Downloads:

64

Downloads of v 0.9.12:

50

Last Update:

11 Jun 2020

Package Maintainer(s):

Software Author(s):

  • Vincent Hourdin
  • Cyril Richard
  • François Meyer and Contributors

Tags:

siril astronomical image processing

SIRIL

0.9.12 | Updated: 11 Jun 2020

Downloads:

64

Downloads of v 0.9.12:

50

Maintainer(s):

Software Author(s):

  • Vincent Hourdin
  • Cyril Richard
  • François Meyer and Contributors

SIRIL 0.9.12

All Checks are Passing

2 Passing Test


Validation Testing Passed


Verification Testing Passed

Details

To install SIRIL, run the following command from the command line or from PowerShell:

>

To upgrade SIRIL, run the following command from the command line or from PowerShell:

>

To uninstall SIRIL, run the following command from the command line or from PowerShell:

>

NOTE: This applies to both open source and commercial editions of Chocolatey.

1. Ensure you are set for organizational deployment

Please see the organizational deployment guide

  • Open Source or Commercial:
    • Proxy Repository - Create a proxy nuget repository on Nexus, Artifactory Pro, or a proxy Chocolatey repository on ProGet. Point your upstream to https://chocolatey.org/api/v2. Packages cache on first access automatically. Make sure your choco clients are using your proxy repository as a source and NOT the default community repository. See source command for more information.
    • You can also just download the package and push it to a repository Download

3. Enter your internal repository url

(this should look similar to https://chocolatey.org/api/v2)

4. Choose your deployment method:


choco upgrade siril -y --source="'STEP 3 URL'" [other options]

See options you can pass to upgrade.

See best practices for scripting.

Add this to a PowerShell script or use a Batch script with tools and in places where you are calling directly to Chocolatey. If you are integrating, keep in mind enhanced exit codes.

If you do use a PowerShell script, use the following to ensure bad exit codes are shown as failures:


choco upgrade siril -y --source="'STEP 3 URL'"
$exitCode = $LASTEXITCODE

Write-Verbose "Exit code was $exitCode"
$validExitCodes = @(0, 1605, 1614, 1641, 3010)
if ($validExitCodes -contains $exitCode) {
  Exit 0
}

Exit $exitCode

- name: Ensure siril installed
  win_chocolatey:
    name: siril
    state: present
    version: 0.9.12
    source: STEP 3 URL

See docs at https://docs.ansible.com/ansible/latest/modules/win_chocolatey_module.html.

Coming early 2020! Central Managment Reporting available now! More information...


chocolatey_package 'siril' do
  action    :install
  version  '0.9.12'
  source   'STEP 3 URL'
end

See docs at https://docs.chef.io/resource_chocolatey_package.html.


Chocolatey::Ensure-Package
(
    Name: siril,
    Version: 0.9.12,
    Source: STEP 3 URL
);

Requires Otter Chocolatey Extension. See docs at https://inedo.com/den/otter/chocolatey.


cChocoPackageInstaller siril
{
   Name     = 'siril'
   Ensure   = 'Present'
   Version  = '0.9.12'
   Source   = 'STEP 3 URL'
}

Requires cChoco DSC Resource. See docs at https://github.com/chocolatey/cChoco.


package { 'siril':
  provider => 'chocolatey',
  ensure   => '0.9.12',
  source   => 'STEP 3 URL',
}

Requires Puppet Chocolatey Provider module. See docs at https://forge.puppet.com/puppetlabs/chocolatey.


salt '*' chocolatey.install siril version="0.9.12" source="STEP 3 URL"

See docs at https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.chocolatey.html.

5. If applicable - Chocolatey configuration/installation

See infrastructure management matrix for Chocolatey configuration elements and examples.

There are versions of this package awaiting moderation . See the Version History section below.

This package was approved by moderator flcdrg on 27 Jun 2020.

Description

SIRIL is an astronomical image processing tool.

It is specially tailored for noise reduction and improving the signal/noise ratio of an image from multiple captures, as required in astronomy.

SIRIL can align automatically or manually, stack and enhance pictures from various file formats, even image sequence files (films and SER files).

WHO SHOULD USE SIRIL?
SIRIL is targeted to amateur astronomers having acquired images and wanting to process them in a semi-automatic way.

FEATURES
SIRIL uses modern and powerful processing algorithms running in parallel in order to speed up the time of processing.

WHAT ARE THE ADVANTAGES IN USING SIRIL?
Nearly the whole processing chain is available in SIRIL. With only one software you can produce high quality images for print or web diffusion.

DEEP SKY
SIRIL is fully capable to pre-process and process astronomic images by offering to the users a large set of dedicated algorithms. So far, due to the high level of its star detection algorithm it is quite performant to process deep-sky images in an easy way.

LUCKY IMAGING
Thanks to the ability to directly process SER videos, SIRIL is adapted to the deep-sky lucky imaging technic. All algorithms work to use all cores of the computer, making it possible to process more than 60,000 frames with minimal effort.

SOME HIGHLIGHTS OF SIRIL
New features are being introduced quite regularly. Here is a list of main features:
* Native image format support
* Image conversion (to the native FITS format only)
* Images pre-processing with bias, darks and flats masters
* Image registration
* Registered sequence export
* Image stacking, with optional additive or multiplicative normalization
* Enhancement and processing of final images
* Image compositing tool, combining and aligning multiple channels
* Plotting various pieces of information about an image sequence


tools\tools\bin\avcodec-58.dll
md5: 0FEC08CC3CC1E19D150B9D824EBCD7E4 | sha1: 7ECF2E51B4E89C10ECF4CA7BDB0C10DE88BBE9C3 | sha256: 702EBBAB3C7FA31764FC81A95B8ABE4F480168DDC541CBA821394F14CBB82A39 | sha512: A9BB6EB3CA70967D5C47F4AEB07B96DCC0ABA5D386DA40638D98A0243455D6045CCA4CE88F156D9D5FAEE610A7BFD883BB4413CA6468D453D362222871E5C170
tools\tools\bin\avformat-58.dll
md5: 87B17B864FA0F126FCEC0E01F627B6B0 | sha1: 121A7D2D3B836BDA12E2A72BB552F13FE436D262 | sha256: 1DA55CF626C798AD4D5B7FBB20614BAD9BF1659B1417F09DE3374A6FC8CB6F2F | sha512: 2CD4B184F5123CE53FCFAED0ACFB4C3A8F928B1958F9DC515CBE338780FDCFEE5CEF2EF68AA15FD91C0294D719863B66A1F50C57174FE92CA20945A15C995F67
tools\tools\bin\avutil-56.dll
md5: 743440B47943E503357F6691BC68ABD4 | sha1: 83DED1806C59E3572574499A18D7DCC74893E487 | sha256: EDDF0D3046EB7DBC7C2AA8E93503B84B2DFAE05E39B41594F4787B6F96A354BA | sha512: C7CE991E747527CECD7FB25ECA4C38ACCD4BB614C6F127969A338C1972E9EE3E2FF52DCC55A02DF8EB3E723E0A5CD731D80FCE24B49444783F4CCD3B54B926C5
tools\tools\bin\gdbus.exe
md5: 365333ACFEFDE3982D8B57A4B812D037 | sha1: 0C2EE1520BD0858E9FF7AEB924E466D3BD9959D3 | sha256: 8DA88590FE64B2019B05B55F2AA8966AD1F053C12DED9C4810FFE9CEFF74F156 | sha512: D1A9223B21DA40ACD699CCA8987AF5A97242043A4043F48ACEC58D97C4561204822286CE1E0E6179174822BBD8BA54C657BC0FE3F79E9CAB736C6A7A94BADD24
tools\tools\bin\gdbus.exe.ignore
 
tools\tools\bin\gspawn-win64-helper-console.exe
md5: DE21C1D416E84F4873A42D0E526C6790 | sha1: D3439B2A15B0A7FCCF6D264DAB7CC0AFC2ADBF6E | sha256: 5372A917766E09E126E3E649A6171E2DF5B0428A58A9B65554A4E05468ECFECC | sha512: 5CAA851F7F42043609FA77181FA6A008E8DEB699DE84B6BC3E2AC4DD87277242CB7380B36577CB6B500777AD07FAEE6CD59B0C3FC9754CC3CDD04926BE3E85B2
tools\tools\bin\gspawn-win64-helper-console.exe.ignore
 
tools\tools\bin\gspawn-win64-helper.exe
md5: D61B15ECB9CCBF4967DAAA888D953B44 | sha1: B4C05CB0F30F7046F3CF3296F1105EEE628E3F3A | sha256: D289E2732690D7D8FF4CBD89115A11BE03C60E45F9A586CAA5FF1B7BD881FB2F | sha512: 4C473B5351FE69F3F207D7AF70BB9D40C4FBF681EA3471D4B00311F2AB52C52096040C32EB0EBB8418E21D1BA0CD8D3486A7981704867D6C5D465E7C64842081
tools\tools\bin\gspawn-win64-helper.exe.ignore
 
tools\tools\bin\libatk-1.0-0.dll
md5: 87A7B2C3108B4E01AAE945361620F17B | sha1: 30D8884161053B1AEB44B5666A71BF31390AF425 | sha256: 0DAFBE25C1E3AC5D95F275030713964A06EC8E2DA50C0587658D25EEBC6D7D7C | sha512: 9FED81C2128087450E320C40B240AFD036F8F2C22E7E247C759110DCDE3E403F3B09C4D4E82AD51C883E95E27862FFB59FEFE1554939E4870DA179F233A9415A
tools\tools\bin\libbluray-2.dll
md5: 07683D5286B0606EB3C4E34CCCCA7C95 | sha1: 88922DC3B48C7D2CD9987820FEC29F44992314A0 | sha256: B5320D577991A925605EC4DC24E0C967D92D86F053B0DF8C92F2E9D2942AF925 | sha512: 8684E868F021D4D2900A8FD3D5F6867644BBCA5ABF1D076B7DA668B9C50F30E1B6127820754CFBB77A3A960B5ABE3C59B96B8B4FB828B891CE33E583A0E79AF0
tools\tools\bin\libbrotlicommon.dll
md5: 88A22D24CC12F26A7E6B492291C40374 | sha1: 5374D622D1F2401A799B53C43E54F232C258197A | sha256: 986C8E5FCA7F1549A84E4223EBD080FE47A4A5B7A26DCFB73F0527413B393148 | sha512: 347B45E96CCF5CFA50FE1AB4EBB123C1BC32453308F1A4952E6D8FDFCBAEBB2C340B863E76B0F1CC8A68051BFAEE4FCB6F215D1A450E2F3B9B244F9FBF11A27B
tools\tools\bin\libbrotlidec.dll
md5: CDA31E8645A35D24FAFB575784CBFEA7 | sha1: 462D455D6197868AC6D0B3A91A28A11D5FD9C9E5 | sha256: E7FEFFC8F8623D6D12947E23D8CB90D865D033297B8D42FF27F11AAB3197E5DB | sha512: BBC7B751FCE7385F884F7C0746CDBE498BDE3ECA32CAF19C1EABA9C8414F13A21CA89037335A01A71B050CDB02DB427F92D1E7CDFD6D86E7F47FB016A782D837
tools\tools\bin\libbz2-1.dll
md5: 19577A76EC7B5176A8B648462EA061DF | sha1: 5654EBC55144D6FA432A82586C1815DE2A95C515 | sha256: C4CD3E2D2A463EBAE73528C17528735E48A7A273190526C855115797836A2B25 | sha512: 70DBC90E8EC986DD4F20383C1849518D823E2B92FF36D81CFDB593188834C259A96CE63EBC0130C22CB9DA67FF72CF45BC72E0050A33B51BA5A7D0DE9F383C02
tools\tools\bin\libcairo-2.dll
md5: 011ADBF1BCF6ECF533B429AB3A06CB4F | sha1: CC3ACDCEC4103E3E9BB85C1814C17704B95862DB | sha256: 751C93BC9E36EE73F30D24C13729AFA1E8CEB6527706B2BD23DF363DD5830304 | sha512: 5FA08F6B4F276FADD1A0C3B95186A46ED57DDC9D1FC4F819FA4E3845D26C58B322943F8BEABD11F118B6612A202857427499AC6469B491F2DD53541A0C117DB2
tools\tools\bin\libcairo-gobject-2.dll
md5: 84AB5FE7810C4CD4666971DCC8F102AD | sha1: 617720249BC7FA4C47AC849753D120C46B071EC5 | sha256: D198FDF7CA71B5D14AF6D2DA04C28CED9228B5158D9136656A96958B675C852E | sha512: E844DFB7A5BE66929514723E66844AA13221FA104489F2877349D099F7E38BA4290FFB1984A2DB9A402E73162D8A279F2BA943FBBF73A3A73F38A902559F48AE
tools\tools\bin\libcelt0-2.dll
md5: 52058BF1FD249A7812884E0FC6ED8DBF | sha1: 2F2105C5009A220A929768E5DF3510BDD183BAA1 | sha256: 02D1A8C146FCAD49A3F8657EF352B84C78B9047CC9B5142095BEA8EE32943F6E | sha512: C98B6321B93CD73E8FDC916DCCB83BA546581D73AE17D772D51C8108944016AA1ACFD140A97A61458E693A59F722283DA751FE0A22379A0B897A18FD564CBDF8
tools\tools\bin\libcfitsio-3.dll
md5: D45AF52BE0C78DA7FEAA759475AA358A | sha1: D081B04D29C81168982A521C941AFBCEE103BD2B | sha256: 06616AC09AB6F58BC3120650F8B4C5EB1A0BAC40C6F930174590121AB92F7532 | sha512: 828C13592A393D84B2D5D2A663FC6B42A9F4EC83C548279A72FDE13C6C2F98C43D52144CA88330A90CD71EFB7AB63503B128BC6DF5B5859DFD50F6813298FFBE
tools\tools\bin\libconfig-11.dll
md5: AD87ED5FB9C095EADA5296D56545FEC3 | sha1: 9DAF4704C6A8AAC13D336518EECB0D5235F29E91 | sha256: 029C52DCF7916AC07CC149862D1C4C5D59C27A17189D94F4C9577308D73A7E7C | sha512: BD90B797906FC5102C483D505565D9BAA0AA156D7C5F0C71D653601D4B56762CF181E5B603CF2BA7FAC79E9AA9EAFF000343C8D1E3BDC3A0C5180E12D4B81228
tools\tools\bin\libcroco-0.6-3.dll
md5: B481ED028DC922313AE96606F4AC3D9C | sha1: 32CF5C65BC3E67E05CD4ECD6579BA1CB6DE4C728 | sha256: 736524DD0B26A566C60965850A82D341DC7AF61C150FEE3F9A4E73DD4BA96B66 | sha512: 9B5A779992263CF81680560DCC01A85C5E45A20FAF8FDEE3ADFF967E656AB84BDD033E539E1123745504855D4405CD0E0A06257F478C2ACF6CE64C58B2DB74D3
tools\tools\bin\libcrypto-1_1-x64.dll
md5: D3C37EBD7421BC80701885A900FC8BF8 | sha1: 15815ACE463A064438904B83B7E4D990646DECA4 | sha256: B6E67544673DDEB55DA348B55E987FB579ABD10CE9474D8348C5BE568DBE8AAC | sha512: F2AF029FF13273E826874E4D4321DBF56FF7D1DABA3554FC56FCFC8A49C11A7C560E4700149EA90571BC24DD87F4FD18E31F5084712CF7F7787B20EDFAD86DB8
tools\tools\bin\libcurl-4.dll
md5: A030D43DB7A1E94A09EA3696BA4261A0 | sha1: ED84853395FBF55115607722BF7046FAC3B185A0 | sha256: 9C9C7FFE5DEF31751B453B0615210859598F453674E7A499516036E58063E1D1 | sha512: D227D553662FB552EBDA8FA18E73DB4E25EF92B57FF9E17557CF91438624C5716E7BCE1AA10D5F10D3273092238648B320585761F2D9F74BF7ED47A52FEBDF14
tools\tools\bin\libdatrie-1.dll
md5: 8A54723090530190EB11AFCD5B702B1B | sha1: DFA923EC796A754BD21C4F9E504305848A4CB1B2 | sha256: 738F67F45FAA07CC387BAF390604EE4CE709CBE7C223D9A043EE06F7CB360D5B | sha512: E0D310458C8259112E07B153EDC86FDFF29E1B09648FED8D163D44DEB3BEE1545E7AD37BB00E9255DF6514844B21A829750848DA42F85FA77BEF376CE09750CF
tools\tools\bin\libepoxy-0.dll
md5: 96B7141337918D13864ED73C19E72CDC | sha1: 941A19EBAC742B46FEF5CAE1DADB28A711B89840 | sha256: 0555975567F1F9BF314202454C8BC2FCFF8DD52A3060D70792F9705B35EFF602 | sha512: 0B505CDF23F6E604C63EE879B9ACFD2CE11613AD7728967EBBED4A96358A92D7ECC18C8C0B526FE1CC0F8254E5009CB6F921D2149CC705B0AA1B99E340AC0065
tools\tools\bin\libexpat-1.dll
md5: A00E630FDA6292917A7B76BF95238E7B | sha1: 0CBCE4D3A8129CEA7EDDFF8609F6EC8D357EB8D0 | sha256: 2D8AEF19798F4BFCDB7E4699B124DD403DD5620A2F748E42A52F4329E3A62CEF | sha512: 025F3718E5FE92E283E4D846BD430209C5A926391599973A1CCAEF7925C03CFFF93EBD3F7126806631BC58F62F3CEDE23E4B1E00EF0EFE2397CB4AB99B8B0A30
tools\tools\bin\libffi-6.dll
md5: 835B9252CF84AA654459EE3B7D07E824 | sha1: 89BD2B8CF4BEBFC08A660520253AE097BA40D2F6 | sha256: 077ED959CD9AB1BF8F9E2ED248A0CB6492A18FD2BA283F52896125412EAD121D | sha512: 19D60EFB0ED2C73707396627F95D46C7D2A42855A58F0A29D5CE2C9B143C4297FF02D96B83761BDFE3045A1B4FFA6351275760920353C3BDD0829EAEF07F8CF5
tools\tools\bin\libffms2-4.dll
md5: CBB91E69A6A7D81277EF72A41698AC81 | sha1: 54C36AF690B03217A0438A8A899A8998DCFDC6B0 | sha256: E1FC664CFC7127DE8BBA29AC8A81DAA323455386D75632DE355A06A7E665DA7B | sha512: 4E24CDE1CEC947ABF1D0FFA2DB3CEACFF021B86F92FC2C631C8E8F4C4D423C6CF578E977856F2A01DFC24744D5C8C407BD8947A3EA9D4082A3DECCAF2E1DB0C2
tools\tools\bin\libfftw3-3.dll
md5: 277CE27645DB09EE89CC9448866EC46A | sha1: 11EE9F7B97E2557A11979B8991D7FA17C9283645 | sha256: F7BE2028CD0D3C0AD11ADED0A26BB6183EC6A04B6C9871559E0DE34E2BD4B2A4 | sha512: D0EF1E94A49551DE694B5D60ED48020C464F0D4F29408B97F935E4CB33112FCB6C7DBE97BD8C0EDC164C48503EF3242BB474BA0B7542889370E83C522CF380C6
tools\tools\bin\libfontconfig-1.dll
md5: EFE9A5FF9D1D6A8CDCB8670D98791B81 | sha1: A0DAFFC09BB58DF32478B69BBC2CECA709D52A70 | sha256: 34B4D2804DD5E3E46B6592B9D4E875AFCA50652F487733545257817B25416F31 | sha512: A3B92C630D95AFF0B734B287A04E0B0310C63136100171BB0146F1941D5FE6181D25A084686E7419BBB2E7C08E65FC9E8B4CA0E9A833C35ABA2AAF80F40B8B6B
tools\tools\bin\libfreetype-6.dll
md5: 7D2EE173BF990B99E1D8B374D5166F48 | sha1: 268B2315C734276FBAE1A2AC7C1E55A1F8350304 | sha256: EDECCFA36BBD811842B636E793952C61038AA49391158BFB34075373423463FD | sha512: 93C007FFE93761F1E645D6AEC9FE85CD0FD6A3D376714FEF3F6B27E7B721F4762FB4E77EBA4EE317403310D1992E5F037963A23306B1CBE7E064A7466AFBD4E5
tools\tools\bin\libfribidi-0.dll
md5: A2C1F7E13656F638EB317F66ACDC843A | sha1: CC354B69C325046813E93257EA191FDACEBBD47B | sha256: F455D52DF63A9CD7DBA913DCA821A0BE54E7FCCE996AE4FF086EE8843831E6C9 | sha512: B0A7D21415A958696E5E2C66124550A3B52F2510DEC5216468586EC068875E111B93F674FBA194F01EE0896D179AAC63D1E84587DA57132EE1A96EEB2A2FDEB6
tools\tools\bin\libgailutil-3-0.dll
md5: FD4090E6621732F6709D678B3115786C | sha1: 8E1308B1A2D80B578A5248586B8AAF95D0C4C4AB | sha256: 31BB603B68374547B68AE6006505358E6EA363D69D45EBF2F3A03A6F03694FC3 | sha512: E5503AF4608FA779AC70C783041DBA2ED6E0A1DA9E4A4E0F21C33AB98EFC86846BCFBF2DB943BB7C38548C7D9DB40342DC6A4CC8B5D130E6AC3F99F2CDB1E4EB
tools\tools\bin\libgcc_s_seh-1.dll
md5: C76586134E031C00E9D72FA11B7ADE47 | sha1: 7F84AB49C74C4F1904B2BC8C39985C50A96C1424 | sha256: E87FAF888989606784BA249C30BA20188E972230871A82E277D741934345A4D2 | sha512: 27C8BD2483DDF851B6A622073ABA6ECE8E13E8990EC6B14DB337449326366748BE6EAD426317CC6AEB62B66B4E70C03E6EE5BFBDC1C5C1DD6F0DD5C298B1B6CE
tools\tools\bin\libgdk-3-0.dll
md5: 392B4B447D724567F119B5B4FB598BF7 | sha1: 59BBB25C1F0A9F824CC293BCDAF8642183D06830 | sha256: CD2EDF63786192CD1D0915A7ED4988375ECB32FCF77C2A4547D71FFD6BCA958A | sha512: 7665D7ED02309F80A446B9641A9708B55B59A4164D06852013EF42724EF06CB4F3ACE5602828B7E3E8A4C934756BFC3DC8A26074FB53A0399824037947E4D42D
tools\tools\bin\libgdk_pixbuf-2.0-0.dll
md5: 1C41A34BE8E6750C3C1790964435024E | sha1: B7383B7B34AAF28EBB966FCCA679DF36E5AC558B | sha256: 7944B6C8581F32C42D38C49D97EC19E8A3B912367B05E903DDAB2D39E197C03C | sha512: 11B2641F06CAF97B8C1AD683A3411B5F9D3C799892044BA2FE87D1E8B69EAD017A5F3F88F8525AF3B39CF8C3AF9845B1CB5D9574D3E11E417F2B56F11FF437B5
tools\tools\bin\libgfortran-5.dll
md5: 84AB722458384FF8F81E47CF17B83A39 | sha1: 5C3D293BC6E991204A1E35CB5BFDD07C5255925C | sha256: EF8B60DFE53098F88971F50DCA250DC48477CBE74B025F318B732AFAC06DB742 | sha512: D409B1634749AE425C5BA354C039806741C77C71A22F5777DB370CE6E269D1E6695D7AE2D6595145DB81150FB8071D46260C904831024AB88916CE0F8541B0B4
tools\tools\bin\libgio-2.0-0.dll
md5: 1C2C1D6EE194DD23B0B40350A449C0CE | sha1: 5D0B88E985E19A8CB4F978D16C3AF4D65B484CD6 | sha256: 5EE87328FCC68AE23F7C3EFAF17BE54A9B00835A4244CB74AFD92C2841A5CE43 | sha512: 147C4C080B46C93C643B291E44DC9096826930B2B6FF55880D91DAAFE8E4EB0EDB30B36A16C47554CBEF53139A179F75C702C2D24B128E4343FA1EC6733F6040
tools\tools\bin\libglib-2.0-0.dll
md5: 0F207E82C3DE9DE3A31F08685E8B587E | sha1: 24784A9D31A721D5AA643BF85D49E1FA48BCD9F6 | sha256: 6F13D455FC33303F86E8FF13D86D443E2730ED20E2C6CDB040B1A81A56830570 | sha512: 153FBF7EBF071404B617B9BBB305D6846E0C4C196AF0E20F3F846B5B7B920E96C28842BA9AF1E2F0491E079BE03786797F2515C75433C4CE534FBBEA9808B9D5
tools\tools\bin\libgmodule-2.0-0.dll
md5: 967D4D85D8BA3F076C6AECAB78564C2E | sha1: 83D7BB6BC0434E2E18AB7F50D56F11089DA8FFE1 | sha256: 41D6C26208E9EBC0564F1A2F01DAEF59AD2FCF8E912B5A7B2CA7C5B3352AE0FE | sha512: 5A050A2D6B36C9D5E259897DD65C9B6C803ADAD14D01959F4DDDE9EF5E18D6C6EF0202F02DC7D5B6DFDADA06DEDCB8106378241D1D115ED9545223C852A279E0
tools\tools\bin\libgmp-10.dll
md5: 1B73B0DCC505152EA8923EEBB075244D | sha1: BDE642FCD0D6BD4709C45A0735593ED8EF44E0C9 | sha256: DAA0A2D32134A108AB3AF38899D8B6CF4BFC75E3D1D7C3A890A25CEDD018AFA1 | sha512: 88E7CF532B33F050E9DC0589D8E17E4AF46D3DE5AA9626EC713281359E06347182BEE0BC62FA55F18FDC6CC7953964455D946630CF33749CE0AF50939F7FD74A
tools\tools\bin\libgnutls-30.dll
md5: 74E412512B0F2529DCA3D62967A1EE58 | sha1: 372BBE3FA18CDF14B4FDDFABA0920FB412BA1F64 | sha256: B725E3744BE0E47A0CF172DE5B179CFD4BF1135CF1B1642794C0825400536E69 | sha512: 6E776AA5C844AAA71770DD7E3842E73CAD207CC6994181322F5AAA12A98D365D2EB3DFBF9341E50C726379E4CA7ED7F1B929FA516104CD8EE3AA072FBAA2B3C1
tools\tools\bin\libgobject-2.0-0.dll
md5: 37E990A776D3BBA310BD1791D7FB3173 | sha1: AA3DF30E00B8E162CCEE71DE69D12544E47AE4C6 | sha256: 8E8FE9200784F41469301F063A1258B62B7E0D1EC945F65543046A3E04D97CE6 | sha512: 75107A56054342770BDF7E3F415ED66F40584872D1302A7F8EE20E9381291E681356DA42C55320F72E8E0D944826DA19BC9C167B3023FEC216DFB3C2B95A19E1
tools\tools\bin\libgomp-1.dll
md5: 2F50CD763C525527806263E07BBD8D40 | sha1: BCAF9145A131D131B9F373E7EA2740BB44063284 | sha256: D9C0D03454F3C3EE76F00A6D22304F9E1E09E876FD448FE112AE65FA46DC88F0 | sha512: DA07FE8EEF5C13DB2351D1B0B941F7B3F4A9E0E43EE886161C20EF15F9D7B6F87CE98F3509DE63C487972073A1F2CFEDD7E463D8D568519410F3B36B14AE161C
tools\tools\bin\libgraphite2.dll
md5: F06F19842FB8289EC3C9B180A690199E | sha1: 758D54527D6EADC455392E95823712A54D9222CC | sha256: CE2BC9FE7424BB5351903E5BBB89FD18D95BD880307133C1E3A10AC4366B8A1B | sha512: 11802A7D2EBE9A2AE8904DB62CC80EDC29A640BD06F6ABEF56FDE87301F93F4F32D78D3D3647FF3527FB1414AA97E119A775A07F27BF73ABD9C4DD3EC46BCF37
tools\tools\bin\libgsl-25.dll
md5: 3DFA84E1C138DCB2EACB599FE04DFCA4 | sha1: 44C9D64EF47C921FA28A41022472863488F46FA3 | sha256: 92C836EF74BFA9DEA0B91EF435A3EBAD0A3167DE724445B7F6B4E8006CBD65E2 | sha512: FD8E3BE9F74579CD22CC9C71AD02383AA88DD8DC2D975A241159B55692010F40987D535E4B07986C0BC9176582A94B0C33948C3DB3338DD64D351455163BDAAB
tools\tools\bin\libgslcblas-0.dll
md5: 74963BA16D9986336190B0A58BF20A68 | sha1: 4DA9D8C64D09A43CA53D54F5F6158109B81BEF63 | sha256: 9BEC0CA4E041932D9B8E3BFA79D88D706E432D71DD9CED078EAE66137A642C0E | sha512: AFAE37980BAC505159F03DCF2F77AB94D905B6A8AA60E7CAB86CEC4AA81B278B795FE553825ACB2A99CEA5ABBC5DAA173142B8B81323A442B195E16A28E4BCDC
tools\tools\bin\libgsm.dll
md5: 5C64D124517F4135189B3704099DA8C4 | sha1: 75FC5786FFFE3F0D549EBCB7F056024E8E7066F3 | sha256: 1A8A535EF715FCE62F0690342E89A678FB5E28F4B67A434247E0550D23519320 | sha512: 08540C0C735248BF4AC0B528720A5B8BFC0482B6B3ECF75BC78E62A4DFE86A47E4E3BA46331347244445DAF5E009E831042D05D677FA5DA52B8827EB0D5CD476
tools\tools\bin\libgthread-2.0-0.dll
md5: 4E52B774C9A99F56319467BC3FE0EAC5 | sha1: B83FA3CD6B78E3650658A77C315ACBB098A9E270 | sha256: 47672362C57A00B51A1C61F3F0D8D2F247A3C4A06BB9FC0BA85FB306C2AA17D9 | sha512: EA0882011C7D75944F6197E7538D799AA12C47E7C931A5058721AEF365AE0B9994C2ADDB2816D19FE94D025BCE01F2B802DFDA869A167CFAA2BB2D74A8611E6D
tools\tools\bin\libgtk-3-0.dll
md5: 007C4A6E3B437F4C8A68E7669EEB4B4A | sha1: 1CB4DD711929BBA34681BA50F21DD640583F548D | sha256: 9A1AA645A8641204505F05C8220D499AB0EA3FF2F2B5D09C9ECFC80AFFA9FC53 | sha512: A7DCB84AEBE80B15ADA3F3E543D4354ECF8B189E118B6BD1F1166AD98096D86E1CC8141A32B21C044540124D30B6ED3157FC684265DE67BBA9746D5E8DD8C3DE
tools\tools\bin\libharfbuzz-0.dll
md5: 6B173488DD1356EE0E458624F972365B | sha1: 5E21C92F6E0933FDD3FC8FADDA8F9D8AF70D045C | sha256: 66C9EBCCA86BF8E0C2A09591F3184285CEF8F6C4CABF5F24BE4EB487C44453BC | sha512: 872AF5E9455BAA53EEEF745438E89C15A9D7F0ACAAD10E2B1C4C11B6F384D0250C52493E4B9B0C4335B80876D96E3B32F7FAD9AE9706C839940F34E91DB76076
tools\tools\bin\libhogweed-5.dll
md5: 4133783672A1D759896A64B4E6AE961D | sha1: 74D9563C9EDD0406C99ADEE3328A2744D85E1144 | sha256: C6CB100D6BDED6EF02A44FE80F33CE78EC57B496F5A456DA538CC789C2E415DC | sha512: 7C6DC2A5A244F13764F2D4EA0ED96F5C4507EE97B9294DE730D64C94B405A8700844616C8F716038BFC98988DB81E9B0D4B7171B226A9F6732963C7F62C8C3D0
tools\tools\bin\libiconv-2.dll
md5: A8B9C6A6D76B4441644D1A2C24ADEFB9 | sha1: 1DC387E7707407BFCEF8D2B8EF01353906CBF9EA | sha256: 1A821165C375B54969014F5BD9F8323792FA7AB436E8A3B1F7BFC7CD547EF475 | sha512: 05B8462326085A4E61E00E0DBADBF74E91F38BA7D51FFB46F50E2448E78E47865378C0F0B31077329D1CEA852D07D557119218555C82A182D85E0346CAD4C618
tools\tools\bin\libidn2-0.dll
md5: CCE8F418BB1EBFC07A08E300E17EE4F2 | sha1: DD021D96E221B71BD32FC0A1211E51A75E9A2CD2 | sha256: F204AF15153D22CBEAC7590824BD0ED29662A7AD2AB78C0A4A76E79A3E5CD69B | sha512: 7225C79C6E6CE4B99C9D43C94BB318A277DEB71707540D16672448755E233474BBE1464A711D5CEFC1DA480A3B98F8A16949F3BF622BC7D7CF5129F79EF5AA2B
tools\tools\bin\libintl-8.dll
md5: 9C40BF1E7AC4534FC6673FAD62859F55 | sha1: 8AD1DF8D89FE88D9D7B0E97EE34B748778E89870 | sha256: 6625B662ADE69BD824F2DA4D17C1851DC62DDAA3E45D95A6E5A10F6C22743C8B | sha512: 3A378FEEEA447471549F4040EFF4D1C19E6C76C87E2EF8743D942C2C3DC77F58AC6E3AF77E0E7AE95DE1AB03FD901C2D3E126BA9427C3842CFEC5D71E60162AF
tools\tools\bin\libjasper-4.dll
md5: 18B66782C820E90AA4B8AE1DA4C72CF9 | sha1: 9521E41AD2B75B52BAD24EC45EF38D9521137BC8 | sha256: 6B2FAC9AC97EBEED6DB3CECEEC7335B312E685803599E32ED40A640CD8C04DDA | sha512: 75B5259D18A7EC2B8E6AC4527C2C7EF54B066B125571BE9BB50ACEF94B6AA6D818048B42D70302CB27DBED8F935179F638F753D3A604E54B2C6B0F204458D1F0
tools\tools\bin\libjpeg-8.dll
md5: 0DDAF469EA85A9298A4528B2260997A2 | sha1: 4158343A019EBAFC01F35ECD0652B9809B76CE92 | sha256: E35E05C27FAA77A0C61EB4A37FCDB61167CBA547A14E1353B76567E5A1A0191B | sha512: 36EC3A6EF197EA80840EDDD6793CB5D2B5DF83AA2B723199F4700E814320D092DD955CFBA0E2F9425FBF3BAA5527CD11906B2547DDF28E247C5C0C310ACAA86F
tools\tools\bin\liblcms2-2.dll
md5: B74283123D64D21D8DB208812154D88A | sha1: 00BB13714611741D5B834AACA7DD1BB486CAE940 | sha256: F37A702397C519FD2BCC788FA9A3EB5F1DDEECEC8628CBA12D6F185B3F80D1EF | sha512: B7EBF86FCD59929D86160D9DD6A69236BDC7450A524ECECB82654790FB0B4122649C46EA8C91E598FEFDAB4830881D79E78151A8A990E1F26899F497DAA0B611
tools\tools\bin\liblzma-5.dll
md5: 14349A7D3B45E32CAB4A172DA41C0273 | sha1: BE8E1C3D2D222723CFAD54E9C4A57BC69B5A6A50 | sha256: B12704E0066D2CDAA2C73C3314CCE8E78ACB04AD28B6C6770DD537D6E641D487 | sha512: 58B35AD989E477226FC77C3F0B2FACEFEFEC8D43D0BAAF1EFA2C24C53BCB8930F5E5F8F3AF3B5D165B33F50BABEE4CA67C386F6E9D8C7DA07E7C782CC19E1ADA
tools\tools\bin\libmfx-1.dll
md5: 26FAD21B34444797188F67EB88753DE2 | sha1: 42CD95228F028B30C25BD1277624A3FB000C4378 | sha256: 0098711D0A18AFAF698E3B0C8E003F6B734DA8C954656DB832A1BA06C1C30EE4 | sha512: E5858076E57C404835B1A2A63B683BB0056FDED855EBDBBF88E3E4B0BB93746D469A6E2FDAE979741F22CC197553A4401112B9A61B857ED1122A573850E61136
tools\tools\bin\libmodplug-1.dll
md5: C4B54F435DBD9620292123A97CA8C6D0 | sha1: 9F0674B7B2A2F0B11D968D080FADADD8C31AA1E8 | sha256: 08651CFA811612EE76F12669274A86B8ABEF68E79496474B5BF77D03F0625C83 | sha512: E8C3FCF827C7999357E7D9F24EACFBBCFFE26D2541CA9B2533E7594C344F0EC56DDE725B863404A15C9D8BF426CEA512FE748594536478955AE42817F3FE49E6
tools\tools\bin\libmp3lame-0.dll
md5: B365B0EC9E0146E2D25A9FCEE11E8027 | sha1: 73280F45C809A31D3AE271776FD010E8BBCE6171 | sha256: A4A76D4545941B9B43F92C9ADF1319342F795D2E60D0D9948E400CDD5A9DF71F | sha512: 57C0B92DED057C358C2501ED6CC0C25DB16033AD772BE4CCB8A097211291FC7B26ADF9DFB7CC2808B6BE1DED939321657672C0602A91EA356D79391C975C653E
tools\tools\bin\libnettle-7.dll
md5: 29CC3595E2CF650917890A5E939947DD | sha1: 9619A725F741659D3E1979AA77139791DE9F11B6 | sha256: D9A264D44098D07932F1D1DBB974090B461D38952F45B518595066ECF09FE1F1 | sha512: 2AE9953053370394F66E08836CBA89450BA69B650659561C82A0D8D15F6B99808298F11B414A75F314DAF36989C0FBE72CBE3C2B07E1151E77D53AB6AA61A7CE
tools\tools\bin\libnghttp2-14.dll
md5: 5AB57FB3D680D89CFE47148FCA7966FA | sha1: 7431D109DA665E4B54AB7148F995019EC716C9E0 | sha256: 83F2A611EE8FB6C4A09AC5E2A22A05EA58495C122DD4C9639D5D5270BE10684C | sha512: 863C81969A77221212D6085D59A6319330FA333B316D2BB320CF94AA2F0C38FD5222F70DFCD0E44DE5A2E204C2E6ED338B40F83AC5CD52AF957F5F873DB1895B
tools\tools\bin\libogg-0.dll
md5: F29906BD0450FBBC3FCC57182D42FE3B | sha1: AFAD7A085FABDC7EA05D1ADD427145CF6231FB93 | sha256: B17D2BEC59E8DC73778ED634FC80D6223CBFE5F2962079C52E464776C133C2EC | sha512: 6A2BF82876CF2056E6FFDF191B0F6A8935C89C6B08F707399FBC4E757F9EE964FCCE1F7C43F0783FA54829B285CA0CE45866FB54604579FF688F8EE9C0CAF7A9
tools\tools\bin\libopenblas.dll
md5: A593E6D93AD023C39361B2E419A041B9 | sha1: 1DB9A1B3457F78C1CDC00D07CC89FD03D4EEE0B9 | sha256: B37A74CCA655E1FCA513359E7A1C204E47D7AEB67DDDDED94B920643EFFC836B | sha512: D03213ECA2A89573B8D639320145E0F6261F86FC042156BAD16EE280113D4777724CA785A0986F1A42F341F6BB93E9FA44DFABD4FEA23D72DA7B753CB37383F0
tools\tools\bin\libopencore-amrnb-0.dll
md5: 7DD52413721EEFDB617AB14FFBFC03A1 | sha1: 9A65E3462E908ACB46426198D76E60D9EABB1D54 | sha256: 7169C0D7BB7512196463B4F3E5D6748917C272E8D5B34DB194750964CD12BC93 | sha512: 657D56544F0312DDADCD8D49F73E75631D876956204D7F024362E5575D6EAFB4F38438B01555753D671CCE7E3D273FAEA8622CBA816DBEF5642589A09748B391
tools\tools\bin\libopencore-amrwb-0.dll
md5: B6362F0BD0FFDD8F1320F079279864E4 | sha1: 1A4D7DB740BC70848124D8F69242E7053A057958 | sha256: 57BB165EEB41D2EBADA98F418BB3D0CCD72EB28AAA06F99D49299711399BE74A | sha512: 70DA6FF5066DAD9C95CDB0CD3A28943F1B5E9A9165D14D7D4B12064A6B9435CF00A64A7EAFC36E4DD1E8B413FF75DE0DEE262B69B7221A4F5BFBDF7F3E544365
tools\tools\bin\libopencv_calib3d411.dll
md5: 46970C81C37C353E3886421E33FC0F93 | sha1: E60C591F44B22A90DB856B99C290543D78968F2E | sha256: A498EAC7AA31FDE54EDB9C95B903175EC9A3F3D188A174A67AC8005EEDC823B6 | sha512: 4525E0A6666B15723497271EA8C70F6AE32EF5AD6B43333386F47E5B904750F7ED4FA398662208E6C4FBC60EA330E0FE55944E18005D2F610AD101C50CE06D2D
tools\tools\bin\libopencv_ccalib411.dll
md5: 045F251B3C351FCC92E49BB518188585 | sha1: 348AE48ABBEB3508408F5DEE39D548AE3EB7850E | sha256: 5489C02634A0B9514E6AE672473CA5BB60D7C7A936E26EAE73DFB1DC64695575 | sha512: E959A30554F038FAE62988DD3C46A1C35CFDD08A58FBE911705722701F1022262CFF987164BC3AFABA6C4B5A0172FA9C444EFE85CAD38D328A5E73C3B2DE4818
tools\tools\bin\libopencv_core411.dll
md5: E40489FCA3395BC78F36CE25419D57E9 | sha1: A236E042551F53808A7D096EEE16366844DE8D0F | sha256: 7DBF99B4844B2ABB8EB29BB8F28DE0652588A90E51099B4B787DA1D9857BC956 | sha512: 489A24DEFA2DB81D9B580CE223BD5972055EB9D1D5E474FDE7C882F6662183EE8547CD5D19BF08BA7C3F9139BA5C5B40F3F13FDEA13C999203122FAE72B39BA2
tools\tools\bin\libopencv_features2d411.dll
md5: F9E6BC04B7ADD814E2D200B9A6BCAF9E | sha1: 6341120365D268A84CF4DBC4D26B8918345B1638 | sha256: 6E235A9D64054F7E9AD75241399AAE4FCF0DAF989343D1A092A5514AB36A0B98 | sha512: EFCDEF35BD6FD4ACE81CEA7F19E6774FAD50BDC51F1A32A8C67B14C717DB62D6E4739B87446159ECB5AAA2D61F9D7B341AE72C3CFAE6A6C81E8D96C623CA04FE
tools\tools\bin\libopencv_flann411.dll
md5: A6D52A0AA9152FEE64D4317F5B042DF6 | sha1: B1B6FA6568C4A17869CB68C1D3BCC7A945E6E728 | sha256: F32C2CC7168B4FC65ECB68CB9624E829EE0F40CB419D9A43F2E6F600FDBA1FE3 | sha512: 070DD5184FE1041B9BEBB76516D4661021AF7A93594840EC189C51DE32344617856916023DE8389C59BEAA92454CC5E7A4E4E7E62291B4B2664E65340F1FA305
tools\tools\bin\libopencv_imgproc411.dll
md5: 9FE7F01F17F5E562C34E7426FFB38B29 | sha1: 9B05AAB2A08B21048749635A6B0836B66770A07E | sha256: FAE7361F0FC857CF88D282E5CBE93F6BB49300EB267EC079A93B15FE3D86A582 | sha512: 74F74A8A61F8C458E39F3CD53F5AB2DAE1600F30ED7EDDFFB0EF8A1265E66132BE6D195BA1600CEAAE01EBD04BA8C6877D3CE914B5AEFC3F0A3F5F1A5AB9F822
tools\tools\bin\libopenjp2-7.dll
md5: 5C9BE00045960C6DABB51E23C6B51FE9 | sha1: A9EA42611326EEF6BBCA92F20F116C234215B4E4 | sha256: 3391371ECEC1DE3CD905F771C2944BAAF4923792798B2F5E12D3C2D723D56147 | sha512: B5B830B826B7E33E55F85419FDC3C51AC67C787A5411691FADEB8FA178C0B6712A722A8436A4E7B05948030F9A27BBD1F7551AAD4BC72FF3AFC5A3A9F0EEC451
tools\tools\bin\libopus-0.dll
md5: 02871BA8A9C27E90B8644B548F7F7F96 | sha1: C57BC966CD493C88ADBCC6F22C4B062EB1430346 | sha256: 6B6D0C22D720707AAB3DDF0824FB94C9A601F76D4078DEA5E956617E449D0C2D | sha512: 335CD11D99AFE3349CC965953E49A1DE3116398BEA53664088F770B0C837B4459801D8B3D80FD3F5C15F20C21FB7E5BB950DE2D5898A163F1E1E4D94B475C71B
tools\tools\bin\libp11-kit-0.dll
md5: 8C619086A3ABB329CBEC217F2A5B1753 | sha1: 363042B30E1174737FD958B0692BBE4884EDE9FB | sha256: 6EBB625C8D0F113E1B47E6D4C38FBD2AB2037F0B40A594FDCEC2CC5E9756D5EF | sha512: 2BAB68E00282044E712F73453EA473331BF071C35D0AC42405C3E8EBD62BEE516B78E1B83630EDF59139A7181CB967870D4C3EDD5A479B364398CC96144C9EFA
tools\tools\bin\libpango-1.0-0.dll
md5: 674376EEB325B26D2230B0E510446390 | sha1: 2ABF56F17D3A87F6432B5B57B76F173F4762D73D | sha256: 01F46F2401DF22465BF2B3F3D59343D14DCF6AADA6747E386F1ADB965AF7B3C3 | sha512: D395E373B87AC42331566621AB99AF07A6F340CCD0E2B6DDE2D9072F622E5C8E436E91FB9560CAF16DE0899823A217C9D039A378F37184D52F1F0E723FE9FF88
tools\tools\bin\libpangocairo-1.0-0.dll
md5: E1E6C0144618128EF2FCCEF21082864F | sha1: D4FDA2E910B42329190F4B0E9D40DF445D97748B | sha256: 4C88B7AF6EF9FA11C1CEB137DDD31E0255CE280C52D6993F0E661B66A462B566 | sha512: 1D5B051DCE7D03E12BE0DE79E3E2E890100E131ACA1BCDD2DF43564006117FAE29BF869529B28144FAA0D0CB332207ACEAE7802EDEAC11CA68045C8B789823AB
tools\tools\bin\libpangoft2-1.0-0.dll
md5: 33F1D93D3943F9CF6460C9B0B29DAEAA | sha1: BD14585D8AF13829BC64F140ECE7F4C965F287B3 | sha256: 2689BFE58AD74EE8EEDE2E5181A848FD3C5EC89B62B656A8E79883E8EB39E484 | sha512: DE919433FFBC8F4BCE341B0D2B6FAC45CE2278FA7AD4686E56DD4BAEA218022D445D6E781DA3EC09D7D507AD931F2E7ECA823484438D9334B528DDA5531BE40B
tools\tools\bin\libpangowin32-1.0-0.dll
md5: BF41B7D5A8105BD92CFD43A6A6909A80 | sha1: F9D6DCC9399ED618ED384670738FCD951D3B5DDC | sha256: 3FCC815BC3D562669483692FF750570F66124C7091A570C3F891B0E8C775CC38 | sha512: 8FB42A24E8F3E08EB42F6276965DCD4A9C57B7DEF6FD8D49EE7014F35214BA31021D567B99434186EB50CF5914B2A3BD0D447541FF01947BB95D5E4D8604CAD6
tools\tools\bin\libpcre-1.dll
md5: B7CD5D8CAB9BAB4F6E7B9DAAA8281DB8 | sha1: 036BB9976232275113EF6E601895B7011DBF495F | sha256: 62A349E83F62AD327A71E05D118D01E563687F72300FB9DA37548E95DBB0AA84 | sha512: 47701843ADEAEB9F137266C5D47FBF58329D93F5F33F3AEF6B49C685FECB64375825B36FB80030DF69CA5408B7F79F448DE31AC029F37DE7DF31CB47F2BCFBDF
tools\tools\bin\libpixman-1-0.dll
md5: 2C4BC9E2714AB27F710299E9A616E798 | sha1: EF7A651291628339F99A5854C2EB045924C0FDE2 | sha256: 687A08B44E3B876E099C34D65C626991135C1FE4E7E774B3F305CF734AFC21D0 | sha512: 72AC11B70F9DEC23289E08A99E7B1E0069207066DEDE35C9E4A9B73A52664A6E47DE5B9739BF09EF9BA66753BA104954432999037D7E90AD19F55A0447B76388
tools\tools\bin\libpng16-16.dll
md5: 39500129ACE748677DC53CD805183CCF | sha1: 126915E66F4663DC68485B9273FBED381B3FAED5 | sha256: C96C79BC84229A90B1F3A009E4A06DC2079B01FF4701C867E07A5CFD14F6025B | sha512: 282A2CC5C54938719999018D8E633350768647A64DD5C9114748F04675FB5DE3CDE1351F95E43CF9F3D2BE0073AC82DA3488F4952D68BD70087E38FDA2D5F190
tools\tools\bin\libpsl-5.dll
md5: 839A6B0201EFECA70CA04E6DA96D5A6D | sha1: EA3179954EDE59CB18171F862C23714EC00FA9C0 | sha256: 3FC6B73BD22CBC057A4FC4E073A94DE144D428B4B46E3D62D7680222DFA69B8E | sha512: 5C338312DCD4DB9B337204D244D6BF885210CEB6D5F97F50C5D2B0BEE0F061F7119A4A51632C11674C1AC1618CE478930C8BAFEE4C5316AA1C112B29E4DE2F59
tools\tools\bin\libquadmath-0.dll
md5: 027BB0D26C9B393FE4E2890009CAEEBF | sha1: 786C295C315EDF81236C9DCBE22A6030701E402C | sha256: 1B200A6DDE0F5B9FA3526F16D725B4BA1C42017E6100F11C10F1375A8B43EB5A | sha512: B395E97B69EED2B9D7AD1A51C47BFA3A54FF33400D64BE28FF69F12DF564FCEA00C0D42541D56AFBFFB928E946728AACA0FC84B576E667A4EB07E3DA96EF101A
tools\tools\bin\libraw-19.dll
md5: 8B873279CBD29D117B8F4EACCDE56A75 | sha1: 854EE80E4C29694F53283CD665515A6D2012A88F | sha256: EF2DC932DDE8CB6DBD098AB24F40800F8FB4B8BE7EA9851FEA50F08F2C37F908 | sha512: 5B9A02052ED6400BE9B98A292B8FE6C13169B239A8FB6AC725F535C588FBACB60D096A117967356F35D8E448915586E5566D9CE246B73574B3484FFD407D0F00
tools\tools\bin\libraw_r-19.dll
md5: 1BB807E168157F2DB019C6F5BB83A76E | sha1: F051429904F494AE1A880BCF3D896DAA773D50D8 | sha256: D9ED72BE17C4AA2FDD09598A6BEB7C93DAD5EF1B5802263B14CF036859139BE6 | sha512: 7EBC517CFC092B84DFF90165CBADC5BFA6E297C9A6F27FDE7377F74C4250A89E6A43144549B272B11C9D7DEA0E1ABCBAA077FD1429B3AA0D9988129189B42AE9
tools\tools\bin\librsvg-2-2.dll
md5: A3D4F1445E455CE765DF740213700288 | sha1: B63034C5DD4ACCC9A567C77A75DAFF484298495A | sha256: 85AF56E07182C3D20B9996A99C577F9457A618FFA3AC5E37F10BD0EA77BD21F5 | sha512: C94C5ACB1134E571526E89E8299836B08F4B035CD9364ECA2E748BD29CC28516A56E49F3B2DE8133325D32329D5D01CA22BE44D7DB31A42844054F0C4AD64B53
tools\tools\bin\librtmp-1.dll
md5: 91A254CF03D59CC0DA13A5AE147E06A8 | sha1: B81D76BCF943068BE3A82C20E1600FD8CFA08631 | sha256: 78129B3C33A88D9C4B93BA83E99B6C4A3FF65EC79014A38F850DE8756D2BD19D | sha512: 71E26284656904F02F4FD8DDACECE79E1A8D3C97185015C1B35349985C51E807F0832510E328D4A63E19B0231DB07B15CC4BEA5FC32F3DA7F3C2B08610161458
tools\tools\bin\libspeex-1.dll
md5: D7549405D57923E27D47B3CB122C309A | sha1: 8855F63D79A6B62F0354A7661B55D81B46DFF058 | sha256: 288A1939D58383FF82F15111E32BB839086AF8EB41188531CD8774100EE1B3DE | sha512: DA3408E1594D5E6A0E615334911AAD81B0B9D109EB427E3516E8375F6A8D213ED821C13BA7E70B9C1949CDCB06C1DC1626252B1AB18D8F958D30D13F5F07C190
tools\tools\bin\libsrt.dll
md5: DE89336CF022CE721408F978AB0FBD7E | sha1: 6798CB36AC994DE00E71394B315D7A689E097137 | sha256: 04B615071EB30A05241765DF8C3F82EB5569803B15785341991DF910ECC1CDD2 | sha512: 3D4E0CCF80DACD2D360CD9905C7DA874E1439B3D26141507A80E3ABA57397B1ACCC5DC2CC333EF575D5AB18A23E2A07EC4FCB8C8DA3B548ECBEFD73D765EFA4B
tools\tools\bin\libssh2-1.dll
md5: FDAC7E9B499ED3D7F90E19E12DDCE288 | sha1: 604DEE500C9DE32A6840D3E9C5BF059ED16CCBD1 | sha256: 3FA3149CFF1C26298A615DB9C81306F69F30B37E9FBB68136999C36741F33F0F | sha512: 81B0A7BDE31DB145B5A97917A4E3A94B7428E0AC726DC890672D151376EF783556D5470A6C5256999C513ED07AA95F0D4574BAEA5FE6472557F23702F63DE5B3
tools\tools\bin\libssl-1_1-x64.dll
md5: 8140108F9E442637DBA8B48E75B19B18 | sha1: 4621A0892818340217B31E334FCB7AC949048A00 | sha256: 3B9DED80A810F72ECABD14CD0E5E328EAE0578E8EF0B80CC1D4CD5D6038997BB | sha512: 0D05FB41DECF116955CDBAC41F27BD4AEF09C4B55079637884D66532C3BF94D6DD078EC9D3914E4AE71CD2AB0F3634DE2A070E0FCE4816133C743A6E48E7851B
tools\tools\bin\libstdc++-6.dll
md5: 79B5A83423DC6165228E2371C9F6221D | sha1: 67655E4D06C9A39B6AB71F3D18F60CDF6C8F7048 | sha256: D537AED19164B281FC17C6D0D3A9017EF140A8E8D2F4D01CC66A65B1D0D89852 | sha512: E0040E50B109DC04CE21CD28F6064FB522B52FED5EF5A6A6B568C33489283C35C6F758FD97D4E32F8C228E53AB1BA304A0BE257BB92D047C5A1AC945ECAAD465
tools\tools\bin\libtasn1-6.dll
md5: 80A5D0385D97B83F9FB7F38101683A5C | sha1: 49DD5F013EE126424A809C086DD730D0DFDB59D8 | sha256: 400B653C07044631FD8AAA9727B1502EA0B0A6373B8CAB4C33CA0FDF472BEC31 | sha512: 26DEE826D6027EFCB6E302C4D0949AB4A7671850E3B88DED63F1290985878E7684BBE392EE6D55A260DD5EBA6242F05E0F9188932E163CB3AC006FA5DE397218
tools\tools\bin\libthai-0.dll
md5: 4C85556AD497E319387D9808E916D568 | sha1: 14B1BE86C7AD69F44568732DC799A72E661BDA69 | sha256: A0450A3C9C8059F874E7807A5155DB6858B16F772042465061FD43A53BAA052F | sha512: CBA4F792C3D18E303C40669CF5C8DB4546D5ECCE89EE1D2920FEBDB51749A5495A59E1328C6F57B7C9F42D255605E44703FA78C044D2E5BB3AB42B308073C583
tools\tools\bin\libtheoradec-1.dll
md5: 99839B03C5BC4AD786466DACC00A1C32 | sha1: FFA6EB68C36871DB99BEF93D3094E45B30F7ACED | sha256: 2392DC50864B77069AF8CBF371DD7FA744DA2F4FDF65F350D0CC6F66AD514D9A | sha512: 79731D09076E9BE4C23D083FDDA137286B6BD60F662F453F8B9A0C18C1C2792A6401F14604B813761E7E4353D57F046016BCDC5E902E142E8CFB5F985B34088C
tools\tools\bin\libtheoraenc-1.dll
md5: A9ABB4560E5126F8A63354F22FA3E85D | sha1: C78CA9E862FCF11C9D6966BB6FE11EA15F9893D4 | sha256: F984F692DCAB2AFC1DF52D9C262D804F4F2B26C3BF56D972B06F251F887BDBF7 | sha512: 79536CE0C2CE27A50A4828FCDC48A4DEE8D1A7F535606EE5C06C894403ECD7C8B35E910BEDC1F86782C7CE80573715B83BB9198DD1C30F7BF287D411064A366D
tools\tools\bin\libtiff-5.dll
md5: 357297DC12DB0DFFE0EB19CCED6992B2 | sha1: A6C53F1297A1EF1AF241CCC5EDCC9C19B07E745E | sha256: 7A29A3BC426F5ED67A85917E69656742E15D1CC7101A2A444A69422094F413FB | sha512: D9AB5AA0333E6B0EDA3C6370BAA5E5D5F6D9DB95FDDA864765B10E84792DE658F174FBBD423D79776DEC68CD3352B90DDAC0E2A9ADC606721D6802AA5D70F2EE
tools\tools\bin\libunistring-2.dll
md5: E05BA8FC8378202661EA58CDC87923C0 | sha1: 64E27E03B7A4962255FC8B8B07F55DE705257EC4 | sha256: 33FBA340E85F7C6036F994F1A43AB3194D530FE973AF9FB09C26681FEC8BB564 | sha512: BA13D2162154FD182004E200C02699E974443445F4B41577E89D97E04256EBE53B3369DD4EFDD9F90D5CE41EA055D50BB5680FFA9007C5B4954D47720524BA2D
tools\tools\bin\libvorbis-0.dll
md5: 59EC70A7D68689FDDF554A91DC47457A | sha1: 88A9A970045A0DAE140ACC41C4A98E96CEF378F3 | sha256: B9971E4AEA113A256E8EA465D16260251BD9FC99FAAB7D781CD3CEC6B57B3729 | sha512: 5ADF7519335292FC98B3505921C5CD43A1E0F37D49A2B1E02589A62206B24CDE6EA6451C60AD29334C9D60DBF678E8627CAFC14B4B3F20EE409DF2B06B8B8F4F
tools\tools\bin\libvorbisenc-2.dll
md5: AA59CA3807EE2C5301A2AE57DA945639 | sha1: 555149A974826E7A491A1C2807827139A54F0D88 | sha256: F61118EFF1099D72330347EB5E35C07ABC46BD62AC1F36DA4DE69BE9BC25F744 | sha512: 258B972E607A6C0BBBC441FDC4E99F28E066E37CC05D9286053EEA20B1884D85DF49306846B02715643162F07E08F44A1D125D87F0EE48F4914928BB0F307263
tools\tools\bin\libvpx-1.dll
md5: 51D8B436C30272E64AD2F57AA91EEC11 | sha1: DE85EE8F149721EF85DA2BE86E94F0C2A9775EC5 | sha256: 7F935567B8F712510A67DD058295CD9E94A93293A8EBB9590BD63BAC5FA54243 | sha512: 97D95619A12F967193557C50FEFB334BAB5DFB359BEBF64B0A4FE73E6133E5B29A05B816D5324907CCFCCCDDDBE79551BB9A608AC3C98455A478E8DB0B9D01A4
tools\tools\bin\libwavpack-1.dll
md5: 3A523F8CC89BEBAAEA37C82853BEA4BC | sha1: E3B4062B0C58D7BF991919B931E3C99A1BC5D7F2 | sha256: 77F588A243C6213396093C3EBE2434112BD6F08C34A247CD8BE369134C2CFE46 | sha512: 9B591251F916B48A827C0901438677F9C088317707A0D9D87363F765CFD0AF08E946033CD8825F4D131D4C997095A2A318849B89B0FC18D6091920AF11E40BA9
tools\tools\bin\libwebp-7.dll
md5: 1E674866F35587D51C251FA851C58157 | sha1: E5082F335609F1C55BE33B4033BC272620338146 | sha256: 5AAE209D988D04FE343ECA4FCFECDFA9C84BF0BD8CB50946EB702E1C1A8D2AA6 | sha512: 8B0ED513172B4C69882DAFE87B7D6AD579F97DAD0BA104DD38C38F4F61AECC66E237347A15D8B98A31FBEDCEA12882AA5D820804BE4D5A80C7BD6290D3817163
tools\tools\bin\libwebpmux-3.dll
md5: 1594FB09D04E95552FCCA30BCEF166AC | sha1: 36A0E7450997777753B64D08FBFF580068818C2F | sha256: F375563811C38819CB08599905675D6456128ACD2F36C6B36BEB4C63ACCF1D02 | sha512: 52DBBFB77FFD50B116261C2D5D40E8F8B898A2C997FC2269D69CC22F7FC6D6A78223742533218488F722721C4E28E0F8C916C5840D32483B618F98380E4BAD96
tools\tools\bin\libwinpthread-1.dll
md5: 54D67242D4F900F5A064D5258E383976 | sha1: 30535999E848D34807D1F934BDACB81462AF33B5 | sha256: F64517BA6E09F64FC5B42740A6BA4F423182C6773ABF0E8736D784E2B009E611 | sha512: B929AFBAA114A35C6B8CD41ECCDFFB2C2F331F33DAC10BAAE1BC58C6AE90B53720C88080D0D1BAFA800020E1355A9329674B3CA08379A7ED6D8FC612BC09BAB2
tools\tools\bin\libx264-157.dll
md5: 76A95BA9681036973BECFBBBF0383612 | sha1: 99EE2F6731399B223C55D098C7685C934A0EDE1E | sha256: 120FC8FE053B2694BBB424EC87701D253C0C03BC5B205477277352B17007994B | sha512: 6070F68634F8AFE9F9CD3446681E2836333CCB223A8003A0D58CDB722D516E97527737FF61C4AA1B9313C95C84EF7FD3C728A0C52DBABB9BBEC63E4622EF4543
tools\tools\bin\libx265.dll
md5: 8A6898C661FF895E0DBE532CE5000539 | sha1: 0D326E0ED776B0AE59E365AEA0FA61BAE5A47626 | sha256: F1E09B336F9DCB6D777AB2132F1903709520767BF0D87D55944D0FED86690BAC | sha512: 179DC161244E3E058DC1B2033791838FB29511A46592321D9A37F044DCEC138FD93BE50FE3CCB6C0B5D2169BE39F8413C933850562D21ED8B8F47877A9E8C9C0
tools\tools\bin\libxml2-2.dll
md5: 29369F2ABC93916FB27B7C492443BC3A | sha1: 57465C01E295CBA049B740F0282CE626211DB88B | sha256: 3DD00982066043C7B4B0406911E6A0407327A5D92299F2E2B74C1FC539A2BD65 | sha512: C019E64B9B0DBE7A6C80C2B99C591C12686C25AC62BACD707B6541899D576111EAD0981DB81409EB64DA19C2AFC1A9D403BD7857ACFCDAB2E9960C23916F6B4C
tools\tools\bin\libzstd.dll
md5: AD1395BE8311813BC6D31F0DCEFF00EC | sha1: D6DB5668457430AD4F48F83B8D5F672643E48DA3 | sha256: F61D9830008BADDA706B02141147F02716F2C8DABC2F92C9CCC125D021AA7650 | sha512: 133CDE914944B4FE70E86DBA01BE6A95F250113DE872759FAFC79BBE27F3E303441B08B00AC24B8FFF9C31C3E643B51F155C7CD829DB4C891E0557F93C4F2BC1
tools\tools\bin\siril.exe
md5: F2C114918EE84B53D0639EE8632F6C67 | sha1: 920A6888F0A2E004C8B582C703EAC15B1ACA4653 | sha256: 9F54BC3A3EFF982125657CCC57638D1A62321B71E87B3F3ACBCF684047E72C8C | sha512: 09D16153C70A7840A8FF14C64D81404B235911E0A169800532D5CCE3F504425607CB533BB6C803D9449DCB842BC58676DABE18603EB146350917D486A5BD4BFC
tools\tools\bin\siril.exe.gui
 
tools\tools\bin\swresample-3.dll
md5: 62B3DEC083231227DEA3742E92C644DE | sha1: A8F1BBFC99327FC1E5D64406CFD7DE3884566D76 | sha256: 6EA8BC61BE8972BFF0CEDB0DD82C8B27A6BB5D3DA04EA2D2AA226FF9E271F7F4 | sha512: C93C9B3D9426B1A4D285D632CF510586C002C24AEC71DB0F05C49978AA4D1974E9F5AF2EFC1A5C2C9D2EC338349F0B93A509A4B265C15AB40C970131196A0909
tools\tools\bin\swscale-5.dll
md5: B379CBEFA636D8FD4103E6E802E686FE | sha1: 4CCC631D4576601DC786758A72A69B7AB54B4C0A | sha256: 9936DF8A0AED2CB8FBC5C5F8033329DC22B9EF49E2393D85AD59E2AFAFAA87DB | sha512: 12D614462F49664EF8B753BC3EC2186EA278F6CB3A59CDCCF44A1DE6D75047C629D7C74E620779F4AFCA1ECEF75AF89DF608E42CFF833FB52AFCD0DA7F867862
tools\tools\bin\tbb.dll
md5: 98CAD864EF9B9424FAEF3F44DB8B7C50 | sha1: 11508480E743BFB8CFB732F396CB499F39F65EB9 | sha256: 33C87FFADD4B4401C41048E7F998B96DCF3D345948A6C10E6E511AE6B14A26F3 | sha512: 5B0DF965DCFF65164451EE68E2154110C38DC5A274595B65EDB9BC0C7AC874B78650AF0AA12A8430EFE160566B1312767557B8572474BBCDACF76B812CC0F197
tools\tools\bin\xvidcore.dll
md5: 88B794290AC547B0958FD76ED8265705 | sha1: E39A0DC1E0BB555A026C38E9A5C26944AC6301FE | sha256: 3690E325EBA4874C94AC05BA0E48A58551254904AC5A344F3F7EC3247DBE481A | sha512: 00CCF80B927132333107FD716A7FEFD27028C359B8CFEB160AE9F6B76D867630B549D36F3583CAEB1CCBB95FC663C85203D29C313CDF40C3EFC464632840F9CC
tools\tools\bin\zlib1.dll
md5: 8715690438860EAECC98CDD95AA80AB8 | sha1: 92CF890392FEBC1C53A7417870CBC9AC373C7405 | sha256: 42566CADD56FEB726BE5544BF5552AA8D4009B415906A2E7AE7945212B16CFB8 | sha512: 989CE0028C0002842F1E7671076FA5CE6A1BDB7B364D008C04CBBA5CFE1ABBAAB20051E284CFC351E46C85D2816E9B1B214AD2BF642839A6DF84DE1C7C544249
tools\tools\chocolateyInstall.ps1
$ErrorActionPreference = 'Stop'; # stop on all errors
$toolsDir   = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)"

$target = Join-Path $toolsDir "bin\siril.exe"
Install-ChocolateyShortcut -shortcutFilePath "$([Environment]::GetFolderPath('CommonStartMenu'))\Programs\SIRIL.lnk" -targetPath "$target" -description "Astronomical image processing."
tools\tools\chocolateyUninstall.ps1
$ErrorActionPreference = 'Stop'

Remove-Item "$([Environment]::GetFolderPath('CommonStartMenu'))\Programs\SIRIL.lnk"
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders.cache
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-ani.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-ani.dll
md5: 1FE83199983F0947C91C4974F0A3679F | sha1: 989FE6B197AD66BC84000A2208FBED4AE913407C | sha256: 8D5204200B49D3B21E02B61BFA457B4C247596E049AE10438813DBC3D46D139F | sha512: 3CD12E546A6841A40FD2EB7C465ACCD85654AEE6680E309236AA6F93192813A6C533AF161E4D585A7DCFEC51CFCBFBE1CC634D014B7120C528CB2CF32DE551D0
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-ani.dll.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-bmp.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-bmp.dll
md5: D7EFA0448D6CEEC522A4C96D4A6BDD21 | sha1: 9B3F10F73519B76BD3F64CF56ADD9B7A8176E7CB | sha256: E2A8DE0CD361B26EC81A0A09BFC49649F7433DA551DACC5F6C076FC9008FC47D | sha512: 0257964EBB7DAE5DE0D9A61A7C08E87F86237DE1676957FA9DBFB1721A4904456D3705176897A01315F09F5D2F91C90F58EA33B4D805DAC26A887552C1CABCE5
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-bmp.dll.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-gif.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-gif.dll
md5: 3D23E681F5B66E3655B6683C716244B3 | sha1: 69D7AA1B2CAA2164C410EF9E4D7A4623CC677184 | sha256: 8D3A248322108267406EF5D5FE900AAC456E2E0308D633E22882C1FFFC686E3B | sha512: 1E4018097C325CBA2E51EF44EAEEB93AFBA28041D97F233328CDF7D33DB5CFF4B2C0C471C7F2A10CC91D84A8DDA54606A8028C05A335A41B673C93D38AD54608
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-gif.dll.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-icns.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-icns.dll
md5: 8C3219700B40A2CC1F24EE70DD7EA55D | sha1: 5FE9AADA77A03C34EF5C8DA956A8DBF4C9E7CD82 | sha256: 69CA24B59BE0E41A0C0FE1C3D58764551B313586DC43ACE6480DF5D5BDA4CF75 | sha512: A6B08E3B9012AFD583503C5547CB4CEFF29E6EB3DB3B717D70268C5C3B6AFE050C5EDAE88EAD672A8DD16F5465904B71D8E6413AFA0EF0F05B97B9D181A2432C
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-icns.dll.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-ico.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-ico.dll
md5: FF5FC91F1538881D06C7140E592AF996 | sha1: 37DB2F4037377AE737499B9C8C3A42B245F44255 | sha256: E06FEEDD4A5947EE2D6C3671B0B3681225C9332B29922CC95BC4231C7FAFEC76 | sha512: 3805FAC07E406FF33B7B211927A7A90F45680F3A655EEF051451D6C3D986C23153E923DBD440F4710B3C0CB69BD7F3523C6782726A2F5ED1F2D0A6A43FFC0603
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-ico.dll.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-jasper.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-jasper.dll
md5: AD032455211B7BA977FDD25DA0054B90 | sha1: 7EB3533F04A39954EE2A0A987C4FBBB847F30E6B | sha256: C948B1436E4F36190D75FD8474273C667D01619B9AF0D426DDF4C5FB4F99625D | sha512: BCAB45638DCBBE80840632F4EA8AD296CB930ED9F897CD86D343A1B9C89B17621F50AEC94F0225C96EDF2F4325603339BF5355FB0B580F326B53F4C819EE5E97
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-jasper.dll.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-jpeg.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-jpeg.dll
md5: 8EB0B952D030C99389D08DDF23E98EC8 | sha1: 7611627656DE91676A7B677E20338596348750A3 | sha256: B33AD43780B454590B94469B050F68920FDDEDA7F181AFBBEA254C1D9CE2CDC6 | sha512: 2E01FA6B08B66CE3A4AC1318327C6260FBABCB661C171D656919DE4CABDB4470AC734EB10FCCAE5BAD21F65E06DD29F5D70AAC1241BC198F4262EBFD8A7037E8
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-jpeg.dll.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-png.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-png.dll
md5: 0142503819C761F1627F91ABA6064376 | sha1: 59E9B753DDAB5D9F386E7558A3E35DC5D2DC27B6 | sha256: 1FDA8D88ACED9507276B7D09BDF76D9EF76F36B310154F34A83B8480FD3B1EAB | sha512: E379F3811F832CD3FD23B24C82F5A7682EFB49E11E4AE947FB3D1505FD4687DD10A8196874BCE267AD168A0A19BB0FD1BE00FDE09C6DD084D8E031F4C178BB7F
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-png.dll.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-pnm.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-pnm.dll
md5: 270E493523456CB404AE6615F6433471 | sha1: A3BDB57B473A28681BCDD6FA88A2D12A3502FB46 | sha256: 78EAA785D1399E3FD079949285CC9BA7BCC533622D73B676E77229BC5F9EA630 | sha512: 4CA52BA8472B7B84B9BDEFDB2FF4D066E9EE5476E569E44B74713912A99429D6395B872071C914A4F6388C563D5052DE163E20C6BB0137491F823766A4A9A628
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-pnm.dll.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-qtif.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-qtif.dll
md5: C0E5057D65C6AE4C518CA847D57A74A7 | sha1: 4D6A41C69916BBCAEE70297454B78A8D61622C1B | sha256: 40869753407ACC63E8346C989540F7C38C16441D5ECADD9F3215D85B5A96FC4E | sha512: 533E467B53A066E5444588F0A98D48666B193769A8E7F4EE958BCC11C992C1D2D0017E2F9D60812C0998DB6390632BDD4C841445C65612D4820746233DF82E4C
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-qtif.dll.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-svg.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-svg.dll
md5: 58C936549C7BECC08445EB1868D36D03 | sha1: C427F5CFBA0A021341BF1364D72A8D0E8D96594C | sha256: CEF35D3ACC1DDB888491A358408021367B62FB24B256E730F6727F0DB349DFBC | sha512: 73910C74E2B455110C2AB3913AFBB71C6C9CB9D216B8F3953D00FF60ED9A0BBB2005B78AE243C9147DD7D6848BA4C13DA526C65EC8DF01B48C094AFD32CFED42
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-svg.dll.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-tga.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-tga.dll
md5: F3DADDEEE9CE0D53D6653BC408076582 | sha1: A2B1AFB70E4790192AD79A21C1973C4223EB2FF8 | sha256: 5CEE349637FF7A6EFF8902676DEA2D86A434A3606E6456B83A3BDCBF57764583 | sha512: E3B9E9394012C239514751FD72A18C219E1CDD77A7F377612D83126019AB259D1007992FD8AE61B6A154C687B0443C7C72C9454FCE17386D8753624B7D5A4D92
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-tga.dll.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-tiff.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-tiff.dll
md5: 8BE7F1297B042AE3A2DDF8429B3B8CF4 | sha1: E2188FE4B477E27913C245CA847834F9B93F57EB | sha256: AEBD4C9CD39A00913BF917DBB67792ECE38892C6821CAF36E27BBBEAE1EBA174 | sha512: 7948F3DD7376AEB32913D68D1F207D69578289B5F8518EE618B063D478A9687B4C9DAEFF56A24AC2FC332F99323694FF762A463A1F25BAA2B9AD8070DB4038EE
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-tiff.dll.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-xbm.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-xbm.dll
md5: BC05F83EFBD2E7E8C20DE8D5D58BDBEE | sha1: E9DF9697B31A0BF9E6A815A707162324AF274095 | sha256: 4EFC0E63A574C84E206B8FF61E8571B1CE522390F441E8793AEFFB2BF2C04C23 | sha512: 5AC075875FC7E738E4C92A553EBADC3F9FE70214B32E386BFFC7FA936EFA5E58AA8FF250E5659C37CC119C90F7155DAB4B453C18791481A8DD8F33C8D9CE6515
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-xbm.dll.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-xpm.a
 
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-xpm.dll
md5: E3B389845EBC69FD38DD36B5AC8B5847 | sha1: 6D0D267F1518054F600D160972B1A1B24D096619 | sha256: 818472E315011AB5EE24F5A3233F0175BCD32EAE693E84A9451D3BBED12B1EC6 | sha512: 3F9EE006D32147E9B083493B64168C48C67EF64168E2D3F9DC37AB2796CE080DC41FF1519C6EAB398AC0972D8431BD55E5C7A0672AEA84B09520BB2018C06AB3
tools\tools\lib\gdk-pixbuf-2.0\2.10.0\loaders\libpixbufloader-xpm.dll.a
 
tools\tools\scripts\DSLR_preprocessing.ssf
 
tools\tools\share\doc\siril\AUTHORS
 
tools\tools\share\doc\siril\LICENSE.md
The GNU General Public License, Version 3, 29 June 2007 (GPLv3)
===============================================================

> Copyright © 2007
> Free Software Foundation, Inc.
> <<http://fsf.org/>>

Everyone is permitted to copy and distribute verbatim copies of this license
document, but changing it is not allowed.


Preamble
--------

The GNU General Public License is a free, copyleft license for software and
other kinds of works.

The licenses for most software and other practical works are designed to take
away your freedom to share and change the works. By contrast, the GNU General
Public License is intended to guarantee your freedom to share and change all
versions of a program--to make sure it remains free software for all its users.
We, the Free Software Foundation, use the GNU General Public License for most of
our software; it applies also to any other work released this way by its
authors. You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our
General Public Licenses are designed to make sure that you have the freedom to
distribute copies of free software (and charge for them if you wish), that you
receive source code or can get it if you want it, that you can change the
software or use pieces of it in new free programs, and that you know you can do
these things.

To protect your rights, we need to prevent others from denying you these rights
or asking you to surrender the rights. Therefore, you have certain
responsibilities if you distribute copies of the software, or if you modify it:
responsibilities to respect the freedom of others.

For example, if you distribute copies of such a program, whether gratis or for a
fee, you must pass on to the recipients the same freedoms that you received. You
must make sure that they, too, receive or can get the source code. And you must
show them these terms so they know their rights.

Developers that use the GNU GPL protect your rights with two steps: (1) assert
copyright on the software, and (2) offer you this License giving you legal
permission to copy, distribute and/or modify it.

For the developers' and authors' protection, the GPL clearly explains that there
is no warranty for this free software. For both users' and authors' sake, the
GPL requires that modified versions be marked as changed, so that their problems
will not be attributed erroneously to authors of previous versions.

Some devices are designed to deny users access to install or run modified
versions of the software inside them, although the manufacturer can do so. This
is fundamentally incompatible with the aim of protecting users' freedom to
change the software. The systematic pattern of such abuse occurs in the area of
products for individuals to use, which is precisely where it is most
unacceptable. Therefore, we have designed this version of the GPL to prohibit
the practice for those products. If such problems arise substantially in other
domains, we stand ready to extend this provision to those domains in future
versions of the GPL, as needed to protect the freedom of users.

Finally, every program is threatened constantly by software patents. States
should not allow patents to restrict development and use of software on
general-purpose computers, but in those that do, we wish to avoid the special
danger that patents applied to a free program could make it effectively
proprietary. To prevent this, the GPL assures that patents cannot be used to
render the program non-free.

The precise terms and conditions for copying, distribution and modification
follow.


TERMS AND CONDITIONS
--------------------


### 0. Definitions.

"This License refers to version 3 of the GNU General Public License.

"Copyright" also means copyright-like laws that apply to other kinds of works,
such as semiconductor masks.

"The Program" refers to any copyrightable work licensed under this License. Each
licensee is addressed as "you". "Licensees" and "recipients" may be individuals
or organizations.

To "modify" a work means to copy from or adapt all or part of the work in a
fashion requiring copyright permission, other than the making of an exact copy.
The resulting work is called a "modified version" of the earlier work or a work
"based on" the earlier work.

A "covered work" means either the unmodified Program or a work based on the
Program.

To "propagate" a work means to do anything with it that, without permission,
would make you directly or secondarily liable for infringement under applicable
copyright law, except executing it on a computer or modifying a private copy.
Propagation includes copying, distribution (with or without modification),
making available to the public, and in some countries other activities as well.

To "convey" a work means any kind of propagation that enables other parties to
make or receive copies. Mere interaction with a user through a computer network,
with no transfer of a copy, is not conveying.

An interactive user interface displays "Appropriate Legal Notices" to the extent
that it includes a convenient and prominently visible feature that (1) displays
an appropriate copyright notice, and (2) tells the user that there is no
warranty for the work (except to the extent that warranties are provided), that
licensees may convey the work under this License, and how to view a copy of this
License. If the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.


### 1. Source Code.

The "source code" for a work means the preferred form of the work for making
modifications to it. "Object code" means any non-source form of a work.

A "Standard Interface" means an interface that either is an official standard
defined by a recognized standards body, or, in the case of interfaces specified
for a particular programming language, one that is widely used among developers
working in that language.

The "System Libraries" of an executable work include anything, other than the
work as a whole, that (a) is included in the normal form of packaging a Major
Component, but which is not part of that Major Component, and (b) serves only to
enable use of the work with that Major Component, or to implement a Standard
Interface for which an implementation is available to the public in source code
form. A "Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system (if any) on
which the executable work runs, or a compiler used to produce the work, or an
object code interpreter used to run it.

The "Corresponding Source" for a work in object code form means all the source
code needed to generate, install, and (for an executable work) run the object
code and to modify the work, including scripts to control those activities.
However, it does not include the work's System Libraries, or general-purpose
tools or generally available free programs which are used unmodified in
performing those activities but which are not part of the work. For example,
Corresponding Source includes interface definition files associated with source
files for the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require, such as by
intimate data communication or control flow between those subprograms and other
parts of the work.

The Corresponding Source need not include anything that users can regenerate
automatically from other parts of the Corresponding Source.

The Corresponding Source for a work in source code form is that same work.


### 2. Basic Permissions.

All rights granted under this License are granted for the term of copyright on
the Program, and are irrevocable provided the stated conditions are met. This
License explicitly affirms your unlimited permission to run the unmodified
Program. The output from running a covered work is covered by this License only
if the output, given its content, constitutes a covered work. This License
acknowledges your rights of fair use or other equivalent, as provided by
copyright law.

You may make, run and propagate covered works that you do not convey, without
conditions so long as your license otherwise remains in force. You may convey
covered works to others for the sole purpose of having them make modifications
exclusively for you, or provide you with facilities for running those works,
provided that you comply with the terms of this License in conveying all
material for which you do not control copyright. Those thus making or running
the covered works for you must do so exclusively on your behalf, under your
direction and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

Conveying under any other circumstances is permitted solely under the conditions
stated below. Sublicensing is not allowed; section 10 makes it unnecessary.


### 3. Protecting Users' Legal Rights From Anti-Circumvention Law.

No covered work shall be deemed part of an effective technological measure under
any applicable law fulfilling obligations under article 11 of the WIPO copyright
treaty adopted on 20 December 1996, or similar laws prohibiting or restricting
circumvention of such measures.

When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention is
effected by exercising rights under this License with respect to the covered
work, and you disclaim any intention to limit operation or modification of the
work as a means of enforcing, against the work's users, your or third parties'
legal rights to forbid circumvention of technological measures.


### 4. Conveying Verbatim Copies.

You may convey verbatim copies of the Program's source code as you receive it,
in any medium, provided that you conspicuously and appropriately publish on each
copy an appropriate copyright notice; keep intact all notices stating that this
License and any non-permissive terms added in accord with section 7 apply to the
code; keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

You may charge any price or no price for each copy that you convey, and you may
offer support or warranty protection for a fee.


### 5. Conveying Modified Source Versions.

You may convey a work based on the Program, or the modifications to produce it
from the Program, in the form of source code under the terms of section 4,
provided that you also meet all of these conditions:

*   **a)** The work must carry prominent notices stating that you modified it,
    and giving a relevant date.

*   **b)** The work must carry prominent notices stating that it is released
    under this License and any conditions added under section 7. This
    requirement modifies the requirement in section 4 to "keep intact all
    notices".

*   **c)** You must license the entire work, as a whole, under this License to
    anyone who comes into possession of a copy. This License will therefore
    apply, along with any applicable section 7 additional terms, to the whole of
    the work, and all its parts, regardless of how they are packaged. This
    License gives no permission to license the work in any other way, but it
    does not invalidate such permission if you have separately received it.

*   **d)** If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your work need not
    make them do so.

A compilation of a covered work with other separate and independent works,
which are not by their nature extensions of the covered work, and which are
not combined with it such as to form a larger program, in or on a volume of
a storage or distribution medium, is called an "aggregate" if the
compilation and its resulting copyright are not used to limit the access or
legal rights of the compilation's users beyond what the individual works
permit. Inclusion of a covered work in an aggregate does not cause this
License to apply to the other parts of the aggregate.


### 6. Conveying Non-Source Forms.

You may convey a covered work in object code form under the terms of sections 4
and 5, provided that you also convey the machine-readable Corresponding Source
under the terms of this License, in one of these ways:

*   **a)** Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the Corresponding
    Source fixed on a durable physical medium customarily used for software
    interchange.

*   **b)** Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a written offer,
    valid for at least three years and valid for as long as you offer spare
    parts or customer support for that product model, to give anyone who
    possesses the object code either (1) a copy of the Corresponding Source for
    all the software in the product that is covered by this License, on a
    durable physical medium customarily used for software interchange, for a
    price no more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the Corresponding Source from a
    network server at no charge.

*   **c)** Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source. This alternative is
    allowed only occasionally and noncommercially, and only if you received the
    object code with such an offer, in accord with subsection 6b.

*   **d)** Convey the object code by offering access from a designated place
    (gratis or for a charge), and offer equivalent access to the Corresponding
    Source in the same way through the same place at no further charge. You need
    not require recipients to copy the Corresponding Source along with the
    object code. If the place to copy the object code is a network server, the
    Corresponding Source may be on a different server (operated by you or a
    third party) that supports equivalent copying facilities, provided you
    maintain clear directions next to the object code saying where to find the
    Corresponding Source. Regardless of what server hosts the Corresponding
    Source, you remain obligated to ensure that it is available for as long as
    needed to satisfy these requirements.

*   **e)** Convey the object code using peer-to-peer transmission, provided you
    inform other peers where the object code and Corresponding Source of the
    work are being offered to the general public at no charge under subsection
    6d.

A separable portion of the object code, whose source code is excluded from
the Corresponding Source as a System Library, need not be included in
conveying the object code work.

A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family, or
household purposes, or (2) anything designed or sold for incorporation into
a dwelling. In determining whether a product is a consumer product, doubtful
cases shall be resolved in favor of coverage. For a particular product
received by a particular user, "normally used" refers to a typical or common
use of that class of product, regardless of the status of the particular
user or of the way in which the particular user actually uses, or expects or
is expected to use, the product. A product is a consumer product regardless
of whether the product has substantial commercial, industrial or non-
consumer uses, unless such uses represent the only significant mode of use
of the product.

"Installation Information" for a User Product means any methods, procedures,
authorization keys, or other information required to install and execute
modified versions of a covered work in that User Product from a modified
version of its Corresponding Source. The information must suffice to ensure
that the continued functioning of the modified object code is in no case
prevented or interfered with solely because modification has been made.

If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as part of
a transaction in which the right of possession and use of the User Product
is transferred to the recipient in perpetuity or for a fixed term
(regardless of how the transaction is characterized), the Corresponding
Source conveyed under this section must be accompanied by the Installation
Information. But this requirement does not apply if neither you nor any
third party retains the ability to install modified object code on the User
Product (for example, the work has been installed in ROM).

The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates for
a work that has been modified or installed by the recipient, or for the User
Product in which it has been modified or installed. Access to a network may
be denied when the modification itself materially and adversely affects the
operation of the network or violates the rules and protocols for
communication across the network.

Corresponding Source conveyed, and Installation Information provided, in
accord with this section must be in a format that is publicly documented
(and with an implementation available to the public in source code form),
and must require no special password or key for unpacking, reading or
copying.


### 7. Additional Terms.

"Additional permissions" are terms that supplement the terms of this License by
making exceptions from one or more of its conditions. Additional permissions
that are applicable to the entire Program shall be treated as though they were
included in this License, to the extent that they are valid under applicable
law. If additional permissions apply only to part of the Program, that part may
be used separately under those permissions, but the entire Program remains
governed by this License without regard to the additional permissions.

When you convey a copy of a covered work, you may at your option remove any
additional permissions from that copy, or from any part of it. (Additional
permissions may be written to require their own removal in certain cases when
you modify the work.) You may place additional permissions on material, added by
you to a covered work, for which you have or can give appropriate copyright
permission.

Notwithstanding any other provision of this License, for material you add to a
covered work, you may (if authorized by the copyright holders of that material)
supplement the terms of this License with terms:

*   **a)** Disclaiming warranty or limiting liability differently from the terms
    of sections 15 and 16 of this License; or

*   **b)** Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal Notices
    displayed by works containing it; or

*   **c)** Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in reasonable
    ways as different from the original version; or

*   **d)** Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

*   **e)** Declining to grant rights under trademark law for use of some trade
    names, trademarks, or service marks; or

*   **f)** Requiring indemnification of licensors and authors of that material
    by anyone who conveys the material (or modified versions of it) with
    contractual assumptions of liability to the recipient, for any liability
    that these contractual assumptions directly impose on those licensors and
    authors.

All other non-permissive additional terms are considered "further restrictions"
within the meaning of section 10. If the Program as you received it, or any part
of it, contains a notice stating that it is governed by this License along with
a term that is a further restriction, you may remove that term. If a license
document contains a further restriction but permits relicensing or conveying
under this License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does not survive
such relicensing or conveying.

If you add terms to a covered work in accord with this section, you must place,
in the relevant source files, a statement of the additional terms that apply to
those files, or a notice indicating where to find the applicable terms.

Additional terms, permissive or non-permissive, may be stated in the form of a
separately written license, or stated as exceptions; the above requirements
apply either way.


### 8. Termination.

You may not propagate or modify a covered work except as expressly provided
under this License. Any attempt otherwise to propagate or modify it is void, and
will automatically terminate your rights under this License (including any
patent licenses granted under the third paragraph of section 11).

However, if you cease all violation of this License, then your license from a
particular copyright holder is reinstated (a) provisionally, unless and until
the copyright holder explicitly and finally terminates your license, and (b)
permanently, if the copyright holder fails to notify you of the violation by
some reasonable means prior to 60 days after the cessation.

Moreover, your license from a particular copyright holder is reinstated
permanently if the copyright holder notifies you of the violation by some
reasonable means, this is the first time you have received notice of violation
of this License (for any work) from that copyright holder, and you cure the
violation prior to 30 days after your receipt of the notice.

Termination of your rights under this section does not terminate the licenses of
parties who have received copies or rights from you under this License. If your
rights have been terminated and not permanently reinstated, you do not qualify
to receive new licenses for the same material under section 10.


### 9. Acceptance Not Required for Having Copies.

You are not required to accept this License in order to receive or run a copy of
the Program. Ancillary propagation of a covered work occurring solely as a
consequence of using peer-to-peer transmission to receive a copy likewise does
not require acceptance. However, nothing other than this License grants you
permission to propagate or modify any covered work. These actions infringe
copyright if you do not accept this License. Therefore, by modifying or
propagating a covered work, you indicate your acceptance of this License to do
so.


### 10. Automatic Licensing of Downstream Recipients.

Each time you convey a covered work, the recipient automatically receives a
license from the original licensors, to run, modify and propagate that work,
subject to this License. You are not responsible for enforcing compliance by
third parties with this License.

An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered work results
from an entity transaction, each party to that transaction who receives a copy
of the work also receives whatever licenses to the work the party's predecessor
in interest had or could give under the previous paragraph, plus a right to
possession of the Corresponding Source of the work from the predecessor in
interest, if the predecessor has it or can get it with reasonable efforts.

You may not impose any further restrictions on the exercise of the rights
granted or affirmed under this License. For example, you may not impose a
license fee, royalty, or other charge for exercise of rights granted under this
License, and you may not initiate litigation (including a cross-claim or
counterclaim in a lawsuit) alleging that any patent claim is infringed by
making, using, selling, offering for sale, or importing the Program or any
portion of it.


### 11. Patents.

A "contributor" is a copyright holder who authorizes use under this License of
the Program or a work on which the Program is based. The work thus licensed is
called the contributor's "contributor version".

A contributor's "essential patent claims" are all patent claims owned or
controlled by the contributor, whether already acquired or hereafter acquired,
that would be infringed by some manner, permitted by this License, of making,
using, or selling its contributor version, but do not include claims that would
be infringed only as a consequence of further modification of the contributor
version. For purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of this License.

Each contributor grants you a non-exclusive, worldwide, royalty-free patent
license under the contributor's essential patent claims, to make, use, sell,
offer for sale, import and otherwise run, modify and propagate the contents of
its contributor version.

In the following three paragraphs, a "patent license" is any express agreement
or commitment, however denominated, not to enforce a patent (such as an express
permission to practice a patent or covenant not to sue for patent infringement).
To "grant" such a patent license to a party means to make such an agreement or
commitment not to enforce a patent against the party.

If you convey a covered work, knowingly relying on a patent license, and the
Corresponding Source of the work is not available for anyone to copy, free of
charge and under the terms of this License, through a publicly available network
server or other readily accessible means, then you must either (1) cause the
Corresponding Source to be so available, or (2) arrange to deprive yourself of
the benefit of the patent license for this particular work, or (3) arrange, in a
manner consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have actual
knowledge that, but for the patent license, your conveying the covered work in a
country, or your recipient's use of the covered work in a country, would
infringe one or more identifiable patents in that country that you have reason
to believe are valid.

If, pursuant to or in connection with a single transaction or arrangement, you
convey, or propagate by procuring conveyance of, a covered work, and grant a
patent license to some of the parties receiving the covered work authorizing
them to use, propagate, modify or convey a specific copy of the covered work,
then the patent license you grant is automatically extended to all recipients of
the covered work and works based on it.

A patent license is "discriminatory" if it does not include within the scope of
its coverage, prohibits the exercise of, or is conditioned on the non- exercise
of one or more of the rights that are specifically granted under this License.
You may not convey a covered work if you are a party to an arrangement with a
third party that is in the business of distributing software, under which you
make payment to the third party based on the extent of your activity of
conveying the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory patent
license (a) in connection with copies of the covered work conveyed by you (or
copies made from those copies), or (b) primarily for and in connection with
specific products or compilations that contain the covered work, unless you
entered into that arrangement, or that patent license was granted, prior to 28
March 2007.

Nothing in this License shall be construed as excluding or limiting any implied
license or other defenses to infringement that may otherwise be available to you
under applicable patent law.


### 12. No Surrender of Others' Freedom.

If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not excuse
you from the conditions of this License. If you cannot convey a covered work so
as to satisfy simultaneously your obligations under this License and any other
pertinent obligations, then as a consequence you may not convey it at all. For
example, if you agree to terms that obligate you to collect a royalty for
further conveying from those to whom you convey the Program, the only way you
could satisfy both those terms and this License would be to refrain entirely
from conveying the Program.


### 13. Use with the GNU Affero General Public License.

Notwithstanding any other provision of this License, you have permission to link
or combine any covered work with a work licensed under version 3 of the GNU
Affero General Public License into a single combined work, and to convey the
resulting work. The terms of this License will continue to apply to the part
which is the covered work, but the special requirements of the GNU Affero
General Public License, section 13, concerning interaction through a network
will apply to the combination as such.


### 14. Revised Versions of this License.

The Free Software Foundation may publish revised and/or new versions of the GNU
General Public License from time to time. Such new versions will be similar in
spirit to the present version, but may differ in detail to address new problems
or concerns.

Each version is given a distinguishing version number. If the Program specifies
that a certain numbered version of the GNU General Public License "or any later
version" applies to it, you have the option of following the terms and
conditions either of that numbered version or of any later version published by
the Free Software Foundation. If the Program does not specify a version number
of the GNU General Public License, you may choose any version ever published by
the Free Software Foundation.

If the Program specifies that a proxy can decide which future versions of the
GNU General Public License can be used, that proxy's public statement of
acceptance of a version permanently authorizes you to choose that version for
the Program.

Later license versions may give you additional or different permissions.
However, no additional obligations are imposed on any author or copyright holder
as a result of your choosing to follow a later version.


### 15. Disclaimer of Warranty.

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER
PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE
QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.


### 16. Limitation of Liability.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY
COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS
PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE
PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY
HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

### 17. Interpretation of Sections 15 and 16.

If the disclaimer of warranty and limitation of liability provided above cannot
be given local legal effect according to their terms, reviewing courts shall
apply local law that most closely approximates an absolute waiver of all civil
liability in connection with the Program, unless a warranty or assumption of
liability accompanies a copy of the Program in return for a fee.

END OF TERMS AND CONDITIONS


How to Apply These Terms to Your New Programs
---------------------------------------------

If you develop a new program, and you want it to be of the greatest possible use
to the public, the best way to achieve this is to make it free software which
everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach
them to the start of each source file to most effectively state the exclusion of
warranty; and each file should have at least the "copyright" line and a pointer
to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by the Free
    Software Foundation, either version 3 of the License, or (at your option)
    any later version.

    This program is distributed in the hope that it will be useful, but WITHOUT
    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
    more details.

    You should have received a copy of the GNU General Public License along with
    this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like
this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'.
    This is free software, and you are welcome to redistribute it under certain
    conditions; type 'show c' for details.

The hypothetical commands 'show w' and 'show c' should show the appropriate
parts of the General Public License. Of course, your program's commands might be
different; for a GUI interface, you would use an "about box".

You should also get your employer (if you work as a programmer) or school, if
any, to sign a "copyright disclaimer" for the program, if necessary. For more
information on this, and how to apply and follow the GNU GPL, see
<<http://www.gnu.org/licenses/>>.

The GNU General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may consider
it more useful to permit linking proprietary applications with the library. If
this is what you want to do, use the GNU Lesser General Public License instead
of this License. But first, please read
<<http://www.gnu.org/philosophy/why-not-lgpl.html>>.
tools\tools\share\glib-2.0\codegen\codegen.py
# -*- Mode: Python -*-
# coding=utf-8

# GDBus - GLib D-Bus Library
#
# Copyright (C) 2008-2018 Red Hat, Inc.
# Copyright (C) 2018 Iñigo Martínez <[email protected]>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General
# Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
#
# Author: David Zeuthen <[email protected]>

import sys

from . import config
from . import utils
from . import dbustypes
from .utils import print_error

LICENSE_STR = '''/*
 * Generated by gdbus-codegen {!s} from {!s}. DO NOT EDIT.
 *
 * The license of this code is the same as for the D-Bus interface description
 * it was derived from.
 */\n'''

def generate_namespace(namespace):
    ns = namespace
    if len(namespace) > 0:
        if utils.is_ugly_case(namespace):
            ns = namespace.replace('_', '')
            ns_upper = namespace.upper() + '_'
            ns_lower = namespace.lower() + '_'
        else:
            ns_upper = utils.camel_case_to_uscore(namespace).upper() + '_'
            ns_lower = utils.camel_case_to_uscore(namespace).lower() + '_'
    else:
        ns_upper = ''
        ns_lower = ''

    return (ns, ns_upper, ns_lower)

class HeaderCodeGenerator:
    def __init__(self, ifaces, namespace, generate_objmanager,
                 generate_autocleanup, header_name, input_files_basenames,
                 use_pragma, outfile):
        self.ifaces = ifaces
        self.namespace, self.ns_upper, self.ns_lower = generate_namespace(namespace)
        self.generate_objmanager = generate_objmanager
        self.generate_autocleanup = generate_autocleanup
        self.header_guard = header_name.upper().replace('.', '_').replace('-', '_').replace('/', '_').replace(':', '_')
        self.input_files_basenames = input_files_basenames
        self.use_pragma = use_pragma
        self.outfile = outfile

    # ----------------------------------------------------------------------------------------------------

    def generate_header_preamble(self):
        basenames = ', '.join(self.input_files_basenames)
        self.outfile.write(LICENSE_STR.format(config.VERSION, basenames))
        self.outfile.write('\n')

        if self.use_pragma:
            self.outfile.write('#pragma once\n')
        else:
            self.outfile.write('#ifndef __{!s}__\n'.format(self.header_guard))
            self.outfile.write('#define __{!s}__\n'.format(self.header_guard))

        self.outfile.write('\n')
        self.outfile.write('#include <gio/gio.h>\n')
        self.outfile.write('\n')
        self.outfile.write('G_BEGIN_DECLS\n')
        self.outfile.write('\n')

    # ----------------------------------------------------------------------------------------------------

    def declare_types(self):
        for i in self.ifaces:
            self.outfile.write('\n')
            self.outfile.write('/* ------------------------------------------------------------------------ */\n')
            self.outfile.write('/* Declarations for %s */\n'%i.name)
            self.outfile.write('\n')

            # First the GInterface
            self.outfile.write('#define %sTYPE_%s (%s_get_type ())\n'%(i.ns_upper, i.name_upper, i.name_lower))
            self.outfile.write('#define %s%s(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_%s, %s))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('#define %sIS_%s(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_%s))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper))
            self.outfile.write('#define %s%s_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), %sTYPE_%s, %sIface))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('\n')
            self.outfile.write('struct _%s;\n'%(i.camel_name))
            self.outfile.write('typedef struct _%s %s;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('typedef struct _%sIface %sIface;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('\n')
            self.outfile.write('struct _%sIface\n'%(i.camel_name))
            self.outfile.write('{\n')
            self.outfile.write('  GTypeInterface parent_iface;\n')

            function_pointers = {}

            # vfuncs for methods
            if len(i.methods) > 0:
                self.outfile.write('\n')
                for m in i.methods:
                    unix_fd = False
                    if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'):
                        unix_fd = True
                    key = (m.since, '_method_%s'%m.name_lower)
                    value  = '  gboolean (*handle_%s) (\n'%(m.name_lower)
                    value += '    %s *object,\n'%(i.camel_name)
                    value += '    GDBusMethodInvocation *invocation'%()
                    if unix_fd:
                        value += ',\n    GUnixFDList *fd_list'
                    for a in m.in_args:
                        value += ',\n    %sarg_%s'%(a.ctype_in, a.name)
                    value += ');\n\n'
                    function_pointers[key] = value

            # vfuncs for signals
            if len(i.signals) > 0:
                self.outfile.write('\n')
                for s in i.signals:
                    key = (s.since, '_signal_%s'%s.name_lower)
                    value  = '  void (*%s) (\n'%(s.name_lower)
                    value += '    %s *object'%(i.camel_name)
                    for a in s.args:
                        value += ',\n    %sarg_%s'%(a.ctype_in, a.name)
                    value += ');\n\n'
                    function_pointers[key] = value

            # vfuncs for properties
            if len(i.properties) > 0:
                self.outfile.write('\n')
                for p in i.properties:
                    key = (p.since, '_prop_get_%s'%p.name_lower)
                    value = '  %s (*get_%s) (%s *object);\n\n'%(p.arg.ctype_in, p.name_lower, i.camel_name)
                    function_pointers[key] = value

            # Sort according to @since tag, then name.. this ensures
            # that the function pointers don't change order assuming
            # judicious use of @since
            #
            # Also use a proper version comparison function so e.g.
            # 10.0 comes after 2.0.
            #
            # See https://bugzilla.gnome.org/show_bug.cgi?id=647577#c5
            # for discussion
            for key in sorted(function_pointers.keys(), key=utils.version_cmp_key):
                self.outfile.write('%s'%function_pointers[key])

            self.outfile.write('};\n')
            self.outfile.write('\n')
            if self.generate_autocleanup == 'all':
                self.outfile.write('#if GLIB_CHECK_VERSION(2, 44, 0)\n')
                self.outfile.write('G_DEFINE_AUTOPTR_CLEANUP_FUNC (%s, g_object_unref)\n' % (i.camel_name))
                self.outfile.write('#endif\n')
                self.outfile.write('\n')
            self.outfile.write('GType %s_get_type (void) G_GNUC_CONST;\n'%(i.name_lower))
            self.outfile.write('\n')
            self.outfile.write('GDBusInterfaceInfo *%s_interface_info (void);\n'%(i.name_lower))
            self.outfile.write('guint %s_override_properties (GObjectClass *klass, guint property_id_begin);\n'%(i.name_lower))
            self.outfile.write('\n')

            # Then method call completion functions
            if len(i.methods) > 0:
                self.outfile.write('\n')
                self.outfile.write('/* D-Bus method call completion functions: */\n')
                for m in i.methods:
                    unix_fd = False
                    if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'):
                        unix_fd = True
                    if m.deprecated:
                        self.outfile.write('G_GNUC_DEPRECATED ')
                    self.outfile.write('void %s_complete_%s (\n'
                                       '    %s *object,\n'
                                       '    GDBusMethodInvocation *invocation'%(i.name_lower, m.name_lower, i.camel_name))
                    if unix_fd:
                        self.outfile.write(',\n    GUnixFDList *fd_list')
                    for a in m.out_args:
                        self.outfile.write(',\n    %s%s'%(a.ctype_in, a.name))
                    self.outfile.write(');\n')
                    self.outfile.write('\n')
                self.outfile.write('\n')

            # Then signal emission functions
            if len(i.signals) > 0:
                self.outfile.write('\n')
                self.outfile.write('/* D-Bus signal emissions functions: */\n')
                for s in i.signals:
                    if s.deprecated:
                        self.outfile.write('G_GNUC_DEPRECATED ')
                    self.outfile.write('void %s_emit_%s (\n'
                                       '    %s *object'%(i.name_lower, s.name_lower, i.camel_name))
                    for a in s.args:
                        self.outfile.write(',\n    %sarg_%s'%(a.ctype_in, a.name))
                    self.outfile.write(');\n')
                    self.outfile.write('\n')
                self.outfile.write('\n')

            # Then method call declarations
            if len(i.methods) > 0:
                self.outfile.write('\n')
                self.outfile.write('/* D-Bus method calls: */\n')
                for m in i.methods:
                    unix_fd = False
                    if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'):
                        unix_fd = True
                    # async begin
                    if m.deprecated:
                        self.outfile.write('G_GNUC_DEPRECATED ')
                    self.outfile.write('void %s_call_%s (\n'
                                       '    %s *proxy'%(i.name_lower, m.name_lower, i.camel_name))
                    for a in m.in_args:
                        self.outfile.write(',\n    %sarg_%s'%(a.ctype_in, a.name))
                    if unix_fd:
                        self.outfile.write(',\n    GUnixFDList *fd_list')
                    self.outfile.write(',\n'
                                       '    GCancellable *cancellable,\n'
                                       '    GAsyncReadyCallback callback,\n'
                                       '    gpointer user_data);\n')
                    self.outfile.write('\n')
                    # async finish
                    if m.deprecated:
                        self.outfile.write('G_GNUC_DEPRECATED ')
                    self.outfile.write('gboolean %s_call_%s_finish (\n'
                                       '    %s *proxy'%(i.name_lower, m.name_lower, i.camel_name))
                    for a in m.out_args:
                        self.outfile.write(',\n    %sout_%s'%(a.ctype_out, a.name))
                    if unix_fd:
                        self.outfile.write(',\n    GUnixFDList **out_fd_list')
                    self.outfile.write(',\n'
                                       '    GAsyncResult *res,\n'
                                       '    GError **error);\n')
                    self.outfile.write('\n')
                    # sync
                    if m.deprecated:
                        self.outfile.write('G_GNUC_DEPRECATED ')
                    self.outfile.write('gboolean %s_call_%s_sync (\n'
                                       '    %s *proxy'%(i.name_lower, m.name_lower, i.camel_name))
                    for a in m.in_args:
                        self.outfile.write(',\n    %sarg_%s'%(a.ctype_in, a.name))
                    if unix_fd:
                        self.outfile.write(',\n    GUnixFDList  *fd_list')
                    for a in m.out_args:
                        self.outfile.write(',\n    %sout_%s'%(a.ctype_out, a.name))
                    if unix_fd:
                        self.outfile.write(',\n    GUnixFDList **out_fd_list')
                    self.outfile.write(',\n'
                                       '    GCancellable *cancellable,\n'
                                       '    GError **error);\n')
                    self.outfile.write('\n')
                self.outfile.write('\n')

            # Then the property accessor declarations
            if len(i.properties) > 0:
                self.outfile.write('\n')
                self.outfile.write('/* D-Bus property accessors: */\n')
                for p in i.properties:
                    # getter
                    if p.deprecated:
                        self.outfile.write('G_GNUC_DEPRECATED ')
                    self.outfile.write('%s%s_get_%s (%s *object);\n'%(p.arg.ctype_in, i.name_lower, p.name_lower, i.camel_name))
                    if p.arg.free_func != None:
                        if p.deprecated:
                            self.outfile.write('G_GNUC_DEPRECATED ')
                        self.outfile.write('%s%s_dup_%s (%s *object);\n'%(p.arg.ctype_in_dup, i.name_lower, p.name_lower, i.camel_name))
                    # setter
                    if p.deprecated:
                        self.outfile.write('G_GNUC_DEPRECATED ')
                    self.outfile.write('void %s_set_%s (%s *object, %svalue);\n'%(i.name_lower, p.name_lower, i.camel_name, p.arg.ctype_in, ))
                    self.outfile.write('\n')

            # Then the proxy
            self.outfile.write('\n')
            self.outfile.write('/* ---- */\n')
            self.outfile.write('\n')
            self.outfile.write('#define %sTYPE_%s_PROXY (%s_proxy_get_type ())\n'%(i.ns_upper, i.name_upper, i.name_lower))
            self.outfile.write('#define %s%s_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_%s_PROXY, %sProxy))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('#define %s%s_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %sTYPE_%s_PROXY, %sProxyClass))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('#define %s%s_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %sTYPE_%s_PROXY, %sProxyClass))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('#define %sIS_%s_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_%s_PROXY))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper))
            self.outfile.write('#define %sIS_%s_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %sTYPE_%s_PROXY))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper))
            self.outfile.write('\n')
            self.outfile.write('typedef struct _%sProxy %sProxy;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('typedef struct _%sProxyClass %sProxyClass;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('typedef struct _%sProxyPrivate %sProxyPrivate;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('\n')
            self.outfile.write('struct _%sProxy\n'%(i.camel_name))
            self.outfile.write('{\n')
            self.outfile.write('  /*< private >*/\n')
            self.outfile.write('  GDBusProxy parent_instance;\n')
            self.outfile.write('  %sProxyPrivate *priv;\n'%(i.camel_name))
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('struct _%sProxyClass\n'%(i.camel_name))
            self.outfile.write('{\n')
            self.outfile.write('  GDBusProxyClass parent_class;\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('GType %s_proxy_get_type (void) G_GNUC_CONST;\n'%(i.name_lower))
            self.outfile.write('\n')
            if self.generate_autocleanup in ('objects', 'all'):
                self.outfile.write('#if GLIB_CHECK_VERSION(2, 44, 0)\n')
                self.outfile.write('G_DEFINE_AUTOPTR_CLEANUP_FUNC (%sProxy, g_object_unref)\n' % (i.camel_name))
                self.outfile.write('#endif\n')
                self.outfile.write('\n')
            if i.deprecated:
                self.outfile.write('G_GNUC_DEPRECATED ')
            self.outfile.write('void %s_proxy_new (\n'
                               '    GDBusConnection     *connection,\n'
                               '    GDBusProxyFlags      flags,\n'
                               '    const gchar         *name,\n'
                               '    const gchar         *object_path,\n'
                               '    GCancellable        *cancellable,\n'
                               '    GAsyncReadyCallback  callback,\n'
                               '    gpointer             user_data);\n'
                               %(i.name_lower))
            if i.deprecated:
                self.outfile.write('G_GNUC_DEPRECATED ')
            self.outfile.write('%s *%s_proxy_new_finish (\n'
                               '    GAsyncResult        *res,\n'
                               '    GError             **error);\n'
                               %(i.camel_name, i.name_lower))
            if i.deprecated:
                self.outfile.write('G_GNUC_DEPRECATED ')
            self.outfile.write('%s *%s_proxy_new_sync (\n'
                               '    GDBusConnection     *connection,\n'
                               '    GDBusProxyFlags      flags,\n'
                               '    const gchar         *name,\n'
                               '    const gchar         *object_path,\n'
                               '    GCancellable        *cancellable,\n'
                               '    GError             **error);\n'
                               %(i.camel_name, i.name_lower))
            self.outfile.write('\n')
            if i.deprecated:
                self.outfile.write('G_GNUC_DEPRECATED ')
            self.outfile.write('void %s_proxy_new_for_bus (\n'
                               '    GBusType             bus_type,\n'
                               '    GDBusProxyFlags      flags,\n'
                               '    const gchar         *name,\n'
                               '    const gchar         *object_path,\n'
                               '    GCancellable        *cancellable,\n'
                               '    GAsyncReadyCallback  callback,\n'
                               '    gpointer             user_data);\n'
                               %(i.name_lower))
            if i.deprecated:
                self.outfile.write('G_GNUC_DEPRECATED ')
            self.outfile.write('%s *%s_proxy_new_for_bus_finish (\n'
                               '    GAsyncResult        *res,\n'
                               '    GError             **error);\n'
                               %(i.camel_name, i.name_lower))
            if i.deprecated:
                self.outfile.write('G_GNUC_DEPRECATED ')
            self.outfile.write('%s *%s_proxy_new_for_bus_sync (\n'
                               '    GBusType             bus_type,\n'
                               '    GDBusProxyFlags      flags,\n'
                               '    const gchar         *name,\n'
                               '    const gchar         *object_path,\n'
                               '    GCancellable        *cancellable,\n'
                               '    GError             **error);\n'
                               %(i.camel_name, i.name_lower))
            self.outfile.write('\n')

            # Then the skeleton
            self.outfile.write('\n')
            self.outfile.write('/* ---- */\n')
            self.outfile.write('\n')
            self.outfile.write('#define %sTYPE_%s_SKELETON (%s_skeleton_get_type ())\n'%(i.ns_upper, i.name_upper, i.name_lower))
            self.outfile.write('#define %s%s_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_%s_SKELETON, %sSkeleton))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('#define %s%s_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %sTYPE_%s_SKELETON, %sSkeletonClass))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('#define %s%s_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %sTYPE_%s_SKELETON, %sSkeletonClass))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('#define %sIS_%s_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_%s_SKELETON))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper))
            self.outfile.write('#define %sIS_%s_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %sTYPE_%s_SKELETON))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper))
            self.outfile.write('\n')
            self.outfile.write('typedef struct _%sSkeleton %sSkeleton;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('typedef struct _%sSkeletonClass %sSkeletonClass;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('typedef struct _%sSkeletonPrivate %sSkeletonPrivate;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('\n')
            self.outfile.write('struct _%sSkeleton\n'%(i.camel_name))
            self.outfile.write('{\n')
            self.outfile.write('  /*< private >*/\n')
            self.outfile.write('  GDBusInterfaceSkeleton parent_instance;\n')
            self.outfile.write('  %sSkeletonPrivate *priv;\n'%(i.camel_name))
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('struct _%sSkeletonClass\n'%(i.camel_name))
            self.outfile.write('{\n')
            self.outfile.write('  GDBusInterfaceSkeletonClass parent_class;\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('GType %s_skeleton_get_type (void) G_GNUC_CONST;\n'%(i.name_lower))
            self.outfile.write('\n')
            if self.generate_autocleanup in ('objects', 'all'):
                self.outfile.write('#if GLIB_CHECK_VERSION(2, 44, 0)\n')
                self.outfile.write('G_DEFINE_AUTOPTR_CLEANUP_FUNC (%sSkeleton, g_object_unref)\n' % (i.camel_name))
                self.outfile.write('#endif\n')
                self.outfile.write('\n')
            if i.deprecated:
                self.outfile.write('G_GNUC_DEPRECATED ')
            self.outfile.write('%s *%s_skeleton_new (void);\n'%(i.camel_name, i.name_lower))

            self.outfile.write('\n')

        # Finally, the Object, ObjectProxy, ObjectSkeleton and ObjectManagerClient
        if self.generate_objmanager:
            self.outfile.write('\n')
            self.outfile.write('/* ---- */\n')
            self.outfile.write('\n')
            self.outfile.write('#define %sTYPE_OBJECT (%sobject_get_type ())\n'%(self.ns_upper, self.ns_lower))
            self.outfile.write('#define %sOBJECT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_OBJECT, %sObject))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sIS_OBJECT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_OBJECT))\n'%(self.ns_upper, self.ns_upper))
            self.outfile.write('#define %sOBJECT_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), %sTYPE_OBJECT, %sObject))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('\n')
            self.outfile.write('struct _%sObject;\n'%(self.namespace))
            self.outfile.write('typedef struct _%sObject %sObject;\n'%(self.namespace, self.namespace))
            self.outfile.write('typedef struct _%sObjectIface %sObjectIface;\n'%(self.namespace, self.namespace))
            self.outfile.write('\n')
            self.outfile.write('struct _%sObjectIface\n'%(self.namespace))
            self.outfile.write('{\n'
                               '  GTypeInterface parent_iface;\n'
                               '};\n'
                               '\n')
            self.outfile.write('GType %sobject_get_type (void) G_GNUC_CONST;\n'
                               '\n'
                               %(self.ns_lower))
            if self.generate_autocleanup == 'all':
                self.outfile.write('#if GLIB_CHECK_VERSION(2, 44, 0)\n')
                self.outfile.write('G_DEFINE_AUTOPTR_CLEANUP_FUNC (%sObject, g_object_unref)\n' % (self.namespace))
                self.outfile.write('#endif\n')
                self.outfile.write('\n')
            for i in self.ifaces:
                if i.deprecated:
                    self.outfile.write('G_GNUC_DEPRECATED ')
                self.outfile.write('%s *%sobject_get_%s (%sObject *object);\n'
                                   %(i.camel_name, self.ns_lower, i.name_upper.lower(), self.namespace))
            for i in self.ifaces:
                if i.deprecated:
                    self.outfile.write('G_GNUC_DEPRECATED ')
                self.outfile.write('%s *%sobject_peek_%s (%sObject *object);\n'
                                   %(i.camel_name, self.ns_lower, i.name_upper.lower(), self.namespace))
            self.outfile.write('\n')
            self.outfile.write('#define %sTYPE_OBJECT_PROXY (%sobject_proxy_get_type ())\n'%(self.ns_upper, self.ns_lower))
            self.outfile.write('#define %sOBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_OBJECT_PROXY, %sObjectProxy))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sOBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %sTYPE_OBJECT_PROXY, %sObjectProxyClass))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sOBJECT_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %sTYPE_OBJECT_PROXY, %sObjectProxyClass))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sIS_OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_OBJECT_PROXY))\n'%(self.ns_upper, self.ns_upper))
            self.outfile.write('#define %sIS_OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %sTYPE_OBJECT_PROXY))\n'%(self.ns_upper, self.ns_upper))
            self.outfile.write('\n')
            self.outfile.write('typedef struct _%sObjectProxy %sObjectProxy;\n'%(self.namespace, self.namespace))
            self.outfile.write('typedef struct _%sObjectProxyClass %sObjectProxyClass;\n'%(self.namespace, self.namespace))
            self.outfile.write('typedef struct _%sObjectProxyPrivate %sObjectProxyPrivate;\n'%(self.namespace, self.namespace))
            self.outfile.write('\n')
            self.outfile.write('struct _%sObjectProxy\n'%(self.namespace))
            self.outfile.write('{\n')
            self.outfile.write('  /*< private >*/\n')
            self.outfile.write('  GDBusObjectProxy parent_instance;\n')
            self.outfile.write('  %sObjectProxyPrivate *priv;\n'%(self.namespace))
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('struct _%sObjectProxyClass\n'%(self.namespace))
            self.outfile.write('{\n')
            self.outfile.write('  GDBusObjectProxyClass parent_class;\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('GType %sobject_proxy_get_type (void) G_GNUC_CONST;\n'%(self.ns_lower))
            self.outfile.write('\n')
            if self.generate_autocleanup in ('objects', 'all'):
                self.outfile.write('#if GLIB_CHECK_VERSION(2, 44, 0)\n')
                self.outfile.write('G_DEFINE_AUTOPTR_CLEANUP_FUNC (%sObjectProxy, g_object_unref)\n' % (self.namespace))
                self.outfile.write('#endif\n')
                self.outfile.write('\n')
            self.outfile.write('%sObjectProxy *%sobject_proxy_new (GDBusConnection *connection, const gchar *object_path);\n'%(self.namespace, self.ns_lower))
            self.outfile.write('\n')
            self.outfile.write('#define %sTYPE_OBJECT_SKELETON (%sobject_skeleton_get_type ())\n'%(self.ns_upper, self.ns_lower))
            self.outfile.write('#define %sOBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_OBJECT_SKELETON, %sObjectSkeleton))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sOBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %sTYPE_OBJECT_SKELETON, %sObjectSkeletonClass))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sOBJECT_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %sTYPE_OBJECT_SKELETON, %sObjectSkeletonClass))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sIS_OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_OBJECT_SKELETON))\n'%(self.ns_upper, self.ns_upper))
            self.outfile.write('#define %sIS_OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %sTYPE_OBJECT_SKELETON))\n'%(self.ns_upper, self.ns_upper))
            self.outfile.write('\n')
            self.outfile.write('typedef struct _%sObjectSkeleton %sObjectSkeleton;\n'%(self.namespace, self.namespace))
            self.outfile.write('typedef struct _%sObjectSkeletonClass %sObjectSkeletonClass;\n'%(self.namespace, self.namespace))
            self.outfile.write('typedef struct _%sObjectSkeletonPrivate %sObjectSkeletonPrivate;\n'%(self.namespace, self.namespace))
            self.outfile.write('\n')
            self.outfile.write('struct _%sObjectSkeleton\n'%(self.namespace))
            self.outfile.write('{\n')
            self.outfile.write('  /*< private >*/\n')
            self.outfile.write('  GDBusObjectSkeleton parent_instance;\n')
            self.outfile.write('  %sObjectSkeletonPrivate *priv;\n'%(self.namespace))
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('struct _%sObjectSkeletonClass\n'%(self.namespace))
            self.outfile.write('{\n')
            self.outfile.write('  GDBusObjectSkeletonClass parent_class;\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('GType %sobject_skeleton_get_type (void) G_GNUC_CONST;\n'%(self.ns_lower))
            self.outfile.write('\n')
            if self.generate_autocleanup in ('objects', 'all'):
                self.outfile.write('#if GLIB_CHECK_VERSION(2, 44, 0)\n')
                self.outfile.write('G_DEFINE_AUTOPTR_CLEANUP_FUNC (%sObjectSkeleton, g_object_unref)\n' % (self.namespace))
                self.outfile.write('#endif\n')
                self.outfile.write('\n')
            self.outfile.write('%sObjectSkeleton *%sobject_skeleton_new (const gchar *object_path);\n'
                               %(self.namespace, self.ns_lower))
            for i in self.ifaces:
                if i.deprecated:
                    self.outfile.write('G_GNUC_DEPRECATED ')
                self.outfile.write('void %sobject_skeleton_set_%s (%sObjectSkeleton *object, %s *interface_);\n'
                                   %(self.ns_lower, i.name_upper.lower(), self.namespace, i.camel_name))
            self.outfile.write('\n')

            self.outfile.write('/* ---- */\n')
            self.outfile.write('\n')
            self.outfile.write('#define %sTYPE_OBJECT_MANAGER_CLIENT (%sobject_manager_client_get_type ())\n'%(self.ns_upper, self.ns_lower))
            self.outfile.write('#define %sOBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_OBJECT_MANAGER_CLIENT, %sObjectManagerClient))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sOBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %sTYPE_OBJECT_MANAGER_CLIENT, %sObjectManagerClientClass))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sOBJECT_MANAGER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %sTYPE_OBJECT_MANAGER_CLIENT, %sObjectManagerClientClass))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sIS_OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_OBJECT_MANAGER_CLIENT))\n'%(self.ns_upper, self.ns_upper))
            self.outfile.write('#define %sIS_OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %sTYPE_OBJECT_MANAGER_CLIENT))\n'%(self.ns_upper, self.ns_upper))
            self.outfile.write('\n')
            self.outfile.write('typedef struct _%sObjectManagerClient %sObjectManagerClient;\n'%(self.namespace, self.namespace))
            self.outfile.write('typedef struct _%sObjectManagerClientClass %sObjectManagerClientClass;\n'%(self.namespace, self.namespace))
            self.outfile.write('typedef struct _%sObjectManagerClientPrivate %sObjectManagerClientPrivate;\n'%(self.namespace, self.namespace))
            self.outfile.write('\n')
            self.outfile.write('struct _%sObjectManagerClient\n'%(self.namespace))
            self.outfile.write('{\n')
            self.outfile.write('  /*< private >*/\n')
            self.outfile.write('  GDBusObjectManagerClient parent_instance;\n')
            self.outfile.write('  %sObjectManagerClientPrivate *priv;\n'%(self.namespace))
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('struct _%sObjectManagerClientClass\n'%(self.namespace))
            self.outfile.write('{\n')
            self.outfile.write('  GDBusObjectManagerClientClass parent_class;\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')
            if self.generate_autocleanup in ('objects', 'all'):
                self.outfile.write('#if GLIB_CHECK_VERSION(2, 44, 0)\n')
                self.outfile.write('G_DEFINE_AUTOPTR_CLEANUP_FUNC (%sObjectManagerClient, g_object_unref)\n' % (self.namespace))
                self.outfile.write('#endif\n')
                self.outfile.write('\n')
            self.outfile.write('GType %sobject_manager_client_get_type (void) G_GNUC_CONST;\n'%(self.ns_lower))
            self.outfile.write('\n')
            self.outfile.write('GType %sobject_manager_client_get_proxy_type (GDBusObjectManagerClient *manager, const gchar *object_path, const gchar *interface_name, gpointer user_data);\n'%(self.ns_lower))
            self.outfile.write('\n')
            self.outfile.write('void %sobject_manager_client_new (\n'
                               '    GDBusConnection        *connection,\n'
                               '    GDBusObjectManagerClientFlags  flags,\n'
                               '    const gchar            *name,\n'
                               '    const gchar            *object_path,\n'
                               '    GCancellable           *cancellable,\n'
                               '    GAsyncReadyCallback     callback,\n'
                               '    gpointer                user_data);\n'
                               %(self.ns_lower))
            self.outfile.write('GDBusObjectManager *%sobject_manager_client_new_finish (\n'
                               '    GAsyncResult        *res,\n'
                               '    GError             **error);\n'
                               %(self.ns_lower))
            self.outfile.write('GDBusObjectManager *%sobject_manager_client_new_sync (\n'
                               '    GDBusConnection        *connection,\n'
                               '    GDBusObjectManagerClientFlags  flags,\n'
                               '    const gchar            *name,\n'
                               '    const gchar            *object_path,\n'
                               '    GCancellable           *cancellable,\n'
                               '    GError                **error);\n'
                               %(self.ns_lower))
            self.outfile.write('\n')
            self.outfile.write('void %sobject_manager_client_new_for_bus (\n'
                               '    GBusType                bus_type,\n'
                               '    GDBusObjectManagerClientFlags  flags,\n'
                               '    const gchar            *name,\n'
                               '    const gchar            *object_path,\n'
                               '    GCancellable           *cancellable,\n'
                               '    GAsyncReadyCallback     callback,\n'
                               '    gpointer                user_data);\n'
                               %(self.ns_lower))
            self.outfile.write('GDBusObjectManager *%sobject_manager_client_new_for_bus_finish (\n'
                               '    GAsyncResult        *res,\n'
                               '    GError             **error);\n'
                               %(self.ns_lower))
            self.outfile.write('GDBusObjectManager *%sobject_manager_client_new_for_bus_sync (\n'
                               '    GBusType                bus_type,\n'
                               '    GDBusObjectManagerClientFlags  flags,\n'
                               '    const gchar            *name,\n'
                               '    const gchar            *object_path,\n'
                               '    GCancellable           *cancellable,\n'
                               '    GError                **error);\n'
                               %(self.ns_lower))
            self.outfile.write('\n')

    # ----------------------------------------------------------------------------------------------------

    def generate_header_postamble(self):
        self.outfile.write('\n')
        self.outfile.write('G_END_DECLS\n')

        if not self.use_pragma:
            self.outfile.write('\n')
            self.outfile.write('#endif /* __{!s}__ */\n'.format(self.header_guard))

    # ----------------------------------------------------------------------------------------------------

    def generate(self):
        self.generate_header_preamble()
        self.declare_types()
        self.generate_header_postamble()

# ----------------------------------------------------------------------------------------------------

class InterfaceInfoHeaderCodeGenerator:
    def __init__(self, ifaces, namespace, header_name, input_files_basenames, use_pragma, outfile):
        self.ifaces = ifaces
        self.namespace, self.ns_upper, self.ns_lower = generate_namespace(namespace)
        self.header_guard = header_name.upper().replace('.', '_').replace('-', '_').replace('/', '_').replace(':', '_')
        self.input_files_basenames = input_files_basenames
        self.use_pragma = use_pragma
        self.outfile = outfile

    # ----------------------------------------------------------------------------------------------------

    def generate_header_preamble(self):
        basenames = ', '.join(self.input_files_basenames)
        self.outfile.write(LICENSE_STR.format(config.VERSION, basenames))
        self.outfile.write('\n')

        if self.use_pragma:
            self.outfile.write('#pragma once\n')
        else:
            self.outfile.write('#ifndef __{!s}__\n'.format(self.header_guard))
            self.outfile.write('#define __{!s}__\n'.format(self.header_guard))

        self.outfile.write('\n')
        self.outfile.write('#include <gio/gio.h>\n')
        self.outfile.write('\n')
        self.outfile.write('G_BEGIN_DECLS\n')
        self.outfile.write('\n')

    # ----------------------------------------------------------------------------------------------------

    def declare_infos(self):
        for i in self.ifaces:
            self.outfile.write('extern const GDBusInterfaceInfo %s_interface;\n' % i.name_lower)

    # ----------------------------------------------------------------------------------------------------

    def generate_header_postamble(self):
        self.outfile.write('\n')
        self.outfile.write('G_END_DECLS\n')

        if not self.use_pragma:
            self.outfile.write('\n')
            self.outfile.write('#endif /* __{!s}__ */\n'.format(self.header_guard))

    # ----------------------------------------------------------------------------------------------------

    def generate(self):
        self.generate_header_preamble()
        self.declare_infos()
        self.generate_header_postamble()

# ----------------------------------------------------------------------------------------------------

class InterfaceInfoBodyCodeGenerator:
    def __init__(self, ifaces, namespace, header_name, input_files_basenames, outfile):
        self.ifaces = ifaces
        self.namespace, self.ns_upper, self.ns_lower = generate_namespace(namespace)
        self.header_name = header_name
        self.input_files_basenames = input_files_basenames
        self.outfile = outfile

    # ----------------------------------------------------------------------------------------------------

    def generate_body_preamble(self):
        basenames = ', '.join(self.input_files_basenames)
        self.outfile.write(LICENSE_STR.format(config.VERSION, basenames))
        self.outfile.write('\n')
        self.outfile.write('#ifdef HAVE_CONFIG_H\n'
                           '#  include "config.h"\n'
                           '#endif\n'
                           '\n'
                           '#include "%s"\n'
                           '\n'
                           '#include <string.h>\n'
                           % (self.header_name))
        self.outfile.write('\n')

    # ----------------------------------------------------------------------------------------------------

    def generate_array(self, array_name_lower, element_type, elements):
        self.outfile.write('const %s * const %s[] =\n' % (element_type, array_name_lower))
        self.outfile.write('{\n')
        for (_, name) in elements:
            self.outfile.write('  &%s,\n' % name)
        self.outfile.write('  NULL,\n')
        self.outfile.write('};\n')
        self.outfile.write('\n')

    def define_annotations(self, array_name_lower, annotations):
        if len(annotations) == 0:
            return

        annotation_pointers = []

        for a in annotations:
            # Skip internal annotations.
            if a.key.startswith('org.gtk.GDBus'):
                continue

            self.define_annotations('%s__%s_annotations' % (array_name_lower, a.key_lower), a.annotations)

            self.outfile.write('const GDBusAnnotationInfo %s__%s_annotation =\n' % (array_name_lower, a.key_lower))
            self.outfile.write('{\n')
            self.outfile.write('  -1,  /* ref count */\n')
            self.outfile.write('  (gchar *) "%s",\n' % a.key)
            self.outfile.write('  (gchar *) "%s",\n' % a.value)
            if len(a.annotations) > 0:
                self.outfile.write('  (GDBusAnnotationInfo **) %s__%s_annotations,\n' % (array_name_lower, a.key_lower))
            else:
                self.outfile.write('  NULL,  /* no annotations */\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')

            key = (a.since, '%s__%s_annotation' % (array_name_lower, a.key_lower))
            annotation_pointers.append(key)

        self.generate_array(array_name_lower, 'GDBusAnnotationInfo',
                            annotation_pointers)

    def define_args(self, array_name_lower, args):
        if len(args) == 0:
            return

        arg_pointers = []

        for a in args:
            self.define_annotations('%s__%s_arg_annotations' % (array_name_lower, a.name), a.annotations)

            self.outfile.write('const GDBusArgInfo %s__%s_arg =\n' % (array_name_lower, a.name))
            self.outfile.write('{\n')
            self.outfile.write('  -1,  /* ref count */\n')
            self.outfile.write('  (gchar *) "%s",\n' % a.name)
            self.outfile.write('  (gchar *) "%s",\n' % a.signature)
            if len(a.annotations) > 0:
                self.outfile.write('  (GDBusAnnotationInfo **) %s__%s_arg_annotations,\n' % (array_name_lower, a.name))
            else:
                self.outfile.write('  NULL,  /* no annotations */\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')

            key = (a.since, '%s__%s_arg' % (array_name_lower, a.name))
            arg_pointers.append(key)

        self.generate_array(array_name_lower, 'GDBusArgInfo', arg_pointers)

    def define_infos(self):
        for i in self.ifaces:
            self.outfile.write('/* ------------------------------------------------------------------------ */\n')
            self.outfile.write('/* Definitions for %s */\n' % i.name)
            self.outfile.write('\n')

            # GDBusMethodInfos.
            if len(i.methods) > 0:
                method_pointers = []

                for m in i.methods:
                    self.define_args('%s_interface__%s_method_in_args' % (i.name_lower, m.name_lower), m.in_args)
                    self.define_args('%s_interface__%s_method_out_args' % (i.name_lower, m.name_lower), m.out_args)
                    self.define_annotations('%s_interface__%s_method_annotations' % (i.name_lower, m.name_lower), m.annotations)

                    self.outfile.write('const GDBusMethodInfo %s_interface__%s_method =\n' % (i.name_lower, m.name_lower))
                    self.outfile.write('{\n')
                    self.outfile.write('  -1,  /* ref count */\n')
                    self.outfile.write('  (gchar *) "%s",\n' % m.name)
                    if len(m.in_args) > 0:
                        self.outfile.write('  (GDBusArgInfo **) %s_interface__%s_method_in_args,\n' % (i.name_lower, m.name_lower))
                    else:
                        self.outfile.write('  NULL,  /* no in args */\n')
                    if len(m.out_args) > 0:
                        self.outfile.write('  (GDBusArgInfo **) %s_interface__%s_method_out_args,\n' % (i.name_lower, m.name_lower))
                    else:
                        self.outfile.write('  NULL,  /* no out args */\n')
                    if len(m.annotations) > 0:
                        self.outfile.write('  (GDBusAnnotationInfo **) %s_interface__%s_method_annotations,\n' % (i.name_lower, m.name_lower))
                    else:
                        self.outfile.write('  NULL,  /* no annotations */\n')
                    self.outfile.write('};\n')
                    self.outfile.write('\n')

                    key = (m.since, '%s_interface__%s_method' % (i.name_lower, m.name_lower))
                    method_pointers.append(key)

                self.generate_array('%s_interface_methods' % i.name_lower,
                                    'GDBusMethodInfo', method_pointers)

            # GDBusSignalInfos.
            if len(i.signals) > 0:
                signal_pointers = []

                for s in i.signals:
                    self.define_args('%s_interface__%s_signal_args' % (i.name_lower, s.name_lower), s.args)
                    self.define_annotations('%s_interface__%s_signal_annotations' % (i.name_lower, s.name_lower), s.annotations)

                    self.outfile.write('const GDBusSignalInfo %s_interface__%s_signal =\n' % (i.name_lower, s.name_lower))
                    self.outfile.write('{\n')
                    self.outfile.write('  -1,  /* ref count */\n')
                    self.outfile.write('  (gchar *) "%s",\n' % s.name)
                    if len(s.args) > 0:
                        self.outfile.write('  (GDBusArgInfo **) %s_interface__%s_signal_args,\n' % (i.name_lower, s.name_lower))
                    else:
                        self.outfile.write('  NULL,  /* no args */\n')
                    if len(s.annotations) > 0:
                        self.outfile.write('  (GDBusAnnotationInfo **) %s_interface__%s_signal_annotations,\n' % (i.name_lower, s.name_lower))
                    else:
                        self.outfile.write('  NULL,  /* no annotations */\n')
                    self.outfile.write('};\n')
                    self.outfile.write('\n')

                    key = (s.since, '%s_interface__%s_signal' % (i.name_lower, s.name_lower))
                    signal_pointers.append(key)

                self.generate_array('%s_interface_signals' % i.name_lower,
                                    'GDBusSignalInfo', signal_pointers)

            # GDBusPropertyInfos.
            if len(i.properties) > 0:
                property_pointers = []

                for p in i.properties:
                    if p.readable and p.writable:
                        flags = 'G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE'
                    elif p.readable:
                        flags = 'G_DBUS_PROPERTY_INFO_FLAGS_READABLE'
                    elif p.writable:
                        flags = 'G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE'
                    else:
                        flags = 'G_DBUS_PROPERTY_INFO_FLAGS_NONE'

                    self.define_annotations('%s_interface__%s_property_annotations' % (i.name_lower, p.name_lower), p.annotations)

                    self.outfile.write('const GDBusPropertyInfo %s_interface__%s_property =\n' % (i.name_lower, p.name_lower))
                    self.outfile.write('{\n')
                    self.outfile.write('  -1,  /* ref count */\n')
                    self.outfile.write('  (gchar *) "%s",\n' % p.name)
                    self.outfile.write('  (gchar *) "%s",\n' % p.signature)
                    self.outfile.write('  %s,\n' % flags)
                    if len(p.annotations) > 0:
                        self.outfile.write('  (GDBusAnnotationInfo **) %s_interface__%s_property_annotations,\n' % (i.name_lower, p.name_lower))
                    else:
                        self.outfile.write('  NULL,  /* no annotations */\n')
                    self.outfile.write('};\n')
                    self.outfile.write('\n')

                    key = (p.since, '%s_interface__%s_property' % (i.name_lower, p.name_lower))
                    property_pointers.append(key)

                self.generate_array('%s_interface_properties' % i.name_lower,
                                    'GDBusPropertyInfo', property_pointers)

            # Finally the GDBusInterfaceInfo.
            self.define_annotations('%s_interface_annotations' % i.name_lower,
                                    i.annotations)

            self.outfile.write('const GDBusInterfaceInfo %s_interface =\n' % i.name_lower)
            self.outfile.write('{\n')
            self.outfile.write('  -1,  /* ref count */\n')
            self.outfile.write('  (gchar *) "%s",\n' % i.name)
            if len(i.methods) > 0:
                self.outfile.write('  (GDBusMethodInfo **) %s_interface_methods,\n' % i.name_lower)
            else:
                self.outfile.write('  NULL,  /* no methods */\n')
            if len(i.signals) > 0:
                self.outfile.write('  (GDBusSignalInfo **) %s_interface_signals,\n' % i.name_lower)
            else:
                self.outfile.write('  NULL,  /* no signals */\n')
            if len(i.properties) > 0:
                self.outfile.write('  (GDBusPropertyInfo **) %s_interface_properties,\n' % i.name_lower)
            else:
                self.outfile.write(  'NULL,  /* no properties */\n')
            if len(i.annotations) > 0:
                self.outfile.write('  (GDBusAnnotationInfo **) %s_interface_annotations,\n' % i.name_lower)
            else:
                self.outfile.write('  NULL,  /* no annotations */\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')

    # ----------------------------------------------------------------------------------------------------

    def generate(self):
        self.generate_body_preamble()
        self.define_infos()

# ----------------------------------------------------------------------------------------------------

class CodeGenerator:
    def __init__(self, ifaces, namespace, generate_objmanager, header_name,
                 input_files_basenames, docbook_gen, outfile):
        self.ifaces = ifaces
        self.namespace, self.ns_upper, self.ns_lower = generate_namespace(namespace)
        self.generate_objmanager = generate_objmanager
        self.header_name = header_name
        self.input_files_basenames = input_files_basenames
        self.docbook_gen = docbook_gen
        self.outfile = outfile

    # ----------------------------------------------------------------------------------------------------

    def generate_body_preamble(self):
        basenames = ', '.join(self.input_files_basenames)
        self.outfile.write(LICENSE_STR.format(config.VERSION, basenames))
        self.outfile.write('\n')
        self.outfile.write('#ifdef HAVE_CONFIG_H\n'
                           '#  include "config.h"\n'
                           '#endif\n'
                           '\n'
                           '#include "%s"\n'
                           '\n'
                           '#include <string.h>\n'
                           %(self.header_name))

        self.outfile.write('#ifdef G_OS_UNIX\n'
                           '#  include <gio/gunixfdlist.h>\n'
                           '#endif\n'
                           '\n')

        self.outfile.write('typedef struct\n'
                           '{\n'
                           '  GDBusArgInfo parent_struct;\n'
                           '  gboolean use_gvariant;\n'
                           '} _ExtendedGDBusArgInfo;\n'
                           '\n')

        self.outfile.write('typedef struct\n'
                           '{\n'
                           '  GDBusMethodInfo parent_struct;\n'
                           '  const gchar *signal_name;\n'
                           '  gboolean pass_fdlist;\n'
                           '} _ExtendedGDBusMethodInfo;\n'
                           '\n')

        self.outfile.write('typedef struct\n'
                           '{\n'
                           '  GDBusSignalInfo parent_struct;\n'
                           '  const gchar *signal_name;\n'
                           '} _ExtendedGDBusSignalInfo;\n'
                           '\n')

        self.outfile.write('typedef struct\n'
                           '{\n'
                           '  GDBusPropertyInfo parent_struct;\n'
                           '  const gchar *hyphen_name;\n'
                           '  guint use_gvariant : 1;\n'
                           '  guint emits_changed_signal : 1;\n'
                           '} _ExtendedGDBusPropertyInfo;\n'
                           '\n')

        self.outfile.write('typedef struct\n'
                           '{\n'
                           '  GDBusInterfaceInfo parent_struct;\n'
                           '  const gchar *hyphen_name;\n'
                           '} _ExtendedGDBusInterfaceInfo;\n'
                           '\n')

        self.outfile.write('typedef struct\n'
                           '{\n'
                           '  const _ExtendedGDBusPropertyInfo *info;\n'
                           '  guint prop_id;\n'
                           '  GValue orig_value; /* the value before the change */\n'
                           '} ChangedProperty;\n'
                           '\n'
                           'static void\n'
                           '_changed_property_free (ChangedProperty *data)\n'
                           '{\n'
                           '  g_value_unset (&data->orig_value);\n'
                           '  g_free (data);\n'
                           '}\n'
                           '\n')

        self.outfile.write('static gboolean\n'
                           '_g_strv_equal0 (gchar **a, gchar **b)\n'
                           '{\n'
                           '  gboolean ret = FALSE;\n'
                           '  guint n;\n'
                           '  if (a == NULL && b == NULL)\n'
                           '    {\n'
                           '      ret = TRUE;\n'
                           '      goto out;\n'
                           '    }\n'
                           '  if (a == NULL || b == NULL)\n'
                           '    goto out;\n'
                           '  if (g_strv_length (a) != g_strv_length (b))\n'
                           '    goto out;\n'
                           '  for (n = 0; a[n] != NULL; n++)\n'
                           '    if (g_strcmp0 (a[n], b[n]) != 0)\n'
                           '      goto out;\n'
                           '  ret = TRUE;\n'
                           'out:\n'
                           '  return ret;\n'
                           '}\n'
                           '\n')

        self.outfile.write('static gboolean\n'
                           '_g_variant_equal0 (GVariant *a, GVariant *b)\n'
                           '{\n'
                           '  gboolean ret = FALSE;\n'
                           '  if (a == NULL && b == NULL)\n'
                           '    {\n'
                           '      ret = TRUE;\n'
                           '      goto out;\n'
                           '    }\n'
                           '  if (a == NULL || b == NULL)\n'
                           '    goto out;\n'
                           '  ret = g_variant_equal (a, b);\n'
                           'out:\n'
                           '  return ret;\n'
                           '}\n'
                           '\n')

        # simplified - only supports the types we use
        self.outfile.write('G_GNUC_UNUSED static gboolean\n'
                           '_g_value_equal (const GValue *a, const GValue *b)\n'
                           '{\n'
                           '  gboolean ret = FALSE;\n'
                           '  g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b));\n'
                           '  switch (G_VALUE_TYPE (a))\n'
                           '    {\n'
                           '      case G_TYPE_BOOLEAN:\n'
                           '        ret = (g_value_get_boolean (a) == g_value_get_boolean (b));\n'
                           '        break;\n'
                           '      case G_TYPE_UCHAR:\n'
                           '        ret = (g_value_get_uchar (a) == g_value_get_uchar (b));\n'
                           '        break;\n'
                           '      case G_TYPE_INT:\n'
                           '        ret = (g_value_get_int (a) == g_value_get_int (b));\n'
                           '        break;\n'
                           '      case G_TYPE_UINT:\n'
                           '        ret = (g_value_get_uint (a) == g_value_get_uint (b));\n'
                           '        break;\n'
                           '      case G_TYPE_INT64:\n'
                           '        ret = (g_value_get_int64 (a) == g_value_get_int64 (b));\n'
                           '        break;\n'
                           '      case G_TYPE_UINT64:\n'
                           '        ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b));\n'
                           '        break;\n'
                           '      case G_TYPE_DOUBLE:\n'
                           '        {\n'
                           '          /* Avoid -Wfloat-equal warnings by doing a direct bit compare */\n'
                           '          gdouble da = g_value_get_double (a);\n'
                           '          gdouble db = g_value_get_double (b);\n'
                           '          ret = memcmp (&da, &db, sizeof (gdouble)) == 0;\n'
                           '        }\n'
                           '        break;\n'
                           '      case G_TYPE_STRING:\n'
                           '        ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0);\n'
                           '        break;\n'
                           '      case G_TYPE_VARIANT:\n'
                           '        ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b));\n'
                           '        break;\n'
                           '      default:\n'
                           '        if (G_VALUE_TYPE (a) == G_TYPE_STRV)\n'
                           '          ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b));\n'
                           '        else\n'
                           '          g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a)));\n'
                           '        break;\n'
                           '    }\n'
                           '  return ret;\n'
                           '}\n'
                           '\n')

    def generate_annotations(self, prefix, annotations):
        if annotations is None:
            return

        n = 0
        for a in annotations:
            #self.generate_annotations('%s_%d'%(prefix, n), a.get_annotations())

            # skip internal annotations
            if a.key.startswith('org.gtk.GDBus'):
                continue

            self.outfile.write('static const GDBusAnnotationInfo %s_%d =\n'
                               '{\n'
                               '  -1,\n'
                               '  (gchar *) "%s",\n'
                               '  (gchar *) "%s",\n'%(prefix, n, a.key, a.value))
            if len(a.annotations) == 0:
                self.outfile.write('  NULL\n')
            else:
                self.outfile.write('  (GDBusAnnotationInfo **) &%s_%d_pointers\n'%(prefix, n))
            self.outfile.write('};\n'
                               '\n')
            n += 1

        if n > 0:
            self.outfile.write('static const GDBusAnnotationInfo * const %s_pointers[] =\n'
                               '{\n'%(prefix))
            m = 0;
            for a in annotations:
                if a.key.startswith('org.gtk.GDBus'):
                    continue
                self.outfile.write('  &%s_%d,\n'%(prefix, m))
                m += 1
            self.outfile.write('  NULL\n'
                               '};\n'
                               '\n')
        return n

    def generate_args(self, prefix, args):
        for a in args:
            num_anno = self.generate_annotations('%s_arg_%s_annotation_info'%(prefix, a.name), a.annotations)

            self.outfile.write('static const _ExtendedGDBusArgInfo %s_%s =\n'
                               '{\n'
                               '  {\n'
                               '    -1,\n'
                               '    (gchar *) "%s",\n'
                               '    (gchar *) "%s",\n'%(prefix, a.name, a.name, a.signature))
            if num_anno == 0:
                self.outfile.write('    NULL\n')
            else:
                self.outfile.write('    (GDBusAnnotationInfo **) &%s_arg_%s_annotation_info_pointers\n'%(prefix, a.name))
            self.outfile.write('  },\n')
            if not utils.lookup_annotation(a.annotations, 'org.gtk.GDBus.C.ForceGVariant'):
                self.outfile.write('  FALSE\n')
            else:
                self.outfile.write('  TRUE\n')
            self.outfile.write('};\n'
                               '\n')

        if len(args) > 0:
            self.outfile.write('static const GDBusArgInfo * const %s_pointers[] =\n'
                             '{\n'%(prefix))
            for a in args:
                self.outfile.write('  &%s_%s.parent_struct,\n'%(prefix, a.name))
            self.outfile.write('  NULL\n'
                               '};\n'
                               '\n')

    def generate_introspection_for_interface(self, i):
            self.outfile.write('/* ---- Introspection data for %s ---- */\n'
                               '\n'%(i.name))

            if len(i.methods) > 0:
                for m in i.methods:
                    unix_fd = False
                    if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'):
                        unix_fd = True
                    self.generate_args('_%s_method_info_%s_IN_ARG'%(i.name_lower, m.name_lower), m.in_args)
                    self.generate_args('_%s_method_info_%s_OUT_ARG'%(i.name_lower, m.name_lower), m.out_args)

                    num_anno = self.generate_annotations('_%s_method_%s_annotation_info'%(i.name_lower, m.name_lower), m.annotations)

                    self.outfile.write('static const _ExtendedGDBusMethodInfo _%s_method_info_%s =\n'
                                       '{\n'
                                       '  {\n'
                                       '    -1,\n'
                                       '    (gchar *) "%s",\n'%(i.name_lower, m.name_lower, m.name))
                    if len(m.in_args) == 0:
                        self.outfile.write('    NULL,\n')
                    else:
                        self.outfile.write('    (GDBusArgInfo **) &_%s_method_info_%s_IN_ARG_pointers,\n'%(i.name_lower, m.name_lower))
                    if len(m.out_args) == 0:
                        self.outfile.write('    NULL,\n')
                    else:
                        self.outfile.write('    (GDBusArgInfo **) &_%s_method_info_%s_OUT_ARG_pointers,\n'%(i.name_lower, m.name_lower))
                    if num_anno == 0:
                        self.outfile.write('    NULL\n')
                    else:
                        self.outfile.write('    (GDBusAnnotationInfo **) &_%s_method_%s_annotation_info_pointers\n'%(i.name_lower, m.name_lower))
                    self.outfile.write('  },\n'
                                       '  "handle-%s",\n'
                                       '  %s\n'
                                       %(m.name_hyphen, 'TRUE' if unix_fd else 'FALSE'))
                    self.outfile.write('};\n'
                                       '\n')

                self.outfile.write('static const GDBusMethodInfo * const _%s_method_info_pointers[] =\n'
                                   '{\n'%(i.name_lower))
                for m in i.methods:
                    self.outfile.write('  &_%s_method_info_%s.parent_struct,\n'%(i.name_lower, m.name_lower))
                self.outfile.write('  NULL\n'
                                   '};\n'
                                   '\n')

            # ---

            if len(i.signals) > 0:
                for s in i.signals:
                    self.generate_args('_%s_signal_info_%s_ARG'%(i.name_lower, s.name_lower), s.args)

                    num_anno = self.generate_annotations('_%s_signal_%s_annotation_info'%(i.name_lower, s.name_lower), s.annotations)
                    self.outfile.write('static const _ExtendedGDBusSignalInfo _%s_signal_info_%s =\n'
                                       '{\n'
                                       '  {\n'
                                       '    -1,\n'
                                       '    (gchar *) "%s",\n'%(i.name_lower, s.name_lower, s.name))
                    if len(s.args) == 0:
                        self.outfile.write('    NULL,\n')
                    else:
                        self.outfile.write('    (GDBusArgInfo **) &_%s_signal_info_%s_ARG_pointers,\n'%(i.name_lower, s.name_lower))
                    if num_anno == 0:
                        self.outfile.write('    NULL\n')
                    else:
                        self.outfile.write('    (GDBusAnnotationInfo **) &_%s_signal_%s_annotation_info_pointers\n'%(i.name_lower, s.name_lower))
                    self.outfile.write('  },\n'
                                       '  "%s"\n'
                                       %(s.name_hyphen))
                    self.outfile.write('};\n'
                                       '\n')

                self.outfile.write('static const GDBusSignalInfo * const _%s_signal_info_pointers[] =\n'
                                   '{\n'%(i.name_lower))
                for s in i.signals:
                    self.outfile.write('  &_%s_signal_info_%s.parent_struct,\n'%(i.name_lower, s.name_lower))
                self.outfile.write('  NULL\n'
                                   '};\n'
                                   '\n')

            # ---

            if len(i.properties) > 0:
                for p in i.properties:
                    if p.readable and p.writable:
                        access = 'G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE'
                    elif p.readable:
                        access = 'G_DBUS_PROPERTY_INFO_FLAGS_READABLE'
                    elif p.writable:
                        access = 'G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE'
                    else:
                        access = 'G_DBUS_PROPERTY_INFO_FLAGS_NONE'
                    num_anno = self.generate_annotations('_%s_property_%s_annotation_info'%(i.name_lower, p.name_lower), p.annotations)
                    self.outfile.write('static const _ExtendedGDBusPropertyInfo _%s_property_info_%s =\n'
                                       '{\n'
                                       '  {\n'
                                       '    -1,\n'
                                       '    (gchar *) "%s",\n'
                                       '    (gchar *) "%s",\n'
                                       '    %s,\n'%(i.name_lower, p.name_lower, p.name, p.arg.signature, access))
                    if num_anno == 0:
                        self.outfile.write('    NULL\n')
                    else:
                        self.outfile.write('    (GDBusAnnotationInfo **) &_%s_property_%s_annotation_info_pointers\n'%(i.name_lower, p.name_lower))
                    self.outfile.write('  },\n'
                                       '  "%s",\n'
                                       %(p.name_hyphen))
                    if not utils.lookup_annotation(p.annotations, 'org.gtk.GDBus.C.ForceGVariant'):
                        self.outfile.write('  FALSE,\n')
                    else:
                        self.outfile.write('  TRUE,\n')
                    if p.emits_changed_signal:
                        self.outfile.write('  TRUE\n')
                    else:
                        self.outfile.write('  FALSE\n')
                    self.outfile.write('};\n'
                                       '\n')

                self.outfile.write('static const GDBusPropertyInfo * const _%s_property_info_pointers[] =\n'
                                   '{\n'%(i.name_lower))
                for p in i.properties:
                    self.outfile.write('  &_%s_property_info_%s.parent_struct,\n'%(i.name_lower, p.name_lower))
                self.outfile.write('  NULL\n'
                                   '};\n'
                                   '\n')

            num_anno = self.generate_annotations('_%s_annotation_info'%(i.name_lower), i.annotations)
            self.outfile.write('static const _ExtendedGDBusInterfaceInfo _%s_interface_info =\n'
                               '{\n'
                               '  {\n'
                               '    -1,\n'
                               '    (gchar *) "%s",\n'%(i.name_lower, i.name))
            if len(i.methods) == 0:
                self.outfile.write('    NULL,\n')
            else:
                self.outfile.write('    (GDBusMethodInfo **) &_%s_method_info_pointers,\n'%(i.name_lower))
            if len(i.signals) == 0:
                self.outfile.write('    NULL,\n')
            else:
                self.outfile.write('    (GDBusSignalInfo **) &_%s_signal_info_pointers,\n'%(i.name_lower))
            if len(i.properties) == 0:
                self.outfile.write('    NULL,\n')
            else:
                self.outfile.write('    (GDBusPropertyInfo **) &_%s_property_info_pointers,\n'%(i.name_lower))
            if num_anno == 0:
                self.outfile.write('    NULL\n')
            else:
                self.outfile.write('    (GDBusAnnotationInfo **) &_%s_annotation_info_pointers\n'%(i.name_lower))
            self.outfile.write('  },\n'
                               '  "%s",\n'
                               '};\n'
                               '\n'
                               %(i.name_hyphen))
            self.outfile.write('\n')
            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %s_interface_info:\n'
                    ' *\n'
                    ' * Gets a machine-readable description of the #%s D-Bus interface.\n'
                    ' *\n'
                    ' * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.\n'
                    %(i.name_lower, i.name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
            self.outfile.write('GDBusInterfaceInfo *\n'
                               '%s_interface_info (void)\n'
                               '{\n'
                               '  return (GDBusInterfaceInfo *) &_%s_interface_info.parent_struct;\n'
                                '}\n'
                                '\n'%(i.name_lower, i.name_lower))

            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %s_override_properties:\n'
                    ' * @klass: The class structure for a #GObject derived class.\n'
                    ' * @property_id_begin: The property id to assign to the first overridden property.\n'
                    ' *\n'
                    ' * Overrides all #GObject properties in the #%s interface for a concrete class.\n'
                    ' * The properties are overridden in the order they are defined.\n'
                    ' *\n'
                    ' * Returns: The last property id.\n'
                    %(i.name_lower, i.camel_name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
            self.outfile.write('guint\n'
                               '%s_override_properties (GObjectClass *klass, guint property_id_begin)\n'
                               '{\n'%(i.name_lower))
            for p in i.properties:
                self.outfile.write('  g_object_class_override_property (klass, property_id_begin++, "%s");\n'%(p.name_hyphen))
            self.outfile.write('  return property_id_begin - 1;\n'
                               '}\n'
                               '\n')
            self.outfile.write('\n')

    # ----------------------------------------------------------------------------------------------------

    def generate_interface(self, i):
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %s:\n'
                ' *\n'
                ' * Abstract interface type for the D-Bus interface #%s.\n'
                %(i.camel_name, i.name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sIface:\n'
                ' * @parent_iface: The parent interface.\n'
                %(i.camel_name), False))

        doc_bits = {}
        if len(i.methods) > 0:
            for m in i.methods:
                key = (m.since, '_method_%s'%m.name_lower)
                value  = '@handle_%s: '%(m.name_lower)
                value += 'Handler for the #%s::handle-%s signal.'%(i.camel_name, m.name_hyphen)
                doc_bits[key] = value
        if len(i.signals) > 0:
            for s in i.signals:
                key = (s.since, '_signal_%s'%s.name_lower)
                value  = '@%s: '%(s.name_lower)
                value += 'Handler for the #%s::%s signal.'%(i.camel_name, s.name_hyphen)
                doc_bits[key] = value
        if len(i.properties) > 0:
            for p in i.properties:
                key = (p.since, '_prop_get_%s'%p.name_lower)
                value  = '@get_%s: '%(p.name_lower)
                value += 'Getter for the #%s:%s property.'%(i.camel_name, p.name_hyphen)
                doc_bits[key] = value
        for key in sorted(doc_bits.keys(), key=utils.version_cmp_key):
            self.outfile.write(' * %s\n'%doc_bits[key])

        self.outfile.write(self.docbook_gen.expand(
                ' *\n'
                ' * Virtual table for the D-Bus interface #%s.\n'
                %(i.name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('\n')

        self.outfile.write('typedef %sIface %sInterface;\n'%(i.camel_name, i.camel_name))
        self.outfile.write('G_DEFINE_INTERFACE (%s, %s, G_TYPE_OBJECT)\n'%(i.camel_name, i.name_lower))
        self.outfile.write('\n')

        self.outfile.write('static void\n'
                           '%s_default_init (%sIface *iface)\n'
                           '{\n'%(i.name_lower, i.camel_name));

        if len(i.methods) > 0:
            self.outfile.write('  /* GObject signals for incoming D-Bus method calls: */\n')
            for m in i.methods:
                unix_fd = False
                if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'):
                    unix_fd = True
                self.outfile.write(self.docbook_gen.expand(
                        '  /**\n'
                        '   * %s::handle-%s:\n'
                        '   * @object: A #%s.\n'
                        '   * @invocation: A #GDBusMethodInvocation.\n'
                        %(i.camel_name, m.name_hyphen, i.camel_name), False))
                if unix_fd:
                    self.outfile.write('   * @fd_list: (nullable): A #GUnixFDList or %NULL.\n')
                for a in m.in_args:
                    self.outfile.write('   * @arg_%s: Argument passed by remote caller.\n'%(a.name))
                self.outfile.write(self.docbook_gen.expand(
                        '   *\n'
                        '   * Signal emitted when a remote caller is invoking the %s.%s() D-Bus method.\n'
                        '   *\n'
                        '   * If a signal handler returns %%TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call %s_complete_%s() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %%G_DBUS_ERROR_UNKNOWN_METHOD error is returned.\n'
                        '   *\n'
                        '   * Returns: %%TRUE if the invocation was handled, %%FALSE to let other signal handlers run.\n'
                        %(i.name, m.name, i.name_lower, m.name_lower), False))
                self.write_gtkdoc_deprecated_and_since_and_close(m, self.outfile, 2)
                if unix_fd:
                    extra_args = 2
                else:
                    extra_args = 1
                self.outfile.write('  g_signal_new ("handle-%s",\n'
                                   '    G_TYPE_FROM_INTERFACE (iface),\n'
                                   '    G_SIGNAL_RUN_LAST,\n'
                                   '    G_STRUCT_OFFSET (%sIface, handle_%s),\n'
                                   '    g_signal_accumulator_true_handled,\n'
                                   '    NULL,\n' # accu_data
                                   '    g_cclosure_marshal_generic,\n'
                                   '    G_TYPE_BOOLEAN,\n'
                                   '    %d,\n'
                                   '    G_TYPE_DBUS_METHOD_INVOCATION'
                                   %(m.name_hyphen, i.camel_name, m.name_lower, len(m.in_args) + extra_args))
                if unix_fd:
                    self.outfile.write(', G_TYPE_UNIX_FD_LIST')
                for a in m.in_args:
                    self.outfile.write(', %s'%(a.gtype))
                self.outfile.write(');\n')
                self.outfile.write('\n')

        if len(i.signals) > 0:
            self.outfile.write('  /* GObject signals for received D-Bus signals: */\n')
            for s in i.signals:
                self.outfile.write(self.docbook_gen.expand(
                        '  /**\n'
                        '   * %s::%s:\n'
                        '   * @object: A #%s.\n'
                        %(i.camel_name, s.name_hyphen, i.camel_name), False))
                for a in s.args:
                    self.outfile.write('   * @arg_%s: Argument.\n'%(a.name))
                self.outfile.write(self.docbook_gen.expand(
                        '   *\n'
                        '   * On the client-side, this signal is emitted whenever the D-Bus signal #%s::%s is received.\n'
                        '   *\n'
                        '   * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal.\n'
                        %(i.name, s.name), False))
                self.write_gtkdoc_deprecated_and_since_and_close(s, self.outfile, 2)
                self.outfile.write('  g_signal_new ("%s",\n'
                                   '    G_TYPE_FROM_INTERFACE (iface),\n'
                                   '    G_SIGNAL_RUN_LAST,\n'
                                   '    G_STRUCT_OFFSET (%sIface, %s),\n'
                                   '    NULL,\n' # accumulator
                                   '    NULL,\n' # accu_data
                                   '    g_cclosure_marshal_generic,\n'
                                   '    G_TYPE_NONE,\n'
                                   '    %d'
                                   %(s.name_hyphen, i.camel_name, s.name_lower, len(s.args)))
                for a in s.args:
                    self.outfile.write(', %s'%(a.gtype))
                self.outfile.write(');\n')
                self.outfile.write('\n')

        if len(i.properties) > 0:
            self.outfile.write('  /* GObject properties for D-Bus properties: */\n')
            for p in i.properties:
                if p.readable and p.writable:
                    hint = 'Since the D-Bus property for this #GObject property is both readable and writable, it is meaningful to both read from it and write to it on both the service- and client-side.'
                elif p.readable:
                    hint = 'Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.'
                elif p.writable:
                    hint = 'Since the D-Bus property for this #GObject property is writable but not readable, it is meaningful to write to it on both the client- and service-side. It is only meaningful, however, to read from it on the service-side.'
                else:
                    print_error('Cannot handle property "{}" that neither readable nor writable'.format(p.name))
                self.outfile.write(self.docbook_gen.expand(
                        '  /**\n'
                        '   * %s:%s:\n'
                        '   *\n'
                        '   * Represents the D-Bus property #%s:%s.\n'
                        '   *\n'
                        '   * %s\n'
                        %(i.camel_name, p.name_hyphen, i.name, p.name, hint), False))
                self.write_gtkdoc_deprecated_and_since_and_close(p, self.outfile, 2)
                self.outfile.write('  g_object_interface_install_property (iface,\n')
                if p.arg.gtype == 'G_TYPE_VARIANT':
                    s = 'g_param_spec_variant ("%s", "%s", "%s", G_VARIANT_TYPE ("%s"), NULL'%(p.name_hyphen, p.name, p.name, p.arg.signature)
                elif p.arg.signature == 'b':
                    s = 'g_param_spec_boolean ("%s", "%s", "%s", FALSE'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'y':
                    s = 'g_param_spec_uchar ("%s", "%s", "%s", 0, 255, 0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'n':
                    s = 'g_param_spec_int ("%s", "%s", "%s", G_MININT16, G_MAXINT16, 0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'q':
                    s = 'g_param_spec_uint ("%s", "%s", "%s", 0, G_MAXUINT16, 0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'i':
                    s = 'g_param_spec_int ("%s", "%s", "%s", G_MININT32, G_MAXINT32, 0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'u':
                    s = 'g_param_spec_uint ("%s", "%s", "%s", 0, G_MAXUINT32, 0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'x':
                    s = 'g_param_spec_int64 ("%s", "%s", "%s", G_MININT64, G_MAXINT64, 0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 't':
                    s = 'g_param_spec_uint64 ("%s", "%s", "%s", 0, G_MAXUINT64, 0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'd':
                    s = 'g_param_spec_double ("%s", "%s", "%s", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 's':
                    s = 'g_param_spec_string ("%s", "%s", "%s", NULL'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'o':
                    s = 'g_param_spec_string ("%s", "%s", "%s", NULL'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'g':
                    s = 'g_param_spec_string ("%s", "%s", "%s", NULL'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'ay':
                    s = 'g_param_spec_string ("%s", "%s", "%s", NULL'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'as':
                    s = 'g_param_spec_boxed ("%s", "%s", "%s", G_TYPE_STRV'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'ao':
                    s = 'g_param_spec_boxed ("%s", "%s", "%s", G_TYPE_STRV'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'aay':
                    s = 'g_param_spec_boxed ("%s", "%s", "%s", G_TYPE_STRV'%(p.name_hyphen, p.name, p.name)
                else:
                    print_error('Unsupported gtype "{}" for GParamSpec'.format(p.arg.gtype))
                flags = 'G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS'
                if p.deprecated:
                    flags = 'G_PARAM_DEPRECATED | ' + flags
                self.outfile.write('    %s, %s));'%(s, flags));
                self.outfile.write('\n')

        self.outfile.write('}\n'
                           '\n')

    # ----------------------------------------------------------------------------------------------------

    def generate_property_accessors(self, i):
        for p in i.properties:
            # getter
            if p.readable and p.writable:
                hint = 'Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.'
            elif p.readable:
                hint = 'Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.'
            elif p.writable:
                hint = 'Since this D-Bus property is not readable, it is only meaningful to use this function on the service-side.'
            else:
                print_error('Cannot handle property "{}" that neither readable nor writable'.format(p.name))
            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %s_get_%s: (skip)\n'
                    ' * @object: A #%s.\n'
                    ' *\n'
                    ' * Gets the value of the #%s:%s D-Bus property.\n'
                    ' *\n'
                    ' * %s\n'
                    ' *\n'
                    %(i.name_lower, p.name_lower, i.camel_name, i.name, p.name, hint), False))
            if p.arg.free_func != None:
                self.outfile.write(' * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use %s_dup_%s() if on another thread.</warning>\n'
                                   ' *\n'
                                   ' * Returns: (transfer none) (nullable): The property value or %%NULL if the property is not set. Do not free the returned value, it belongs to @object.\n'
                                   %(i.name_lower, p.name_lower))
            else:
                self.outfile.write(' * Returns: The property value.\n')
            self.write_gtkdoc_deprecated_and_since_and_close(p, self.outfile, 0)
            self.outfile.write('%s\n'
                               '%s_get_%s (%s *object)\n'
                               '{\n'%(p.arg.ctype_in, i.name_lower, p.name_lower, i.camel_name))
            self.outfile.write('  return %s%s_GET_IFACE (object)->get_%s (object);\n'%(i.ns_upper, i.name_upper, p.name_lower))
            self.outfile.write('}\n')
            self.outfile.write('\n')
            if p.arg.free_func != None:

                self.outfile.write(self.docbook_gen.expand(
                        '/**\n'
                        ' * %s_dup_%s: (skip)\n'
                        ' * @object: A #%s.\n'
                        ' *\n'
                        ' * Gets a copy of the #%s:%s D-Bus property.\n'
                        ' *\n'
                        ' * %s\n'
                        ' *\n'
                        ' * Returns: (transfer full) (nullable): The property value or %%NULL if the property is not set. The returned value should be freed with %s().\n'
                        %(i.name_lower, p.name_lower, i.camel_name, i.name, p.name, hint, p.arg.free_func), False))
                self.write_gtkdoc_deprecated_and_since_and_close(p, self.outfile, 0)
                self.outfile.write('%s\n'
                                   '%s_dup_%s (%s *object)\n'
                                   '{\n'
                                   '  %svalue;\n'%(p.arg.ctype_in_dup, i.name_lower, p.name_lower, i.camel_name, p.arg.ctype_in_dup))
                self.outfile.write('  g_object_get (G_OBJECT (object), "%s", &value, NULL);\n'%(p.name_hyphen))
                self.outfile.write('  return value;\n')
                self.outfile.write('}\n')
                self.outfile.write('\n')

            # setter
            if p.readable and p.writable:
                hint = 'Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.'
            elif p.readable:
                hint = 'Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.'
            elif p.writable:
                hint = 'Since this D-Bus property is writable, it is meaningful to use this function on both the client- and service-side.'
            else:
                print_error('Cannot handle property "{}" that neither readable nor writable'.format(p.name))
            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %s_set_%s: (skip)\n'
                    ' * @object: A #%s.\n'
                    ' * @value: The value to set.\n'
                    ' *\n'
                    ' * Sets the #%s:%s D-Bus property to @value.\n'
                    ' *\n'
                    ' * %s\n'
                    %(i.name_lower, p.name_lower, i.camel_name, i.name, p.name, hint), False))
            self.write_gtkdoc_deprecated_and_since_and_close(p, self.outfile, 0)
            self.outfile.write('void\n'
                               '%s_set_%s (%s *object, %svalue)\n'
                               '{\n'%(i.name_lower, p.name_lower, i.camel_name, p.arg.ctype_in, ))
            self.outfile.write('  g_object_set (G_OBJECT (object), "%s", value, NULL);\n'%(p.name_hyphen))
            self.outfile.write('}\n')
            self.outfile.write('\n')

    # ---------------------------------------------------------------------------------------------------

    def generate_signal_emitters(self, i):
        for s in i.signals:
            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %s_emit_%s:\n'
                    ' * @object: A #%s.\n'
                    %(i.name_lower, s.name_lower, i.camel_name), False))
            for a in s.args:
                self.outfile.write(' * @arg_%s: Argument to pass with the signal.\n'%(a.name))
            self.outfile.write(self.docbook_gen.expand(
                    ' *\n'
                    ' * Emits the #%s::%s D-Bus signal.\n'
                    %(i.name, s.name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(s, self.outfile, 0)
            self.outfile.write('void\n'
                               '%s_emit_%s (\n'
                               '    %s *object'%(i.name_lower, s.name_lower, i.camel_name))
            for a in s.args:
                self.outfile.write(',\n    %sarg_%s'%(a.ctype_in, a.name))
            self.outfile.write(')\n'
                               '{\n'
                               '  g_signal_emit_by_name (object, "%s"'%(s.name_hyphen))
            for a in s.args:
                self.outfile.write(', arg_%s'%a.name)
            self.outfile.write(');\n')
            self.outfile.write('}\n'
                               '\n')

    # ---------------------------------------------------------------------------------------------------

    def generate_method_calls(self, i):
        for m in i.methods:
            unix_fd = False
            if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'):
                unix_fd = True
            # async begin
            self.outfile.write('/**\n'
                               ' * %s_call_%s:\n'
                               ' * @proxy: A #%sProxy.\n'
                               %(i.name_lower, m.name_lower, i.camel_name))
            for a in m.in_args:
                self.outfile.write(' * @arg_%s: Argument to pass with the method invocation.\n'%(a.name))
            if unix_fd:
                self.outfile.write(' * @fd_list: (nullable): A #GUnixFDList or %NULL.\n')
            self.outfile.write(self.docbook_gen.expand(
                    ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                    ' * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %%NULL.\n'
                    ' * @user_data: User data to pass to @callback.\n'
                    ' *\n'
                    ' * Asynchronously invokes the %s.%s() D-Bus method on @proxy.\n'
                    ' * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.\n'
                    ' * You can then call %s_call_%s_finish() to get the result of the operation.\n'
                    ' *\n'
                    ' * See %s_call_%s_sync() for the synchronous, blocking version of this method.\n'
                    %(i.name, m.name, i.name_lower, m.name_lower, i.name_lower, m.name_lower), False))
            self.write_gtkdoc_deprecated_and_since_and_close(m, self.outfile, 0)
            self.outfile.write('void\n'
                               '%s_call_%s (\n'
                               '    %s *proxy'%(i.name_lower, m.name_lower, i.camel_name))
            for a in m.in_args:
                self.outfile.write(',\n    %sarg_%s'%(a.ctype_in, a.name))
            if unix_fd:
                self.outfile.write(',\n    GUnixFDList *fd_list')
            self.outfile.write(',\n'
                               '    GCancellable *cancellable,\n'
                               '    GAsyncReadyCallback callback,\n'
                               '    gpointer user_data)\n'
                               '{\n')
            if unix_fd:
                self.outfile.write('  g_dbus_proxy_call_with_unix_fd_list (G_DBUS_PROXY (proxy),\n')
            else:
                self.outfile.write('  g_dbus_proxy_call (G_DBUS_PROXY (proxy),\n')
            self.outfile.write('    "%s",\n'
                               '    g_variant_new ("('%(m.name))
            for a in m.in_args:
                self.outfile.write('%s'%(a.format_in))
            self.outfile.write(')"')
            for a in m.in_args:
                self.outfile.write(',\n                   arg_%s'%(a.name))
            self.outfile.write('),\n'
                               '    G_DBUS_CALL_FLAGS_NONE,\n'
                               '    -1,\n')
            if unix_fd:
                self.outfile.write('    fd_list,\n')
            self.outfile.write('    cancellable,\n'
                               '    callback,\n'
                               '    user_data);\n')
            self.outfile.write('}\n'
                               '\n')
            # async finish
            self.outfile.write('/**\n'
                               ' * %s_call_%s_finish:\n'
                               ' * @proxy: A #%sProxy.\n'
                               %(i.name_lower, m.name_lower, i.camel_name))
            for a in m.out_args:
                self.outfile.write(' * @out_%s: (out) (optional)%s: Return location for return parameter or %%NULL to ignore.\n'%(a.name, ' ' + a.array_annotation if a.array_annotation else ''))
            if unix_fd:
                self.outfile.write(' * @out_fd_list: (out) (optional): Return location for a #GUnixFDList or %NULL to ignore.\n')
            self.outfile.write(self.docbook_gen.expand(
                    ' * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to %s_call_%s().\n'
                    ' * @error: Return location for error or %%NULL.\n'
                    ' *\n'
                    ' * Finishes an operation started with %s_call_%s().\n'
                    ' *\n'
                    ' * Returns: (skip): %%TRUE if the call succeded, %%FALSE if @error is set.\n'
                    %(i.name_lower, m.name_lower, i.name_lower, m.name_lower), False))
            self.write_gtkdoc_deprecated_and_since_and_close(m, self.outfile, 0)
            self.outfile.write('gboolean\n'
                               '%s_call_%s_finish (\n'
                               '    %s *proxy'%(i.name_lower, m.name_lower, i.camel_name))
            for a in m.out_args:
                self.outfile.write(',\n    %sout_%s'%(a.ctype_out, a.name))
            if unix_fd:
                self.outfile.write(',\n    GUnixFDList **out_fd_list')
            self.outfile.write(',\n'
                               '    GAsyncResult *res,\n'
                               '    GError **error)\n'
                               '{\n'
                               '  GVariant *_ret;\n')
            if unix_fd:
                self.outfile.write('  _ret = g_dbus_proxy_call_with_unix_fd_list_finish (G_DBUS_PROXY (proxy), out_fd_list, res, error);\n')
            else:
                self.outfile.write('  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);\n')
            self.outfile.write('  if (_ret == NULL)\n'
                               '    goto _out;\n')
            self.outfile.write('  g_variant_get (_ret,\n'
                               '                 \"(')
            for a in m.out_args:
                self.outfile.write('%s'%(a.format_out))
            self.outfile.write(')"')
            for a in m.out_args:
                self.outfile.write(',\n                 out_%s'%(a.name))
            self.outfile.write(');\n'
                               '  g_variant_unref (_ret);\n')
            self.outfile.write('_out:\n'
                               '  return _ret != NULL;\n'
                               '}\n'
                               '\n')


            # sync
            self.outfile.write('/**\n'
                               ' * %s_call_%s_sync:\n'
                               ' * @proxy: A #%sProxy.\n'
                               %(i.name_lower, m.name_lower, i.camel_name))
            for a in m.in_args:
                self.outfile.write(' * @arg_%s: Argument to pass with the method invocation.\n'%(a.name))
            if unix_fd:
                self.outfile.write(' * @fd_list: (nullable): A #GUnixFDList or %NULL.\n')
            for a in m.out_args:
                self.outfile.write(' * @out_%s: (out) (optional)%s: Return location for return parameter or %%NULL to ignore.\n'%(a.name, ' ' + a.array_annotation if a.array_annotation else ''))
            if unix_fd:
                self.outfile.write(' * @out_fd_list: (out): Return location for a #GUnixFDList or %NULL.\n')
            self.outfile.write(self.docbook_gen.expand(
                    ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                    ' * @error: Return location for error or %%NULL.\n'
                    ' *\n'
                    ' * Synchronously invokes the %s.%s() D-Bus method on @proxy. The calling thread is blocked until a reply is received.\n'
                    ' *\n'
                    ' * See %s_call_%s() for the asynchronous version of this method.\n'
                    ' *\n'
                    ' * Returns: (skip): %%TRUE if the call succeded, %%FALSE if @error is set.\n'
                    %(i.name, m.name, i.name_lower, m.name_lower), False))
            self.write_gtkdoc_deprecated_and_since_and_close(m, self.outfile, 0)
            self.outfile.write('gboolean\n'
                               '%s_call_%s_sync (\n'
                               '    %s *proxy'%(i.name_lower, m.name_lower, i.camel_name))
            for a in m.in_args:
                self.outfile.write(',\n    %sarg_%s'%(a.ctype_in, a.name))
            if unix_fd:
                self.outfile.write(',\n    GUnixFDList  *fd_list')
            for a in m.out_args:
                self.outfile.write(',\n    %sout_%s'%(a.ctype_out, a.name))
            if unix_fd:
                self.outfile.write(',\n    GUnixFDList **out_fd_list')
            self.outfile.write(',\n'
                               '    GCancellable *cancellable,\n'
                               '    GError **error)\n'
                               '{\n'
                               '  GVariant *_ret;\n')
            if unix_fd:
                self.outfile.write('  _ret = g_dbus_proxy_call_with_unix_fd_list_sync (G_DBUS_PROXY (proxy),\n')
            else:
                self.outfile.write('  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),\n')
            self.outfile.write('    "%s",\n'
                               '    g_variant_new ("('%(m.name))
            for a in m.in_args:
                self.outfile.write('%s'%(a.format_in))
            self.outfile.write(')"')
            for a in m.in_args:
                self.outfile.write(',\n                   arg_%s'%(a.name))
            self.outfile.write('),\n'
                               '    G_DBUS_CALL_FLAGS_NONE,\n'
                               '    -1,\n')
            if unix_fd:
                self.outfile.write('    fd_list,\n'
                                   '    out_fd_list,\n')
            self.outfile.write('    cancellable,\n'
                               '    error);\n'
                               '  if (_ret == NULL)\n'
                               '    goto _out;\n')
            self.outfile.write('  g_variant_get (_ret,\n'
                               '                 \"(')
            for a in m.out_args:
                self.outfile.write('%s'%(a.format_out))
            self.outfile.write(')"')
            for a in m.out_args:
                self.outfile.write(',\n                 out_%s'%(a.name))
            self.outfile.write(');\n'
                               '  g_variant_unref (_ret);\n')
            self.outfile.write('_out:\n'
                               '  return _ret != NULL;\n'
                               '}\n'
                               '\n')

    # ---------------------------------------------------------------------------------------------------

    def generate_method_completers(self, i):
        for m in i.methods:
            unix_fd = False
            if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'):
                unix_fd = True
            self.outfile.write('/**\n'
                               ' * %s_complete_%s:\n'
                               ' * @object: A #%s.\n'
                               ' * @invocation: (transfer full): A #GDBusMethodInvocation.\n'
                               %(i.name_lower, m.name_lower, i.camel_name))
            if unix_fd:
                self.outfile.write(' * @fd_list: (nullable): A #GUnixFDList or %NULL.\n')
            for a in m.out_args:
                self.outfile.write(' * @%s: Parameter to return.\n'%(a.name))
            self.outfile.write(self.docbook_gen.expand(
                    ' *\n'
                    ' * Helper function used in service implementations to finish handling invocations of the %s.%s() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.\n'
                    ' *\n'
                    ' * This method will free @invocation, you cannot use it afterwards.\n'
                    %(i.name, m.name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(m, self.outfile, 0)
            self.outfile.write('void\n'
                               '%s_complete_%s (\n'
                               '    %s *object,\n'
                               '    GDBusMethodInvocation *invocation'%(i.name_lower, m.name_lower, i.camel_name))
            if unix_fd:
                self.outfile.write(',\n    GUnixFDList *fd_list')
            for a in m.out_args:
                self.outfile.write(',\n    %s%s'%(a.ctype_in, a.name))
            self.outfile.write(')\n'
                               '{\n')

            if unix_fd:
                self.outfile.write('  g_dbus_method_invocation_return_value_with_unix_fd_list (invocation,\n'
                                   '    g_variant_new ("(')
            else:
                self.outfile.write('  g_dbus_method_invocation_return_value (invocation,\n'
                                   '    g_variant_new ("(')
            for a in m.out_args:
                self.outfile.write('%s'%(a.format_in))
            self.outfile.write(')"')
            for a in m.out_args:
                self.outfile.write(',\n                   %s'%(a.name))
            if unix_fd:
                self.outfile.write('),\n    fd_list);\n')
            else:
                self.outfile.write('));\n')
            self.outfile.write('}\n'
                               '\n')

    # ---------------------------------------------------------------------------------------------------

    def generate_proxy(self, i):
        # class boilerplate
        self.outfile.write('/* ------------------------------------------------------------------------ */\n'
                           '\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sProxy:\n'
                ' *\n'
                ' * The #%sProxy structure contains only private data and should only be accessed using the provided API.\n'
                %(i.camel_name, i.camel_name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sProxyClass:\n'
                ' * @parent_class: The parent class.\n'
                ' *\n'
                ' * Class structure for #%sProxy.\n'
                %(i.camel_name, i.camel_name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('\n')

        self.outfile.write('struct _%sProxyPrivate\n'
                           '{\n'
                           '  GData *qdata;\n'
                           '};\n'
                           '\n'%i.camel_name)

        self.outfile.write('static void %s_proxy_iface_init (%sIface *iface);\n'
                           '\n'%(i.name_lower, i.camel_name))
        self.outfile.write('#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38\n')
        self.outfile.write('G_DEFINE_TYPE_WITH_CODE (%sProxy, %s_proxy, G_TYPE_DBUS_PROXY,\n'%(i.camel_name, i.name_lower))
        self.outfile.write('                         G_ADD_PRIVATE (%sProxy)\n'%(i.camel_name))
        self.outfile.write('                         G_IMPLEMENT_INTERFACE (%sTYPE_%s, %s_proxy_iface_init))\n\n'%(i.ns_upper, i.name_upper, i.name_lower))
        self.outfile.write('#else\n')
        self.outfile.write('G_DEFINE_TYPE_WITH_CODE (%sProxy, %s_proxy, G_TYPE_DBUS_PROXY,\n'%(i.camel_name, i.name_lower))
        self.outfile.write('                         G_IMPLEMENT_INTERFACE (%sTYPE_%s, %s_proxy_iface_init))\n\n'%(i.ns_upper, i.name_upper, i.name_lower))
        self.outfile.write('#endif\n')

        # finalize
        self.outfile.write('static void\n'
                           '%s_proxy_finalize (GObject *object)\n'
                           '{\n'%(i.name_lower))
        self.outfile.write('  %sProxy *proxy = %s%s_PROXY (object);\n'%(i.camel_name, i.ns_upper, i.name_upper))
        self.outfile.write('  g_datalist_clear (&proxy->priv->qdata);\n')
        self.outfile.write('  G_OBJECT_CLASS (%s_proxy_parent_class)->finalize (object);\n'
                           '}\n'
                           '\n'%(i.name_lower))

        # property accessors
        #
        # Note that we are guaranteed that prop_id starts at 1 and is
        # laid out in the same order as introspection data pointers
        #
        self.outfile.write('static void\n'
                           '%s_proxy_get_property (GObject      *object,\n'
                           '  guint         prop_id,\n'
                           '  GValue       *value,\n'
                           '  GParamSpec   *pspec G_GNUC_UNUSED)\n'
                           '{\n'%(i.name_lower))
        if len(i.properties) > 0:
            self.outfile.write('  const _ExtendedGDBusPropertyInfo *info;\n'
                               '  GVariant *variant;\n'
                               '  g_assert (prop_id != 0 && prop_id - 1 < %d);\n'
                               '  info = (const _ExtendedGDBusPropertyInfo *) _%s_property_info_pointers[prop_id - 1];\n'
                               '  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);\n'
                               '  if (info->use_gvariant)\n'
                               '    {\n'
                               '      g_value_set_variant (value, variant);\n'
                               '    }\n'
                               '  else\n'
                               '    {\n'
                               # could be that we don't have the value in cache - in that case, we do
                               # nothing and the user gets the default value for the GType
                               '      if (variant != NULL)\n'
                               '        g_dbus_gvariant_to_gvalue (variant, value);\n'
                               '    }\n'
                               '  if (variant != NULL)\n'
                               '    g_variant_unref (variant);\n'
                               %(len(i.properties), i.name_lower))
        self.outfile.write('}\n'
                           '\n')
        if len(i.properties) > 0:
            self.outfile.write('static void\n'
                               '%s_proxy_set_property_cb (GDBusProxy *proxy,\n'
                               '  GAsyncResult *res,\n'
                               '  gpointer      user_data)\n'
                               '{\n'%(i.name_lower))
            self.outfile.write('  const _ExtendedGDBusPropertyInfo *info = user_data;\n'
                               '  GError *error;\n'
                               '  GVariant *_ret;\n'
                               '  error = NULL;\n'
                               '  _ret = g_dbus_proxy_call_finish (proxy, res, &error);\n'
                               '  if (!_ret)\n'
                               '    {\n'
                               '      g_warning ("Error setting property \'%%s\' on interface %s: %%s (%%s, %%d)",\n'
                               '                 info->parent_struct.name, \n'
                               '                 error->message, g_quark_to_string (error->domain), error->code);\n'
                               '      g_error_free (error);\n'
                               '    }\n'
                               '  else\n'
                               '    {\n'
                               '      g_variant_unref (_ret);\n'
                               '    }\n'
                               %(i.name))
            self.outfile.write('}\n'
                               '\n')
        self.outfile.write('static void\n'
                           '%s_proxy_set_property (GObject      *object,\n'
                           '  guint         prop_id,\n'
                           '  const GValue *value,\n'
                           '  GParamSpec   *pspec G_GNUC_UNUSED)\n'
                           '{\n'%(i.name_lower))
        if len(i.properties) > 0:
            self.outfile.write('  const _ExtendedGDBusPropertyInfo *info;\n'
                               '  GVariant *variant;\n'
                               '  g_assert (prop_id != 0 && prop_id - 1 < %d);\n'
                               '  info = (const _ExtendedGDBusPropertyInfo *) _%s_property_info_pointers[prop_id - 1];\n'
                               '  variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));\n'
                               '  g_dbus_proxy_call (G_DBUS_PROXY (object),\n'
                               '    "org.freedesktop.DBus.Properties.Set",\n'
                               '    g_variant_new ("(ssv)", "%s", info->parent_struct.name, variant),\n'
                               '    G_DBUS_CALL_FLAGS_NONE,\n'
                               '    -1,\n'
                               '    NULL, (GAsyncReadyCallback) %s_proxy_set_property_cb, (GDBusPropertyInfo *) &info->parent_struct);\n'
                               '  g_variant_unref (variant);\n'
                               %(len(i.properties), i.name_lower, i.name, i.name_lower))
        self.outfile.write('}\n'
                           '\n')

        # signal received
        self.outfile.write('static void\n'
                           '%s_proxy_g_signal (GDBusProxy *proxy,\n'
                           '  const gchar *sender_name G_GNUC_UNUSED,\n'
                           '  const gchar *signal_name,\n'
                           '  GVariant *parameters)\n'
                           '{\n'%(i.name_lower))
        self.outfile.write('  _ExtendedGDBusSignalInfo *info;\n'
                           '  GVariantIter iter;\n'
                           '  GVariant *child;\n'
                           '  GValue *paramv;\n'
                           '  gsize num_params;\n'
                           '  gsize n;\n'
                           '  guint signal_id;\n');
        # Note: info could be NULL if we are talking to a newer version of the interface
        self.outfile.write('  info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_%s_interface_info.parent_struct, signal_name);\n'
                           '  if (info == NULL)\n'
                           '    return;\n'
                           %(i.name_lower))
        self.outfile.write('  num_params = g_variant_n_children (parameters);\n'
                           '  paramv = g_new0 (GValue, num_params + 1);\n'
                           '  g_value_init (&paramv[0], %sTYPE_%s);\n'
                           '  g_value_set_object (&paramv[0], proxy);\n'
                           %(i.ns_upper, i.name_upper))
        self.outfile.write('  g_variant_iter_init (&iter, parameters);\n'
                           '  n = 1;\n'
                           '  while ((child = g_variant_iter_next_value (&iter)) != NULL)\n'
                           '    {\n'
                           '      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];\n'
                           '      if (arg_info->use_gvariant)\n'
                           '        {\n'
                           '          g_value_init (&paramv[n], G_TYPE_VARIANT);\n'
                           '          g_value_set_variant (&paramv[n], child);\n'
                           '          n++;\n'
                           '        }\n'
                           '      else\n'
                           '        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);\n'
                           '      g_variant_unref (child);\n'
                           '    }\n'
                           )
        self.outfile.write('  signal_id = g_signal_lookup (info->signal_name, %sTYPE_%s);\n'
                           %(i.ns_upper, i.name_upper))
        self.outfile.write('  g_signal_emitv (paramv, signal_id, 0, NULL);\n')
        self.outfile.write('  for (n = 0; n < num_params + 1; n++)\n'
                           '    g_value_unset (&paramv[n]);\n'
                           '  g_free (paramv);\n')
        self.outfile.write('}\n'
                           '\n')

        # property changed
        self.outfile.write('static void\n'
                           '%s_proxy_g_properties_changed (GDBusProxy *_proxy,\n'
                           '  GVariant *changed_properties,\n'
                           '  const gchar *const *invalidated_properties)\n'
                           '{\n'%(i.name_lower))
        # Note: info could be NULL if we are talking to a newer version of the interface
        self.outfile.write('  %sProxy *proxy = %s%s_PROXY (_proxy);\n'
                           '  guint n;\n'
                           '  const gchar *key;\n'
                           '  GVariantIter *iter;\n'
                           '  _ExtendedGDBusPropertyInfo *info;\n'
                           '  g_variant_get (changed_properties, "a{sv}", &iter);\n'
                           '  while (g_variant_iter_next (iter, "{&sv}", &key, NULL))\n'
                           '    {\n'
                           '      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_%s_interface_info.parent_struct, key);\n'
                           '      g_datalist_remove_data (&proxy->priv->qdata, key);\n'
                           '      if (info != NULL)\n'
                           '        g_object_notify (G_OBJECT (proxy), info->hyphen_name);\n'
                           '    }\n'
                           '  g_variant_iter_free (iter);\n'
                           '  for (n = 0; invalidated_properties[n] != NULL; n++)\n'
                           '    {\n'
                           '      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_%s_interface_info.parent_struct, invalidated_properties[n]);\n'
                           '      g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);\n'
                           '      if (info != NULL)\n'
                           '        g_object_notify (G_OBJECT (proxy), info->hyphen_name);\n'
                           '    }\n'
                           '}\n'
                           '\n'
                           %(i.camel_name, i.ns_upper, i.name_upper,
                             i.name_lower, i.name_lower))

        # property vfuncs
        for p in i.properties:
            nul_value = '0'
            if p.arg.free_func != None:
                nul_value = 'NULL'
            self.outfile.write('static %s\n'
                               '%s_proxy_get_%s (%s *object)\n'
                               '{\n'
                               '  %sProxy *proxy = %s%s_PROXY (object);\n'
                               '  GVariant *variant;\n'
                               '  %svalue = %s;\n'%(p.arg.ctype_in, i.name_lower, p.name_lower, i.camel_name,
                                                    i.camel_name, i.ns_upper, i.name_upper,
                                                    p.arg.ctype_in, nul_value))
            # For some property types, we have to free the returned
            # value (or part of it, e.g. the container) because of how
            # GVariant works.. see https://bugzilla.gnome.org/show_bug.cgi?id=657100
            # for details
            #
            free_container = False;
            if p.arg.gvariant_get == 'g_variant_get_strv' or p.arg.gvariant_get == 'g_variant_get_objv' or p.arg.gvariant_get == 'g_variant_get_bytestring_array':
                free_container = True;
            # If already using an old value for strv, objv, bytestring_array (see below),
            # then just return that... that way the result from multiple consecutive calls
            # to the getter are valid as long as they're freed
            #
            if free_container:
                self.outfile.write('  value = g_datalist_get_data (&proxy->priv->qdata, \"%s\");\n'
                                   '  if (value != NULL)\n'
                                   '    return value;\n'
                                   %(p.name))
            self.outfile.write('  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), \"%s\");\n'%(p.name))
            if p.arg.gtype == 'G_TYPE_VARIANT':
                self.outfile.write('  value = variant;\n')
                self.outfile.write('  if (variant != NULL)\n')
                self.outfile.write('    g_variant_unref (variant);\n')
            else:
                self.outfile.write('  if (variant != NULL)\n'
                                   '    {\n')
                extra_len = ''
                if p.arg.gvariant_get == 'g_variant_get_string' or p.arg.gvariant_get == 'g_variant_get_strv' or p.arg.gvariant_get == 'g_variant_get_objv' or p.arg.gvariant_get == 'g_variant_get_bytestring_array':
                    extra_len = ', NULL'
                self.outfile.write('      value = %s (variant%s);\n'%(p.arg.gvariant_get, extra_len))
                if free_container:
                    self.outfile.write('      g_datalist_set_data_full (&proxy->priv->qdata, \"%s\", (gpointer) value, g_free);\n'
                                       %(p.name))
                self.outfile.write('      g_variant_unref (variant);\n')
                self.outfile.write('    }\n')
            self.outfile.write('  return value;\n')
            self.outfile.write('}\n')
            self.outfile.write('\n')

        # class boilerplate
        self.outfile.write('static void\n'
                           '%s_proxy_init (%sProxy *proxy)\n'
                           '{\n'
                           '#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38\n'
                           '  proxy->priv = %s_proxy_get_instance_private (proxy);\n'
                           '#else\n'
                           '  proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, %sTYPE_%s_PROXY, %sProxyPrivate);\n'
                           '#endif\n\n'
                           '  g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), %s_interface_info ());\n'
                           '}\n'
                           '\n'
                           %(i.name_lower, i.camel_name,
                             i.name_lower,
                             i.ns_upper, i.name_upper, i.camel_name,
                             i.name_lower))
        self.outfile.write('static void\n'
                           '%s_proxy_class_init (%sProxyClass *klass)\n'
                           '{\n'
                           '  GObjectClass *gobject_class;\n'
                           '  GDBusProxyClass *proxy_class;\n'
                           '\n'
                           '  gobject_class = G_OBJECT_CLASS (klass);\n'
                           '  gobject_class->finalize     = %s_proxy_finalize;\n'
                           '  gobject_class->get_property = %s_proxy_get_property;\n'
                           '  gobject_class->set_property = %s_proxy_set_property;\n'
                           '\n'
                           '  proxy_class = G_DBUS_PROXY_CLASS (klass);\n'
                           '  proxy_class->g_signal = %s_proxy_g_signal;\n'
                           '  proxy_class->g_properties_changed = %s_proxy_g_properties_changed;\n'
                           '\n'%(i.name_lower, i.camel_name,
                                 i.name_lower, i.name_lower, i.name_lower, i.name_lower, i.name_lower))
        if len(i.properties) > 0:
            self.outfile.write('  %s_override_properties (gobject_class, 1);\n\n'%(i.name_lower))
        self.outfile.write('#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38\n'
                           '  g_type_class_add_private (klass, sizeof (%sProxyPrivate));\n'
                           '#endif\n'%(i.camel_name))
        self.outfile.write('}\n'
                           '\n')

        self.outfile.write('static void\n'
                           '%s_proxy_iface_init (%sIface *iface)\n'
                           '{\n'%(i.name_lower, i.camel_name))
        for p in i.properties:
            self.outfile.write('  iface->get_%s = %s_proxy_get_%s;\n'%(p.name_lower, i.name_lower, p.name_lower))
        self.outfile.write('}\n'
                           '\n')

        # constructors
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %s_proxy_new:\n'
                ' * @connection: A #GDBusConnection.\n'
                ' * @flags: Flags from the #GDBusProxyFlags enumeration.\n'
                ' * @name: (nullable): A bus name (well-known or unique) or %%NULL if @connection is not a message bus connection.\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @callback: A #GAsyncReadyCallback to call when the request is satisfied.\n'
                ' * @user_data: User data to pass to @callback.\n'
                ' *\n'
                ' * Asynchronously creates a proxy for the D-Bus interface #%s. See g_dbus_proxy_new() for more details.\n'
                ' *\n'
                ' * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.\n'
                ' * You can then call %s_proxy_new_finish() to get the result of the operation.\n'
                ' *\n'
                ' * See %s_proxy_new_sync() for the synchronous, blocking version of this constructor.\n'
                %(i.name_lower, i.name, i.name_lower, i.name_lower), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('void\n'
                           '%s_proxy_new (\n'
                           '    GDBusConnection     *connection,\n'
                           '    GDBusProxyFlags      flags,\n'
                           '    const gchar         *name,\n'
                           '    const gchar         *object_path,\n'
                           '    GCancellable        *cancellable,\n'
                           '    GAsyncReadyCallback  callback,\n'
                           '    gpointer             user_data)\n'
                           '{\n'
                           '  g_async_initable_new_async (%sTYPE_%s_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "%s", NULL);\n'
                           '}\n'
                           '\n'
                           %(i.name_lower, i.ns_upper, i.name_upper, i.name))
        self.outfile.write('/**\n'
                           ' * %s_proxy_new_finish:\n'
                           ' * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to %s_proxy_new().\n'
                           ' * @error: Return location for error or %%NULL\n'
                           ' *\n'
                           ' * Finishes an operation started with %s_proxy_new().\n'
                           ' *\n'
                           ' * Returns: (transfer full) (type %sProxy): The constructed proxy object or %%NULL if @error is set.\n'
                           %(i.name_lower, i.name_lower, i.name_lower, i.camel_name))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('%s *\n'
                           '%s_proxy_new_finish (\n'
                           '    GAsyncResult        *res,\n'
                           '    GError             **error)\n'
                           '{\n'
                           '  GObject *ret;\n'
                           '  GObject *source_object;\n'
                           '  source_object = g_async_result_get_source_object (res);\n'
                           '  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);\n'
                           '  g_object_unref (source_object);\n'
                           '  if (ret != NULL)\n'
                           '    return %s%s (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(i.camel_name, i.name_lower, i.ns_upper, i.name_upper))
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %s_proxy_new_sync:\n'
                ' * @connection: A #GDBusConnection.\n'
                ' * @flags: Flags from the #GDBusProxyFlags enumeration.\n'
                ' * @name: (nullable): A bus name (well-known or unique) or %%NULL if @connection is not a message bus connection.\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @error: Return location for error or %%NULL\n'
                ' *\n'
                ' * Synchronously creates a proxy for the D-Bus interface #%s. See g_dbus_proxy_new_sync() for more details.\n'
                ' *\n'
                ' * The calling thread is blocked until a reply is received.\n'
                ' *\n'
                ' * See %s_proxy_new() for the asynchronous version of this constructor.\n'
                ' *\n'
                ' * Returns: (transfer full) (type %sProxy): The constructed proxy object or %%NULL if @error is set.\n'
                %(i.name_lower, i.name, i.name_lower, i.camel_name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('%s *\n'
                           '%s_proxy_new_sync (\n'
                           '    GDBusConnection     *connection,\n'
                           '    GDBusProxyFlags      flags,\n'
                           '    const gchar         *name,\n'
                           '    const gchar         *object_path,\n'
                           '    GCancellable        *cancellable,\n'
                           '    GError             **error)\n'
                           '{\n'
                           '  GInitable *ret;\n'
                           '  ret = g_initable_new (%sTYPE_%s_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "%s", NULL);\n'
                           '  if (ret != NULL)\n'
                           '    return %s%s (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(i.camel_name, i.name_lower, i.ns_upper, i.name_upper, i.name, i.ns_upper, i.name_upper))
        self.outfile.write('\n')
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %s_proxy_new_for_bus:\n'
                ' * @bus_type: A #GBusType.\n'
                ' * @flags: Flags from the #GDBusProxyFlags enumeration.\n'
                ' * @name: A bus name (well-known or unique).\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @callback: A #GAsyncReadyCallback to call when the request is satisfied.\n'
                ' * @user_data: User data to pass to @callback.\n'
                ' *\n'
                ' * Like %s_proxy_new() but takes a #GBusType instead of a #GDBusConnection.\n'
                ' *\n'
                ' * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.\n'
                ' * You can then call %s_proxy_new_for_bus_finish() to get the result of the operation.\n'
                ' *\n'
                ' * See %s_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.\n'
                %(i.name_lower, i.name_lower, i.name_lower, i.name_lower), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('void\n'
                           '%s_proxy_new_for_bus (\n'
                           '    GBusType             bus_type,\n'
                           '    GDBusProxyFlags      flags,\n'
                           '    const gchar         *name,\n'
                           '    const gchar         *object_path,\n'
                           '    GCancellable        *cancellable,\n'
                           '    GAsyncReadyCallback  callback,\n'
                           '    gpointer             user_data)\n'
                           '{\n'
                           '  g_async_initable_new_async (%sTYPE_%s_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "%s", NULL);\n'
                           '}\n'
                           '\n'
                           %(i.name_lower, i.ns_upper, i.name_upper, i.name))
        self.outfile.write('/**\n'
                           ' * %s_proxy_new_for_bus_finish:\n'
                           ' * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to %s_proxy_new_for_bus().\n'
                           ' * @error: Return location for error or %%NULL\n'
                           ' *\n'
                           ' * Finishes an operation started with %s_proxy_new_for_bus().\n'
                           ' *\n'
                           ' * Returns: (transfer full) (type %sProxy): The constructed proxy object or %%NULL if @error is set.\n'
                           %(i.name_lower, i.name_lower, i.name_lower, i.camel_name))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('%s *\n'
                           '%s_proxy_new_for_bus_finish (\n'
                           '    GAsyncResult        *res,\n'
                           '    GError             **error)\n'
                           '{\n'
                           '  GObject *ret;\n'
                           '  GObject *source_object;\n'
                           '  source_object = g_async_result_get_source_object (res);\n'
                           '  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);\n'
                           '  g_object_unref (source_object);\n'
                           '  if (ret != NULL)\n'
                           '    return %s%s (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(i.camel_name, i.name_lower, i.ns_upper, i.name_upper))
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %s_proxy_new_for_bus_sync:\n'
                ' * @bus_type: A #GBusType.\n'
                ' * @flags: Flags from the #GDBusProxyFlags enumeration.\n'
                ' * @name: A bus name (well-known or unique).\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @error: Return location for error or %%NULL\n'
                ' *\n'
                ' * Like %s_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.\n'
                ' *\n'
                ' * The calling thread is blocked until a reply is received.\n'
                ' *\n'
                ' * See %s_proxy_new_for_bus() for the asynchronous version of this constructor.\n'
                ' *\n'
                ' * Returns: (transfer full) (type %sProxy): The constructed proxy object or %%NULL if @error is set.\n'
                %(i.name_lower, i.name_lower, i.name_lower, i.camel_name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('%s *\n'
                           '%s_proxy_new_for_bus_sync (\n'
                           '    GBusType             bus_type,\n'
                           '    GDBusProxyFlags      flags,\n'
                           '    const gchar         *name,\n'
                           '    const gchar         *object_path,\n'
                           '    GCancellable        *cancellable,\n'
                           '    GError             **error)\n'
                           '{\n'
                           '  GInitable *ret;\n'
                           '  ret = g_initable_new (%sTYPE_%s_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "%s", NULL);\n'
                           '  if (ret != NULL)\n'
                           '    return %s%s (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(i.camel_name, i.name_lower, i.ns_upper, i.name_upper, i.name, i.ns_upper, i.name_upper))
        self.outfile.write('\n')

    # ---------------------------------------------------------------------------------------------------

    def generate_skeleton(self, i):
        # class boilerplate
        self.outfile.write('/* ------------------------------------------------------------------------ */\n'
                           '\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sSkeleton:\n'
                ' *\n'
                ' * The #%sSkeleton structure contains only private data and should only be accessed using the provided API.\n'
                %(i.camel_name, i.camel_name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sSkeletonClass:\n'
                ' * @parent_class: The parent class.\n'
                ' *\n'
                ' * Class structure for #%sSkeleton.\n'
                %(i.camel_name, i.camel_name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('\n')

        self.outfile.write('struct _%sSkeletonPrivate\n'
                           '{\n'
                           '  GValue *properties;\n'
                           '  GList *changed_properties;\n'
                           '  GSource *changed_properties_idle_source;\n'
                           '  GMainContext *context;\n'
                           '  GMutex lock;\n'
                           '};\n'
                           '\n'%i.camel_name)

        self.outfile.write('static void\n'
                           '_%s_skeleton_handle_method_call (\n'
                           '  GDBusConnection *connection G_GNUC_UNUSED,\n'
                           '  const gchar *sender G_GNUC_UNUSED,\n'
                           '  const gchar *object_path G_GNUC_UNUSED,\n'
                           '  const gchar *interface_name,\n'
                           '  const gchar *method_name,\n'
                           '  GVariant *parameters,\n'
                           '  GDBusMethodInvocation *invocation,\n'
                           '  gpointer user_data)\n'
                           '{\n'
                           '  %sSkeleton *skeleton = %s%s_SKELETON (user_data);\n'
                           '  _ExtendedGDBusMethodInfo *info;\n'
                           '  GVariantIter iter;\n'
                           '  GVariant *child;\n'
                           '  GValue *paramv;\n'
                           '  gsize num_params;\n'
                           '  guint num_extra;\n'
                           '  gsize n;\n'
                           '  guint signal_id;\n'
                           '  GValue return_value = G_VALUE_INIT;\n'
                           %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper))
        self.outfile.write('  info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);\n'
                           '  g_assert (info != NULL);\n'
                           %())
        self.outfile.write('  num_params = g_variant_n_children (parameters);\n'
                           '  num_extra = info->pass_fdlist ? 3 : 2;'
                           '  paramv = g_new0 (GValue, num_params + num_extra);\n'
                           '  n = 0;\n'
                           '  g_value_init (&paramv[n], %sTYPE_%s);\n'
                           '  g_value_set_object (&paramv[n++], skeleton);\n'
                           '  g_value_init (&paramv[n], G_TYPE_DBUS_METHOD_INVOCATION);\n'
                           '  g_value_set_object (&paramv[n++], invocation);\n'
                           '  if (info->pass_fdlist)\n'
                           '    {\n'
                           '#ifdef G_OS_UNIX\n'
                           '      g_value_init (&paramv[n], G_TYPE_UNIX_FD_LIST);\n'
                           '      g_value_set_object (&paramv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation)));\n'
                           '#else\n'
                           '      g_assert_not_reached ();\n'
                           '#endif\n'
                           '    }\n'
                           %(i.ns_upper, i.name_upper))
        self.outfile.write('  g_variant_iter_init (&iter, parameters);\n'
                           '  while ((child = g_variant_iter_next_value (&iter)) != NULL)\n'
                           '    {\n'
                           '      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];\n'
                           '      if (arg_info->use_gvariant)\n'
                           '        {\n'
                           '          g_value_init (&paramv[n], G_TYPE_VARIANT);\n'
                           '          g_value_set_variant (&paramv[n], child);\n'
                           '          n++;\n'
                           '        }\n'
                           '      else\n'
                           '        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);\n'
                           '      g_variant_unref (child);\n'
                           '    }\n')
        self.outfile.write('  signal_id = g_signal_lookup (info->signal_name, %sTYPE_%s);\n'
                           %(i.ns_upper, i.name_upper))
        self.outfile.write('  g_value_init (&return_value, G_TYPE_BOOLEAN);\n'
                           '  g_signal_emitv (paramv, signal_id, 0, &return_value);\n'
                           '  if (!g_value_get_boolean (&return_value))\n'
                           '    g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name);\n'
                           '  g_value_unset (&return_value);\n')
        self.outfile.write('  for (n = 0; n < num_params + num_extra; n++)\n'
                           '    g_value_unset (&paramv[n]);\n'
                           '  g_free (paramv);\n')
        self.outfile.write('}\n'
                           '\n')

        self.outfile.write('static GVariant *\n'
                           '_%s_skeleton_handle_get_property (\n'
                           '  GDBusConnection *connection G_GNUC_UNUSED,\n'
                           '  const gchar *sender G_GNUC_UNUSED,\n'
                           '  const gchar *object_path G_GNUC_UNUSED,\n'
                           '  const gchar *interface_name G_GNUC_UNUSED,\n'
                           '  const gchar *property_name,\n'
                           '  GError **error,\n'
                           '  gpointer user_data)\n'
                           '{\n'
                           '  %sSkeleton *skeleton = %s%s_SKELETON (user_data);\n'
                           '  GValue value = G_VALUE_INIT;\n'
                           '  GParamSpec *pspec;\n'
                           '  _ExtendedGDBusPropertyInfo *info;\n'
                           '  GVariant *ret;\n'
                           %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper))
        self.outfile.write('  ret = NULL;\n'
                           '  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_%s_interface_info.parent_struct, property_name);\n'
                           '  g_assert (info != NULL);\n'
                           '  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);\n'
                           '  if (pspec == NULL)\n'
                           '    {\n'
                           '      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %%s", property_name);\n'
                           '    }\n'
                           '  else\n'
                           '    {\n'
                           '      g_value_init (&value, pspec->value_type);\n'
                           '      g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);\n'
                           '      ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));\n'
                           '      g_value_unset (&value);\n'
                           '    }\n'
                           '  return ret;\n'
                           '}\n'
                           '\n'
                           %(i.name_lower))

        self.outfile.write('static gboolean\n'
                           '_%s_skeleton_handle_set_property (\n'
                           '  GDBusConnection *connection G_GNUC_UNUSED,\n'
                           '  const gchar *sender G_GNUC_UNUSED,\n'
                           '  const gchar *object_path G_GNUC_UNUSED,\n'
                           '  const gchar *interface_name G_GNUC_UNUSED,\n'
                           '  const gchar *property_name,\n'
                           '  GVariant *variant,\n'
                           '  GError **error,\n'
                           '  gpointer user_data)\n'
                           '{\n'
                           '  %sSkeleton *skeleton = %s%s_SKELETON (user_data);\n'
                           '  GValue value = G_VALUE_INIT;\n'
                           '  GParamSpec *pspec;\n'
                           '  _ExtendedGDBusPropertyInfo *info;\n'
                           '  gboolean ret;\n'
                           %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper))
        self.outfile.write('  ret = FALSE;\n'
                           '  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_%s_interface_info.parent_struct, property_name);\n'
                           '  g_assert (info != NULL);\n'
                           '  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);\n'
                           '  if (pspec == NULL)\n'
                           '    {\n'
                           '      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %%s", property_name);\n'
                           '    }\n'
                           '  else\n'
                           '    {\n'
                           '      if (info->use_gvariant)\n'
                           '        g_value_set_variant (&value, variant);\n'
                           '      else\n'
                           '        g_dbus_gvariant_to_gvalue (variant, &value);\n'
                           '      g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);\n'
                           '      g_value_unset (&value);\n'
                           '      ret = TRUE;\n'
                           '    }\n'
                           '  return ret;\n'
                           '}\n'
                           '\n'
                           %(i.name_lower))


        self.outfile.write('static const GDBusInterfaceVTable _%s_skeleton_vtable =\n'
                           '{\n'
                           '  _%s_skeleton_handle_method_call,\n'
                           '  _%s_skeleton_handle_get_property,\n'
                           '  _%s_skeleton_handle_set_property,\n'
                           '  {NULL}\n'
                           '};\n'
                           '\n'%(i.name_lower, i.name_lower, i.name_lower, i.name_lower))

        self.outfile.write('static GDBusInterfaceInfo *\n'
                           '%s_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)\n'
                           '{\n'
                           '  return %s_interface_info ();\n'
                           %(i.name_lower, i.name_lower))
        self.outfile.write('}\n'
                           '\n')

        self.outfile.write('static GDBusInterfaceVTable *\n'
                           '%s_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)\n'
                           '{\n'
                           '  return (GDBusInterfaceVTable *) &_%s_skeleton_vtable;\n'
                           %(i.name_lower, i.name_lower))
        self.outfile.write('}\n'
                           '\n')

        self.outfile.write('static GVariant *\n'
                           '%s_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)\n'
                           '{\n'
                           '  %sSkeleton *skeleton = %s%s_SKELETON (_skeleton);\n'
                           %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper))
        self.outfile.write('\n'
                           '  GVariantBuilder builder;\n'
                           '  guint n;\n'
                           '  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));\n'
                           '  if (_%s_interface_info.parent_struct.properties == NULL)\n'
                           '    goto out;\n'
                           '  for (n = 0; _%s_interface_info.parent_struct.properties[n] != NULL; n++)\n'
                           '    {\n'
                           '      GDBusPropertyInfo *info = _%s_interface_info.parent_struct.properties[n];\n'
                           '      if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)\n'
                           '        {\n'
                           '          GVariant *value;\n'
                           '          value = _%s_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "%s", info->name, NULL, skeleton);\n'
                           '          if (value != NULL)\n'
                           '            {\n'
                           '              g_variant_take_ref (value);\n'
                           '              g_variant_builder_add (&builder, "{sv}", info->name, value);\n'
                           '              g_variant_unref (value);\n'
                           '            }\n'
                           '        }\n'
                           '    }\n'
                           'out:\n'
                           '  return g_variant_builder_end (&builder);\n'
                           '}\n'
                           '\n'
                           %(i.name_lower, i.name_lower, i.name_lower, i.name_lower, i.name))

        if len(i.properties) > 0:
            self.outfile.write('static gboolean _%s_emit_changed (gpointer user_data);\n'
                               '\n'
                               %(i.name_lower))

        self.outfile.write('static void\n'
                           '%s_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)\n'
                           '{\n'
                           %(i.name_lower))
        if len(i.properties) > 0:
            self.outfile.write('  %sSkeleton *skeleton = %s%s_SKELETON (_skeleton);\n'
                               '  gboolean emit_changed = FALSE;\n'
                               '\n'
                               '  g_mutex_lock (&skeleton->priv->lock);\n'
                               '  if (skeleton->priv->changed_properties_idle_source != NULL)\n'
                               '    {\n'
                               '      g_source_destroy (skeleton->priv->changed_properties_idle_source);\n'
                               '      skeleton->priv->changed_properties_idle_source = NULL;\n'
                               '      emit_changed = TRUE;\n'
                               '    }\n'
                               '  g_mutex_unlock (&skeleton->priv->lock);\n'
                               '\n'
                               '  if (emit_changed)\n'
                               '    _%s_emit_changed (skeleton);\n'
                               %(i.camel_name, i.ns_upper, i.name_upper, i.name_lower))
        self.outfile.write('}\n'
                           '\n')

        for s in i.signals:
            self.outfile.write('static void\n'
                               '_%s_on_signal_%s (\n'
                               '    %s *object'%(i.name_lower, s.name_lower, i.camel_name))
            for a in s.args:
                self.outfile.write(',\n    %sarg_%s'%(a.ctype_in, a.name))
            self.outfile.write(')\n'
                               '{\n'
                               '  %sSkeleton *skeleton = %s%s_SKELETON (object);\n\n'
                               '  GList      *connections, *l;\n'
                               '  GVariant   *signal_variant;\n'
                               '  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));\n'
                               %(i.camel_name, i.ns_upper, i.name_upper))
            self.outfile.write('\n'
                               '  signal_variant = g_variant_ref_sink (g_variant_new ("(')
            for a in s.args:
                self.outfile.write('%s'%(a.format_in))
            self.outfile.write(')"')
            for a in s.args:
                self.outfile.write(',\n                   arg_%s'%(a.name))
            self.outfile.write('));\n')

            self.outfile.write('  for (l = connections; l != NULL; l = l->next)\n'
                               '    {\n'
                               '      GDBusConnection *connection = l->data;\n'
                               '      g_dbus_connection_emit_signal (connection,\n'
                               '        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "%s", "%s",\n'
                               '        signal_variant, NULL);\n'
                               '    }\n'
                               %(i.name, s.name))
            self.outfile.write('  g_variant_unref (signal_variant);\n')
            self.outfile.write('  g_list_free_full (connections, g_object_unref);\n')
            self.outfile.write('}\n'
                               '\n')

        self.outfile.write('static void %s_skeleton_iface_init (%sIface *iface);\n'
                           %(i.name_lower, i.camel_name))

        self.outfile.write('#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38\n')
        self.outfile.write('G_DEFINE_TYPE_WITH_CODE (%sSkeleton, %s_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,\n'%(i.camel_name, i.name_lower))
        self.outfile.write('                         G_ADD_PRIVATE (%sSkeleton)\n'%(i.camel_name))
        self.outfile.write('                         G_IMPLEMENT_INTERFACE (%sTYPE_%s, %s_skeleton_iface_init))\n\n'%(i.ns_upper, i.name_upper, i.name_lower))
        self.outfile.write('#else\n')
        self.outfile.write('G_DEFINE_TYPE_WITH_CODE (%sSkeleton, %s_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,\n'%(i.camel_name, i.name_lower))
        self.outfile.write('                         G_IMPLEMENT_INTERFACE (%sTYPE_%s, %s_skeleton_iface_init))\n\n'%(i.ns_upper, i.name_upper, i.name_lower))
        self.outfile.write('#endif\n')

        # finalize
        self.outfile.write('static void\n'
                           '%s_skeleton_finalize (GObject *object)\n'
                           '{\n'%(i.name_lower))
        self.outfile.write('  %sSkeleton *skeleton = %s%s_SKELETON (object);\n'%(i.camel_name, i.ns_upper, i.name_upper))
        if len(i.properties) > 0:
            self.outfile.write('  guint n;\n'
                               '  for (n = 0; n < %d; n++)\n'
                               '    g_value_unset (&skeleton->priv->properties[n]);\n'%(len(i.properties)))
            self.outfile.write('  g_free (skeleton->priv->properties);\n')
        self.outfile.write('  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);\n')
        self.outfile.write('  if (skeleton->priv->changed_properties_idle_source != NULL)\n')
        self.outfile.write('    g_source_destroy (skeleton->priv->changed_properties_idle_source);\n')
        self.outfile.write('  g_main_context_unref (skeleton->priv->context);\n')
        self.outfile.write('  g_mutex_clear (&skeleton->priv->lock);\n')
        self.outfile.write('  G_OBJECT_CLASS (%s_skeleton_parent_class)->finalize (object);\n'
                           '}\n'
                           '\n'%(i.name_lower))

        # property accessors (TODO: generate PropertiesChanged signals in setter)
        if len(i.properties) > 0:
            self.outfile.write('static void\n'
                               '%s_skeleton_get_property (GObject      *object,\n'
                               '  guint         prop_id,\n'
                            '  GValue       *value,\n'
                            '  GParamSpec   *pspec G_GNUC_UNUSED)\n'
                            '{\n'%(i.name_lower))
            self.outfile.write('  %sSkeleton *skeleton = %s%s_SKELETON (object);\n'
                               '  g_assert (prop_id != 0 && prop_id - 1 < %d);\n'
                               '  g_mutex_lock (&skeleton->priv->lock);\n'
                               '  g_value_copy (&skeleton->priv->properties[prop_id - 1], value);\n'
                               '  g_mutex_unlock (&skeleton->priv->lock);\n'
                               %(i.camel_name, i.ns_upper, i.name_upper, len(i.properties)))
            self.outfile.write('}\n'
                               '\n')

            # if property is already scheduled then re-use entry.. though it could be
            # that the user did
            #
            #  foo_set_prop_bar (object, "");
            #  foo_set_prop_bar (object, "blah");
            #
            # say, every update... In this case, where nothing happens, we obviously
            # don't want a PropertiesChanged() event. We can easily check for this
            # by comparing against the _original value_ recorded before the first
            # change event. If the latest value is not different from the original
            # one, we can simply ignore the ChangedProperty
            #
            self.outfile.write('static gboolean\n'
                               '_%s_emit_changed (gpointer user_data)\n'
                               '{\n'
                               '  %sSkeleton *skeleton = %s%s_SKELETON (user_data);\n'
                               %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper))
            self.outfile.write('  GList *l;\n'
                               '  GVariantBuilder builder;\n'
                               '  GVariantBuilder invalidated_builder;\n'
                               '  guint num_changes;\n'
                               '\n'
                               '  g_mutex_lock (&skeleton->priv->lock);\n'
                               '  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));\n'
                               '  g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));\n'
                               '  for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next)\n'
                               '    {\n'
                               '      ChangedProperty *cp = l->data;\n'
                               '      GVariant *variant;\n'
                               '      const GValue *cur_value;\n'
                               '\n'
                               '      cur_value = &skeleton->priv->properties[cp->prop_id - 1];\n'
                               '      if (!_g_value_equal (cur_value, &cp->orig_value))\n'
                               '        {\n'
                               '          variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE (cp->info->parent_struct.signature));\n'
                               '          g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant);\n'
                               '          g_variant_unref (variant);\n'
                               '          num_changes++;\n'
                               '        }\n'
                               '    }\n'
                               '  if (num_changes > 0)\n'
                               '    {\n'
                               '      GList *connections, *ll;\n'
                               '      GVariant *signal_variant;'
                               '\n'
                               '      signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "%s",\n'
                               '                                           &builder, &invalidated_builder));\n'
                               '      connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));\n'
                               '      for (ll = connections; ll != NULL; ll = ll->next)\n'
                               '        {\n'
                               '          GDBusConnection *connection = ll->data;\n'
                               '\n'
                               '          g_dbus_connection_emit_signal (connection,\n'
                               '                                         NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)),\n'
                               '                                         "org.freedesktop.DBus.Properties",\n'
                               '                                         "PropertiesChanged",\n'
                               '                                         signal_variant,\n'
                               '                                         NULL);\n'
                               '        }\n'
                               '      g_variant_unref (signal_variant);\n'
                               '      g_list_free_full (connections, g_object_unref);\n'
                               '    }\n'
                               '  else\n'
                               '    {\n'
                               '      g_variant_builder_clear (&builder);\n'
                               '      g_variant_builder_clear (&invalidated_builder);\n'
                               '    }\n'
                               %(i.name))
            self.outfile.write('  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);\n')
            self.outfile.write('  skeleton->priv->changed_properties = NULL;\n')
            self.outfile.write('  skeleton->priv->changed_properties_idle_source = NULL;\n')
            self.outfile.write('  g_mutex_unlock (&skeleton->priv->lock);\n')
            self.outfile.write('  return FALSE;\n'
                               '}\n'
                               '\n')
            # holding lock while being called
            self.outfile.write('static void\n'
                               '_%s_schedule_emit_changed (%sSkeleton *skeleton, const _ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value)\n'
                               '{\n'
                               '  ChangedProperty *cp;\n'
                               '  GList *l;\n'
                               '  cp = NULL;\n'
                               '  for (l = skeleton->priv->changed_properties; l != NULL; l = l->next)\n'
                               '    {\n'
                               '      ChangedProperty *i_cp = l->data;\n'
                               '      if (i_cp->info == info)\n'
                               '        {\n'
                               '          cp = i_cp;\n'
                               '          break;\n'
                               '        }\n'
                               '    }\n'
                               %(i.name_lower, i.camel_name))
            self.outfile.write('  if (cp == NULL)\n'
                               '    {\n'
                               '      cp = g_new0 (ChangedProperty, 1);\n'
                               '      cp->prop_id = prop_id;\n'
                               '      cp->info = info;\n'
                               '      skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp);\n'
                               '      g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value));\n'
                               '      g_value_copy (orig_value, &cp->orig_value);\n'
                               '    }\n'
                               '}\n'
                               '\n'
                               %())

            # Postpone setting up the refresh source until the ::notify signal is emitted as
            # this allows use of g_object_freeze_notify()/g_object_thaw_notify() ...
            # This is useful when updating several properties from another thread than
            # where the idle will be emitted from
            self.outfile.write('static void\n'
                               '%s_skeleton_notify (GObject      *object,\n'
                               '  GParamSpec *pspec G_GNUC_UNUSED)\n'
                               '{\n'
                               '  %sSkeleton *skeleton = %s%s_SKELETON (object);\n'
                               '  g_mutex_lock (&skeleton->priv->lock);\n'
                               '  if (skeleton->priv->changed_properties != NULL &&\n'
                               '      skeleton->priv->changed_properties_idle_source == NULL)\n'
                               '    {\n'
                               '      skeleton->priv->changed_properties_idle_source = g_idle_source_new ();\n'
                               '      g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT);\n'
                               '      g_source_set_callback (skeleton->priv->changed_properties_idle_source, _%s_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref);\n'
                               '      g_source_set_name (skeleton->priv->changed_properties_idle_source, "[generated] _%s_emit_changed");\n'
                               '      g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context);\n'
                               '      g_source_unref (skeleton->priv->changed_properties_idle_source);\n'
                               '    }\n'
                               '  g_mutex_unlock (&skeleton->priv->lock);\n'
                               '}\n'
                               '\n'
                               %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper, i.name_lower, i.name_lower))

            self.outfile.write('static void\n'
                               '%s_skeleton_set_property (GObject      *object,\n'
                               '  guint         prop_id,\n'
                               '  const GValue *value,\n'
                               '  GParamSpec   *pspec)\n'
                               '{\n'%(i.name_lower))
            self.outfile.write('  const _ExtendedGDBusPropertyInfo *info;\n'
                               '  %sSkeleton *skeleton = %s%s_SKELETON (object);\n'
                               '  g_assert (prop_id != 0 && prop_id - 1 < %d);\n'
                               '  info = (const _ExtendedGDBusPropertyInfo *) _%s_property_info_pointers[prop_id - 1];\n'
                               '  g_mutex_lock (&skeleton->priv->lock);\n'
                               '  g_object_freeze_notify (object);\n'
                               '  if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))\n'
                               '    {\n'
                               '      if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL &&\n'
                               '          info->emits_changed_signal)\n'
                               '        _%s_schedule_emit_changed (skeleton, info, prop_id, &skeleton->priv->properties[prop_id - 1]);\n'
                               '      g_value_copy (value, &skeleton->priv->properties[prop_id - 1]);\n'
                               '      g_object_notify_by_pspec (object, pspec);\n'
                               '    }\n'
                               '  g_mutex_unlock (&skeleton->priv->lock);\n'
                               '  g_object_thaw_notify (object);\n'
                               %(i.camel_name, i.ns_upper, i.name_upper, len(i.properties), i.name_lower, i.name_lower))
            self.outfile.write('}\n'
                               '\n')

        self.outfile.write('static void\n'
                           '%s_skeleton_init (%sSkeleton *skeleton)\n'
                           '{\n'
                           '#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38\n'
                           '  skeleton->priv = %s_skeleton_get_instance_private (skeleton);\n'
                           '#else\n'
                           '  skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, %sTYPE_%s_SKELETON, %sSkeletonPrivate);\n'
                           '#endif\n\n'
                           %(i.name_lower, i.camel_name,
                             i.name_lower,
                             i.ns_upper, i.name_upper, i.camel_name))
        self.outfile.write('  g_mutex_init (&skeleton->priv->lock);\n')
        self.outfile.write('  skeleton->priv->context = g_main_context_ref_thread_default ();\n')
        if len(i.properties) > 0:
            self.outfile.write('  skeleton->priv->properties = g_new0 (GValue, %d);\n'%(len(i.properties)))
            n = 0
            for p in i.properties:
                self.outfile.write('  g_value_init (&skeleton->priv->properties[%d], %s);\n'%(n, p.arg.gtype))
                n += 1
        self.outfile.write('}\n'
                           '\n')

        # property vfuncs
        n = 0
        for p in i.properties:
            self.outfile.write('static %s\n'
                               '%s_skeleton_get_%s (%s *object)\n'
                               '{\n'
                               %(p.arg.ctype_in, i.name_lower, p.name_lower, i.camel_name))
            self.outfile.write('  %sSkeleton *skeleton = %s%s_SKELETON (object);\n'%(i.camel_name, i.ns_upper, i.name_upper))
            self.outfile.write('  %svalue;\n'
                               '  g_mutex_lock (&skeleton->priv->lock);\n'
                               '  value = %s (&(skeleton->priv->properties[%d]));\n'
                               '  g_mutex_unlock (&skeleton->priv->lock);\n'
                               %(p.arg.ctype_in_g, p.arg.gvalue_get, n))
            self.outfile.write('  return value;\n')
            self.outfile.write('}\n')
            self.outfile.write('\n')
            n += 1

        self.outfile.write('static void\n'
                           '%s_skeleton_class_init (%sSkeletonClass *klass)\n'
                           '{\n'
                           '  GObjectClass *gobject_class;\n'
                           '  GDBusInterfaceSkeletonClass *skeleton_class;\n'
                           '\n'
                           '  gobject_class = G_OBJECT_CLASS (klass);\n'
                           '  gobject_class->finalize = %s_skeleton_finalize;\n'
                           %(i.name_lower, i.camel_name, i.name_lower))
        if len(i.properties) > 0:
            self.outfile.write('  gobject_class->get_property = %s_skeleton_get_property;\n'
                               '  gobject_class->set_property = %s_skeleton_set_property;\n'
                               '  gobject_class->notify       = %s_skeleton_notify;\n'
                               '\n'%(i.name_lower, i.name_lower, i.name_lower))
            self.outfile.write('\n'
                               '  %s_override_properties (gobject_class, 1);\n'%(i.name_lower))
        self.outfile.write('\n'
                           '  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);\n');
        self.outfile.write('  skeleton_class->get_info = %s_skeleton_dbus_interface_get_info;\n'%(i.name_lower))
        self.outfile.write('  skeleton_class->get_properties = %s_skeleton_dbus_interface_get_properties;\n'%(i.name_lower))
        self.outfile.write('  skeleton_class->flush = %s_skeleton_dbus_interface_flush;\n'%(i.name_lower))
        self.outfile.write('  skeleton_class->get_vtable = %s_skeleton_dbus_interface_get_vtable;\n'%(i.name_lower))

        self.outfile.write('\n'
                           '#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38\n'
                           '  g_type_class_add_private (klass, sizeof (%sSkeletonPrivate));\n'
                           '#endif\n'%(i.camel_name))

        self.outfile.write('}\n'
                           '\n')

        self.outfile.write('static void\n'
                           '%s_skeleton_iface_init (%sIface *iface)\n'
                           '{\n'
                           %(i.name_lower, i.camel_name))
        for s in i.signals:
            self.outfile.write('  iface->%s = _%s_on_signal_%s;\n'
                               %(s.name_lower, i.name_lower, s.name_lower))
        for p in i.properties:
            self.outfile.write('  iface->get_%s = %s_skeleton_get_%s;\n'%(p.name_lower, i.name_lower, p.name_lower))
        self.outfile.write('}\n'
                           '\n')

        # constructors
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %s_skeleton_new:\n'
                ' *\n'
                ' * Creates a skeleton object for the D-Bus interface #%s.\n'
                ' *\n'
                ' * Returns: (transfer full) (type %sSkeleton): The skeleton object.\n'
                %(i.name_lower, i.name, i.camel_name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('%s *\n'
                           '%s_skeleton_new (void)\n'
                           '{\n'
                           '  return %s%s (g_object_new (%sTYPE_%s_SKELETON, NULL));\n'
                           '}\n'
                           '\n'%(i.camel_name, i.name_lower, i.ns_upper, i.name_upper, i.ns_upper, i.name_upper))

    # ---------------------------------------------------------------------------------------------------

    def generate_object(self):
        self.outfile.write('/* ------------------------------------------------------------------------\n'
                           ' * Code for Object, ObjectProxy and ObjectSkeleton\n'
                           ' * ------------------------------------------------------------------------\n'
                           ' */\n'
                           '\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * SECTION:%sObject\n'
                ' * @title: %sObject\n'
                ' * @short_description: Specialized GDBusObject types\n'
                ' *\n'
                ' * This section contains the #%sObject, #%sObjectProxy, and #%sObjectSkeleton types which make it easier to work with objects implementing generated types for D-Bus interfaces.\n'
                ' */\n'
                %(self.namespace, self.namespace, self.namespace, self.namespace, self.namespace), False))
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObject:\n'
                ' *\n'
                ' * The #%sObject type is a specialized container of interfaces.\n'
                ' */\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObjectIface:\n'
                ' * @parent_iface: The parent interface.\n'
                ' *\n'
                ' * Virtual table for the #%sObject interface.\n'
                ' */\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write('\n')

        self.outfile.write('typedef %sObjectIface %sObjectInterface;\n'%(self.namespace, self.namespace))
        self.outfile.write('G_DEFINE_INTERFACE_WITH_CODE (%sObject, %sobject, G_TYPE_OBJECT, g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_DBUS_OBJECT);)\n'%(self.namespace, self.ns_lower))
        self.outfile.write('\n')
        self.outfile.write('static void\n'
                           '%sobject_default_init (%sObjectIface *iface)\n'
                           '{\n'
                           %(self.ns_lower, self.namespace));
        for i in self.ifaces:
            self.outfile.write(self.docbook_gen.expand(
                    '  /**\n'
                    '   * %sObject:%s:\n'
                    '   *\n'
                    '   * The #%s instance corresponding to the D-Bus interface #%s, if any.\n'
                    '   *\n'
                    '   * Connect to the #GObject::notify signal to get informed of property changes.\n'
                    %(self.namespace, i.name_hyphen, i.camel_name, i.name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 2)
            flags = 'G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS'
            if i.deprecated:
                flags = 'G_PARAM_DEPRECATED | ' + flags
            self.outfile.write('  g_object_interface_install_property (iface, g_param_spec_object ("%s", "%s", "%s", %sTYPE_%s, %s));\n'
                               '\n'
                               %(i.name_hyphen, i.name_hyphen, i.name_hyphen, self.ns_upper, i.name_upper, flags))
        self.outfile.write('}\n'
                           '\n')

        for i in self.ifaces:
            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %sobject_get_%s:\n'
                    ' * @object: A #%sObject.\n'
                    ' *\n'
                    ' * Gets the #%s instance for the D-Bus interface #%s on @object, if any.\n'
                    ' *\n'
                    ' * Returns: (transfer full) (nullable): A #%s that must be freed with g_object_unref() or %%NULL if @object does not implement the interface.\n'
                    %(self.ns_lower, i.name_upper.lower(), self.namespace, i.camel_name, i.name, i.camel_name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
            self.outfile.write('%s *%sobject_get_%s (%sObject *object)\n'
                               %(i.camel_name, self.ns_lower, i.name_upper.lower(), self.namespace))
            self.outfile.write('{\n'
                               '  GDBusInterface *ret;\n'
                               '  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "%s");\n'
                               '  if (ret == NULL)\n'
                               '    return NULL;\n'
                               '  return %s%s (ret);\n'
                               '}\n'
                               '\n'
                               %(i.name, self.ns_upper, i.name_upper))
        self.outfile.write('\n')
        for i in self.ifaces:
            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %sobject_peek_%s: (skip)\n'
                    ' * @object: A #%sObject.\n'
                    ' *\n'
                    ' * Like %sobject_get_%s() but doesn\'t increase the reference count on the returned object.\n'
                    ' *\n'
                    ' * <warning>It is not safe to use the returned object if you are on another thread than the one where the #GDBusObjectManagerClient or #GDBusObjectManagerServer for @object is running.</warning>\n'
                    ' *\n'
                    ' * Returns: (transfer none) (nullable): A #%s or %%NULL if @object does not implement the interface. Do not free the returned object, it is owned by @object.\n'
                    %(self.ns_lower, i.name_upper.lower(), self.namespace, self.ns_lower, i.name_upper.lower(), i.camel_name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
            self.outfile.write('%s *%sobject_peek_%s (%sObject *object)\n'
                               %(i.camel_name, self.ns_lower, i.name_upper.lower(), self.namespace))
            self.outfile.write('{\n'
                               '  GDBusInterface *ret;\n'
                               '  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "%s");\n'
                               '  if (ret == NULL)\n'
                               '    return NULL;\n'
                               '  g_object_unref (ret);\n'
                               '  return %s%s (ret);\n'
                               '}\n'
                               '\n'
                               %(i.name, self.ns_upper, i.name_upper))
        self.outfile.write('\n')
        # shared by ObjectProxy and ObjectSkeleton classes
        self.outfile.write('static void\n'
                           '%sobject_notify (GDBusObject *object, GDBusInterface *interface)\n'
                           '{\n'
                           '  _ExtendedGDBusInterfaceInfo *info = (_ExtendedGDBusInterfaceInfo *) g_dbus_interface_get_info (interface);\n'
                           '  /* info can be NULL if the other end is using a D-Bus interface we don\'t know\n'
                           '   * anything about, for example old generated code in this process talking to\n'
                           '   * newer generated code in the other process. */\n'
                           '  if (info != NULL)\n'
                           '    g_object_notify (G_OBJECT (object), info->hyphen_name);\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower))

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObjectProxy:\n'
                ' *\n'
                ' * The #%sObjectProxy structure contains only private data and should only be accessed using the provided API.\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('\n')
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObjectProxyClass:\n'
                ' * @parent_class: The parent class.\n'
                ' *\n'
                ' * Class structure for #%sObjectProxy.\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('\n')
        # class boilerplate
        self.outfile.write('static void\n'
                           '%sobject_proxy__%sobject_iface_init (%sObjectIface *iface G_GNUC_UNUSED)\n'
                           '{\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_lower, self.namespace))
        self.outfile.write('static void\n'
                           '%sobject_proxy__g_dbus_object_iface_init (GDBusObjectIface *iface)\n'
                           '{\n'
                           '  iface->interface_added = %sobject_notify;\n'
                           '  iface->interface_removed = %sobject_notify;\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_lower, self.ns_lower))
        self.outfile.write('\n')
        self.outfile.write('G_DEFINE_TYPE_WITH_CODE (%sObjectProxy, %sobject_proxy, G_TYPE_DBUS_OBJECT_PROXY,\n'
                           '                         G_IMPLEMENT_INTERFACE (%sTYPE_OBJECT, %sobject_proxy__%sobject_iface_init)\n'
                           '                         G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, %sobject_proxy__g_dbus_object_iface_init))\n'
                           '\n'
                           %(self.namespace, self.ns_lower, self.ns_upper, self.ns_lower, self.ns_lower, self.ns_lower))
        # class boilerplate
        self.outfile.write('static void\n'
                           '%sobject_proxy_init (%sObjectProxy *object G_GNUC_UNUSED)\n'
                           '{\n'
                           '}\n'
                           '\n'%(self.ns_lower, self.namespace))
        self.outfile.write('static void\n'
                           '%sobject_proxy_set_property (GObject      *gobject,\n'
                           '  guint         prop_id,\n'
                           '  const GValue *value G_GNUC_UNUSED,\n'
                           '  GParamSpec   *pspec)\n'
                           '{\n'
                           '  G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);\n'
                           %(self.ns_lower))
        self.outfile.write('}\n'
                           '\n'%())
        self.outfile.write('static void\n'
                           '%sobject_proxy_get_property (GObject      *gobject,\n'
                           '  guint         prop_id,\n'
                           '  GValue       *value,\n'
                           '  GParamSpec   *pspec)\n'
                           '{\n'
                           '  %sObjectProxy *object = %sOBJECT_PROXY (gobject);\n'
                           '  GDBusInterface *interface;\n'
                           '\n'
                           '  switch (prop_id)\n'
                           '    {\n'
                           %(self.ns_lower, self.namespace, self.ns_upper))
        n = 1
        for i in self.ifaces:
            self.outfile.write('    case %d:\n'
                               '      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "%s");\n'
                               '      g_value_take_object (value, interface);\n'
                               '      break;\n'
                               '\n'
                               %(n, i.name))
            n += 1
        self.outfile.write('    default:\n'
                           '      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);\n'
                           '      break;\n'
                           '  }\n'
                           '}\n'
                           '\n'%())
        self.outfile.write('static void\n'
                           '%sobject_proxy_class_init (%sObjectProxyClass *klass)\n'
                           '{\n'
                           '  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);\n'
                           '\n'
                           '  gobject_class->set_property = %sobject_proxy_set_property;\n'
                           '  gobject_class->get_property = %sobject_proxy_get_property;\n'
                           '\n'
                           %(self.ns_lower, self.namespace, self.ns_lower, self.ns_lower))
        n = 1
        for i in self.ifaces:
            self.outfile.write('  g_object_class_override_property (gobject_class, %d, "%s");'
                               '\n'
                               %(n, i.name_hyphen))
            n += 1
        self.outfile.write('}\n'
                           '\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sobject_proxy_new:\n'
                ' * @connection: A #GDBusConnection.\n'
                ' * @object_path: An object path.\n'
                ' *\n'
                ' * Creates a new proxy object.\n'
                ' *\n'
                ' * Returns: (transfer full): The proxy object.\n'
                ' */\n'
                %(self.ns_lower), False))
        self.outfile.write('%sObjectProxy *\n'
                     '%sobject_proxy_new (GDBusConnection *connection,\n'
                     '  const gchar *object_path)\n'
                     '{\n'
                     '  g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL);\n'
                     '  g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);\n'
                     '  return %sOBJECT_PROXY (g_object_new (%sTYPE_OBJECT_PROXY, "g-connection", connection, "g-object-path", object_path, NULL));\n'
                     '}\n'
                     '\n'%(self.namespace, self.ns_lower, self.ns_upper, self.ns_upper))

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObjectSkeleton:\n'
                ' *\n'
                ' * The #%sObjectSkeleton structure contains only private data and should only be accessed using the provided API.\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('\n')
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObjectSkeletonClass:\n'
                ' * @parent_class: The parent class.\n'
                ' *\n'
                ' * Class structure for #%sObjectSkeleton.\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('\n')
        # class boilerplate
        self.outfile.write('static void\n'
                           '%sobject_skeleton__%sobject_iface_init (%sObjectIface *iface G_GNUC_UNUSED)\n'
                           '{\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_lower, self.namespace))
        self.outfile.write('\n')
        self.outfile.write('static void\n'
                           '%sobject_skeleton__g_dbus_object_iface_init (GDBusObjectIface *iface)\n'
                           '{\n'
                           '  iface->interface_added = %sobject_notify;\n'
                           '  iface->interface_removed = %sobject_notify;\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_lower, self.ns_lower))
        self.outfile.write('G_DEFINE_TYPE_WITH_CODE (%sObjectSkeleton, %sobject_skeleton, G_TYPE_DBUS_OBJECT_SKELETON,\n'
                           '                         G_IMPLEMENT_INTERFACE (%sTYPE_OBJECT, %sobject_skeleton__%sobject_iface_init)\n'
                           '                         G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, %sobject_skeleton__g_dbus_object_iface_init))\n'
                           '\n'
                           %(self.namespace, self.ns_lower, self.ns_upper, self.ns_lower, self.ns_lower, self.ns_lower))
        # class boilerplate
        self.outfile.write('static void\n'
                           '%sobject_skeleton_init (%sObjectSkeleton *object G_GNUC_UNUSED)\n'
                           '{\n'
                           '}\n'
                           '\n'%(self.ns_lower, self.namespace))
        self.outfile.write('static void\n'
                           '%sobject_skeleton_set_property (GObject      *gobject,\n'
                           '  guint         prop_id,\n'
                           '  const GValue *value,\n'
                           '  GParamSpec   *pspec)\n'
                           '{\n'
                           '  %sObjectSkeleton *object = %sOBJECT_SKELETON (gobject);\n'
                           '  GDBusInterfaceSkeleton *interface;\n'
                           '\n'
                           '  switch (prop_id)\n'
                           '    {\n'
                           %(self.ns_lower, self.namespace, self.ns_upper))
        n = 1
        for i in self.ifaces:
            self.outfile.write('    case %d:\n'
                               '      interface = g_value_get_object (value);\n'
                               '      if (interface != NULL)\n'
                               '        {\n'
                               '          g_warn_if_fail (%sIS_%s (interface));\n'
                               '          g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface);\n'
                               '        }\n'
                               '      else\n'
                               '        {\n'
                               '          g_dbus_object_skeleton_remove_interface_by_name (G_DBUS_OBJECT_SKELETON (object), "%s");\n'
                               '        }\n'
                               '      break;\n'
                               '\n'
                               %(n, self.ns_upper, i.name_upper, i.name))
            n += 1
        self.outfile.write('    default:\n'
                     '      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);\n'
                     '      break;\n'
                     '  }\n'
                     '}\n'
                     '\n'%())
        self.outfile.write('static void\n'
                           '%sobject_skeleton_get_property (GObject      *gobject,\n'
                           '  guint         prop_id,\n'
                           '  GValue       *value,\n'
                           '  GParamSpec   *pspec)\n'
                           '{\n'
                           '  %sObjectSkeleton *object = %sOBJECT_SKELETON (gobject);\n'
                           '  GDBusInterface *interface;\n'
                           '\n'
                           '  switch (prop_id)\n'
                           '    {\n'
                           %(self.ns_lower, self.namespace, self.ns_upper))
        n = 1
        for i in self.ifaces:
            self.outfile.write('    case %d:\n'
                               '      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "%s");\n'
                               '      g_value_take_object (value, interface);\n'
                               '      break;\n'
                               '\n'
                               %(n, i.name))
            n += 1
        self.outfile.write('    default:\n'
                           '      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);\n'
                           '      break;\n'
                           '  }\n'
                           '}\n'
                           '\n'%())
        self.outfile.write('static void\n'
                           '%sobject_skeleton_class_init (%sObjectSkeletonClass *klass)\n'
                           '{\n'
                           '  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);\n'
                           '\n'
                           '  gobject_class->set_property = %sobject_skeleton_set_property;\n'
                           '  gobject_class->get_property = %sobject_skeleton_get_property;\n'
                           '\n'
                           %(self.ns_lower, self.namespace, self.ns_lower, self.ns_lower))
        n = 1
        for i in self.ifaces:
            self.outfile.write('  g_object_class_override_property (gobject_class, %d, "%s");'
                               '\n'
                               %(n, i.name_hyphen))
            n += 1
        self.outfile.write('}\n'
                           '\n')
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sobject_skeleton_new:\n'
                ' * @object_path: An object path.\n'
                ' *\n'
                ' * Creates a new skeleton object.\n'
                ' *\n'
                ' * Returns: (transfer full): The skeleton object.\n'
                ' */\n'
                %(self.ns_lower), False))
        self.outfile.write('%sObjectSkeleton *\n'
                           '%sobject_skeleton_new (const gchar *object_path)\n'
                           '{\n'
                           '  g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);\n'
                           '  return %sOBJECT_SKELETON (g_object_new (%sTYPE_OBJECT_SKELETON, "g-object-path", object_path, NULL));\n'
                           '}\n'
                           '\n'%(self.namespace, self.ns_lower, self.ns_upper, self.ns_upper))
        for i in self.ifaces:
            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %sobject_skeleton_set_%s:\n'
                    ' * @object: A #%sObjectSkeleton.\n'
                    ' * @interface_: (nullable): A #%s or %%NULL to clear the interface.\n'
                    ' *\n'
                    ' * Sets the #%s instance for the D-Bus interface #%s on @object.\n'
                    %(self.ns_lower, i.name_upper.lower(), self.namespace, i.camel_name, i.camel_name, i.name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
            self.outfile.write('void %sobject_skeleton_set_%s (%sObjectSkeleton *object, %s *interface_)\n'
                               %(self.ns_lower, i.name_upper.lower(), self.namespace, i.camel_name))
            self.outfile.write('{\n'
                               '  g_object_set (G_OBJECT (object), "%s", interface_, NULL);\n'
                               '}\n'
                               '\n'
                               %(i.name_hyphen))
        self.outfile.write('\n')


    def generate_object_manager_client(self):
        self.outfile.write('/* ------------------------------------------------------------------------\n'
                           ' * Code for ObjectManager client\n'
                           ' * ------------------------------------------------------------------------\n'
                           ' */\n'
                           '\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * SECTION:%sObjectManagerClient\n'
                ' * @title: %sObjectManagerClient\n'
                ' * @short_description: Generated GDBusObjectManagerClient type\n'
                ' *\n'
                ' * This section contains a #GDBusObjectManagerClient that uses %sobject_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc.\n'
                ' */\n'
                %(self.namespace, self.namespace, self.ns_lower), False))
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObjectManagerClient:\n'
                ' *\n'
                ' * The #%sObjectManagerClient structure contains only private data and should only be accessed using the provided API.\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObjectManagerClientClass:\n'
                ' * @parent_class: The parent class.\n'
                ' *\n'
                ' * Class structure for #%sObjectManagerClient.\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('\n')

        # class boilerplate
        self.outfile.write('G_DEFINE_TYPE (%sObjectManagerClient, %sobject_manager_client, G_TYPE_DBUS_OBJECT_MANAGER_CLIENT)\n'
                           '\n'
                           %(self.namespace, self.ns_lower))

        # class boilerplate
        self.outfile.write('static void\n'
                           '%sobject_manager_client_init (%sObjectManagerClient *manager G_GNUC_UNUSED)\n'
                           '{\n'
                           '}\n'
                           '\n'%(self.ns_lower, self.namespace))
        self.outfile.write('static void\n'
                           '%sobject_manager_client_class_init (%sObjectManagerClientClass *klass G_GNUC_UNUSED)\n'
                           '{\n'
                           '}\n'
                           '\n'%(self.ns_lower, self.namespace))

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sobject_manager_client_get_proxy_type:\n'
                ' * @manager: A #GDBusObjectManagerClient.\n'
                ' * @object_path: The object path of the remote object (unused).\n'
                ' * @interface_name: (nullable): Interface name of the remote object or %%NULL to get the object proxy #GType.\n'
                ' * @user_data: User data (unused).\n'
                ' *\n'
                ' * A #GDBusProxyTypeFunc that maps @interface_name to the generated #GDBusObjectProxy derived and #GDBusProxy derived types.\n'
                ' *\n'
                ' * Returns: A #GDBusProxy derived #GType if @interface_name is not %%NULL, otherwise the #GType for #%sObjectProxy.\n'
                %(self.ns_lower, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('GType\n'
                           '%sobject_manager_client_get_proxy_type (GDBusObjectManagerClient *manager G_GNUC_UNUSED, const gchar *object_path G_GNUC_UNUSED, const gchar *interface_name, gpointer user_data G_GNUC_UNUSED)\n'
                           '{\n'
                           %(self.ns_lower))
        self.outfile.write('  static gsize once_init_value = 0;\n'
                           '  static GHashTable *lookup_hash;\n'
                           '  GType ret;\n'
                           '\n'
                           '  if (interface_name == NULL)\n'
                           '    return %sTYPE_OBJECT_PROXY;\n'
                           '  if (g_once_init_enter (&once_init_value))\n'
                           '    {\n'
                           '      lookup_hash = g_hash_table_new (g_str_hash, g_str_equal);\n'
                           %(self.ns_upper))
        for i in self.ifaces:
            self.outfile.write('      g_hash_table_insert (lookup_hash, (gpointer) "%s", GSIZE_TO_POINTER (%sTYPE_%s_PROXY));\n'
                               %(i.name, i.ns_upper, i.name_upper))
        self.outfile.write('      g_once_init_leave (&once_init_value, 1);\n'
                           '    }\n')
        self.outfile.write('  ret = (GType) GPOINTER_TO_SIZE (g_hash_table_lookup (lookup_hash, interface_name));\n'
                           '  if (ret == (GType) 0)\n'
                           '    ret = G_TYPE_DBUS_PROXY;\n')
        self.outfile.write('  return ret;\n'
                           '}\n'
                           '\n')

        # constructors
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sobject_manager_client_new:\n'
                ' * @connection: A #GDBusConnection.\n'
                ' * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.\n'
                ' * @name: (nullable): A bus name (well-known or unique) or %%NULL if @connection is not a message bus connection.\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @callback: A #GAsyncReadyCallback to call when the request is satisfied.\n'
                ' * @user_data: User data to pass to @callback.\n'
                ' *\n'
                ' * Asynchronously creates #GDBusObjectManagerClient using %sobject_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new() for more details.\n'
                ' *\n'
                ' * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.\n'
                ' * You can then call %sobject_manager_client_new_finish() to get the result of the operation.\n'
                ' *\n'
                ' * See %sobject_manager_client_new_sync() for the synchronous, blocking version of this constructor.\n'
                %(self.ns_lower, self.ns_lower, self.ns_lower, self.ns_lower), False))
        self.outfile.write(' */\n')
        self.outfile.write('void\n'
                           '%sobject_manager_client_new (\n'
                           '    GDBusConnection        *connection,\n'
                           '    GDBusObjectManagerClientFlags  flags,\n'
                           '    const gchar            *name,\n'
                           '    const gchar            *object_path,\n'
                           '    GCancellable           *cancellable,\n'
                           '    GAsyncReadyCallback     callback,\n'
                           '    gpointer                user_data)\n'
                           '{\n'
                           '  g_async_initable_new_async (%sTYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", %sobject_manager_client_get_proxy_type, NULL);\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_upper, self.ns_lower))
        self.outfile.write('/**\n'
                           ' * %sobject_manager_client_new_finish:\n'
                           ' * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to %sobject_manager_client_new().\n'
                           ' * @error: Return location for error or %%NULL\n'
                           ' *\n'
                           ' * Finishes an operation started with %sobject_manager_client_new().\n'
                           ' *\n'
                           ' * Returns: (transfer full) (type %sObjectManagerClient): The constructed object manager client or %%NULL if @error is set.\n'
                           %(self.ns_lower, self.ns_lower, self.ns_lower, self.namespace))
        self.outfile.write(' */\n')
        self.outfile.write('GDBusObjectManager *\n'
                           '%sobject_manager_client_new_finish (\n'
                           '    GAsyncResult        *res,\n'
                           '    GError             **error)\n'
                           '{\n'
                           '  GObject *ret;\n'
                           '  GObject *source_object;\n'
                           '  source_object = g_async_result_get_source_object (res);\n'
                           '  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);\n'
                           '  g_object_unref (source_object);\n'
                           '  if (ret != NULL)\n'
                           '    return G_DBUS_OBJECT_MANAGER (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower))
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sobject_manager_client_new_sync:\n'
                ' * @connection: A #GDBusConnection.\n'
                ' * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.\n'
                ' * @name: (nullable): A bus name (well-known or unique) or %%NULL if @connection is not a message bus connection.\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @error: Return location for error or %%NULL\n'
                ' *\n'
                ' * Synchronously creates #GDBusObjectManagerClient using %sobject_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new_sync() for more details.\n'
                ' *\n'
                ' * The calling thread is blocked until a reply is received.\n'
                ' *\n'
                ' * See %sobject_manager_client_new() for the asynchronous version of this constructor.\n'
                ' *\n'
                ' * Returns: (transfer full) (type %sObjectManagerClient): The constructed object manager client or %%NULL if @error is set.\n'
                %(self.ns_lower, self.ns_lower, self.ns_lower, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('GDBusObjectManager *\n'
                           '%sobject_manager_client_new_sync (\n'
                           '    GDBusConnection        *connection,\n'
                           '    GDBusObjectManagerClientFlags  flags,\n'
                           '    const gchar            *name,\n'
                           '    const gchar            *object_path,\n'
                           '    GCancellable           *cancellable,\n'
                           '    GError                **error)\n'
                           '{\n'
                           '  GInitable *ret;\n'
                           '  ret = g_initable_new (%sTYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", %sobject_manager_client_get_proxy_type, NULL);\n'
                           '  if (ret != NULL)\n'
                           '    return G_DBUS_OBJECT_MANAGER (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_upper, self.ns_lower))
        self.outfile.write('\n')
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sobject_manager_client_new_for_bus:\n'
                ' * @bus_type: A #GBusType.\n'
                ' * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.\n'
                ' * @name: A bus name (well-known or unique).\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @callback: A #GAsyncReadyCallback to call when the request is satisfied.\n'
                ' * @user_data: User data to pass to @callback.\n'
                ' *\n'
                ' * Like %sobject_manager_client_new() but takes a #GBusType instead of a #GDBusConnection.\n'
                ' *\n'
                ' * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.\n'
                ' * You can then call %sobject_manager_client_new_for_bus_finish() to get the result of the operation.\n'
                ' *\n'
                ' * See %sobject_manager_client_new_for_bus_sync() for the synchronous, blocking version of this constructor.\n'
                %(self.ns_lower, self.ns_lower, self.ns_lower, self.ns_lower), False))
        self.outfile.write(' */\n')
        self.outfile.write('void\n'
                           '%sobject_manager_client_new_for_bus (\n'
                           '    GBusType                bus_type,\n'
                           '    GDBusObjectManagerClientFlags  flags,\n'
                           '    const gchar            *name,\n'
                           '    const gchar            *object_path,\n'
                           '    GCancellable           *cancellable,\n'
                           '    GAsyncReadyCallback     callback,\n'
                           '    gpointer                user_data)\n'
                           '{\n'
                           '  g_async_initable_new_async (%sTYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func", %sobject_manager_client_get_proxy_type, NULL);\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_upper, self.ns_lower))
        self.outfile.write('/**\n'
                           ' * %sobject_manager_client_new_for_bus_finish:\n'
                           ' * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to %sobject_manager_client_new_for_bus().\n'
                           ' * @error: Return location for error or %%NULL\n'
                           ' *\n'
                           ' * Finishes an operation started with %sobject_manager_client_new_for_bus().\n'
                           ' *\n'
                           ' * Returns: (transfer full) (type %sObjectManagerClient): The constructed object manager client or %%NULL if @error is set.\n'
                           %(self.ns_lower, self.ns_lower, self.ns_lower, self.namespace))
        self.outfile.write(' */\n')
        self.outfile.write('GDBusObjectManager *\n'
                           '%sobject_manager_client_new_for_bus_finish (\n'
                           '    GAsyncResult        *res,\n'
                           '    GError             **error)\n'
                           '{\n'
                           '  GObject *ret;\n'
                           '  GObject *source_object;\n'
                           '  source_object = g_async_result_get_source_object (res);\n'
                           '  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);\n'
                           '  g_object_unref (source_object);\n'
                           '  if (ret != NULL)\n'
                           '    return G_DBUS_OBJECT_MANAGER (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower))
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sobject_manager_client_new_for_bus_sync:\n'
                ' * @bus_type: A #GBusType.\n'
                ' * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.\n'
                ' * @name: A bus name (well-known or unique).\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @error: Return location for error or %%NULL\n'
                ' *\n'
                ' * Like %sobject_manager_client_new_sync() but takes a #GBusType instead of a #GDBusConnection.\n'
                ' *\n'
                ' * The calling thread is blocked until a reply is received.\n'
                ' *\n'
                ' * See %sobject_manager_client_new_for_bus() for the asynchronous version of this constructor.\n'
                ' *\n'
                ' * Returns: (transfer full) (type %sObjectManagerClient): The constructed object manager client or %%NULL if @error is set.\n'
                %(self.ns_lower, self.ns_lower, self.ns_lower, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('GDBusObjectManager *\n'
                           '%sobject_manager_client_new_for_bus_sync (\n'
                           '    GBusType                bus_type,\n'
                           '    GDBusObjectManagerClientFlags  flags,\n'
                           '    const gchar            *name,\n'
                           '    const gchar            *object_path,\n'
                           '    GCancellable           *cancellable,\n'
                           '    GError                **error)\n'
                           '{\n'
                           '  GInitable *ret;\n'
                           '  ret = g_initable_new (%sTYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func", %sobject_manager_client_get_proxy_type, NULL);\n'
                           '  if (ret != NULL)\n'
                           '    return G_DBUS_OBJECT_MANAGER (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_upper, self.ns_lower))
        self.outfile.write('\n')

    # ---------------------------------------------------------------------------------------------------

    def write_gtkdoc_deprecated_and_since_and_close(self, obj, f, indent):
        if len(obj.since) > 0:
            f.write('%*s *\n'
                    '%*s * Since: %s\n'
                    %(indent, '', indent, '', obj.since))
        if obj.deprecated:
            if isinstance(obj, dbustypes.Interface):
                thing = 'The D-Bus interface'
            elif isinstance(obj, dbustypes.Method):
                thing = 'The D-Bus method'
            elif isinstance(obj, dbustypes.Signal):
                thing = 'The D-Bus signal'
            elif isinstance(obj, dbustypes.Property):
                thing = 'The D-Bus property'
            else:
                print_error('Cannot handle object "{}"'.format(obj))
            f.write(self.docbook_gen.expand(
                    '%*s *\n'
                    '%*s * Deprecated: %s has been deprecated.\n'
                    %(indent, '', indent, '', thing), False))
        f.write('%*s */\n'%(indent, ''))

    # ---------------------------------------------------------------------------------------------------

    def generate_interface_intro(self, i):
        self.outfile.write('/* ------------------------------------------------------------------------\n'
                           ' * Code for interface %s\n'
                           ' * ------------------------------------------------------------------------\n'
                           ' */\n'
                           '\n'%(i.name))

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * SECTION:%s\n'
                ' * @title: %s\n'
                ' * @short_description: Generated C code for the %s D-Bus interface\n'
                ' *\n'
                ' * This section contains code for working with the #%s D-Bus interface in C.\n'
                ' */\n'
                %(i.camel_name, i.camel_name, i.name, i.name), False))
        self.outfile.write('\n')

    def generate(self):
        self.generate_body_preamble()
        for i in self.ifaces:
            self.generate_interface_intro(i)
            self.generate_introspection_for_interface(i)
            self.generate_interface(i)
            self.generate_property_accessors(i)
            self.generate_signal_emitters(i)
            self.generate_method_calls(i)
            self.generate_method_completers(i)
            self.generate_proxy(i)
            self.generate_skeleton(i)
        if self.generate_objmanager:
            self.generate_object()
            self.generate_object_manager_client()
tools\tools\share\glib-2.0\codegen\codegen_docbook.py
# -*- Mode: Python -*-

# GDBus - GLib D-Bus Library
#
# Copyright (C) 2008-2011 Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General
# Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
#
# Author: David Zeuthen <[email protected]>

import sys
import re
from os import path

from . import config
from . import utils
from . import dbustypes
from . import parser

# ----------------------------------------------------------------------------------------------------

class DocbookCodeGenerator:
    def __init__(self, ifaces):
        self.ifaces = ifaces
        self.generate_expand_dicts()

    def print_method_prototype(self, i, m, in_synopsis):
        max_method_len = 0
        if in_synopsis:
            for _m in i.methods:
                max_method_len = max(len(_m.name), max_method_len)
        else:
            max_method_len = max(len(m.name), max_method_len)

        max_signature_len = 0
        if in_synopsis:
            for _m in i.methods:
                for a in _m.in_args:
                    max_signature_len = max(len(a.signature), max_signature_len)
                for a in _m.out_args:
                    max_signature_len = max(len(a.signature), max_signature_len)
        else:
            for a in m.in_args:
                max_signature_len = max(len(a.signature), max_signature_len)
            for a in m.out_args:
                max_signature_len = max(len(a.signature), max_signature_len)

        if in_synopsis:
            self.out.write('<link linkend="gdbus-method-%s.%s">%s</link>%*s ('
                           %(utils.dots_to_hyphens(i.name), m.name, m.name, max_method_len - len(m.name), ''))
        else:
            self.out.write('%s%*s ('
                           %(m.name, max_method_len - len(m.name), ''))
        count = 0
        for a in m.in_args:
            if (count > 0):
                self.out.write(',\n%*s'%(max_method_len + 2, ''))
            self.out.write('IN  %s%*s %s'%(a.signature, max_signature_len - len(a.signature), '', a.name))
            count = count + 1
        for a in m.out_args:
            if (count > 0):
                self.out.write(',\n%*s'%(max_method_len + 2, ''))
            self.out.write('OUT %s%*s %s'%(a.signature, max_signature_len - len(a.signature), '', a.name))
            count = count + 1
        self.out.write(');\n')

    def print_signal_prototype(self, i, s, in_synopsis):
        max_signal_len = 0
        if in_synopsis:
            for _s in i.signals:
                max_signal_len = max(len(_s.name), max_signal_len)
        else:
            max_signal_len = max(len(s.name), max_signal_len)

        max_signature_len = 0
        if in_synopsis:
            for _s in i.signals:
                for a in _s.args:
                    max_signature_len = max(len(a.signature), max_signature_len)
        else:
            for a in s.args:
                max_signature_len = max(len(a.signature), max_signature_len)

        if in_synopsis:
            self.out.write('<link linkend="gdbus-signal-%s.%s">%s</link>%*s ('
                           %(utils.dots_to_hyphens(i.name), s.name, s.name, max_signal_len - len(s.name), ''))
        else:
            self.out.write('%s%*s ('
                           %(s.name, max_signal_len - len(s.name), ''))
        count = 0
        for a in s.args:
            if (count > 0):
                self.out.write(',\n%*s'%(max_signal_len + 2, ''))
            self.out.write('%s%*s %s'%(a.signature, max_signature_len - len(a.signature), '', a.name))
            count = count + 1
        self.out.write(');\n')

    def print_property_prototype(self, i, p, in_synopsis):
        max_property_len = 0
        if in_synopsis:
            for _p in i.properties:
                max_property_len = max(len(_p.name), max_property_len)
        else:
            max_property_len = max(len(p.name), max_property_len)

        max_signature_len = 0
        if in_synopsis:
            for _p in i.properties:
                max_signature_len = max(len(_p.signature), max_signature_len)
        else:
            max_signature_len = max(len(p.signature), max_signature_len)

        if in_synopsis:
            self.out.write('<link linkend="gdbus-property-%s.%s">%s</link>%*s'
                           %(utils.dots_to_hyphens(i.name), p.name, p.name, max_property_len - len(p.name), ''))
        else:
            self.out.write('%s%*s'
                           %(p.name, max_property_len - len(p.name), ''))
        if p.readable and p.writable:
            access = 'readwrite'
        elif p.readable:
            access = 'readable '
        else:
            access = 'writable '
        self.out.write('  %s  %s\n'%(access, p.signature))


    def print_synopsis_methods(self, i):
        self.out.write('  <refsynopsisdiv role="synopsis">\n'%())
        self.out.write('    <title role="synopsis.title">Methods</title>\n'%())
        self.out.write('    <synopsis>\n'%())
        for m in i.methods:
            self.print_method_prototype(i, m, in_synopsis=True)
        self.out.write('</synopsis>\n'%())
        self.out.write('  </refsynopsisdiv>\n'%())

    def print_synopsis_signals(self, i):
        self.out.write('  <refsect1 role="signal_proto">\n'%())
        self.out.write('    <title role="signal_proto.title">Signals</title>\n'%())
        self.out.write('    <synopsis>\n'%())
        for s in i.signals:
            self.print_signal_prototype(i, s, in_synopsis=True)
        self.out.write('</synopsis>\n'%())
        self.out.write('  </refsect1>\n'%())

    def print_synopsis_properties(self, i):
        self.out.write('  <refsect1 role="properties">\n'%())
        self.out.write('    <title role="properties.title">Properties</title>\n'%())
        self.out.write('    <synopsis>\n'%())
        for p in i.properties:
            self.print_property_prototype(i, p, in_synopsis=True)
        self.out.write('</synopsis>\n'%())
        self.out.write('  </refsect1>\n'%())

    def print_method(self, i, m):
        self.out.write('<refsect2 role="method" id="gdbus-method-%s.%s">\n'%(utils.dots_to_hyphens(i.name), m.name))
        self.out.write('  <title>The %s() method</title>\n'%(m.name))
        self.out.write('  <indexterm zone="gdbus-method-%s.%s"><primary sortas="%s.%s">%s.%s()</primary></indexterm>\n'%(utils.dots_to_hyphens(i.name), m.name, i.name_without_prefix, m.name, i.name, m.name))
        self.out.write('<programlisting>\n')
        self.print_method_prototype(i, m, in_synopsis=False)
        self.out.write('</programlisting>\n')
        self.out.write('%s\n'%(self.expand_paras(m.doc_string, True)))
        if m.in_args or m.out_args:
            self.out.write('<variablelist role="params">\n')
            for a in m.in_args:
                self.out.write('<varlistentry>\n'%())
                self.out.write('  <term><literal>IN %s <parameter>%s</parameter></literal>:</term>\n'%(a.signature, a.name))
                self.out.write('  <listitem>%s</listitem>\n'%(self.expand_paras(a.doc_string, True)))
                self.out.write('</varlistentry>\n'%())
            for a in m.out_args:
                self.out.write('<varlistentry>\n'%())
                self.out.write('  <term><literal>OUT %s <parameter>%s</parameter></literal>:</term>\n'%(a.signature, a.name))
                self.out.write('  <listitem>%s</listitem>\n'%(self.expand_paras(a.doc_string, True)))
                self.out.write('</varlistentry>\n'%())
            self.out.write('</variablelist>\n')
        if len(m.since) > 0:
            self.out.write('<para role="since">Since %s</para>\n'%(m.since))
        if m.deprecated:
            self.out.write('<warning><para>The %s() method is deprecated.</para></warning>'%(m.name))
        self.out.write('</refsect2>\n')

    def print_signal(self, i, s):
        self.out.write('<refsect2 role="signal" id="gdbus-signal-%s.%s">\n'%(utils.dots_to_hyphens(i.name), s.name))
        self.out.write('  <title>The "%s" signal</title>\n'%(s.name))
        self.out.write('  <indexterm zone="gdbus-signal-%s.%s"><primary sortas="%s::%s">%s::%s</primary></indexterm>\n'%(utils.dots_to_hyphens(i.name), s.name, i.name_without_prefix, s.name, i.name, s.name))
        self.out.write('<programlisting>\n')
        self.print_signal_prototype(i, s, in_synopsis=False)
        self.out.write('</programlisting>\n')
        self.out.write('%s\n'%(self.expand_paras(s.doc_string, True)))
        if s.args:
            self.out.write('<variablelist role="params">\n')
            for a in s.args:
                self.out.write('<varlistentry>\n'%())
                self.out.write('  <term><literal>%s <parameter>%s</parameter></literal>:</term>\n'%(a.signature, a.name))
                self.out.write('  <listitem>%s</listitem>\n'%(self.expand_paras(a.doc_string, True)))
                self.out.write('</varlistentry>\n'%())
            self.out.write('</variablelist>\n')
        if len(s.since) > 0:
            self.out.write('<para role="since">Since %s</para>\n'%(s.since))
        if s.deprecated:
            self.out.write('<warning><para>The "%s" signal is deprecated.</para></warning>'%(s.name))
        self.out.write('</refsect2>\n')

    def print_property(self, i, p):
        self.out.write('<refsect2 role="property" id="gdbus-property-%s.%s">\n'%(utils.dots_to_hyphens(i.name), p.name))
        self.out.write('  <title>The "%s" property</title>\n'%(p.name))
        self.out.write('  <indexterm zone="gdbus-property-%s.%s"><primary sortas="%s:%s">%s:%s</primary></indexterm>\n'%(utils.dots_to_hyphens(i.name), p.name, i.name_without_prefix, p.name, i.name, p.name))
        self.out.write('<programlisting>\n')
        self.print_property_prototype(i, p, in_synopsis=False)
        self.out.write('</programlisting>\n')
        self.out.write('%s\n'%(self.expand_paras(p.doc_string, True)))
        if len(p.since) > 0:
            self.out.write('<para role="since">Since %s</para>\n'%(p.since))
        if p.deprecated:
            self.out.write('<warning><para>The "%s" property is deprecated.</para></warning>'%(p.name))
        self.out.write('</refsect2>\n')

    def expand(self, s, expandParamsAndConstants):
        for key in self.expand_member_dict_keys:
            s = s.replace(key, self.expand_member_dict[key])
        for key in self.expand_iface_dict_keys:
            s = s.replace(key, self.expand_iface_dict[key])
        if expandParamsAndConstants:
            # replace @foo with <parameter>foo</parameter>
            s = re.sub('@[a-zA-Z0-9_]*', lambda m: '<parameter>' + m.group(0)[1:] + '</parameter>', s)
            # replace e.g. %TRUE with <constant>TRUE</constant>
            s = re.sub('%[a-zA-Z0-9_]*', lambda m: '<constant>' + m.group(0)[1:] + '</constant>', s)
        return s

    def expand_paras(self, s, expandParamsAndConstants):
        s = self.expand(s, expandParamsAndConstants).strip()
        if not s.startswith("<para"):
            s = "<para>%s</para>" % s
        return s

    def generate_expand_dicts(self):
        self.expand_member_dict = {}
        self.expand_iface_dict = {}
        for i in self.ifaces:
            key = '#%s'%(i.name)
            value = '<link linkend="gdbus-interface-%s.top_of_page">%s</link>'%(utils.dots_to_hyphens(i.name), i.name)
            self.expand_iface_dict[key] = value
            for m in i.methods:
                key = '%s.%s()'%(i.name, m.name)
                value = '<link linkend="gdbus-method-%s.%s">%s()</link>'%(utils.dots_to_hyphens(i.name), m.name, m.name)
                self.expand_member_dict[key] = value
            for s in i.signals:
                key = '#%s::%s'%(i.name, s.name)
                value = '<link linkend="gdbus-signal-%s.%s">"%s"</link>'%(utils.dots_to_hyphens(i.name), s.name, s.name)
                self.expand_member_dict[key] = value
            for p in i.properties:
                key = '#%s:%s'%(i.name, p.name)
                value = '<link linkend="gdbus-property-%s.%s">"%s"</link>'%(utils.dots_to_hyphens(i.name), p.name, p.name)
                self.expand_member_dict[key] = value
        # Make sure to expand the keys in reverse order so e.g. #org.foo.Iface:MediaCompat
        # is evaluated before #org.foo.Iface:Media ...
        self.expand_member_dict_keys = sorted(self.expand_member_dict.keys(), reverse=True)
        self.expand_iface_dict_keys = sorted(self.expand_iface_dict.keys(), reverse=True)

    def generate(self, docbook, outdir):
        for i in self.ifaces:
            self.out = open(path.join(outdir, '%s-%s.xml'%(docbook, i.name)), 'w')
            self.out.write(''%())
            self.out.write('<?xml version="1.0" encoding="utf-8"?>\n'%())
            self.out.write('<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"\n'%())
            self.out.write('               "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [\n'%())
            self.out.write(']>\n'%())
            self.out.write('<refentry id="gdbus-%s">\n'%(i.name))
            self.out.write('  <refmeta>'%())
            self.out.write('    <refentrytitle role="top_of_page" id="gdbus-interface-%s.top_of_page">%s</refentrytitle>\n'%(utils.dots_to_hyphens(i.name), i.name))
            self.out.write('  <indexterm zone="gdbus-interface-%s.top_of_page"><primary sortas="%s">%s</primary></indexterm>\n'%(utils.dots_to_hyphens(i.name), i.name_without_prefix, i.name))
            self.out.write('  </refmeta>'%())

            self.out.write('  <refnamediv>'%())
            self.out.write('    <refname>%s</refname>'%(i.name))
            self.out.write('    <refpurpose>%s</refpurpose>'%(i.doc_string_brief))
            self.out.write('  </refnamediv>'%())

            if len(i.methods) > 0:
                self.print_synopsis_methods(i)
            if len(i.signals) > 0:
                self.print_synopsis_signals(i)
            if len(i.properties) > 0:
                self.print_synopsis_properties(i)

            self.out.write('<refsect1 role="desc" id="gdbus-interface-%s">\n'%(utils.dots_to_hyphens(i.name)))
            self.out.write('  <title role="desc.title">Description</title>\n'%())
            self.out.write('  %s\n'%(self.expand_paras(i.doc_string, True)))
            if len(i.since) > 0:
                self.out.write('  <para role="since">Since %s</para>\n'%(i.since))
            if i.deprecated:
                self.out.write('<warning><para>The %s interface is deprecated.</para></warning>'%(i.name))
            self.out.write('</refsect1>\n'%())

            if len(i.methods) > 0:
                self.out.write('<refsect1 role="details" id="gdbus-methods-%s">\n'%(i.name))
                self.out.write('  <title role="details.title">Method Details</title>\n'%())
                for m in i.methods:
                    self.print_method(i, m)
                self.out.write('</refsect1>\n'%())

            if len(i.signals) > 0:
                self.out.write('<refsect1 role="details" id="gdbus-signals-%s">\n'%(i.name))
                self.out.write('  <title role="details.title">Signal Details</title>\n'%())
                for s in i.signals:
                    self.print_signal(i, s)
                self.out.write('</refsect1>\n'%())

            if len(i.properties) > 0:
                self.out.write('<refsect1 role="details" id="gdbus-properties-%s">\n'%(i.name))
                self.out.write('  <title role="details.title">Property Details</title>\n'%())
                for s in i.properties:
                    self.print_property(i, s)
                self.out.write('</refsect1>\n'%())

            self.out.write('</refentry>\n')
            self.out.write('\n')

tools\tools\share\glib-2.0\codegen\codegen_main.py
# -*- Mode: Python -*-
# coding=utf-8

# GDBus - GLib D-Bus Library
#
# Copyright (C) 2008-2011 Red Hat, Inc.
# Copyright (C) 2018 Iñigo Martínez <[email protected]>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General
# Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
#
# Author: David Zeuthen <[email protected]>

import argparse
import os
import sys

from . import config
from . import dbustypes
from . import parser
from . import codegen
from . import codegen_docbook
from .utils import print_error, print_warning

def find_arg(arg_list, arg_name):
    for a in arg_list:
        if a.name == arg_name:
            return a
    return None

def find_method(iface, method):
    for m in iface.methods:
        if m.name == method:
            return m
    return None

def find_signal(iface, signal):
    for m in iface.signals:
        if m.name == signal:
            return m
    return None

def find_prop(iface, prop):
    for m in iface.properties:
        if m.name == prop:
            return m
    return None

def apply_annotation(iface_list, iface, method, signal, prop, arg, key, value):
    iface_obj = None
    for i in iface_list:
        if i.name == iface:
            iface_obj = i
            break

    if iface_obj is None:
        print_error('No interface "{}"'.format(iface))

    target_obj = None

    if method:
        method_obj = find_method(iface_obj, method)
        if method_obj is None:
            print_error('No method "{}" on interface "{}"'.format(method, iface))
        if arg:
            arg_obj = find_arg(method_obj.in_args, arg)
            if (arg_obj is None):
                arg_obj = find_arg(method_obj.out_args, arg)
                if (arg_obj is None):
                    print_error('No arg "{}" on method "{}" on interface "{}"'.format(arg, method, iface))
            target_obj = arg_obj
        else:
            target_obj = method_obj
    elif signal:
        signal_obj = find_signal(iface_obj, signal)
        if signal_obj is None:
            print_error('No signal "{}" on interface "{}"'.format(signal, iface))
        if arg:
            arg_obj = find_arg(signal_obj.args, arg)
            if (arg_obj is None):
                print_error('No arg "{}" on signal "{}" on interface "{}"'.format(arg, signal, iface))
            target_obj = arg_obj
        else:
            target_obj = signal_obj
    elif prop:
        prop_obj = find_prop(iface_obj, prop)
        if prop_obj is None:
            print_error('No property "{}" on interface "{}"'.format(prop, iface))
        target_obj = prop_obj
    else:
        target_obj = iface_obj
    target_obj.annotations.insert(0, dbustypes.Annotation(key, value))


def apply_annotations(iface_list, annotation_list):
    # apply annotations given on the command line
    for (what, key, value) in annotation_list:
        pos = what.find('::')
        if pos != -1:
            # signal
            iface = what[0:pos];
            signal = what[pos + 2:]
            pos = signal.find('[')
            if pos != -1:
                arg = signal[pos + 1:]
                signal = signal[0:pos]
                pos = arg.find(']')
                arg = arg[0:pos]
                apply_annotation(iface_list, iface, None, signal, None, arg, key, value)
            else:
                apply_annotation(iface_list, iface, None, signal, None, None, key, value)
        else:
            pos = what.find(':')
            if pos != -1:
                # property
                iface = what[0:pos];
                prop = what[pos + 1:]
                apply_annotation(iface_list, iface, None, None, prop, None, key, value)
            else:
                pos = what.find('()')
                if pos != -1:
                    # method
                    combined = what[0:pos]
                    pos = combined.rfind('.')
                    iface = combined[0:pos]
                    method = combined[pos + 1:]
                    pos = what.find('[')
                    if pos != -1:
                        arg = what[pos + 1:]
                        pos = arg.find(']')
                        arg = arg[0:pos]
                        apply_annotation(iface_list, iface, method, None, None, arg, key, value)
                    else:
                        apply_annotation(iface_list, iface, method, None, None, None, key, value)
                else:
                    # must be an interface
                    iface = what
                    apply_annotation(iface_list, iface, None, None, None, None, key, value)

def codegen_main():
    arg_parser = argparse.ArgumentParser(description='D-Bus code and documentation generator')
    arg_parser.add_argument('files', metavar='FILE', nargs='*',
                            help='D-Bus introspection XML file')
    arg_parser.add_argument('--xml-files', metavar='FILE', action='append', default=[],
                            help=argparse.SUPPRESS)
    arg_parser.add_argument('--interface-prefix', metavar='PREFIX', default='',
                            help='String to strip from D-Bus interface names for code and docs')
    arg_parser.add_argument('--c-namespace', metavar='NAMESPACE', default='',
                            help='The namespace to use for generated C code')
    arg_parser.add_argument('--c-generate-object-manager', action='store_true',
                            help='Generate a GDBusObjectManagerClient subclass when generating C code')
    arg_parser.add_argument('--c-generate-autocleanup', choices=['none', 'objects', 'all'], default='objects',
                            help='Generate autocleanup support')
    arg_parser.add_argument('--generate-docbook', metavar='OUTFILES',
                            help='Generate Docbook in OUTFILES-org.Project.IFace.xml')
    arg_parser.add_argument('--pragma-once', action='store_true',
                            help='Use "pragma once" as the inclusion guard')
    arg_parser.add_argument('--annotate', nargs=3, action='append', metavar='WHAT KEY VALUE',
                            help='Add annotation (may be used several times)')

    group = arg_parser.add_mutually_exclusive_group()
    group.add_argument('--generate-c-code', metavar='OUTFILES',
                       help='Generate C code in OUTFILES.[ch]')
    group.add_argument('--header', action='store_true',
                       help='Generate C headers')
    group.add_argument('--body', action='store_true',
                       help='Generate C code')
    group.add_argument('--interface-info-header', action='store_true',
                       help='Generate GDBusInterfaceInfo C header')
    group.add_argument('--interface-info-body', action='store_true',
                       help='Generate GDBusInterfaceInfo C code')

    group = arg_parser.add_mutually_exclusive_group()
    group.add_argument('--output', metavar='FILE',
                       help='Write output into the specified file')
    group.add_argument('--output-directory', metavar='OUTDIR', default='',
                       help='Location to output generated files')

    args = arg_parser.parse_args();

    if len(args.xml_files) > 0:
        print_warning('The "--xml-files" option is deprecated; use positional arguments instead')

    if ((args.generate_c_code is not None or args.generate_docbook is not None) and
            args.output is not None):
        print_error('Using --generate-c-code or --generate-docbook and '
                    '--output at the same time is not allowed')

    if args.generate_c_code:
        header_name = args.generate_c_code + '.h'
        h_file = os.path.join(args.output_directory, header_name)
        args.header = True
        c_file = os.path.join(args.output_directory, args.generate_c_code + '.c')
        args.body = True
    elif args.header:
        if args.output is None:
            print_error('Using --header requires --output')

        h_file = args.output
        header_name = os.path.basename(h_file)
    elif args.body:
        if args.output is None:
            print_error('Using --body requires --output')

        c_file = args.output
        header_name = os.path.splitext(os.path.basename(c_file))[0] + '.h'
    elif args.interface_info_header:
        if args.output is None:
            print_error('Using --interface-info-header requires --output')
        if args.c_generate_object_manager:
            print_error('--c-generate-object-manager is incompatible with '
                        '--interface-info-header')

        h_file = args.output
        header_name = os.path.basename(h_file)
    elif args.interface_info_body:
        if args.output is None:
            print_error('Using --interface-info-body requires --output')
        if args.c_generate_object_manager:
            print_error('--c-generate-object-manager is incompatible with '
                        '--interface-info-body')

        c_file = args.output
        header_name = os.path.splitext(os.path.basename(c_file))[0] + '.h'

    all_ifaces = []
    input_files_basenames = []
    for fname in sorted(args.files + args.xml_files):
        with open(fname, 'rb') as f:
            xml_data = f.read()
        parsed_ifaces = parser.parse_dbus_xml(xml_data)
        all_ifaces.extend(parsed_ifaces)
        input_files_basenames.append(os.path.basename(fname))

    if args.annotate is not None:
        apply_annotations(all_ifaces, args.annotate)

    for i in all_ifaces:
        i.post_process(args.interface_prefix, args.c_namespace)

    docbook = args.generate_docbook
    docbook_gen = codegen_docbook.DocbookCodeGenerator(all_ifaces);
    if docbook:
        ret = docbook_gen.generate(docbook, args.output_directory)

    if args.header:
        with open(h_file, 'w') as outfile:
            gen = codegen.HeaderCodeGenerator(all_ifaces,
                                              args.c_namespace,
                                              args.c_generate_object_manager,
                                              args.c_generate_autocleanup,
                                              header_name,
                                              input_files_basenames,
                                              args.pragma_once,
                                              outfile)
            gen.generate()

    if args.body:
        with open(c_file, 'w') as outfile:
            gen = codegen.CodeGenerator(all_ifaces,
                                        args.c_namespace,
                                        args.c_generate_object_manager,
                                        header_name,
                                        input_files_basenames,
                                        docbook_gen,
                                        outfile)
            gen.generate()

    if args.interface_info_header:
        with open(h_file, 'w') as outfile:
            gen = codegen.InterfaceInfoHeaderCodeGenerator(all_ifaces,
                                                           args.c_namespace,
                                                           header_name,
                                                           input_files_basenames,
                                                           args.pragma_once,
                                                           outfile)
            gen.generate()

    if args.interface_info_body:
        with open(c_file, 'w') as outfile:
            gen = codegen.InterfaceInfoBodyCodeGenerator(all_ifaces,
                                                         args.c_namespace,
                                                         header_name,
                                                         input_files_basenames,
                                                         outfile)
            gen.generate()

    sys.exit(0)

if __name__ == "__main__":
    codegen_main()
tools\tools\share\glib-2.0\codegen\config.py
# -*- Mode: Python -*-

# GDBus - GLib D-Bus Library
#
# Copyright (C) 2008-2011 Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General
# Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
#
# Author: David Zeuthen <[email protected]>

VERSION = "2.60.3"
tools\tools\share\glib-2.0\codegen\dbustypes.py
# -*- Mode: Python -*-

# GDBus - GLib D-Bus Library
#
# Copyright (C) 2008-2011 Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General
# Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
#
# Author: David Zeuthen <[email protected]>

from . import utils
from .utils import print_error

class Annotation:
    def __init__(self, key, value):
        self.key = key
        self.value = value
        self.annotations = []
        self.since = ''

    def post_process(self, interface_prefix, cns, cns_upper, cns_lower, container):
        key = self.key
        overridden_key = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
        if utils.is_ugly_case(overridden_key):
            self.key_lower = overridden_key.lower()
        else:
            if overridden_key:
                key = overridden_key
            self.key_lower = utils.camel_case_to_uscore(key).lower().replace('-', '_').replace('.', '_')

        if len(self.since) == 0:
            self.since = utils.lookup_since(self.annotations)
            if len(self.since) == 0:
                self.since = container.since

        for a in self.annotations:
            a.post_process(interface_prefix, cns, cns_upper, cns_lower, self)

class Arg:
    def __init__(self, name, signature):
        self.name = name
        self.signature = signature
        self.annotations = []
        self.doc_string = ''
        self.since = ''

    def post_process(self, interface_prefix, cns, cns_upper, cns_lower, arg_number):
        if len(self.doc_string) == 0:
            self.doc_string = utils.lookup_docs(self.annotations)
        if len(self.since) == 0:
            self.since = utils.lookup_since(self.annotations)

        if self.name is None:
            self.name = 'unnamed_arg%d'%arg_number
        # default to GVariant
        self.ctype_in_g  = 'GVariant *'
        self.ctype_in  = 'GVariant *'
        self.ctype_in_dup  = 'GVariant *'
        self.ctype_out = 'GVariant **'
        self.gtype = 'G_TYPE_VARIANT'
        self.free_func = 'g_variant_unref'
        self.format_in = '@' + self.signature
        self.format_out = '@' + self.signature
        self.gvariant_get = 'XXX'
        self.gvalue_get = 'g_value_get_variant'
        self.array_annotation = ''

        if not utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.ForceGVariant'):
            if self.signature == 'b':
                self.ctype_in_g  = 'gboolean '
                self.ctype_in  = 'gboolean '
                self.ctype_out = 'gboolean *'
                self.gtype = 'G_TYPE_BOOLEAN'
                self.free_func = None
                self.format_in = 'b'
                self.format_out = 'b'
                self.gvariant_get = 'g_variant_get_boolean'
                self.gvalue_get = 'g_value_get_boolean'
            elif self.signature == 'y':
                self.ctype_in_g  = 'guchar '
                self.ctype_in  = 'guchar '
                self.ctype_out = 'guchar *'
                self.gtype = 'G_TYPE_UCHAR'
                self.free_func = None
                self.format_in = 'y'
                self.format_out = 'y'
                self.gvariant_get = 'g_variant_get_byte'
                self.gvalue_get = 'g_value_get_uchar'
            elif self.signature == 'n':
                self.ctype_in_g  = 'gint '
                self.ctype_in  = 'gint16 '
                self.ctype_out = 'gint16 *'
                self.gtype = 'G_TYPE_INT'
                self.free_func = None
                self.format_in = 'n'
                self.format_out = 'n'
                self.gvariant_get = 'g_variant_get_int16'
                self.gvalue_get = 'g_value_get_int'
            elif self.signature == 'q':
                self.ctype_in_g  = 'guint '
                self.ctype_in  = 'guint16 '
                self.ctype_out = 'guint16 *'
                self.gtype = 'G_TYPE_UINT'
                self.free_func = None
                self.format_in = 'q'
                self.format_out = 'q'
                self.gvariant_get = 'g_variant_get_uint16'
                self.gvalue_get = 'g_value_get_uint'
            elif self.signature == 'i':
                self.ctype_in_g  = 'gint '
                self.ctype_in  = 'gint '
                self.ctype_out = 'gint *'
                self.gtype = 'G_TYPE_INT'
                self.free_func = None
                self.format_in = 'i'
                self.format_out = 'i'
                self.gvariant_get = 'g_variant_get_int32'
                self.gvalue_get = 'g_value_get_int'
            elif self.signature == 'u':
                self.ctype_in_g  = 'guint '
                self.ctype_in  = 'guint '
                self.ctype_out = 'guint *'
                self.gtype = 'G_TYPE_UINT'
                self.free_func = None
                self.format_in = 'u'
                self.format_out = 'u'
                self.gvariant_get = 'g_variant_get_uint32'
                self.gvalue_get = 'g_value_get_uint'
            elif self.signature == 'x':
                self.ctype_in_g  = 'gint64 '
                self.ctype_in  = 'gint64 '
                self.ctype_out = 'gint64 *'
                self.gtype = 'G_TYPE_INT64'
                self.free_func = None
                self.format_in = 'x'
                self.format_out = 'x'
                self.gvariant_get = 'g_variant_get_int64'
                self.gvalue_get = 'g_value_get_int64'
            elif self.signature == 't':
                self.ctype_in_g  = 'guint64 '
                self.ctype_in  = 'guint64 '
                self.ctype_out = 'guint64 *'
                self.gtype = 'G_TYPE_UINT64'
                self.free_func = None
                self.format_in = 't'
                self.format_out = 't'
                self.gvariant_get = 'g_variant_get_uint64'
                self.gvalue_get = 'g_value_get_uint64'
            elif self.signature == 'd':
                self.ctype_in_g  = 'gdouble '
                self.ctype_in  = 'gdouble '
                self.ctype_out = 'gdouble *'
                self.gtype = 'G_TYPE_DOUBLE'
                self.free_func = None
                self.format_in = 'd'
                self.format_out = 'd'
                self.gvariant_get = 'g_variant_get_double'
                self.gvalue_get = 'g_value_get_double'
            elif self.signature == 's':
                self.ctype_in_g  = 'const gchar *'
                self.ctype_in  = 'const gchar *'
                self.ctype_in_dup  = 'gchar *'
                self.ctype_out = 'gchar **'
                self.gtype = 'G_TYPE_STRING'
                self.free_func = 'g_free'
                self.format_in = 's'
                self.format_out = 's'
                self.gvariant_get = 'g_variant_get_string'
                self.gvalue_get = 'g_value_get_string'
            elif self.signature == 'o':
                self.ctype_in_g  = 'const gchar *'
                self.ctype_in  = 'const gchar *'
                self.ctype_in_dup  = 'gchar *'
                self.ctype_out = 'gchar **'
                self.gtype = 'G_TYPE_STRING'
                self.free_func = 'g_free'
                self.format_in = 'o'
                self.format_out = 'o'
                self.gvariant_get = 'g_variant_get_string'
                self.gvalue_get = 'g_value_get_string'
            elif self.signature == 'g':
                self.ctype_in_g  = 'const gchar *'
                self.ctype_in  = 'const gchar *'
                self.ctype_in_dup  = 'gchar *'
                self.ctype_out = 'gchar **'
                self.gtype = 'G_TYPE_STRING'
                self.free_func = 'g_free'
                self.format_in = 'g'
                self.format_out = 'g'
                self.gvariant_get = 'g_variant_get_string'
                self.gvalue_get = 'g_value_get_string'
            elif self.signature == 'ay':
                self.ctype_in_g  = 'const gchar *'
                self.ctype_in  = 'const gchar *'
                self.ctype_in_dup  = 'gchar *'
                self.ctype_out = 'gchar **'
                self.gtype = 'G_TYPE_STRING'
                self.free_func = 'g_free'
                self.format_in = '^ay'
                self.format_out = '^ay'
                self.gvariant_get = 'g_variant_get_bytestring'
                self.gvalue_get = 'g_value_get_string'
            elif self.signature == 'as':
                self.ctype_in_g  = 'const gchar *const *'
                self.ctype_in  = 'const gchar *const *'
                self.ctype_in_dup  = 'gchar **'
                self.ctype_out = 'gchar ***'
                self.gtype = 'G_TYPE_STRV'
                self.free_func = 'g_strfreev'
                self.format_in = '^as'
                self.format_out = '^as'
                self.gvariant_get = 'g_variant_get_strv'
                self.gvalue_get = 'g_value_get_boxed'
                self.array_annotation = '(array zero-terminated=1)'
            elif self.signature == 'ao':
                self.ctype_in_g  = 'const gchar *const *'
                self.ctype_in  = 'const gchar *const *'
                self.ctype_in_dup  = 'gchar **'
                self.ctype_out = 'gchar ***'
                self.gtype = 'G_TYPE_STRV'
                self.free_func = 'g_strfreev'
                self.format_in = '^ao'
                self.format_out = '^ao'
                self.gvariant_get = 'g_variant_get_objv'
                self.gvalue_get = 'g_value_get_boxed'
                self.array_annotation = '(array zero-terminated=1)'
            elif self.signature == 'aay':
                self.ctype_in_g  = 'const gchar *const *'
                self.ctype_in  = 'const gchar *const *'
                self.ctype_in_dup  = 'gchar **'
                self.ctype_out = 'gchar ***'
                self.gtype = 'G_TYPE_STRV'
                self.free_func = 'g_strfreev'
                self.format_in = '^aay'
                self.format_out = '^aay'
                self.gvariant_get = 'g_variant_get_bytestring_array'
                self.gvalue_get = 'g_value_get_boxed'
                self.array_annotation = '(array zero-terminated=1)'

        for a in self.annotations:
            a.post_process(interface_prefix, cns, cns_upper, cns_lower, self)

class Method:
    def __init__(self, name):
        self.name = name
        self.in_args = []
        self.out_args = []
        self.annotations = []
        self.doc_string = ''
        self.since = ''
        self.deprecated = False

    def post_process(self, interface_prefix, cns, cns_upper, cns_lower, containing_iface):
        if len(self.doc_string) == 0:
            self.doc_string = utils.lookup_docs(self.annotations)
        if len(self.since) == 0:
            self.since = utils.lookup_since(self.annotations)
            if len(self.since) == 0:
                self.since = containing_iface.since

        name = self.name
        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
        if utils.is_ugly_case(overridden_name):
            self.name_lower = overridden_name.lower()
        else:
            if overridden_name:
                name = overridden_name
            self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_')
        self.name_hyphen = self.name_lower.replace('_', '-')

        arg_count = 0
        for a in self.in_args:
            a.post_process(interface_prefix, cns, cns_upper, cns_lower, arg_count)
            arg_count += 1

        for a in self.out_args:
            a.post_process(interface_prefix, cns, cns_upper, cns_lower, arg_count)
            arg_count += 1

        if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true':
            self.deprecated = True

        for a in self.annotations:
            a.post_process(interface_prefix, cns, cns_upper, cns_lower, self)

class Signal:
    def __init__(self, name):
        self.name = name
        self.args = []
        self.annotations = []
        self.doc_string = ''
        self.since = ''
        self.deprecated = False

    def post_process(self, interface_prefix, cns, cns_upper, cns_lower, containing_iface):
        if len(self.doc_string) == 0:
            self.doc_string = utils.lookup_docs(self.annotations)
        if len(self.since) == 0:
            self.since = utils.lookup_since(self.annotations)
            if len(self.since) == 0:
                self.since = containing_iface.since

        name = self.name
        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
        if utils.is_ugly_case(overridden_name):
            self.name_lower = overridden_name.lower()
        else:
            if overridden_name:
                name = overridden_name
            self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_')
        self.name_hyphen = self.name_lower.replace('_', '-')

        arg_count = 0
        for a in self.args:
            a.post_process(interface_prefix, cns, cns_upper, cns_lower, arg_count)
            arg_count += 1

        if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true':
            self.deprecated = True

        for a in self.annotations:
            a.post_process(interface_prefix, cns, cns_upper, cns_lower, self)

class Property:
    def __init__(self, name, signature, access):
        self.name = name
        self.signature = signature
        self.access = access
        self.annotations = []
        self.arg = Arg('value', self.signature)
        self.arg.annotations = self.annotations
        self.readable = False
        self.writable = False
        if self.access == 'readwrite':
            self.readable = True
            self.writable = True
        elif self.access == 'read':
            self.readable = True
        elif self.access == 'write':
            self.writable = True
        else:
            print_error('Invalid access type "{}"'.format(self.access))
        self.doc_string = ''
        self.since = ''
        self.deprecated = False
        self.emits_changed_signal = True

    def post_process(self, interface_prefix, cns, cns_upper, cns_lower, containing_iface):
        if len(self.doc_string) == 0:
            self.doc_string = utils.lookup_docs(self.annotations)
        if len(self.since) == 0:
            self.since = utils.lookup_since(self.annotations)
            if len(self.since) == 0:
                self.since = containing_iface.since

        name = self.name
        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
        if utils.is_ugly_case(overridden_name):
            self.name_lower = overridden_name.lower()
        else:
            if overridden_name:
                name = overridden_name
            self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_')
        self.name_hyphen = self.name_lower.replace('_', '-')
        # don't clash with the GType getter, e.g.: GType foo_bar_get_type (void); G_GNUC_CONST
        if self.name_lower == 'type':
            self.name_lower = 'type_'

        # recalculate arg
        self.arg.annotations = self.annotations
        self.arg.post_process(interface_prefix, cns, cns_upper, cns_lower, 0)

        if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true':
            self.deprecated = True

        for a in self.annotations:
            a.post_process(interface_prefix, cns, cns_upper, cns_lower, self)

        # FIXME: for now we only support 'false' and 'const' on the signal itself, see #674913 and
        # http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format
        # for details
        if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Property.EmitsChangedSignal') in ('false', 'const'):
            self.emits_changed_signal = False

class Interface:
    def __init__(self, name):
        self.name = name
        self.methods = []
        self.signals = []
        self.properties = []
        self.annotations = []
        self.doc_string = ''
        self.doc_string_brief = ''
        self.since = ''
        self.deprecated = False

    def post_process(self, interface_prefix, c_namespace):
        if len(self.doc_string) == 0:
            self.doc_string = utils.lookup_docs(self.annotations)
        if len(self.doc_string_brief) == 0:
            self.doc_string_brief = utils.lookup_brief_docs(self.annotations)
        if len(self.since) == 0:
            self.since = utils.lookup_since(self.annotations)

        if len(c_namespace) > 0:
            if utils.is_ugly_case(c_namespace):
                cns = c_namespace.replace('_', '')
                cns_upper = c_namespace.upper() + '_'
                cns_lower = c_namespace.lower() + '_'
            else:
                cns = c_namespace
                cns_upper = utils.camel_case_to_uscore(c_namespace).upper() + '_'
                cns_lower = utils.camel_case_to_uscore(c_namespace).lower() + '_'
        else:
            cns = ''
            cns_upper = ''
            cns_lower = ''

        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
        if utils.is_ugly_case(overridden_name):
            name = overridden_name.replace('_', '')
            name_with_ns = cns + name
            self.name_without_prefix = name
            self.camel_name = name_with_ns
            self.ns_upper = cns_upper
            self.name_lower = cns_lower + overridden_name.lower()
            self.name_upper = overridden_name.upper()

            #print_error('handle Ugly_Case "{}"'.format(overridden_name))
        else:
            if overridden_name:
                name = overridden_name
            else:
                name = self.name
                if name.startswith(interface_prefix):
                    name = name[len(interface_prefix):]
            self.name_without_prefix = name
            name = utils.strip_dots(name)
            name_with_ns = utils.strip_dots(cns + '.' + name)
            self.camel_name = name_with_ns
            self.ns_upper = cns_upper
            self.name_lower = cns_lower + utils.camel_case_to_uscore(name)
            self.name_upper = utils.camel_case_to_uscore(name).upper()

        self.name_hyphen = self.name_upper.lower().replace('_', '-')

        if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true':
            self.deprecated = True

        for m in self.methods:
            m.post_process(interface_prefix, cns, cns_upper, cns_lower, self)

        for s in self.signals:
            s.post_process(interface_prefix, cns, cns_upper, cns_lower, self)

        for p in self.properties:
            p.post_process(interface_prefix, cns, cns_upper, cns_lower, self)

        for a in self.annotations:
            a.post_process(interface_prefix, cns, cns_upper, cns_lower, self)
tools\tools\share\glib-2.0\codegen\parser.py
# -*- Mode: Python -*-

# GDBus - GLib D-Bus Library
#
# Copyright (C) 2008-2011 Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General
# Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
#
# Author: David Zeuthen <[email protected]>

import sys
import xml.parsers.expat

from . import dbustypes
from .utils import print_error

class DBusXMLParser:
    STATE_TOP = 'top'
    STATE_NODE = 'node'
    STATE_INTERFACE = 'interface'
    STATE_METHOD = 'method'
    STATE_SIGNAL = 'signal'
    STATE_PROPERTY = 'property'
    STATE_ARG = 'arg'
    STATE_ANNOTATION = 'annotation'
    STATE_IGNORED = 'ignored'

    def __init__(self, xml_data):
        self._parser = xml.parsers.expat.ParserCreate()
        self._parser.CommentHandler = self.handle_comment
        self._parser.CharacterDataHandler = self.handle_char_data
        self._parser.StartElementHandler = self.handle_start_element
        self._parser.EndElementHandler = self.handle_end_element

        self.parsed_interfaces = []
        self._cur_object = None

        self.state = DBusXMLParser.STATE_TOP
        self.state_stack = []
        self._cur_object = None
        self._cur_object_stack = []

        self.doc_comment_last_symbol = ''

        self._parser.Parse(xml_data)

    COMMENT_STATE_BEGIN = 'begin'
    COMMENT_STATE_PARAMS = 'params'
    COMMENT_STATE_BODY = 'body'
    COMMENT_STATE_SKIP = 'skip'
    def handle_comment(self, data):
        comment_state = DBusXMLParser.COMMENT_STATE_BEGIN;
        lines = data.split('\n')
        symbol = ''
        body = ''
        in_para = False
        params = {}
        for line in lines:
            orig_line = line
            line = line.lstrip()
            if comment_state == DBusXMLParser.COMMENT_STATE_BEGIN:
                if len(line) > 0:
                    colon_index = line.find(': ')
                    if colon_index == -1:
                        if line.endswith(':'):
                            symbol = line[0:len(line)-1]
                            comment_state = DBusXMLParser.COMMENT_STATE_PARAMS
                        else:
                            comment_state = DBusXMLParser.COMMENT_STATE_SKIP
                    else:
                        symbol = line[0:colon_index]
                        rest_of_line = line[colon_index+2:].strip()
                        if len(rest_of_line) > 0:
                            body += '<para>' + rest_of_line + '</para>'
                        comment_state = DBusXMLParser.COMMENT_STATE_PARAMS
            elif comment_state == DBusXMLParser.COMMENT_STATE_PARAMS:
                if line.startswith('@'):
                    colon_index = line.find(': ')
                    if colon_index == -1:
                        comment_state = DBusXMLParser.COMMENT_STATE_BODY
                        if not in_para:
                            body += '<para>'
                            in_para = True
                        body += orig_line + '\n'
                    else:
                        param = line[1:colon_index]
                        docs = line[colon_index + 2:]
                        params[param] = docs
                else:
                    comment_state = DBusXMLParser.COMMENT_STATE_BODY
                    if len(line) > 0:
                        if not in_para:
                            body += '<para>'
                            in_para = True
                        body += orig_line + '\n'
            elif comment_state == DBusXMLParser.COMMENT_STATE_BODY:
                if len(line) > 0:
                    if not in_para:
                        body += '<para>'
                        in_para = True
                    body += orig_line + '\n'
                else:
                    if in_para:
                        body += '</para>'
                        in_para = False
        if in_para:
            body += '</para>'

        if symbol != '':
            self.doc_comment_last_symbol = symbol
            self.doc_comment_params = params
            self.doc_comment_body = body

    def handle_char_data(self, data):
        #print 'char_data=%s'%data
        pass

    def handle_start_element(self, name, attrs):
        old_state = self.state
        old_cur_object = self._cur_object
        if self.state == DBusXMLParser.STATE_IGNORED:
            self.state = DBusXMLParser.STATE_IGNORED
        elif self.state == DBusXMLParser.STATE_TOP:
            if name == DBusXMLParser.STATE_NODE:
                self.state = DBusXMLParser.STATE_NODE
            else:
                self.state = DBusXMLParser.STATE_IGNORED
        elif self.state == DBusXMLParser.STATE_NODE:
            if name == DBusXMLParser.STATE_INTERFACE:
                self.state = DBusXMLParser.STATE_INTERFACE
                iface = dbustypes.Interface(attrs['name'])
                self._cur_object = iface
                self.parsed_interfaces.append(iface)
            elif name == DBusXMLParser.STATE_ANNOTATION:
                self.state = DBusXMLParser.STATE_ANNOTATION
                anno = dbustypes.Annotation(attrs['name'], attrs['value'])
                self._cur_object.annotations.append(anno)
                self._cur_object = anno
            else:
                self.state = DBusXMLParser.STATE_IGNORED

            # assign docs, if any
            if 'name' in attrs and self.doc_comment_last_symbol == attrs['name']:
                self._cur_object.doc_string = self.doc_comment_body
                if 'short_description' in self.doc_comment_params:
                    short_description = self.doc_comment_params['short_description']
                    self._cur_object.doc_string_brief = short_description
                if 'since' in self.doc_comment_params:
                    self._cur_object.since = \
                        self.doc_comment_params['since'].strip()

        elif self.state == DBusXMLParser.STATE_INTERFACE:
            if name == DBusXMLParser.STATE_METHOD:
                self.state = DBusXMLParser.STATE_METHOD
                method = dbustypes.Method(attrs['name'])
                self._cur_object.methods.append(method)
                self._cur_object = method
            elif name == DBusXMLParser.STATE_SIGNAL:
                self.state = DBusXMLParser.STATE_SIGNAL
                signal = dbustypes.Signal(attrs['name'])
                self._cur_object.signals.append(signal)
                self._cur_object = signal
            elif name == DBusXMLParser.STATE_PROPERTY:
                self.state = DBusXMLParser.STATE_PROPERTY
                prop = dbustypes.Property(attrs['name'], attrs['type'], attrs['access'])
                self._cur_object.properties.append(prop)
                self._cur_object = prop
            elif name == DBusXMLParser.STATE_ANNOTATION:
                self.state = DBusXMLParser.STATE_ANNOTATION
                anno = dbustypes.Annotation(attrs['name'], attrs['value'])
                self._cur_object.annotations.append(anno)
                self._cur_object = anno
            else:
                self.state = DBusXMLParser.STATE_IGNORED

            # assign docs, if any
            if 'name' in attrs and self.doc_comment_last_symbol == attrs['name']:
                self._cur_object.doc_string = self.doc_comment_body
                if 'since' in self.doc_comment_params:
                    self._cur_object.since = \
                        self.doc_comment_params['since'].strip()

        elif self.state == DBusXMLParser.STATE_METHOD:
            if name == DBusXMLParser.STATE_ARG:
                self.state = DBusXMLParser.STATE_ARG
                arg_name = None
                if 'name' in attrs:
                    arg_name = attrs['name']
                arg = dbustypes.Arg(arg_name, attrs['type'])
                direction = attrs.get('direction', 'in')
                if direction == 'in':
                    self._cur_object.in_args.append(arg)
                elif direction == 'out':
                    self._cur_object.out_args.append(arg)
                else:
                    print_error('Invalid direction "{}"'.format(direction))
                self._cur_object = arg
            elif name == DBusXMLParser.STATE_ANNOTATION:
                self.state = DBusXMLParser.STATE_ANNOTATION
                anno = dbustypes.Annotation(attrs['name'], attrs['value'])
                self._cur_object.annotations.append(anno)
                self._cur_object = anno
            else:
                self.state = DBusXMLParser.STATE_IGNORED

            # assign docs, if any
            if self.doc_comment_last_symbol == old_cur_object.name:
                if 'name' in attrs and attrs['name'] in self.doc_comment_params:
                    doc_string = self.doc_comment_params[attrs['name']]
                    if doc_string != None:
                        self._cur_object.doc_string = doc_string
                    if 'since' in self.doc_comment_params:
                        self._cur_object.since = \
                            self.doc_comment_params['since'].strip()

        elif self.state == DBusXMLParser.STATE_SIGNAL:
            if name == DBusXMLParser.STATE_ARG:
                self.state = DBusXMLParser.STATE_ARG
                arg_name = None
                if 'name' in attrs:
                    arg_name = attrs['name']
                arg = dbustypes.Arg(arg_name, attrs['type'])
                self._cur_object.args.append(arg)
                self._cur_object = arg
            elif name == DBusXMLParser.STATE_ANNOTATION:
                self.state = DBusXMLParser.STATE_ANNOTATION
                anno = dbustypes.Annotation(attrs['name'], attrs['value'])
                self._cur_object.annotations.append(anno)
                self._cur_object = anno
            else:
                self.state = DBusXMLParser.STATE_IGNORED

            # assign docs, if any
            if self.doc_comment_last_symbol == old_cur_object.name:
                if 'name' in attrs and attrs['name'] in self.doc_comment_params:
                    doc_string = self.doc_comment_params[attrs['name']]
                    if doc_string != None:
                        self._cur_object.doc_string = doc_string
                    if 'since' in self.doc_comment_params:
                        self._cur_object.since = \
                            self.doc_comment_params['since'].strip()

        elif self.state == DBusXMLParser.STATE_PROPERTY:
            if name == DBusXMLParser.STATE_ANNOTATION:
                self.state = DBusXMLParser.STATE_ANNOTATION
                anno = dbustypes.Annotation(attrs['name'], attrs['value'])
                self._cur_object.annotations.append(anno)
                self._cur_object = anno
            else:
                self.state = DBusXMLParser.STATE_IGNORED

        elif self.state == DBusXMLParser.STATE_ARG:
            if name == DBusXMLParser.STATE_ANNOTATION:
                self.state = DBusXMLParser.STATE_ANNOTATION
                anno = dbustypes.Annotation(attrs['name'], attrs['value'])
                self._cur_object.annotations.append(anno)
                self._cur_object = anno
            else:
                self.state = DBusXMLParser.STATE_IGNORED

        elif self.state == DBusXMLParser.STATE_ANNOTATION:
            if name == DBusXMLParser.STATE_ANNOTATION:
                self.state = DBusXMLParser.STATE_ANNOTATION
                anno = dbustypes.Annotation(attrs['name'], attrs['value'])
                self._cur_object.annotations.append(anno)
                self._cur_object = anno
            else:
                self.state = DBusXMLParser.STATE_IGNORED

        else:
            print_error('Unhandled state "{}" while entering element with name "{}"'.format(self.state, name))

        self.state_stack.append(old_state)
        self._cur_object_stack.append(old_cur_object)

    def handle_end_element(self, name):
        self.state = self.state_stack.pop()
        self._cur_object = self._cur_object_stack.pop()

def parse_dbus_xml(xml_data):
    parser = DBusXMLParser(xml_data)
    return parser.parsed_interfaces
tools\tools\share\glib-2.0\codegen\utils.py
# -*- Mode: Python -*-

# GDBus - GLib D-Bus Library
#
# Copyright (C) 2008-2011 Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General
# Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
#
# Author: David Zeuthen <[email protected]>

import distutils.version
import os
import sys

# pylint: disable=too-few-public-methods
class Color:
    '''ANSI Terminal colors'''
    GREEN = '\033[1;32m'
    BLUE = '\033[1;34m'
    YELLOW = '\033[1;33m'
    RED = '\033[1;31m'
    END = '\033[0m'

def print_color(msg, color=Color.END, prefix='MESSAGE'):
    '''Print a string with a color prefix'''
    if os.isatty(sys.stderr.fileno()):
        real_prefix = '{start}{prefix}{end}'.format(start=color, prefix=prefix, end=Color.END)
    else:
        real_prefix = prefix
    sys.stderr.write('{prefix}: {msg}\n'.format(prefix=real_prefix, msg=msg))

def print_error(msg):
    '''Print an error, and terminate'''
    print_color(msg, color=Color.RED, prefix='ERROR')
    sys.exit(1)

def print_warning(msg, fatal=False):
    '''Print a warning, and optionally terminate'''
    if fatal:
        color = Color.RED
        prefix = 'ERROR'
    else:
        color = Color.YELLOW
        prefix = 'WARNING'
    print_color(msg, color, prefix)
    if fatal:
        sys.exit(1)

def print_info(msg):
    '''Print a message'''
    print_color(msg, color=Color.GREEN, prefix='INFO')

def strip_dots(s):
    ret = ''
    force_upper = False
    for c in s:
        if c == '.':
            force_upper = True
        else:
            if force_upper:
                ret += c.upper()
                force_upper = False
            else:
                ret += c
    return ret

def dots_to_hyphens(s):
    return s.replace('.', '-')

def camel_case_to_uscore(s):
    ret = ''
    insert_uscore = False
    prev_was_lower = False
    initial = True;
    for c in s:
        # Keep initial underscores in camel case
        if initial and c == '_':
            ret += '_'
            continue;
        initial = False

        if c.isupper():
            if prev_was_lower:
                insert_uscore = True
            prev_was_lower = False
        else:
            prev_was_lower = True
        if insert_uscore:
            ret += '_'
        ret += c.lower()
        insert_uscore = False
    return ret

def is_ugly_case(s):
    if s and s.find('_') > 0:
        return True
    return False

def lookup_annotation(annotations, key):
    if annotations:
        for a in annotations:
            if a.key == key:
                return a.value
    return None

def lookup_docs(annotations):
    s = lookup_annotation(annotations, 'org.gtk.GDBus.DocString')
    if s is None:
        return ''
    else:
        return s

def lookup_since(annotations):
    s = lookup_annotation(annotations, 'org.gtk.GDBus.Since')
    if s is None:
        return ''
    else:
        return s

def lookup_brief_docs(annotations):
    s = lookup_annotation(annotations, 'org.gtk.GDBus.DocString.Short')
    if s is None:
        return ''
    else:
        return s

def version_cmp_key(key):
    # If the 'since' version is 'UNRELEASED', compare higher than anything else
    # If it is empty put a 0 in its place as this will
    # allow LooseVersion to work and will always compare lower.
    if key[0] == 'UNRELEASED':
        v = '9999'
    elif key[0]:
        v = str(key[0])
    else:
        v = '0'
    return (distutils.version.LooseVersion(v), key[1])
tools\tools\share\glib-2.0\codegen\__init__.py
# -*- Mode: Python -*-

# GDBus - GLib D-Bus Library
#
# Copyright (C) 2008-2011 Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General
# Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
#
# Author: David Zeuthen <[email protected]>

import os

builddir = os.environ.get('UNINSTALLED_GLIB_BUILDDIR')

if builddir is not None:
    __path__.append(os.path.abspath(os.path.join(builddir, 'gio', 'gdbus-2.0', 'codegen')))
tools\tools\share\glib-2.0\gdb\glib_gdb.py
import gdb
import sys

if sys.version_info[0] >= 3:
    long = int

# This is not quite right, as local vars may override symname
def read_global_var (symname):
    return gdb.selected_frame().read_var(symname)

def g_quark_to_string (quark):
    if quark is None:
        return None
    quark = long(quark)
    if quark == 0:
        return None
    try:
        val = read_global_var ("quarks")
        max_q = long(read_global_var ("quark_seq_id"))
    except:
        try:
            val = read_global_var ("g_quarks")
            max_q = long(read_global_var ("g_quark_seq_id"))
        except:
            return None;
    if quark < max_q:
        return val[quark].string()
    return None

# We override the node printers too, so that node->next is not expanded
class GListNodePrinter:
    "Prints a GList node"

    def __init__ (self, val):
        self.val = val

    def to_string (self):
        return "{data=%s, next=0x%x, prev=0x%x}" % (str(self.val["data"]), long(self.val["next"]), long(self.val["prev"]))

class GSListNodePrinter:
    "Prints a GSList node"

    def __init__ (self, val):
        self.val = val

    def to_string (self):
        return "{data=%s, next=0x%x}" % (str(self.val["data"]), long(self.val["next"]))

class GListPrinter:
    "Prints a GList"

    class _iterator:
        def __init__(self, head, listtype):
            self.link = head
            self.listtype = listtype
            self.count = 0

        def __iter__(self):
            return self

        def next(self):
            if self.link == 0:
                raise StopIteration
            data = self.link['data']
            self.link = self.link['next']
            count = self.count
            self.count = self.count + 1
            return ('[%d]' % count, data)

        __next__ = next

    def __init__ (self, val, listtype):
        self.val = val
        self.listtype = listtype

    def children(self):
        return self._iterator(self.val, self.listtype)

    def to_string (self):
        return  "0x%x" % (long(self.val))

    def display_hint (self):
        return "array"

class GHashPrinter:
    "Prints a GHashTable"

    class _iterator:
        class _pointer_array:
            def __init__(self, ptr, big_items):
                self._big_items = big_items
                self._gpointer_type = gdb.lookup_type("gpointer")
                item_type = self._gpointer_type if self._big_items else gdb.lookup_type("guint")

                self._items = ptr.cast(item_type.pointer())

            def __getitem__(self, item):
                item = self._items[item]

                if not self._big_items:
                    item = item.cast(self._gpointer_type)

                return item

        def __init__(self, ht, keys_are_strings):
            self.ht = ht
            if ht != 0:
                self.keys = self._pointer_array(ht["keys"], ht["have_big_keys"])
                self.values = self._pointer_array(ht["values"], ht["have_big_values"])
                self.hashes = ht["hashes"]
                self.size = ht["size"]
            self.pos = 0
            self.keys_are_strings = keys_are_strings
            self.value = None

        def __iter__(self):
            return self

        def next(self):
            if self.ht == 0:
                raise StopIteration
            if self.value != None:
                v = self.value
                self.value = None
                return v
            while long(self.pos) < long(self.size):
                self.pos = self.pos + 1
                if long (self.hashes[self.pos]) >= 2:
                    key = self.keys[self.pos]
                    val = self.values[self.pos]

                    if self.keys_are_strings:
                        key = key.cast (gdb.lookup_type("char").pointer())

                    # Queue value for next result
                    self.value = ('[%dv]'% (self.pos), val)

                    # Return key
                    return ('[%dk]'% (self.pos), key)
            raise StopIteration

        __next__ = next

    def __init__ (self, val):
        self.val = val
        self.keys_are_strings = False
        try:
            string_hash = read_global_var ("g_str_hash")
        except:
            string_hash = None
        if self.val != 0 and string_hash != None and self.val["hash_func"] == string_hash:
            self.keys_are_strings = True

    def children(self):
        return self._iterator(self.val, self.keys_are_strings)

    def to_string (self):
        return  "0x%x" % (long(self.val))

    def display_hint (self):
        return "map"

def pretty_printer_lookup (val):
    # None yet, want things like hash table and list

    type = val.type.unqualified()

    # If it points to a reference, get the reference.
    if type.code == gdb.TYPE_CODE_REF:
        type = type.target ()

    if type.code == gdb.TYPE_CODE_PTR:
        type = type.target().unqualified()
        t = str(type)
        if t == "GList":
            return GListPrinter(val, "GList")
        if t == "GSList":
            return GListPrinter(val, "GSList")
        if t == "GHashTable":
            return GHashPrinter(val)
    else:
        t = str(type)
        if t == "GList":
            return GListNodePrinter(val)
        if t == "GSList *":
            return GListPrinter(val, "GSList")
    return None

def register (obj):
    if obj is None:
        obj = gdb

    obj.pretty_printers.append(pretty_printer_lookup)

class ForeachCommand (gdb.Command):
    """Foreach on list"""

    def __init__ (self):
        super (ForeachCommand, self).__init__ ("gforeach",
                                               gdb.COMMAND_DATA,
                                               gdb.COMPLETE_SYMBOL)

    def valid_name (self, name):
        if not name[0].isalpha():
            return False
        return True

    def parse_args (self, arg):
        i = arg.find(" ")
        if i <= 0:
            raise Exception ("No var specified")
        var = arg[:i]
        if not self.valid_name(var):
            raise Exception ("Invalid variable name")

        while i < len (arg) and arg[i].isspace():
            i = i + 1

        if arg[i:i+2] != "in":
            raise Exception ("Invalid syntax, missing in")

        i = i + 2

        while i < len (arg) and arg[i].isspace():
            i = i + 1

        colon = arg.find (":", i)
        if colon == -1:
            raise Exception ("Invalid syntax, missing colon")

        val = arg[i:colon]

        colon = colon + 1
        while colon < len (arg) and arg[colon].isspace():
            colon = colon + 1

        command = arg[colon:]

        return (var, val, command)

    def do_iter(self, arg, item, command):
        item = item.cast (gdb.lookup_type("void").pointer())
        item = long(item)
        to_eval = "set $%s = (void *)0x%x\n"%(arg, item)
        gdb.execute(to_eval)
        gdb.execute(command)

    def slist_iterator (self, arg, container, command):
        l = container.cast (gdb.lookup_type("GSList").pointer())
        while long(l) != 0:
            self.do_iter (arg, l["data"], command)
            l = l["next"]

    def list_iterator (self, arg, container, command):
        l = container.cast (gdb.lookup_type("GList").pointer())
        while long(l) != 0:
            self.do_iter (arg, l["data"], command)
            l = l["next"]

    def pick_iterator (self, container):
        t = container.type.unqualified()
        if t.code == gdb.TYPE_CODE_PTR:
            t = t.target().unqualified()
            t = str(t)
            if t == "GSList":
                return self.slist_iterator
            if t == "GList":
                return self.list_iterator
        raise Exception("Invalid container type %s"%(str(container.type)))

    def invoke (self, arg, from_tty):
        (var, container, command) = self.parse_args(arg)
        container = gdb.parse_and_eval (container)
        func = self.pick_iterator(container)
        func(var, container, command)

ForeachCommand ()
tools\tools\share\glib-2.0\gdb\gobject_gdb.py
import os.path
import gdb
import glib_gdb
import sys

if sys.version_info[0] >= 3:
    long = int
else:
    import itertools
    map = itertools.imap

# FrameDecorator is new in gdb 7.7, so we adapt to its absence.
try:
    import gdb.FrameDecorator
    HAVE_GDB_FRAMEDECORATOR = True
    FrameDecorator = gdb.FrameDecorator.FrameDecorator
except ImportError:
    HAVE_GDB_FRAMEDECORATOR = False

# This is not quite right, as local vars may override symname
def read_global_var (symname):
    return gdb.selected_frame().read_var(symname)

def g_type_to_typenode (gtype):
    def lookup_fundamental_type (typenode):
        if typenode == 0:
            return None
        val = read_global_var ("static_fundamental_type_nodes")
        if val is None:
            return None
        return val[typenode >> 2].address

    gtype = long(gtype)
    typenode = gtype - gtype % 4
    if typenode > (255 << 2):
        typenode = gdb.Value(typenode).cast (gdb.lookup_type("TypeNode").pointer())
    else:
        typenode = lookup_fundamental_type (typenode)
    return typenode

def g_type_to_name (gtype):
    typenode = g_type_to_typenode(gtype)
    if typenode != None:
        return glib_gdb.g_quark_to_string (typenode["qname"])
    return None

def is_g_type_instance (val):
    def is_g_type_instance_helper (type):
        if str(type) == "GTypeInstance":
            return True

        while type.code == gdb.TYPE_CODE_TYPEDEF:
            type = type.target()

        if type.code != gdb.TYPE_CODE_STRUCT:
            return False

        fields = type.fields()
        if len (fields) < 1:
            return False

        first_field = fields[0]
        return is_g_type_instance_helper(first_field.type)

    type = val.type
    if type.code != gdb.TYPE_CODE_PTR:
        return False
    type = type.target()
    return is_g_type_instance_helper (type)

def g_type_name_from_instance (instance):
    if long(instance) != 0:
        try:
            inst = instance.cast (gdb.lookup_type("GTypeInstance").pointer())
            klass = inst["g_class"]
            gtype = klass["g_type"]
            name = g_type_to_name (gtype)
            return name
        except RuntimeError:
            pass
    return None

class GTypePrettyPrinter:
    "Prints a GType instance pointer"

    def __init__ (self, val):
        self.val = val

    def to_string (self):
        name = g_type_name_from_instance (self.val)
        if name:
            return ("0x%x [%s]")% (long(self.val), name)
        return  ("0x%x") % (long(self.val))

def is_g_type_class_instance (val):
    type = val.type
    if type.code != gdb.TYPE_CODE_PTR:
        return False
    return str(type.target()) == "GTypeClass"

class GTypeHandlePrettyPrinter:
    "Prints a GType instance"

    def __init__ (self, val, hint = ""):
        self.val = val
        self.hint = hint

    def to_string (self):
        typenode = g_type_to_typenode(self.val)
        if typenode != None:
            name = glib_gdb.g_quark_to_string (typenode["qname"])
            s = ("0x%x [%s%s")% (long(self.val), self.hint, name)
            for i in range (1, int(typenode["n_supers"])):
                node = g_type_to_typenode(typenode["supers"][i])
                if node:
                    name = glib_gdb.g_quark_to_string(node["qname"])
                else:
                    name = "???"
                s += "/" + name
            return s + "]"
        else:
            return  ("0x%x") % (long(self.val))

def pretty_printer_lookup (val):
    if is_g_type_instance (val):
        return GTypePrettyPrinter (val)
    if str(val.type) == "GType":
        return GTypeHandlePrettyPrinter (val)
    if is_g_type_class_instance (val):
        return GTypeHandlePrettyPrinter (val["g_type"], "g_type: ")

    return None

def get_signal_name (id):
    if id is None:
        return None
    id = long(id)
    if id == 0:
        return None
    val = read_global_var ("g_signal_nodes")
    max_s = read_global_var ("g_n_signal_nodes")
    max_s = long(max_s)
    if id < max_s:
        return val[id]["name"].string()
    return None

def frame_name(frame):
    return str(frame.function())

def frame_var(frame, var):
    return frame.inferior_frame().read_var(var)


class SignalFrame(FrameDecorator):
    def __init__ (self, frames):
        FrameDecorator.__init__(self, frames[-1])
        self.frame = frames[-1]
        self.frames = frames

    def name (self):
        return "signal-emission"

    def read_var (self, frame, name, array = None):
        try:
            v = frame_var (frame, name)
            if v is None or v.is_optimized_out:
                return None
            if array != None:
                array.append (v)
            return v
        except ValueError:
            return None

    def read_object (self, frame, name, array = None):
        try:
            v = frame_var (frame, name)
            if v is None or v.is_optimized_out:
                return None
            v = v.cast (gdb.lookup_type("GObject").pointer())
            # Ensure this is a somewhat correct object pointer
            if v != None and g_type_name_from_instance (v):
                if array != None:
                    array.append (v)
                return v
            return None
        except ValueError:
            return None

    def append (self, array, obj):
        if obj != None:
            array.append (obj)

    def or_join_array (self, array):
        if len(array) == 0:
            return "???"
        else:
            return ' or '.join(set(map(str, array)))

    def get_detailed_signal_from_frame(self, frame, signal):
        detail = self.read_var (frame, "detail")
        detail = glib_gdb.g_quark_to_string (detail)
        if detail is not None:
            return signal + ":" + detail
        else:
            return detail

    def function (self):
        instances = []
        signals = []

        for frame in self.frames:
            name = frame_name(frame)
            if name == "signal_emit_unlocked_R":
                self.read_object (frame, "instance", instances)
                node = self.read_var (frame, "node")
                if node:
                    signal = node["name"].string()
                    signal = self.get_detailed_signal_from_frame(frame, signal)
                    self.append(signals, signal)

            if name == "g_signal_emitv":
                instance_and_params = self.read_var (frame, "instance_and_params")
                if instance_and_params:
                    instance = instance_and_params[0]["v_pointer"].cast (gdb.Type("GObject").pointer())
                    self.append (instances, instance)
                id = self.read_var (frame, "signal_id")
                signal = get_signal_name (id)
                if signal:
                    signal = self.get_detailed_signal_from_frame(frame, signal)
                    self.append (signals, signal)

            if name == "g_signal_emit_valist" or name == "g_signal_emit":
                self.read_object (frame, "instance", instances)
                id = self.read_var (frame, "signal_id")
                signal = get_signal_name (id)
                if signal:
                    signal = self.get_detailed_signal_from_frame(frame, signal)
                    self.append (signals, signal)

            if name == "g_signal_emit_by_name":
                self.read_object (frame, "instance", instances)
                self.read_var (frame, "detailed_signal", signals)
                break

        instance = self.or_join_array (instances)
        signal = self.or_join_array (signals)

        return "<emit signal %s on instance %s>" %  (signal, instance)

    def elided (self):
        return self.frames[0:-1]

    def describe (self, stream, full):
        stream.write (" " + self.function () + "\n")

class GFrameDecorator:
    def __init__ (self, iter):
        self.queue = []
        self.iter = iter

    def __iter__ (self):
        return self

    def fill (self):
        while len(self.queue) <= 8:
            try:
                f = next(self.iter)
                self.queue.append (f)
            except StopIteration:
                return

    def find_signal_emission (self):
        for i in range (min (len(self.queue), 3)):
            if frame_name(self.queue[i]) == "signal_emit_unlocked_R":
                return i
        return -1

    def next (self):
        # Ensure we have enough frames for a full signal emission
        self.fill()

        # Are we at the end?
        if len(self.queue) == 0:
            raise StopIteration

        emission = self.find_signal_emission ()
        if emission > 0:
            start = emission
            while True:
                if start == 0:
                    break
                prev_name = frame_name(self.queue[start-1])
                if prev_name.find("_marshal_") >= 0 or prev_name == "g_closure_invoke":
                    start = start - 1
                else:
                    break
            end = emission + 1
            while end < len(self.queue):
                if frame_name(self.queue[end]) in ["g_signal_emitv",
                                                   "g_signal_emit_valist",
                                                   "g_signal_emit",
                                                   "g_signal_emit_by_name",
                                                   "_g_closure_invoke_va"]:
                    end = end + 1
                else:
                    break

            signal_frames = self.queue[start:end]
            new_frames = [SignalFrame(signal_frames)]
            self.queue[start:end] = new_frames

        return self.queue.pop(0)

    def __next__ (self):
        return self.next()

class GFrameFilter(object):
    name = 'glib'
    enabled = True
    priority = 100

    def filter(self, iterator):
        return GFrameDecorator(iterator)

def register (obj):
    if obj is None:
        obj = gdb

    if HAVE_GDB_FRAMEDECORATOR:
        filter = GFrameFilter()
        obj.frame_filters[filter.name] = filter
    obj.pretty_printers.append(pretty_printer_lookup)
tools\tools\share\glib-2.0\gettext\po\Makefile.in.in
 
tools\tools\share\glib-2.0\schemas\gschema.dtd
 
tools\tools\share\glib-2.0\schemas\gschemas.compiled
 
tools\tools\share\glib-2.0\schemas\org.gtk.Demo.gschema.xml
<?xml version="1.0" encoding="UTF-8"?>

<schemalist>

  <enum id='org.gtk.Demo.Color'>
    <value nick='red'   value='0'/>
    <value nick='green' value='1'/>
    <value nick='blue'  value='2'/>
  </enum>

  <schema id='org.gtk.Demo' path='/org/gtk/Demo/'>
    <key name='color' enum='org.gtk.Demo.Color'>
      <default>'red'</default>
    </key>
    <key name='window-size' type='(ii)'>
      <default>(-1, -1)</default>
    </key>
    <key name='maximized' type='b'>
      <default>false</default>
    </key>
    <key name='fullscreen' type='b'>
      <default>false</default>
    </key>
  </schema>

</schemalist>
tools\tools\share\glib-2.0\schemas\org.gtk.exampleapp.gschema.xml
<?xml version="1.0" encoding="UTF-8"?>
<schemalist>
  <schema path="/org/gtk/exampleapp/" id="org.gtk.exampleapp">
    <key name="font" type="s">
      <default>'Monospace 12'</default>
      <summary>Font</summary>
      <description>The font to be used for content.</description>
    </key>
    <key name="transition" type="s">
      <choices>
        <choice value='none'/>
        <choice value='crossfade'/>
        <choice value='slide-left-right'/>
      </choices>
      <default>'none'</default>
      <summary>Transition</summary>
      <description>The transition to use when switching tabs.</description>
    </key>
    <key name="show-words" type="b">
      <default>false</default>
      <summary>Show words</summary>
      <description>Whether to show a word list in the sidebar</description>
    </key>
  </schema>
</schemalist>
tools\tools\share\glib-2.0\schemas\org.gtk.Settings.ColorChooser.gschema.xml
<?xml version="1.0" encoding="UTF-8"?>
<schemalist>

  <schema id='org.gtk.Settings.ColorChooser' path='/org/gtk/settings/color-chooser/'>
    <key name='custom-colors' type='a(dddd)'>
      <default>[]</default>
      <summary>Custom colors</summary>
      <description>
        An array of custom colors to show in the color chooser. Each color is
        specified as a tuple of four doubles, specifying RGBA values between
        0 and 1.
      </description>
    </key>
    <key name='selected-color' type='(bdddd)'>
      <default>(false,1.0,1.0,1.0,1.0)</default>
      <summary>The selected color</summary>
      <description>
         The selected color, described as a tuple whose first member is a
         boolean that is true if a color was selected, and the remaining
         four members are four doubles, specifying RGBA values between
         0 and 1.
      </description>
    </key>
  </schema>

</schemalist>
tools\tools\share\glib-2.0\schemas\org.gtk.Settings.Debug.gschema.xml
<?xml version="1.0" encoding="UTF-8"?>
<schemalist>

  <schema id='org.gtk.Settings.Debug' path='/org/gtk/settings/debug/'>
    <key name='enable-inspector-keybinding' type='b'>
      <default>false</default>
      <summary>Enable inspector keybinding</summary>
      <description>
        If this setting is true, GTK+ lets the user open an interactive
        debugging window with a keybinding. The default shortcuts for
        the keybinding are Control-Shift-I and Control-Shift-D.
      </description>
    </key>
    <key name='inspector-warning' type='b'>
      <default>true</default>
      <summary>Inspector warning</summary>
      <description>
        If this setting is true, GTK+ shows a warning before letting
        the user use the interactive debugger.
      </description>
    </key>
  </schema>

</schemalist>

tools\tools\share\glib-2.0\schemas\org.gtk.Settings.EmojiChooser.gschema.xml
<?xml version="1.0" encoding="UTF-8"?>
<schemalist>

  <schema id='org.gtk.Settings.EmojiChooser' path='/org/gtk/settings/emoji-chooser/'>
    <key name='recent-emoji' type='a((auss)u)'>
      <default>[]</default>
      <summary>Recently used Emoji</summary>
      <description>
        An array of Emoji definitions to show in the Emoji chooser. Each Emoji is
        specified as an array of codepoints, name and shortname. The extra integer after this
        pair is the code of the Fitzpatrick modifier to use in place of a 0 in the
        codepoint array.
      </description>
    </key>
  </schema>

</schemalist>
tools\tools\share\glib-2.0\schemas\org.gtk.Settings.FileChooser.gschema.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
  Copyright © 2010 Christian Persch

  This library is free software; you can redistribute it and/or modify
  it under the terms of the GNU Lesser General Public License as published by
  the Free Software Foundation; either version 2.1, or (at your option)
  any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public License
  along with this library. If not, see <http://www.gnu.org/licenses/>.
-->
<schemalist>

  <enum id='org.gtk.Settings.FileChooser.LocationMode'>
    <value nick='path-bar' value='0'/>
    <value nick='filename-entry' value='1'/>
  </enum>

  <enum id='org.gtk.Settings.FileChooser.SortColumn'>
    <value nick='name' value='0'/>
    <value nick='size' value='1'/>
    <value nick='modified' value='2'/>
  </enum>

  <enum id='org.gtk.Settings.FileChooser.SortOrder'>
    <value nick='ascending' value='0'/>
    <value nick='descending' value='1'/>
  </enum>

  <enum id='org.gtk.Settings.FileChooser.StartupMode'>
    <value nick='recent' value='0'/>
    <value nick='cwd' value='1'/>
  </enum>

  <enum id='org.gtk.Settings.FileChooser.ClockFormat'>
    <value nick='24h' value='0'/>
    <value nick='12h' value='1'/>
  </enum>

  <enum id='org.gtk.Settings.FileChooser.DateFormat'>
    <value nick='regular' value='0'/>
    <value nick='with-time' value='1'/>
  </enum>

  <schema id='org.gtk.Settings.FileChooser' path='/org/gtk/settings/file-chooser/'>
    <key name='last-folder-uri' type='s'>
      <default>""</default>
    </key>
    <key name='location-mode' enum='org.gtk.Settings.FileChooser.LocationMode'>
      <default>'path-bar'</default>
      <summary>Location mode</summary>
      <description>
	Controls whether the file chooser shows just a path bar, or a visible entry
        for the filename as well, for the benefit of typing-oriented users. The
        possible values for these modes are "path-bar" and "filename-entry".
      </description>
    </key>
    <key name='show-hidden' type='b'>
      <default>false</default>
      <summary>Show hidden files</summary>
      <description>
	Controls whether the file chooser shows hidden files or not.
      </description>
    </key>
    <key type="b" name="sort-directories-first">
      <default>false</default>
      <summary>Show folders first</summary>
      <description>
        If set to true, then folders are shown before files in the list.
      </description>
    </key>
    <key name='expand-folders' type='b'>
      <default>false</default>
      <summary>Expand folders</summary>
      <description>This key is deprecated; do not use it.</description>
    </key>
    <key name='show-size-column' type='b'>
      <default>true</default>
      <summary>Show file sizes</summary>
      <description>
	Controls whether the file chooser shows a column with file sizes.
      </description>
    </key>
    <key name='sort-column' enum='org.gtk.Settings.FileChooser.SortColumn'>
      <default>'name'</default>
      <summary>Sort column</summary>
      <description>
	Can be one of "name", "modified", or "size".  It controls
	which of the columns in the file chooser is used for sorting
	the list of files.
      </description>
    </key>
    <key name='sort-order' enum='org.gtk.Settings.FileChooser.SortOrder'>
      <default>'ascending'</default>
      <summary>Sort order</summary>
      <description>
	Can be one of the strings "ascending" or "descending".
      </description>
    </key>
    <key name='window-position' type='(ii)'>
      <default>(-1, -1)</default>
      <summary>Window position</summary>
      <description>
	The (x, y) coordinates of the upper-left corner of the GtkFileChooserDialog's
        window.
      </description>
    </key>
    <key name='window-size' type='(ii)'>
      <default>(-1, -1)</default>
      <summary>Window size</summary>
      <description>
	The size (width, height) of the GtkFileChooserDialog's window, in pixels.
      </description>
    </key>
    <key name='startup-mode' enum='org.gtk.Settings.FileChooser.StartupMode'>
      <default>'recent'</default>
      <summary>Startup mode</summary>
      <description>
	Either "recent" or "cwd"; controls whether the file chooser
	starts up showing the list of recently-used files, or the
	contents of the current working directory.
      </description>
    </key>
    <key name='sidebar-width' type='i'>
      <default>148</default>
      <summary>Sidebar width</summary>
      <description>
	Width in pixels of the file chooser's places sidebar.
      </description>
    </key>
    <key name="clock-format" enum="org.gtk.Settings.FileChooser.ClockFormat">
      <default>'24h'</default>
      <summary>Time format</summary>
      <description>
        Whether the time is shown in 24h or 12h format.
      </description>
    </key>
    <key name="date-format" enum="org.gtk.Settings.FileChooser.DateFormat">
      <default>'regular'</default>
      <summary>Date format</summary>
      <description>
        The amount of detail to show in the Modified column.
      </description>
    </key>
  </schema>

</schemalist>
tools\tools\share\icons\Adwaita\16x16\actions\action-unavailable-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\address-book-new-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\address-book-new.png
 
tools\tools\share\icons\Adwaita\16x16\actions\application-exit-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\application-exit.png
 
tools\tools\share\icons\Adwaita\16x16\actions\appointment-new-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\appointment-new.png
 
tools\tools\share\icons\Adwaita\16x16\actions\bookmark-new-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\bookmark-new.png
 
tools\tools\share\icons\Adwaita\16x16\actions\call-start-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\call-start.png
 
tools\tools\share\icons\Adwaita\16x16\actions\call-stop-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\call-stop.png
 
tools\tools\share\icons\Adwaita\16x16\actions\camera-switch-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\color-select-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\contact-new-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\contact-new.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-edit-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-new-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-new.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-open-recent-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-open-recent.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-open-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-open.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-page-setup-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-page-setup.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-print-preview-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-print-preview.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-print-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-print.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-properties-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-properties.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-revert-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-revert-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-revert-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-revert.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-save-as-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-save-as.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-save-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-save.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-send-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\document-send.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-clear-all-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-clear-all.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-clear-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-clear-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-clear-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-clear.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-copy-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-copy.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-cut-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-cut.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-delete-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-delete.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-find-replace-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-find-replace.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-find-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-find.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-paste-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-paste.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-redo-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-redo-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-redo-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-redo.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-select-all-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-select-all.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-select-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-undo-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-undo-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-undo-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\edit-undo.png
 
tools\tools\share\icons\Adwaita\16x16\actions\error-correct-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\find-location-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\focus-legacy-systray-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\focus-top-bar-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\focus-windows-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\folder-new-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\folder-new.png
 
tools\tools\share\icons\Adwaita\16x16\actions\font-select-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-indent-less-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-indent-less-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-indent-less-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-indent-less.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-indent-more-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-indent-more-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-indent-more-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-indent-more.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-justify-center-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-justify-center.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-justify-fill-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-justify-fill.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-justify-left-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-justify-left.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-justify-right-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-justify-right.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-text-bold-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-text-bold.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-text-direction-ltr.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-text-direction-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-text-direction-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-text-direction-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-text-italic-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-text-italic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-text-strikethrough-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-text-strikethrough.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-text-underline-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\format-text-underline.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-bottom-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-bottom.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-down-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-down.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-first-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-first-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-first-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-first.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-home-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-home.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-jump-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-jump-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-jump.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-last-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-last-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-last-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-last.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-next-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-next-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-next-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-next.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-previous-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-previous-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-previous-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-previous.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-top-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-top.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-up-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\go-up.png
 
tools\tools\share\icons\Adwaita\16x16\actions\help-about-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\help-about.png
 
tools\tools\share\icons\Adwaita\16x16\actions\help-contents.png
 
tools\tools\share\icons\Adwaita\16x16\actions\help-faq.png
 
tools\tools\share\icons\Adwaita\16x16\actions\insert-image-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\insert-image.png
 
tools\tools\share\icons\Adwaita\16x16\actions\insert-link-symbolic.symbolic.png
tools\tools\share\icons\Adwaita\16x16\actions\insert-link.png
tools\tools\share\icons\Adwaita\16x16\actions\insert-object-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\insert-object.png
 
tools\tools\share\icons\Adwaita\16x16\actions\insert-text-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\insert-text.png
 
tools\tools\share\icons\Adwaita\16x16\actions\list-add-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\list-add.png
 
tools\tools\share\icons\Adwaita\16x16\actions\list-remove-all-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\list-remove-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\list-remove.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-forward-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-forward.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-mark-important-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-mark-important.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-mark-junk-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-mark-junk.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-mark-notjunk-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-mark-notjunk.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-mark-read.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-mark-unread.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-message-new-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-message-new.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-reply-all-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-reply-all.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-reply-sender-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-reply-sender.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-send-receive-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-send-receive.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-send-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mail-send.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mark-location-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\mark-location.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-eject-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-eject.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-playback-pause-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-playback-pause.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-playback-start-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-playback-start-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-playback-start-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-playback-start.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-playback-stop-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-playback-stop.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-record-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-record.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-seek-backward-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-seek-backward-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-seek-backward-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-seek-backward.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-seek-forward-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-seek-forward-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-seek-forward-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-seek-forward.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-skip-backward-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-skip-backward-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-skip-backward-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-skip-backward.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-skip-forward-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-skip-forward-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-skip-forward-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-skip-forward.png
 
tools\tools\share\icons\Adwaita\16x16\actions\media-view-subtitles-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\object-flip-horizontal-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\object-flip-horizontal.png
 
tools\tools\share\icons\Adwaita\16x16\actions\object-flip-vertical-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\object-flip-vertical.png
 
tools\tools\share\icons\Adwaita\16x16\actions\object-rotate-left-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\object-rotate-left.png
 
tools\tools\share\icons\Adwaita\16x16\actions\object-rotate-right-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\object-rotate-right.png
 
tools\tools\share\icons\Adwaita\16x16\actions\object-select-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\open-menu-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\pan-down-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\pan-end-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\pan-end-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\pan-start-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\pan-start-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\pan-up-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\process-stop-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\process-stop.png
 
tools\tools\share\icons\Adwaita\16x16\actions\selection-end-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\selection-end-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\selection-start-symbolic-rtl.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\selection-start-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\send-to-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\star-new-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\system-lock-screen.png
 
tools\tools\share\icons\Adwaita\16x16\actions\system-log-out-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\system-log-out.png
 
tools\tools\share\icons\Adwaita\16x16\actions\system-reboot-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\system-run-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\system-run.png
 
tools\tools\share\icons\Adwaita\16x16\actions\system-search-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\system-search.png
 
tools\tools\share\icons\Adwaita\16x16\actions\system-shutdown-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\system-shutdown.png
 
tools\tools\share\icons\Adwaita\16x16\actions\system-switch-user-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\tab-new-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\tab-new.png
 
tools\tools\share\icons\Adwaita\16x16\actions\tools-check-spelling-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\tools-check-spelling.png
 
tools\tools\share\icons\Adwaita\16x16\actions\value-decrease-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\value-increase-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-app-grid-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-continuous-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-dual-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-fullscreen-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-fullscreen.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-grid-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-list-bullet-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-list-ordered-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-list-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-mirror-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-more-horizontal-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-more-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-paged-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-pin-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-refresh-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-refresh.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-restore-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-restore.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-sort-ascending-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-sort-ascending.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-sort-descending-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\view-sort-descending.png
 
tools\tools\share\icons\Adwaita\16x16\actions\window-close-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\window-close.png
 
tools\tools\share\icons\Adwaita\16x16\actions\window-maximize-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\window-minimize-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\window-new.png
 
tools\tools\share\icons\Adwaita\16x16\actions\window-restore-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\zoom-fit-best-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\zoom-fit-best.png
 
tools\tools\share\icons\Adwaita\16x16\actions\zoom-in-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\zoom-in.png
 
tools\tools\share\icons\Adwaita\16x16\actions\zoom-original-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\zoom-original.png
 
tools\tools\share\icons\Adwaita\16x16\actions\zoom-out-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\actions\zoom-out.png
 
tools\tools\share\icons\Adwaita\16x16\apps\accessories-calculator-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\accessories-calculator.png
 
tools\tools\share\icons\Adwaita\16x16\apps\accessories-character-map-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\accessories-character-map.png
 
tools\tools\share\icons\Adwaita\16x16\apps\accessories-dictionary-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\accessories-dictionary.png
 
tools\tools\share\icons\Adwaita\16x16\apps\accessories-text-editor-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\accessories-text-editor.png
 
tools\tools\share\icons\Adwaita\16x16\apps\applets-screenshooter-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\applets-screenshooter.png
 
tools\tools\share\icons\Adwaita\16x16\apps\bluetooth-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\gnome-power-manager-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\goa-panel-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\help-browser-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\help-browser.png
 
tools\tools\share\icons\Adwaita\16x16\apps\help-contents-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\help-faq-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\multimedia-volume-control-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\multimedia-volume-control.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-color-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-accessibility-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-accessibility.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-display-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-display.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-font-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-font.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-keyboard-shortcuts-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-keyboard-shortcuts.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-keyboard-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-keyboard.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-locale-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-locale.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-remote-desktop-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-remote-desktop.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-screensaver-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-screensaver.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-theme.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-wallpaper-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-desktop-wallpaper.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-system-details-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-system-devices-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-system-network-proxy-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-system-network-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-system-notifications-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-system-notifications.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-system-privacy-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-system-privacy.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-system-search-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-system-search.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-system-sharing-symbolic.symbolic.png
tools\tools\share\icons\Adwaita\16x16\apps\preferences-system-sharing.png
tools\tools\share\icons\Adwaita\16x16\apps\preferences-system-time-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\preferences-system-windows.png
 
tools\tools\share\icons\Adwaita\16x16\apps\system-file-manager-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\system-file-manager.png
 
tools\tools\share\icons\Adwaita\16x16\apps\system-software-install-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\system-software-install.png
 
tools\tools\share\icons\Adwaita\16x16\apps\system-software-update.png
 
tools\tools\share\icons\Adwaita\16x16\apps\system-users-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\system-users.png
 
tools\tools\share\icons\Adwaita\16x16\apps\text-editor-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\user-info-symbolic.symbolic.png
tools\tools\share\icons\Adwaita\16x16\apps\user-info.png
tools\tools\share\icons\Adwaita\16x16\apps\utilities-system-monitor-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\utilities-system-monitor.png
 
tools\tools\share\icons\Adwaita\16x16\apps\utilities-terminal-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\utilities-terminal.png
 
tools\tools\share\icons\Adwaita\16x16\apps\web-browser-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\apps\web-browser.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-accessories.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-development.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-engineering-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-engineering.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-games-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-games.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-graphics-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-graphics.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-internet.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-multimedia-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-multimedia.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-office.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-other.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-science-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-science.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-system-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-system.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-utilities-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\applications-utilities.png
 
tools\tools\share\icons\Adwaita\16x16\categories\emoji-activities-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\emoji-body-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\emoji-flags-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\emoji-food-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\emoji-nature-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\emoji-objects-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\emoji-people-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\emoji-recent-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\emoji-symbols-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\emoji-travel-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\preferences-desktop-peripherals.png
 
tools\tools\share\icons\Adwaita\16x16\categories\preferences-desktop-personal.png
 
tools\tools\share\icons\Adwaita\16x16\categories\preferences-desktop.png
 
tools\tools\share\icons\Adwaita\16x16\categories\preferences-other-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\preferences-other.png
 
tools\tools\share\icons\Adwaita\16x16\categories\preferences-system-network.png
 
tools\tools\share\icons\Adwaita\16x16\categories\preferences-system-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\preferences-system.png
 
tools\tools\share\icons\Adwaita\16x16\categories\system-help-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\categories\system-help.png
 
tools\tools\share\icons\Adwaita\16x16\devices\ac-adapter-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\ac-adapter.png
 
tools\tools\share\icons\Adwaita\16x16\devices\audio-card-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\audio-card.png
 
tools\tools\share\icons\Adwaita\16x16\devices\audio-headphones-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\audio-headphones.png
 
tools\tools\share\icons\Adwaita\16x16\devices\audio-headset-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\audio-headset.png
 
tools\tools\share\icons\Adwaita\16x16\devices\audio-input-microphone-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\audio-input-microphone.png
 
tools\tools\share\icons\Adwaita\16x16\devices\audio-speakers-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\audio-speakers.png
 
tools\tools\share\icons\Adwaita\16x16\devices\audio-volume-high-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\audio-volume-low-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\audio-volume-medium-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\audio-volume-muted-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\audio-volume-overamplified-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\auth-fingerprint-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\auth-sim-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\auth-smartcard-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\battery-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\battery.png
 
tools\tools\share\icons\Adwaita\16x16\devices\bluetooth-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\camera-photo-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\camera-photo.png
 
tools\tools\share\icons\Adwaita\16x16\devices\camera-video-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\camera-video.png
 
tools\tools\share\icons\Adwaita\16x16\devices\camera-web-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\camera-web.png
 
tools\tools\share\icons\Adwaita\16x16\devices\colorimeter-colorhug-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\computer-apple-ipad-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\computer-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\computer.png
 
tools\tools\share\icons\Adwaita\16x16\devices\display-projector-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\drive-harddisk-ieee1394-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\drive-harddisk-solidstate-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\drive-harddisk-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\drive-harddisk-system-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\drive-harddisk-usb-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\drive-harddisk.png
 
tools\tools\share\icons\Adwaita\16x16\devices\drive-multidisk-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\drive-multidisk.png
 
tools\tools\share\icons\Adwaita\16x16\devices\drive-optical-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\drive-optical.png
 
tools\tools\share\icons\Adwaita\16x16\devices\drive-removable-media-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\drive-removable-media.png
 
tools\tools\share\icons\Adwaita\16x16\devices\ebook-reader.png
 
tools\tools\share\icons\Adwaita\16x16\devices\input-dialpad-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\input-dialpad.png
 
tools\tools\share\icons\Adwaita\16x16\devices\input-gaming-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\input-gaming.png
 
tools\tools\share\icons\Adwaita\16x16\devices\input-keyboard-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\input-keyboard.png
 
tools\tools\share\icons\Adwaita\16x16\devices\input-mouse-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\input-mouse.png
 
tools\tools\share\icons\Adwaita\16x16\devices\input-tablet-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\input-tablet.png
 
tools\tools\share\icons\Adwaita\16x16\devices\input-touchpad-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\input-touchpad.png
 
tools\tools\share\icons\Adwaita\16x16\devices\media-flash-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\media-flash.png
 
tools\tools\share\icons\Adwaita\16x16\devices\media-floppy-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\media-floppy.png
 
tools\tools\share\icons\Adwaita\16x16\devices\media-optical-bd-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\media-optical-cd-audio-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\media-optical-dvd-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\media-optical-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\media-optical.png
 
tools\tools\share\icons\Adwaita\16x16\devices\media-removable-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\media-removable.png
 
tools\tools\share\icons\Adwaita\16x16\devices\media-tape-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\media-tape.png
 
tools\tools\share\icons\Adwaita\16x16\devices\media-zip-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\modem-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\modem.png
 
tools\tools\share\icons\Adwaita\16x16\devices\multimedia-player-apple-ipod-touch-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\multimedia-player-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\multimedia-player.png
 
tools\tools\share\icons\Adwaita\16x16\devices\network-vpn.png
 
tools\tools\share\icons\Adwaita\16x16\devices\network-wired-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\network-wired.png
 
tools\tools\share\icons\Adwaita\16x16\devices\network-wireless-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\network-wireless.png
 
tools\tools\share\icons\Adwaita\16x16\devices\pda-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\pda.png
 
tools\tools\share\icons\Adwaita\16x16\devices\phone-apple-iphone-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\phone-old-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\phone-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\phone.png
 
tools\tools\share\icons\Adwaita\16x16\devices\printer-network-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\printer-network.png
 
tools\tools\share\icons\Adwaita\16x16\devices\printer-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\printer.png
 
tools\tools\share\icons\Adwaita\16x16\devices\scanner-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\scanner.png
 
tools\tools\share\icons\Adwaita\16x16\devices\thunderbolt-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\tv-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\uninterruptible-power-supply-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\uninterruptible-power-supply.png
 
tools\tools\share\icons\Adwaita\16x16\devices\video-display-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\video-display.png
 
tools\tools\share\icons\Adwaita\16x16\devices\video-joined-displays-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\devices\video-single-display-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-default-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-default.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-documents-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-documents.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-downloads.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-favorite-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-favorite.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-generic.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-important-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-important.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-mail.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-music-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-new.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-ok-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-package.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-photos-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-photos.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-readonly.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-shared-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-shared.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-symbolic-link.png
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-synchronizing-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-synchronizing.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-system-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-system.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-unreadable.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-urgent.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-videos-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emblems\emblem-web.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\emote-love-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\emote-love.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-angel-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-angel.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-angry-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-angry.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-confused-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-cool-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-cool.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-crying-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-crying.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-devilish-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-devilish.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-embarrassed-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-embarrassed.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-glasses-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-glasses.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-kiss-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-kiss.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-laugh-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-laugh.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-monkey-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-monkey.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-plain-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-plain.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-raspberry-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-raspberry.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-sad-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-sad.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-shutmouth-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-sick-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-sick.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-smile-big-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-smile-big.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-smile-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-smile.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-smirk-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-smirk.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-surprise-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-surprise.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-tired-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-tired.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-uncertain-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-uncertain.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-wink-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-wink.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-worried-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-worried.png
 
tools\tools\share\icons\Adwaita\16x16\emotes\face-yawn-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\ac-adapter.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\accessories-calculator.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\accessories-character-map.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\accessories-dictionary.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\accessories-text-editor.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\address-book-new.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\applets-screenshooter.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\application-exit.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\applications-accessories.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\applications-development.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\applications-engineering.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\applications-games.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\applications-graphics.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\applications-internet.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\applications-office.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\applications-other.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\applications-science.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\applications-system.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\applications-utilities.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\appointment-missed.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\appointment-new.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\appointment-soon.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\audio-card.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\audio-speakers.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\audio-volume-high.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\audio-volume-low.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\audio-volume-medium.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\audio-volume-muted.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\battery-caution-charging.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\battery-caution.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\battery-empty.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\battery-full-charged.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\battery-full-charging.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\battery-full.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\battery-good-charging.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\battery-good.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\battery-low-charging.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\battery-low.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\battery-missing.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\battery.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\bookmark-new.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\call-start.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\call-stop.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\camera-photo.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\camera-video.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\camera-web.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\changes-allow.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\changes-prevent.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\computer-fail.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\computer.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\contact-new.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\dialog-error.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\dialog-information.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\dialog-password.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\dialog-question.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\dialog-warning.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\document-new.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\document-open-recent.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\document-open.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\document-page-setup.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\document-print-preview.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\document-print.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\document-properties.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\document-revert-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\document-revert.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\document-save-as.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\document-save.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\document-send.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\drive-multidisk.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\drive-optical.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\ebook-reader.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\edit-clear-all.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\edit-clear-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\edit-clear.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\edit-copy.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\edit-cut.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\edit-delete.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\edit-find-replace.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\edit-find.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\edit-paste.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\edit-redo-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\edit-redo.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\edit-select-all.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\edit-undo-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\edit-undo.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\emblem-default.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\emblem-documents.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\emblem-downloads.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\emblem-favorite.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\emblem-generic.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\emblem-important.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\emblem-mail.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\emblem-new.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\emblem-package.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\emblem-photos.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\emblem-system.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\emblem-urgent.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\emblem-web.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\emote-love.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-angel.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-angry.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-cool.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-crying.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-devilish.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-embarrassed.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-glasses.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-kiss.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-laugh.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-monkey.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-plain.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-raspberry.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-sad.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-sick.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-smile-big.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-smile.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-smirk.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-surprise.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-tired.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-uncertain.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-wink.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\face-worried.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\folder-new.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\folder-visiting.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\format-indent-less-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\format-indent-less.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\format-indent-more-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\format-indent-more.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\format-justify-center.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\format-justify-fill.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\format-justify-left.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\format-justify-right.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\format-text-bold.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\format-text-direction-ltr.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\format-text-direction-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\format-text-italic.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\format-text-strikethrough.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\format-text-underline.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\go-bottom.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\go-down.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\go-first-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\go-first.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\go-home.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\go-jump.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\go-last-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\go-last.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\go-next-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\go-next.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\go-previous-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\go-previous.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\go-top.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\go-up.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\help-about.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\help-browser.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\help-contents.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\help-faq.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\image-missing.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\input-dialpad.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\input-gaming.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\input-keyboard.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\input-mouse.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\input-tablet.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\input-touchpad.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\insert-image.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\insert-link.png
tools\tools\share\icons\Adwaita\16x16\legacy\insert-object.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\insert-text.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\list-add.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\list-remove.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-attachment.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-forward.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-mark-important.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-mark-junk.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-mark-notjunk.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-mark-read.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-mark-unread.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-message-new.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-read.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-replied.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-reply-all.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-reply-sender.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-send-receive.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-send.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-signed-verified.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-signed.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mail-unread.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\mark-location.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-eject.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-flash.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-floppy.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-optical.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-playback-pause.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-playback-start-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-playback-start.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-playback-stop.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-playlist-repeat.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-playlist-shuffle.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-record.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-removable.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-seek-backward-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-seek-backward.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-seek-forward-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-seek-forward.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-skip-backward-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-skip-backward.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-skip-forward-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-skip-forward.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\media-tape.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\microphone-sensitivity-high.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\microphone-sensitivity-low.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\microphone-sensitivity-medium.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\microphone-sensitivity-muted.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\modem.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\multimedia-player.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\multimedia-volume-control.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\network-cellular-connected.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\network-error.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\network-idle.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\network-offline.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\network-receive.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\network-transmit-receive.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\network-transmit.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\network-vpn.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\network-wired-disconnected.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\network-wired.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\network-wireless-encrypted.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\network-wireless.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\non-starred.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\object-flip-horizontal.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\object-flip-vertical.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\object-rotate-left.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\object-rotate-right.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\pda.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\phone.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-desktop-accessibility.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-desktop-display.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-desktop-font.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-desktop-keyboard-shortcuts.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-desktop-keyboard.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-desktop-locale.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-desktop-peripherals.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-desktop-personal.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-desktop-remote-desktop.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-desktop-screensaver.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-desktop-theme.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-desktop-wallpaper.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-desktop.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-other.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-system-network.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-system-notifications.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-system-privacy.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-system-search.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-system-sharing.png
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-system-windows.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\preferences-system.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\printer-error.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\printer-network.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\printer-printing.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\printer.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\process-stop.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\scanner.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\security-high.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\security-low.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\security-medium.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\semi-starred-rtl.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\semi-starred.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\software-update-available.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\software-update-urgent.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\starred.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\system-file-manager.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\system-help.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\system-lock-screen.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\system-log-out.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\system-run.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\system-search.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\system-shutdown.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\system-software-install.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\system-software-update.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\system-users.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\tab-new.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\task-due.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\task-past-due.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\tools-check-spelling.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\trophy-bronze.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\trophy-gold.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\trophy-silver.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\uninterruptible-power-supply.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\user-available.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\user-away.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\user-busy.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\user-idle.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\user-info.png
tools\tools\share\icons\Adwaita\16x16\legacy\user-invisible.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\user-offline.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\user-trash-full.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\utilities-terminal.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\video-display.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\view-fullscreen.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\view-refresh.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\view-restore.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\view-sort-ascending.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\view-sort-descending.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\weather-clear-night.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\weather-clear.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\weather-few-clouds-night.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\weather-few-clouds.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\weather-fog.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\weather-overcast.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\weather-severe-alert.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\weather-showers-scattered.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\weather-showers.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\weather-snow.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\weather-storm.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\web-browser.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\window-close.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\window-new.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\zoom-fit-best.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\zoom-in.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\zoom-original.png
 
tools\tools\share\icons\Adwaita\16x16\legacy\zoom-out.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\application-certificate-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\application-certificate.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\application-rss+xml-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\application-x-addon-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\application-x-addon.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\application-x-appliance-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\application-x-executable-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\application-x-executable.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\application-x-firmware-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\application-x-firmware.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\audio-x-generic-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\audio-x-generic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\font-x-generic-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\font-x-generic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\image-x-generic-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\image-x-generic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\inode-directory-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\package-x-generic-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\package-x-generic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\text-html.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\text-x-generic-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\text-x-generic-template.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\text-x-generic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\text-x-preview.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\text-x-script.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\video-x-generic-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\video-x-generic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-address-book-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-address-book.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-calendar-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-calendar.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-document-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-document-template.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-document.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-drawing-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-drawing-template.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-drawing.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-presentation-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-presentation-template.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-presentation.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-spreadsheet-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-spreadsheet-template.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-office-spreadsheet.png
 
tools\tools\share\icons\Adwaita\16x16\mimetypes\x-package-repository.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-documents-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-documents.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-download-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-download.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-drag-accept.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-music-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-music.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-open.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-pictures-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-pictures.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-publicshare-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-publicshare.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-remote-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-remote.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-saved-search-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-saved-search.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-templates-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-templates.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-videos-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder-videos.png
 
tools\tools\share\icons\Adwaita\16x16\places\folder.png
 
tools\tools\share\icons\Adwaita\16x16\places\network-server-symbolic.symbolic.png
 
tools\tools\share\icons\Adwaita\16x16\places\network-server.png
 
tools\tools\share\icons\Adwaita\16x16\places\network-workgroup-symbolic.symbolic.png