summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiels De Graef <nielsdegraef@gmail.com>2022-04-09 11:04:57 +0000
committerNiels De Graef <nielsdegraef@gmail.com>2022-04-09 11:04:57 +0000
commit464faa55541d4054fa4c73910857090d4fb83e7a (patch)
treee6cd6e3fe8cb74a3b2acda8fe3e3eff83da34250
parent029faac47f9c440dc7feb436a8c00ea44b91a3de (diff)
parentc70dd86775d37627964657c094cfbb0caa0415e1 (diff)
downloadgcr-464faa55541d4054fa4c73910857090d4fb83e7a.tar.gz
Merge branch 'main' into 'master'
Create gcr4 Closes #53 See merge request GNOME/gcr!82
-rw-r--r--.editorconfig20
-rw-r--r--.gitlab-ci.yml19
-rw-r--r--README.md7
-rw-r--r--docs/gck/pkcs11-links.md4
-rw-r--r--docs/gcr-gtk3/gcr-gtk3.toml.in (renamed from docs/ui/gcr-ui.toml.in)0
-rw-r--r--docs/gcr-gtk3/images/certificate-widget.png (renamed from docs/ui/images/certificate-widget.png)bin16144 -> 16144 bytes
-rw-r--r--docs/gcr-gtk3/images/combo-selector.png (renamed from docs/ui/images/combo-selector.png)bin7065 -> 7065 bytes
-rw-r--r--docs/gcr-gtk3/images/import-button.png (renamed from docs/ui/images/import-button.png)bin2925 -> 2925 bytes
-rw-r--r--docs/gcr-gtk3/images/key-widget.png (renamed from docs/ui/images/key-widget.png)bin10159 -> 10159 bytes
-rw-r--r--docs/gcr-gtk3/images/list-selector.png (renamed from docs/ui/images/list-selector.png)bin10123 -> 10123 bytes
-rw-r--r--docs/gcr-gtk3/images/tree-selector.png (renamed from docs/ui/images/tree-selector.png)bin10628 -> 10628 bytes
-rw-r--r--docs/gcr-gtk3/images/viewer-widget.png (renamed from docs/ui/images/viewer-widget.png)bin13167 -> 13167 bytes
-rw-r--r--docs/gcr-gtk3/meson.build (renamed from docs/ui/meson.build)16
-rw-r--r--docs/gcr-gtk3/widget-gallery.md (renamed from docs/ui/widget-gallery.md)0
-rw-r--r--docs/gcr-gtk4/gcr-gtk4.toml.in44
-rw-r--r--docs/gcr-gtk4/meson.build31
-rw-r--r--docs/gcr/gcr.toml.in (renamed from docs/gcr/gcr-base.toml.in)0
-rw-r--r--docs/gcr/meson.build12
-rw-r--r--docs/meson.build14
-rw-r--r--gck/Gck-1.metadata3
-rw-r--r--gck/gck-attributes.c436
-rw-r--r--gck/gck-deprecated.h130
-rw-r--r--gck/gck-enumerator.c155
-rw-r--r--gck/gck-interaction.c176
-rw-r--r--gck/gck-misc.c22
-rw-r--r--gck/gck-mock.c38
-rw-r--r--gck/gck-module.c149
-rw-r--r--gck/gck-modules.c12
-rw-r--r--gck/gck-object-cache.c48
-rw-r--r--gck/gck-object.c171
-rw-r--r--gck/gck-password.c43
-rw-r--r--gck/gck-private.h14
-rw-r--r--gck/gck-session.c260
-rw-r--r--gck/gck-slot.c71
-rw-r--r--gck/gck-uri.c65
-rw-r--r--gck/gck.h206
-rw-r--r--gck/gck.symbols2
-rw-r--r--gck/meson.build5
-rw-r--r--gck/test-gck-crypto.c46
-rw-r--r--gck/test-gck-enumerator.c74
-rw-r--r--gck/test-gck-module.c6
-rw-r--r--gck/test-gck-modules.c9
-rw-r--r--gck/test-gck-object.c39
-rw-r--r--gck/test-gck-session.c31
-rw-r--r--gck/test-gck-slot.c4
-rw-r--r--gck/test-gck-uri.c66
-rw-r--r--gcr-gtk3/fixtures/ca-certificates.crt (renamed from ui/fixtures/ca-certificates.crt)0
-rw-r--r--gcr-gtk3/fixtures/der-certificate.crt (renamed from ui/fixtures/der-certificate.crt)bin747 -> 747 bytes
-rw-r--r--gcr-gtk3/fixtures/der-rsa-2048.p10 (renamed from ui/fixtures/der-rsa-2048.p10)bin681 -> 681 bytes
-rw-r--r--gcr-gtk3/fixtures/email.p12 (renamed from ui/fixtures/email.p12)bin2488 -> 2488 bytes
-rw-r--r--gcr-gtk3/fixtures/pem-dsa-1024.key (renamed from ui/fixtures/pem-dsa-1024.key)0
-rw-r--r--gcr-gtk3/frob-certificate.c (renamed from ui/frob-certificate.c)3
-rw-r--r--gcr-gtk3/gcr-certificate-widget.c677
-rw-r--r--gcr-gtk3/gcr-certificate-widget.h33
-rw-r--r--gcr-gtk3/gcr-crypto-types.xml (renamed from ui/gcr-crypto-types.xml)1
-rw-r--r--gcr-gtk3/gcr-gtk3.h (renamed from ui/gcr-list-selector-private.h)25
-rw-r--r--gcr-gtk3/gcr-gtk3.pc.in (renamed from ui/gcr-ui.pc.in)0
-rw-r--r--gcr-gtk3/gcr-gtk3.symbols (renamed from ui/gcr-ui.symbols)0
-rw-r--r--gcr-gtk3/gcr-section.c204
-rw-r--r--gcr-gtk3/gcr-section.h29
-rw-r--r--gcr-gtk3/gcr-secure-entry-buffer.c (renamed from ui/gcr-secure-entry-buffer.c)0
-rw-r--r--gcr-gtk3/gcr-secure-entry-buffer.h (renamed from ui/gcr-secure-entry-buffer.h)0
-rw-r--r--gcr-gtk3/gcr.gresource.xml (renamed from ui/gcr.gresource.xml)0
-rw-r--r--gcr-gtk3/icons/16x16/gcr-gnupg.png (renamed from ui/icons/16x16/gcr-gnupg.png)bin637 -> 637 bytes
-rw-r--r--gcr-gtk3/icons/16x16/gcr-key-pair.png (renamed from ui/icons/16x16/gcr-key-pair.png)bin879 -> 879 bytes
-rw-r--r--gcr-gtk3/icons/16x16/gcr-key.png (renamed from ui/icons/16x16/gcr-key.png)bin650 -> 650 bytes
-rw-r--r--gcr-gtk3/icons/16x16/gcr-password.png (renamed from ui/icons/16x16/gcr-password.png)bin483 -> 483 bytes
-rw-r--r--gcr-gtk3/icons/16x16/gcr-smart-card.png (renamed from ui/icons/16x16/gcr-smart-card.png)bin509 -> 509 bytes
-rw-r--r--gcr-gtk3/icons/22x22/gcr-gnupg.png (renamed from ui/icons/22x22/gcr-gnupg.png)bin843 -> 843 bytes
-rw-r--r--gcr-gtk3/icons/22x22/gcr-key-pair.png (renamed from ui/icons/22x22/gcr-key-pair.png)bin1275 -> 1275 bytes
-rw-r--r--gcr-gtk3/icons/22x22/gcr-key.png (renamed from ui/icons/22x22/gcr-key.png)bin868 -> 868 bytes
-rw-r--r--gcr-gtk3/icons/22x22/gcr-password.png (renamed from ui/icons/22x22/gcr-password.png)bin803 -> 803 bytes
-rw-r--r--gcr-gtk3/icons/22x22/gcr-smart-card.png (renamed from ui/icons/22x22/gcr-smart-card.png)bin666 -> 666 bytes
-rw-r--r--gcr-gtk3/icons/24x24/gcr-gnupg.png (renamed from ui/icons/24x24/gcr-gnupg.png)bin858 -> 858 bytes
-rw-r--r--gcr-gtk3/icons/24x24/gcr-key-pair.png (renamed from ui/icons/24x24/gcr-key-pair.png)bin1278 -> 1278 bytes
-rw-r--r--gcr-gtk3/icons/24x24/gcr-key.png (renamed from ui/icons/24x24/gcr-key.png)bin882 -> 882 bytes
-rw-r--r--gcr-gtk3/icons/24x24/gcr-password.png (renamed from ui/icons/24x24/gcr-password.png)bin744 -> 744 bytes
-rw-r--r--gcr-gtk3/icons/24x24/gcr-smart-card.png (renamed from ui/icons/24x24/gcr-smart-card.png)bin645 -> 645 bytes
-rw-r--r--gcr-gtk3/icons/256x256/gcr-gnupg.png (renamed from ui/icons/256x256/gcr-gnupg.png)bin8863 -> 8863 bytes
-rw-r--r--gcr-gtk3/icons/256x256/gcr-password.png (renamed from ui/icons/256x256/gcr-password.png)bin5596 -> 5596 bytes
-rw-r--r--gcr-gtk3/icons/256x256/gcr-smart-card.png (renamed from ui/icons/256x256/gcr-smart-card.png)bin10098 -> 10098 bytes
-rw-r--r--gcr-gtk3/icons/32x32/gcr-gnupg.png (renamed from ui/icons/32x32/gcr-gnupg.png)bin1129 -> 1129 bytes
-rw-r--r--gcr-gtk3/icons/32x32/gcr-key-pair.png (renamed from ui/icons/32x32/gcr-key-pair.png)bin1903 -> 1903 bytes
-rw-r--r--gcr-gtk3/icons/32x32/gcr-key.png (renamed from ui/icons/32x32/gcr-key.png)bin1176 -> 1176 bytes
-rw-r--r--gcr-gtk3/icons/32x32/gcr-password.png (renamed from ui/icons/32x32/gcr-password.png)bin902 -> 902 bytes
-rw-r--r--gcr-gtk3/icons/32x32/gcr-smart-card.png (renamed from ui/icons/32x32/gcr-smart-card.png)bin1093 -> 1093 bytes
-rw-r--r--gcr-gtk3/icons/48x48/gcr-gnupg.png (renamed from ui/icons/48x48/gcr-gnupg.png)bin1679 -> 1679 bytes
-rw-r--r--gcr-gtk3/icons/48x48/gcr-key-pair.png (renamed from ui/icons/48x48/gcr-key-pair.png)bin3502 -> 3502 bytes
-rw-r--r--gcr-gtk3/icons/48x48/gcr-key.png (renamed from ui/icons/48x48/gcr-key.png)bin2036 -> 2036 bytes
-rw-r--r--gcr-gtk3/icons/48x48/gcr-password.png (renamed from ui/icons/48x48/gcr-password.png)bin1525 -> 1525 bytes
-rw-r--r--gcr-gtk3/icons/48x48/gcr-smart-card.png (renamed from ui/icons/48x48/gcr-smart-card.png)bin1724 -> 1724 bytes
-rw-r--r--gcr-gtk3/icons/meson.build (renamed from ui/icons/meson.build)0
-rwxr-xr-xgcr-gtk3/icons/render-icons.py (renamed from ui/icons/render-icons.py)4
-rw-r--r--gcr-gtk3/icons/src/gcr-gnupg.svg (renamed from ui/icons/src/gcr-gnupg.svg)0
-rw-r--r--gcr-gtk3/icons/src/gcr-key-and-keypair.svg (renamed from ui/icons/src/gcr-key-and-keypair.svg)0
-rw-r--r--gcr-gtk3/icons/src/gcr-password.svg (renamed from ui/icons/src/gcr-password.svg)0
-rw-r--r--gcr-gtk3/icons/src/gcr-smart-card.svg (renamed from ui/icons/src/gcr-smart-card.svg)0
-rw-r--r--gcr-gtk3/libgcr-gtk3.map (renamed from gcr/libgcr-base.map)0
-rw-r--r--gcr-gtk3/meson.build156
-rw-r--r--gcr-gtk4/gcr-certificate-widget.c684
-rw-r--r--gcr-gtk4/gcr-certificate-widget.h30
-rw-r--r--gcr-gtk4/gcr-gtk4.h20
-rw-r--r--gcr-gtk4/gcr-section.c222
-rw-r--r--gcr-gtk4/gcr-section.h30
-rw-r--r--gcr-gtk4/libgcr-gtk4.map (renamed from ui/libgcr-ui.map)0
-rw-r--r--gcr-gtk4/meson.build129
-rw-r--r--gcr/frob-certificate-request.c2
-rw-r--r--gcr/frob-openpgp.c2
-rw-r--r--gcr/frob-parser.c2
-rw-r--r--gcr/gcr-base.h65
-rw-r--r--gcr/gcr-callback-output-stream.h3
-rw-r--r--gcr/gcr-certificate-chain.c2
-rw-r--r--gcr/gcr-certificate-chain.h8
-rw-r--r--gcr/gcr-certificate-extensions.h2
-rw-r--r--gcr/gcr-certificate-request.c2
-rw-r--r--gcr/gcr-certificate-request.h8
-rw-r--r--gcr/gcr-certificate.c2
-rw-r--r--gcr/gcr-certificate.h10
-rw-r--r--gcr/gcr-collection.c169
-rw-r--r--gcr/gcr-collection.h80
-rw-r--r--gcr/gcr-column.h4
-rw-r--r--gcr/gcr-comparable.c9
-rw-r--r--gcr/gcr-comparable.h17
-rw-r--r--gcr/gcr-deprecated-base.h79
-rw-r--r--gcr/gcr-filter-collection.c372
-rw-r--r--gcr/gcr-filter-collection.h76
-rw-r--r--gcr/gcr-fingerprint.h8
-rw-r--r--gcr/gcr-gnupg-collection.c738
-rw-r--r--gcr/gcr-gnupg-collection.h69
-rw-r--r--gcr/gcr-gnupg-importer.c4
-rw-r--r--gcr/gcr-gnupg-importer.h8
-rw-r--r--gcr/gcr-gnupg-key.h8
-rw-r--r--gcr/gcr-gnupg-records.h4
-rw-r--r--gcr/gcr-gnupg-util.h4
-rw-r--r--gcr/gcr-icons.h8
-rw-r--r--gcr/gcr-import-interaction.c27
-rw-r--r--gcr/gcr-import-interaction.h21
-rw-r--r--gcr/gcr-importer.c133
-rw-r--r--gcr/gcr-importer.h21
-rw-r--r--gcr/gcr-key-mechanisms.c2
-rw-r--r--gcr/gcr-key-mechanisms.h4
-rw-r--r--gcr/gcr-library.c10
-rw-r--r--gcr/gcr-library.h8
-rw-r--r--gcr/gcr-mock-prompter.c4
-rw-r--r--gcr/gcr-mock-prompter.h8
-rw-r--r--gcr/gcr-openpgp.h4
-rw-r--r--gcr/gcr-openssh.c4
-rw-r--r--gcr/gcr-openssh.h4
-rw-r--r--gcr/gcr-parser.c2
-rw-r--r--gcr/gcr-parser.h8
-rw-r--r--gcr/gcr-pkcs11-certificate.c2
-rw-r--r--gcr/gcr-pkcs11-certificate.h8
-rw-r--r--gcr/gcr-pkcs11-importer.c22
-rw-r--r--gcr/gcr-pkcs11-importer.h4
-rw-r--r--gcr/gcr-prompt.c30
-rw-r--r--gcr/gcr-prompt.h21
-rw-r--r--gcr/gcr-record.h4
-rw-r--r--gcr/gcr-secret-exchange.h8
-rw-r--r--gcr/gcr-secure-memory.h8
-rw-r--r--gcr/gcr-simple-certificate.c23
-rw-r--r--gcr/gcr-simple-certificate.h8
-rw-r--r--gcr/gcr-simple-collection.c193
-rw-r--r--gcr/gcr-simple-collection.h65
-rw-r--r--gcr/gcr-single-collection.c151
-rw-r--r--gcr/gcr-single-collection.h45
-rw-r--r--gcr/gcr-ssh-agent-service.c2
-rw-r--r--gcr/gcr-ssh-askpass.h8
-rw-r--r--gcr/gcr-subject-public-key.c6
-rw-r--r--gcr/gcr-subject-public-key.h4
-rw-r--r--gcr/gcr-system-prompt.c4
-rw-r--r--gcr/gcr-system-prompt.h8
-rw-r--r--gcr/gcr-system-prompter.c4
-rw-r--r--gcr/gcr-system-prompter.h8
-rw-r--r--gcr/gcr-trust.c14
-rw-r--r--gcr/gcr-trust.h8
-rw-r--r--gcr/gcr-types.h8
-rw-r--r--gcr/gcr-union-collection.c339
-rw-r--r--gcr/gcr-union-collection.h77
-rw-r--r--gcr/gcr-version.h.in2
-rw-r--r--gcr/gcr.h28
-rw-r--r--gcr/gcr.symbols (renamed from gcr/gcr-base.symbols)0
-rw-r--r--gcr/libgcr.map8
-rw-r--r--gcr/meson.build116
-rw-r--r--gcr/test-certificate-chain.c2
-rw-r--r--gcr/test-certificate.c2
-rw-r--r--gcr/test-filter-collection.c272
-rw-r--r--gcr/test-fingerprint.c4
-rw-r--r--gcr/test-gnupg-collection.c249
-rw-r--r--gcr/test-gnupg-process.c2
-rw-r--r--gcr/test-openpgp.c2
-rw-r--r--gcr/test-openssh.c2
-rw-r--r--gcr/test-parser.c2
-rw-r--r--gcr/test-pkcs11-certificate.c2
-rw-r--r--gcr/test-secret-exchange.c2
-rw-r--r--gcr/test-simple-certificate.c2
-rw-r--r--gcr/test-ssh-askpass.c2
-rw-r--r--gcr/test-subject-public-key.c12
-rw-r--r--gcr/test-system-prompt.c2
-rw-r--r--gcr/test-trust.c2
-rw-r--r--gcr/test-util.c2
-rw-r--r--meson.build34
-rw-r--r--meson_options.txt11
-rwxr-xr-xmeson_post_install.py23
-rw-r--r--po/POTFILES.in40
-rw-r--r--tools/gtk3/meson.build7
-rw-r--r--tools/gtk3/viewer.c139
-rw-r--r--tools/gtk4/meson.build7
-rw-r--r--tools/gtk4/viewer.c139
-rw-r--r--tools/meson.build7
-rw-r--r--ui/GcrUi-3.metadata5
-rw-r--r--ui/eggimagemenuitem.c734
-rw-r--r--ui/eggimagemenuitem.h80
-rw-r--r--ui/frob-combo-selector.c97
-rw-r--r--ui/frob-gnupg-selector.c94
-rw-r--r--ui/frob-import-button.c251
-rw-r--r--ui/frob-key.c87
-rw-r--r--ui/frob-prompt.c279
-rw-r--r--ui/frob-request.c97
-rw-r--r--ui/frob-system-prompt.c145
-rw-r--r--ui/frob-tree-selector.c211
-rw-r--r--ui/frob-unlock-options.c82
-rw-r--r--ui/frob-unlock.c123
-rw-r--r--ui/gcr-certificate-basics-widget.c79
-rw-r--r--ui/gcr-certificate-basics-widget.h65
-rw-r--r--ui/gcr-certificate-details-widget.c79
-rw-r--r--ui/gcr-certificate-details-widget.h65
-rw-r--r--ui/gcr-certificate-exporter.c570
-rw-r--r--ui/gcr-certificate-exporter.h74
-rw-r--r--ui/gcr-certificate-renderer-private.h49
-rw-r--r--ui/gcr-certificate-renderer.c960
-rw-r--r--ui/gcr-certificate-renderer.h73
-rw-r--r--ui/gcr-certificate-request-renderer.c531
-rw-r--r--ui/gcr-certificate-request-renderer.h71
-rw-r--r--ui/gcr-certificate-widget.c245
-rw-r--r--ui/gcr-certificate-widget.h73
-rw-r--r--ui/gcr-collection-model.c1654
-rw-r--r--ui/gcr-collection-model.h102
-rw-r--r--ui/gcr-combo-selector.c250
-rw-r--r--ui/gcr-combo-selector.h67
-rw-r--r--ui/gcr-deprecated.h55
-rw-r--r--ui/gcr-dialog-util.c171
-rw-r--r--ui/gcr-dialog-util.h40
-rw-r--r--ui/gcr-display-scrolled.c173
-rw-r--r--ui/gcr-display-scrolled.h57
-rw-r--r--ui/gcr-display-view.c1232
-rw-r--r--ui/gcr-display-view.h116
-rw-r--r--ui/gcr-failure-renderer.c228
-rw-r--r--ui/gcr-failure-renderer.h67
-rw-r--r--ui/gcr-gnupg-renderer.c852
-rw-r--r--ui/gcr-gnupg-renderer.h77
-rw-r--r--ui/gcr-import-button.c592
-rw-r--r--ui/gcr-import-button.h74
-rw-r--r--ui/gcr-key-renderer.c481
-rw-r--r--ui/gcr-key-renderer.h66
-rw-r--r--ui/gcr-key-widget.c210
-rw-r--r--ui/gcr-key-widget.h61
-rw-r--r--ui/gcr-list-selector.c442
-rw-r--r--ui/gcr-list-selector.h71
-rw-r--r--ui/gcr-live-search.c656
-rw-r--r--ui/gcr-live-search.h84
-rw-r--r--ui/gcr-pkcs11-import-dialog.c271
-rw-r--r--ui/gcr-pkcs11-import-dialog.h62
-rw-r--r--ui/gcr-pkcs11-import-dialog.ui255
-rw-r--r--ui/gcr-pkcs11-import-interaction.c249
-rw-r--r--ui/gcr-pkcs11-import-interaction.h38
-rw-r--r--ui/gcr-prompt-dialog.c1060
-rw-r--r--ui/gcr-prompt-dialog.h63
-rw-r--r--ui/gcr-prompter-tool.c257
-rw-r--r--ui/gcr-prompter.desktop.in.in9
-rw-r--r--ui/gcr-renderer.c326
-rw-r--r--ui/gcr-renderer.h88
-rw-r--r--ui/gcr-tree-selector.c346
-rw-r--r--ui/gcr-tree-selector.h70
-rw-r--r--ui/gcr-ui.h58
-rw-r--r--ui/gcr-unlock-options-widget.c501
-rw-r--r--ui/gcr-unlock-options-widget.h82
-rw-r--r--ui/gcr-unlock-options-widget.ui117
-rw-r--r--ui/gcr-unlock-renderer.c345
-rw-r--r--ui/gcr-unlock-renderer.h83
-rw-r--r--ui/gcr-viewer-tool.c126
-rw-r--r--ui/gcr-viewer-widget.c680
-rw-r--r--ui/gcr-viewer-widget.h62
-rw-r--r--ui/gcr-viewer-window.c201
-rw-r--r--ui/gcr-viewer-window.h67
-rw-r--r--ui/gcr-viewer.c181
-rw-r--r--ui/gcr-viewer.desktop.in.in7
-rw-r--r--ui/gcr-viewer.h85
-rw-r--r--ui/meson.build265
288 files changed, 3617 insertions, 24360 deletions
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..d12b075
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,20 @@
+# SPDX-FileCopyrightText: 2021 The GCR Authors
+# SPDX-License-Identifier: CC0-1.0
+
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+trim_trailing_whitespace = true
+
+[*.[ch]]
+indent_style = tab
+insert_final_newline = true
+trim_trailing_whitespace = true
+tab_width = 8
+
+[meson.build]
+indent_size = 2
+indent_style = space
+
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 91999cd..0d6f57c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,7 +3,7 @@ stages:
- deploy
variables:
- DEPENDENCIES: dbus-daemon diffutils gcc gi-docgen libsecret-devel meson ninja-build openssh openssh-clients python redhat-rpm-config systemd-devel
+ DEPENDENCIES: dbus-daemon diffutils gcc gi-docgen libsecret-devel meson ninja-build openssh openssh-clients python redhat-rpm-config systemd-devel gtk4-devel
fedora:Werror:
image: fedora:latest
@@ -86,14 +86,23 @@ fedora:coverage:
pages:
stage: deploy
only:
- - master
+ - main
needs: ['fedora:coverage']
+ before_script:
+ - dnf upgrade -y
+ - dnf install -y curl unzip
script:
- mkdir public
+ - 'curl --location --output gcr-3.zip "https://gitlab.gnome.org/api/v4/projects/${CI_PROJECT_ID}/jobs/artifacts/gcr-3-41/download?job=fedora:coverage&job_token=${CI_JOB_TOKEN}"'
+ - unzip -q gcr-3.zip -d gcr-3
+ - mv gcr-3/_build/docs/gck/gck-1 public/gck-1
+ - mv gcr-3/_build/docs/gcr/gcr-3 public/gcr-3
+ - mv gcr-3/_build/docs/ui/gcr-ui-3 public/gcr-ui-3
- mv _build/meson-logs/coveragereport public/coverage
- - mv _build/docs/gck/gck-1 public/gck-1
- - mv _build/docs/gcr/gcr-3 public/gcr-3
- - mv _build/docs/ui/gcr-ui-3 public/gcr-ui-3
+ - mv _build/docs/gck/gck-2 public/gck-2
+ - mv _build/docs/gcr/gcr-4 public/gcr-4
+ - mv _build/docs/gcr-gtk3/gcr-4-gtk3 public/gcr-4-gtk3
+ - mv _build/docs/gcr-gtk4/gcr-4-gtk4 public/gcr-4-gtk4
artifacts:
when: on_success
paths:
diff --git a/README.md b/README.md
index 7013994..dd3d4f8 100644
--- a/README.md
+++ b/README.md
@@ -33,6 +33,13 @@ The documentation for GCR and GCK is built using [gi-docgen].
You can find the nightly documentation at:
+* Gck: https://gnome.pages.gitlab.gnome.org/gcr/gck-2/
+* Gcr: https://gnome.pages.gitlab.gnome.org/gcr/gcr-4/
+* GcrGtk4: https://gnome.pages.gitlab.gnome.org/gcr/gcr-4-gtk4/
+* GcrGtk3: https://gnome.pages.gitlab.gnome.org/gcr/gcr-4-gtk3/
+
+You can find the older GCR documentation at:
+
* Gck: https://gnome.pages.gitlab.gnome.org/gcr/gck-1/
* Gcr: https://gnome.pages.gitlab.gnome.org/gcr/gcr-3/
* GcrUI: https://gnome.pages.gitlab.gnome.org/gcr/gcr-ui-3/
diff --git a/docs/gck/pkcs11-links.md b/docs/gck/pkcs11-links.md
index ad89d6c..ee62924 100644
--- a/docs/gck/pkcs11-links.md
+++ b/docs/gck/pkcs11-links.md
@@ -17,8 +17,8 @@ A PKCS#11 URI can always resolve to more than one object, token or module. A
PKCS#11 URI that refers to a token, would (when used in a context that expects
objects) refer to all the token on that module.
-To parse a PKCS#11 URI, use the [func@uri_parse] function passing in the type of
-context in which you're using the URI. To build a URI, use the [func@uri_build]
+To parse a PKCS#11 URI, use the [func@Gck.UriData.parse] function passing in the type of
+context in which you're using the URI. To build a URI, use the [method@Gck.UriData.build]
function.
In most cases, the parsing or building of URIs is already handled for you in the
diff --git a/docs/ui/gcr-ui.toml.in b/docs/gcr-gtk3/gcr-gtk3.toml.in
index 6f5f4da..6f5f4da 100644
--- a/docs/ui/gcr-ui.toml.in
+++ b/docs/gcr-gtk3/gcr-gtk3.toml.in
diff --git a/docs/ui/images/certificate-widget.png b/docs/gcr-gtk3/images/certificate-widget.png
index e3c9158..e3c9158 100644
--- a/docs/ui/images/certificate-widget.png
+++ b/docs/gcr-gtk3/images/certificate-widget.png
Binary files differ
diff --git a/docs/ui/images/combo-selector.png b/docs/gcr-gtk3/images/combo-selector.png
index 073f483..073f483 100644
--- a/docs/ui/images/combo-selector.png
+++ b/docs/gcr-gtk3/images/combo-selector.png
Binary files differ
diff --git a/docs/ui/images/import-button.png b/docs/gcr-gtk3/images/import-button.png
index 9166bb8..9166bb8 100644
--- a/docs/ui/images/import-button.png
+++ b/docs/gcr-gtk3/images/import-button.png
Binary files differ
diff --git a/docs/ui/images/key-widget.png b/docs/gcr-gtk3/images/key-widget.png
index db3a371..db3a371 100644
--- a/docs/ui/images/key-widget.png
+++ b/docs/gcr-gtk3/images/key-widget.png
Binary files differ
diff --git a/docs/ui/images/list-selector.png b/docs/gcr-gtk3/images/list-selector.png
index 7f9c688..7f9c688 100644
--- a/docs/ui/images/list-selector.png
+++ b/docs/gcr-gtk3/images/list-selector.png
Binary files differ
diff --git a/docs/ui/images/tree-selector.png b/docs/gcr-gtk3/images/tree-selector.png
index 7bcd1a1..7bcd1a1 100644
--- a/docs/ui/images/tree-selector.png
+++ b/docs/gcr-gtk3/images/tree-selector.png
Binary files differ
diff --git a/docs/ui/images/viewer-widget.png b/docs/gcr-gtk3/images/viewer-widget.png
index 1933e04..1933e04 100644
--- a/docs/ui/images/viewer-widget.png
+++ b/docs/gcr-gtk3/images/viewer-widget.png
Binary files differ
diff --git a/docs/ui/meson.build b/docs/gcr-gtk3/meson.build
index 3666f0d..fdb818b 100644
--- a/docs/ui/meson.build
+++ b/docs/gcr-gtk3/meson.build
@@ -1,9 +1,9 @@
-gcr_ui_content_files = [
+gcr_gtk3_content_files = [
'widget-gallery.md',
]
-gcr_ui_toml = configure_file(
- input: 'gcr-ui.toml.in',
+gcr_gtk3_toml = configure_file(
+ input: 'gcr-gtk3.toml.in',
output: '@BASENAME@',
configuration: {
'GCR_VERSION': gcr_api_version,
@@ -11,9 +11,9 @@ gcr_ui_toml = configure_file(
},
)
-gcr_ui_docs = custom_target('gcr-ui-docs',
- input: gcr_ui_gir[0],
- output: gcr_ui_basename,
+gcr_gtk3_docs = custom_target('gcr-gtk3-docs',
+ input: gcr_gtk3_gir[0],
+ output: gcr_gtk3_basename,
command: [
gi_docgen,
'generate',
@@ -21,13 +21,13 @@ gcr_ui_docs = custom_target('gcr-ui-docs',
'--fatal-warnings',
'--add-include-path=@0@'.format(build_root / 'gck'),
'--add-include-path=@0@'.format(build_root / 'gcr'),
- '--config', gcr_ui_toml,
+ '--config', gcr_gtk3_toml,
'--output-dir=@OUTPUT@',
'--no-namespace-dir',
'--content-dir=@0@'.format(meson.current_source_dir()),
'@INPUT@',
],
- depend_files: [ gcr_ui_toml, gcr_ui_content_files ],
+ depend_files: [ gcr_gtk3_toml, gcr_gtk3_content_files ],
depends: [ gck_gir[0], gcr_gir[0] ],
build_by_default: true,
install: true,
diff --git a/docs/ui/widget-gallery.md b/docs/gcr-gtk3/widget-gallery.md
index 27e1e90..27e1e90 100644
--- a/docs/ui/widget-gallery.md
+++ b/docs/gcr-gtk3/widget-gallery.md
diff --git a/docs/gcr-gtk4/gcr-gtk4.toml.in b/docs/gcr-gtk4/gcr-gtk4.toml.in
new file mode 100644
index 0000000..a42e5fb
--- /dev/null
+++ b/docs/gcr-gtk4/gcr-gtk4.toml.in
@@ -0,0 +1,44 @@
+[library]
+namespace = "GcrGtk"
+version = "@GCR_VERSION@"
+browse_url = "https://gitlab.gnome.org/GNOME/gcr/"
+repository_url = "https://gitlab.gnome.org/GNOME/gcr.git"
+authors = "GCR contributors"
+license = "LGPL-2.0-or-later"
+description = "Library providing GTK widgets for high level crypto"
+dependencies = [ "GObject-2.0", "Gio-2.0", "Gtk-4.0", "Gck-@GCK_VERSION@", "Gcr-@GCR_VERSION@" ]
+devhelp = true
+search_index = true
+
+ [dependencies."GObject-2.0"]
+ name = "GObject"
+ description = "The base type system library"
+ docs_url = "https://developer.gnome.org/gobject/stable"
+
+ [dependencies."Gio-2.0"]
+ name = "Gio"
+ description = "GObject interfaces and objects"
+ docs_url = "https://developer.gnome.org/gio/stable"
+
+ [dependencies."Gtk-4.0"]
+ name = "Gtk"
+ description = "The GTK UI toolkit"
+ docs_url = "https://docs.gtk.org/gtk4/"
+
+ [dependencies."Gck-@GCK_VERSION@"]
+ name = "Gck"
+ description = "GObject bindings for PKCS#11"
+ docs_url = "https://gnome.pages.gitlab.gnome.org/gcr/gck-@GCK_VERSION@"
+
+ [dependencies."Gcr-@GCR_VERSION@"]
+ name = "Gcr"
+ description = "GObject library for high level crypto parsing"
+ docs_url = "https://gnome.pages.gitlab.gnome.org/gcr/gcr-@GCR_VERSION@"
+
+[theme]
+name = "basic"
+show_index_summary = true
+show_class_hierarchy = true
+
+[source-location]
+base_url = "https://gitlab.gnome.org/GNOME/gcr/-/blob/master/"
diff --git a/docs/gcr-gtk4/meson.build b/docs/gcr-gtk4/meson.build
new file mode 100644
index 0000000..d3f34eb
--- /dev/null
+++ b/docs/gcr-gtk4/meson.build
@@ -0,0 +1,31 @@
+gcr_gtk4_toml = configure_file(
+ input: 'gcr-gtk4.toml.in',
+ output: '@BASENAME@',
+ configuration: {
+ 'GCR_VERSION': gcr_api_version,
+ 'GCK_VERSION': gck_api_version,
+ },
+)
+
+gcr_gtk4_docs = custom_target('gcr-gtk4-docs',
+ input: gcr_gtk4_gir[0],
+ output: gcr_gtk4_basename,
+ command: [
+ gi_docgen,
+ 'generate',
+ '--quiet',
+ '--fatal-warnings',
+ '--add-include-path=@0@'.format(build_root / 'gck'),
+ '--add-include-path=@0@'.format(build_root / 'gcr'),
+ '--config', gcr_gtk4_toml,
+ '--output-dir=@OUTPUT@',
+ '--no-namespace-dir',
+ '--content-dir=@0@'.format(meson.current_source_dir()),
+ '@INPUT@',
+ ],
+ depend_files: [ gcr_gtk4_toml ],
+ depends: [ gck_gir[0], gcr_gir[0] ],
+ build_by_default: true,
+ install: true,
+ install_dir: get_option('datadir') / 'doc',
+)
diff --git a/docs/gcr/gcr-base.toml.in b/docs/gcr/gcr.toml.in
index 1b89810..1b89810 100644
--- a/docs/gcr/gcr-base.toml.in
+++ b/docs/gcr/gcr.toml.in
diff --git a/docs/gcr/meson.build b/docs/gcr/meson.build
index d80b7c7..b7a33fb 100644
--- a/docs/gcr/meson.build
+++ b/docs/gcr/meson.build
@@ -1,11 +1,11 @@
-gcr_base_content_files = [
+gcr_content_files = [
'non-pageable-memory.md',
'pkcs11-configuration.md',
'trust-store.md',
]
-gcr_base_toml = configure_file(
- input: 'gcr-base.toml.in',
+gcr_toml = configure_file(
+ input: 'gcr.toml.in',
output: '@BASENAME@',
configuration: {
'GCR_VERSION': gcr_api_version,
@@ -13,7 +13,7 @@ gcr_base_toml = configure_file(
},
)
-gcr_base_docs = custom_target('gcr-docs',
+gcr_docs = custom_target('gcr-docs',
input: gcr_gir[0],
output: gcr_basename,
command: [
@@ -22,13 +22,13 @@ gcr_base_docs = custom_target('gcr-docs',
'--quiet',
'--fatal-warnings',
'--add-include-path=@0@'.format(build_root / 'gck'),
- '--config', gcr_base_toml,
+ '--config', gcr_toml,
'--output-dir=@OUTPUT@',
'--no-namespace-dir',
'--content-dir=@0@'.format(meson.current_source_dir()),
'@INPUT@',
],
- depend_files: [ gcr_base_toml, gcr_base_content_files ],
+ depend_files: [ gcr_toml, gcr_content_files ],
depends: [ gck_gir[0] ],
build_by_default: true,
install: true,
diff --git a/docs/meson.build b/docs/meson.build
index b90095c..3ae63b0 100644
--- a/docs/meson.build
+++ b/docs/meson.build
@@ -2,11 +2,19 @@ gi_docgen = find_program('gi-docgen')
subdir('gck')
subdir('gcr')
-subdir('ui')
+gtk_docs_targets = []
+if get_option('gtk3')
+ subdir('gcr-gtk3')
+ gtk_docs_targets += gcr_gtk3_docs
+endif
+if get_option('gtk4')
+ subdir('gcr-gtk4')
+ gtk_docs_targets += gcr_gtk4_docs
+endif
# Create a pseudo target that build all docs at once
alias_target('docs',
gck_docs,
- gcr_base_docs,
- gcr_ui_docs,
+ gcr_docs,
+ gtk_docs_targets,
)
diff --git a/gck/Gck-1.metadata b/gck/Gck-1.metadata
index 213a679..90493c2 100644
--- a/gck/Gck-1.metadata
+++ b/gck/Gck-1.metadata
@@ -8,6 +8,9 @@ Attribute
.length skip=true
.value skip=true
+Attributes
+ .new_empty skip=false sentinel="GCK_INVALID"
+
Enumerator
.set_object_type_full name="set_object_type"
diff --git a/gck/gck-attributes.c b/gck/gck-attributes.c
index 33044a7..3ba9be1 100644
--- a/gck/gck-attributes.c
+++ b/gck/gck-attributes.c
@@ -48,14 +48,10 @@
G_STATIC_ASSERT (sizeof (GckAttribute) == sizeof (CK_ATTRIBUTE));
-#define STATE_LOCKED 1
-#define STATE_FLOATING 8
-
struct _GckAttributes {
GckAttribute *data;
gulong count;
gint refs;
- gint state;
};
typedef struct {
@@ -238,7 +234,7 @@ gck_builder_ref (GckBuilder *builder)
/**
* gck_builder_unref:
- * @builder: the builder
+ * @builder: (transfer full): the builder
*
* Unreferences a builder. If this was the last reference then the builder
* is freed.
@@ -247,7 +243,7 @@ gck_builder_ref (GckBuilder *builder)
* stack.
*/
void
-gck_builder_unref (gpointer builder)
+gck_builder_unref (GckBuilder *builder)
{
GckRealBuilder *real = (GckRealBuilder *)builder;
@@ -1266,19 +1262,17 @@ gck_builder_find_date (GckBuilder *builder,
}
/**
- * gck_builder_steal:
+ * gck_builder_end:
* @builder: the builder
*
* Take the attributes that have been built in the #GckBuilder. The builder
* will no longer contain any attributes after this function call.
*
- * The returned set of attributes is a full reference, not floating.
- *
- * Returns: (transfer full): the stolen attributes, which should be freed with
+ * Returns: (transfer full): the attributes, which should be freed with
* gck_attributes_unref()
*/
GckAttributes *
-gck_builder_steal (GckBuilder *builder)
+gck_builder_end (GckBuilder *builder)
{
GckRealBuilder *real = (GckRealBuilder *)builder;
GckAttributes *attrs;
@@ -1305,39 +1299,6 @@ gck_builder_steal (GckBuilder *builder)
}
/**
- * gck_builder_end:
- * @builder: the builder
- *
- * Complete the #GckBuilder, and return the attributes contained in the builder.
- * The #GckBuilder will be cleared after this function call, and it is no
- * longer necessary to use [method@Builder.clear] on it, although it is also
- * permitted. The builder may be used again to build another set of attributes
- * after this function call.
- *
- * The returned set of attributes is floating, and should either be passed to
- * another gck library function which consumes this floating reference, or if
- * you wish to keep these attributes around you should ref them with
- * gck_attributes_ref_sink() and unref them later with gck_attributes_unref().
- *
- * Returns: (transfer none): a floating reference to the attributes created
- * in the builder
- */
-GckAttributes *
-gck_builder_end (GckBuilder *builder)
-{
- GckRealBuilder *real = (GckRealBuilder *)builder;
- GckAttributes *attrs;
-
- g_return_val_if_fail (builder != NULL, NULL);
-
- attrs = gck_builder_steal (builder);
- attrs->state |= STATE_FLOATING;
-
- g_assert (real->array == NULL);
- return attrs;
-}
-
-/**
* gck_builder_clear:
* @builder: the builder
*
@@ -2032,13 +1993,6 @@ gck_attribute_hash (gconstpointer attr)
G_DEFINE_BOXED_TYPE (GckAttributes, gck_attributes,
gck_attributes_ref, gck_attributes_unref)
-GType
-gck_attributes_get_boxed_type (void)
-{
- /* Deprecated version */
- return gck_attributes_get_type ();
-}
-
/**
* gck_attributes_new_empty:
* @first_type: the first empty attribute type
@@ -2048,12 +2002,7 @@ gck_attributes_get_boxed_type (void)
*
* Terminate the argument list with [const@INVALID].
*
- * The returned set of attributes is floating, and should either be passed to
- * another gck library function which consumes this floating reference, or if
- * you wish to keep these attributes around you should ref them with
- * gck_attributes_ref_sink() and unref them later with gck_attributes_unref().
- *
- * Returns: (transfer none): a floating reference to an empty set of attributes
+ * Returns: (transfer full): a reference to an empty set of attributes
**/
GckAttributes *
gck_attributes_new_empty (gulong first_type,
@@ -2237,45 +2186,6 @@ gck_attributes_ref (GckAttributes *attrs)
}
/**
- * gck_attributes_ref_sink:
- * @attrs: an attribute array
- *
- * #GckAttributes uses a floating reference count system. [method@Builder.end]
- * and [ctor@Attributes.new_empty] both return floating references.
- *
- * Calling this function on a `GckAttributes` with a floating
- * reference will convert the floating reference into a full reference.
- * Calling this function on a non-floating `GckAttributes` results
- * in an additional normal reference being added.
- *
- * In other words, if the @attrs is floating, then this call "assumes
- * ownership" of the floating reference, converting it to a normal
- * reference. If the @attrs is not floating, then this call adds a
- * new normal reference increasing the reference count by one.
- *
- * All Gck library functions that assume ownership of floating references
- * are documented as such. Essentially any Gck function that performs
- * an operation using a #GckAttributes argument rather than operating on the
- * attributes themselves, will accept a floating reference.
- *
- * Returns: (transfer full): the referenced attributes
- */
-GckAttributes *
-gck_attributes_ref_sink (GckAttributes *attrs)
-{
- g_return_val_if_fail (attrs, NULL);
- g_bit_lock (&attrs->state, STATE_LOCKED);
-
- if (~attrs->state & STATE_FLOATING)
- gck_attributes_ref (attrs);
- else
- attrs->state &= ~STATE_FLOATING;
-
- g_bit_unlock (&attrs->state, STATE_LOCKED);
- return attrs;
-}
-
-/**
* gck_attributes_unref:
* @attrs: (nullable) (type Gck.Attributes) (transfer full): An attribute array
*
@@ -2810,345 +2720,15 @@ gck_attributes_to_string (GckAttributes *attrs)
/**
* gck_attributes_new:
- * @reserved: Should be set to always be [const@INVALID]
*
* Create a new empty `GckAttributes` array.
*
- * The returned set of attributes is floating, and should either be passed to
- * another gck library function which consumes this floating reference, or if
- * you wish to keep these attributes around you should ref them with
- * gck_attributes_ref_sink() and unref them later with gck_attributes_unref().
- *
- * Returns: (transfer none): a floating reference to the new attributes array;
+ * Returns: (transfer full): a reference to the new attributes array;
* when done with the array release it with gck_attributes_unref().
**/
GckAttributes *
-gck_attributes_new (gulong reserved)
+gck_attributes_new (void)
{
GckBuilder builder = GCK_BUILDER_INIT;
return gck_builder_end (&builder);
}
-
-/**
- * gck_attributes_new_full: (skip)
- * @allocator: memory allocator for attribute data, or %NULL for default
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.set_all] instead.
- *
- * Returns: returns %NULL
- **/
-GckAttributes *
-gck_attributes_new_full (GckAllocator allocator)
-{
- g_warning ("gck_attributes_new_full() is no no longer supported");
- return NULL;
-}
-
-/**
- * gck_attributes_add:
- * @attrs: the attributes array to add to
- * @attr: the attribute to add
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.set_all] instead.
- *
- * Returns: (transfer none): returns %NULL
- **/
-GckAttribute *
-gck_attributes_add (GckAttributes *attrs,
- GckAttribute *attr)
-{
- g_warning ("gck_attributes_add() is no no longer supported");
- return NULL;
-}
-
-/**
- * gck_attributes_set:
- * @attrs: attributes array to add to
- * @attr: attribute to set
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.set_data] instead.
- **/
-void
-gck_attributes_set (GckAttributes *attrs,
- GckAttribute *attr)
-{
- g_warning ("gck_attributes_set() is no no longer supported");
-}
-
-/**
- * gck_attributes_add_data:
- * @attrs: The attributes array to add to.
- * @attr_type: The type of attribute to add.
- * @value: (array length=length): the raw memory of the attribute value
- * @length: The length of the attribute value.
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.add_data] instead.
- *
- * Returns: (transfer none): returns %NULL
- **/
-GckAttribute *
-gck_attributes_add_data (GckAttributes *attrs,
- gulong attr_type,
- const guchar *value,
- gsize length)
-{
- g_warning ("gck_attributes_add_data() is no no longer supported");
- return NULL;
-}
-
-/**
- * gck_attributes_add_invalid:
- * @attrs: The attributes array to add to.
- * @attr_type: The type of attribute to add.
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.add_invalid] instead
- *
- * Returns: (transfer none): returns %NULL
- **/
-GckAttribute *
-gck_attributes_add_invalid (GckAttributes *attrs,
- gulong attr_type)
-{
- g_warning ("gck_attributes_add_invalid() is no no longer supported");
- return NULL;
-}
-
-/**
- * gck_attributes_add_empty:
- * @attrs: The attributes array to add.
- * @attr_type: The type of attribute to add.
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.add_empty] instead.
- *
- * Returns: (transfer none): returns %NULL
- **/
-GckAttribute *
-gck_attributes_add_empty (GckAttributes *attrs,
- gulong attr_type)
-{
- g_warning ("gck_attributes_add_empty() is no no longer supported");
- return NULL;
-}
-
-/**
- * gck_attributes_add_boolean:
- * @attrs: the attributes array to add to
- * @attr_type: the type of attribute to add
- * @value: the boolean value to add
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.add_boolean] instead.
- *
- * Returns: (transfer none): returns %NULL
- **/
-GckAttribute *
-gck_attributes_add_boolean (GckAttributes *attrs,
- gulong attr_type,
- gboolean value)
-{
- g_warning ("gck_attributes_add_boolean() is no no longer supported");
- return NULL;
-}
-
-/**
- * gck_attributes_set_boolean:
- * @attrs: the attributes
- * @attr_type: the type of attribute to set
- * @value: boolean value to set
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.set_boolean] instead.
- */
-void
-gck_attributes_set_boolean (GckAttributes *attrs,
- gulong attr_type,
- gboolean value)
-{
- g_warning ("gck_attributes_set_boolean() is no no longer supported");
-
-}
-
-/**
- * gck_attributes_add_string:
- * @attrs: the attributes array to add to
- * @attr_type: the type of attribute to add
- * @value: the null terminated string value to add
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.add_string] instead.
- *
- * Returns: (transfer none): returns %NULL
- **/
-GckAttribute *
-gck_attributes_add_string (GckAttributes *attrs,
- gulong attr_type,
- const gchar *value)
-{
- g_warning ("gck_attributes_add_string() is no no longer supported");
- return NULL;
-}
-
-/**
- * gck_attributes_set_string:
- * @attrs: the attributes
- * @attr_type: the type of attribute to set
- * @value: null terminated string value to set
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.set_string] instead.
- */
-void
-gck_attributes_set_string (GckAttributes *attrs,
- gulong attr_type,
- const gchar *value)
-{
- g_warning ("gck_attributes_set_string() is no no longer supported");
-}
-
-/**
- * gck_attributes_add_date:
- * @attrs: the attributes array to add to
- * @attr_type: the type of attribute to add
- * @value: the GDate value to add
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.add_date] instead.
- *
- * Returns: (transfer none): returns %NULL
- **/
-GckAttribute *
-gck_attributes_add_date (GckAttributes *attrs,
- gulong attr_type,
- const GDate *value)
-{
- g_warning ("gck_attributes_add_date() is no no longer supported");
- return NULL;
-}
-
-/**
- * gck_attributes_set_date:
- * @attrs: the attributes
- * @attr_type: the type of attribute to set
- * @value: date value to set
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.set_date] instead.
- */
-void
-gck_attributes_set_date (GckAttributes *attrs,
- gulong attr_type,
- const GDate *value)
-{
- g_warning ("gck_attributes_set_date() is no no longer supported");
-}
-
-/**
- * gck_attributes_add_ulong:
- * @attrs: the attributes array to add to
- * @attr_type: the type of attribute to add
- * @value: the gulong value to add
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.add_ulong] instead.
- *
- * Returns: (transfer none): returns %NULL
- **/
-GckAttribute *
-gck_attributes_add_ulong (GckAttributes *attrs,
- gulong attr_type,
- gulong value)
-{
- g_warning ("gck_attributes_add_ulong() is no no longer supported");
- return NULL;
-}
-
-/**
- * gck_attributes_set_ulong:
- * @attrs: the attributes
- * @attr_type: the type of attribute to set
- * @value: gulong value to set
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.set_ulong] instead.
- */
-void
-gck_attributes_set_ulong (GckAttributes *attrs,
- gulong attr_type,
- gulong value)
-{
- g_warning ("gck_attributes_set_ulong() is no no longer supported");
-}
-
-/**
- * gck_attributes_add_all:
- * @attrs: a set of attributes
- * @from: attributes to add
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.add_all] instead.
- */
-void
-gck_attributes_add_all (GckAttributes *attrs,
- GckAttributes *from)
-{
- g_warning ("gck_attributes_add_all() is no no longer supported");
-}
-
-/**
- * gck_attributes_set_all:
- * @attrs: set of attributes
- * @from: attributes to add
- *
- * #GckAttributes are now immutable. This method no longer does anything.
- *
- * Deprecated: 3.4: Use [method@Builder.set_all] instead.
- */
-void
-gck_attributes_set_all (GckAttributes *attrs,
- GckAttributes *from)
-{
- g_warning ("gck_attributes_set_all() is no no longer supported");
-}
-
-/**
- * gck_attributes_dup:
- * @attrs: set of attributes to copy
- *
- * #GckAttributes are now immutable, and can be used in mulitple places.
- *
- * Deprecated: 3.4: Use gck_attributes_ref() or [method@Builder.add_all] instead.
- *
- * Returns: (transfer none): a new floating #GckAttributes
- */
-GckAttributes *
-gck_attributes_dup (GckAttributes *attrs)
-{
- GckBuilder builder = GCK_BUILDER_INIT;
-
- if (attrs == NULL)
- return NULL;
-
- gck_builder_add_all (&builder, attrs);
- return gck_builder_end (&builder);
-}
diff --git a/gck/gck-deprecated.h b/gck/gck-deprecated.h
deleted file mode 100644
index 029ab7e..0000000
--- a/gck/gck-deprecated.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* gck-deprecated.h - the GObject PKCS#11 wrapper library
-
- Copyright (C) 2011 Stefan Walter
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#ifndef GCK_DEPRECATED_H
-#define GCK_DEPRECATED_H
-
-#include "gck.h"
-
-G_BEGIN_DECLS
-
-#ifndef GCK_DISABLE_DEPRECATED
-
-typedef GArray GckMechanisms;
-
-G_DEPRECATED_FOR(g_array_free)
-#define gck_mechanisms_free(a) (g_array_free (a, TRUE))
-
-#define CKR_GCK_MODULE_PROBLEM GCK_ERROR_MODULE_PROBLEM
-
-G_DEPRECATED_FOR(gck_error_get_quark)
-GQuark gck_get_error_quark (void);
-
-G_DEPRECATED_FOR(gck_uri_error_get_quark)
-GQuark gck_uri_get_error_quark (void);
-
-#define GCK_URI_BAD_PREFIX GCK_URI_BAD_SCHEME
-
-G_DEPRECATED_FOR(gck_attributes_get_type)
-GType gck_attributes_get_boxed_type (void) G_GNUC_CONST;
-
-G_DEPRECATED_FOR(gck_builder_set_all)
-GckAttributes * gck_attributes_new_full (GckAllocator allocator);
-
-G_DEPRECATED_FOR(gck_builder_set_all)
-GckAttribute * gck_attributes_add (GckAttributes *attrs,
- GckAttribute *attr);
-
-G_DEPRECATED_FOR(gck_builder_set_all)
-void gck_attributes_add_all (GckAttributes *attrs,
- GckAttributes *from);
-
-G_DEPRECATED_FOR(gck_builder_add_data)
-GckAttribute * gck_attributes_add_data (GckAttributes *attrs,
- gulong attr_type,
- const guchar *value,
- gsize length);
-
-G_DEPRECATED_FOR(gck_builder_add_invalid)
-GckAttribute * gck_attributes_add_invalid (GckAttributes *attrs,
- gulong attr_type);
-
-G_DEPRECATED_FOR(gck_builder_add_empty)
-GckAttribute * gck_attributes_add_empty (GckAttributes *attrs,
- gulong attr_type);
-
-G_DEPRECATED_FOR(gck_builder_add_boolean)
-GckAttribute* gck_attributes_add_boolean (GckAttributes *attrs,
- gulong attr_type,
- gboolean value);
-
-G_DEPRECATED_FOR(gck_builder_add_string)
-GckAttribute* gck_attributes_add_string (GckAttributes *attrs,
- gulong attr_type,
- const gchar *value);
-
-G_DEPRECATED_FOR(gck_builder_add_date)
-GckAttribute* gck_attributes_add_date (GckAttributes *attrs,
- gulong attr_type,
- const GDate *value);
-
-G_DEPRECATED_FOR(gck_builder_add_ulong)
-GckAttribute* gck_attributes_add_ulong (GckAttributes *attrs,
- gulong attr_type,
- gulong value);
-
-G_DEPRECATED_FOR(gck_builder_set_data)
-void gck_attributes_set (GckAttributes *attrs,
- GckAttribute *attr);
-
-G_DEPRECATED_FOR(gck_builder_set_boolean)
-void gck_attributes_set_boolean (GckAttributes *attrs,
- gulong attr_type,
- gboolean value);
-
-G_DEPRECATED_FOR(gck_builder_set_ulong)
-void gck_attributes_set_ulong (GckAttributes *attrs,
- gulong attr_type,
- gulong value);
-
-G_DEPRECATED_FOR(gck_builder_set_string)
-void gck_attributes_set_string (GckAttributes *attrs,
- gulong attr_type,
- const gchar *value);
-
-G_DEPRECATED_FOR(gck_builder_set_date)
-void gck_attributes_set_date (GckAttributes *attrs,
- gulong attr_type,
- const GDate *value);
-
-G_DEPRECATED_FOR(gck_builder_set_all)
-void gck_attributes_set_all (GckAttributes *attrs,
- GckAttributes *from);
-
-G_DEPRECATED_FOR(gck_attributes_ref or gck_builder_add_all)
-GckAttributes * gck_attributes_dup (GckAttributes *attrs);
-
-#endif /* GCK_DISABLE_DEPRECATED */
-
-G_END_DECLS
-
-#endif /* GCK_H */
diff --git a/gck/gck-enumerator.c b/gck/gck-enumerator.c
index c1b82ee..902e756 100644
--- a/gck/gck-enumerator.c
+++ b/gck/gck-enumerator.c
@@ -96,8 +96,10 @@ struct _GckEnumeratorState {
GQueue *results;
};
-struct _GckEnumeratorPrivate {
- GMutex *mutex;
+struct _GckEnumerator {
+ GObject parent;
+
+ GMutex mutex;
GckEnumeratorState *the_state;
GTlsInteraction *interaction;
GType object_type;
@@ -107,7 +109,7 @@ struct _GckEnumeratorPrivate {
GckEnumerator *chained;
};
-G_DEFINE_TYPE_WITH_PRIVATE (GckEnumerator, gck_enumerator, G_TYPE_OBJECT);
+G_DEFINE_TYPE (GckEnumerator, gck_enumerator, G_TYPE_OBJECT);
static gpointer state_modules (GckEnumeratorState *args,
gboolean forward);
@@ -357,7 +359,6 @@ state_slot (GckEnumeratorState *args, gboolean forward)
static gpointer
state_session (GckEnumeratorState *args, gboolean forward)
{
- GTlsInteraction *interaction;
CK_RV rv;
g_assert (args->funcs);
@@ -373,17 +374,9 @@ state_session (GckEnumeratorState *args, gboolean forward)
return state_find;
}
- /* Compatibility, hook into GckModule signals if no interaction set */
- if (args->interaction)
- interaction = g_object_ref (args->interaction);
- else
- interaction = _gck_interaction_new (args->slot);
-
rv = _gck_session_authenticate_token (args->funcs,
gck_session_get_handle (args->session),
- args->slot, interaction, NULL);
-
- g_object_unref (interaction);
+ args->slot, args->interaction, NULL);
if (rv != CKR_OK)
g_message ("couldn't authenticate when enumerating: %s", gck_message_from_rv (rv));
@@ -393,8 +386,7 @@ state_session (GckEnumeratorState *args, gboolean forward)
/* Session to slot state */
} else {
- g_object_unref (args->session);
- args->session = NULL;
+ g_clear_object (&args->session);
return state_slot;
}
}
@@ -524,7 +516,7 @@ state_results (GckEnumeratorState *args,
rv = (args->funcs->C_GetAttributeValue) (session, result->handle, template, n_template);
}
- attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ attrs = gck_builder_end (&builder);
if (GCK_IS_GET_ATTRIBUTE_RV_OK (rv)) {
gchar *string = gck_attributes_to_string (attrs);
@@ -552,13 +544,11 @@ state_results (GckEnumeratorState *args,
static void
gck_enumerator_init (GckEnumerator *self)
{
- self->pv = gck_enumerator_get_instance_private (self);
- self->pv->mutex = g_new0 (GMutex, 1);
- g_mutex_init (self->pv->mutex);
- self->pv->the_state = g_new0 (GckEnumeratorState, 1);
- self->pv->object_type = GCK_TYPE_OBJECT;
- self->pv->object_class = g_type_class_ref (self->pv->object_type);
- g_assert (self->pv->object_class);
+ g_mutex_init (&self->mutex);
+ self->the_state = g_new0 (GckEnumeratorState, 1);
+ self->object_type = GCK_TYPE_OBJECT;
+ self->object_class = g_type_class_ref (self->object_type);
+ g_assert (self->object_class);
}
static void
@@ -625,16 +615,15 @@ gck_enumerator_finalize (GObject *obj)
{
GckEnumerator *self = GCK_ENUMERATOR (obj);
- g_assert (self->pv->interaction == NULL);
+ g_assert (self->interaction == NULL);
- g_assert (self->pv->the_state != NULL);
- cleanup_state (self->pv->the_state);
- g_free (self->pv->the_state);
+ g_assert (self->the_state != NULL);
+ cleanup_state (self->the_state);
+ g_free (self->the_state);
- g_mutex_clear (self->pv->mutex);
- g_free (self->pv->mutex);
- g_type_class_unref (self->pv->object_class);
- g_free (self->pv->attr_types);
+ g_mutex_clear (&self->mutex);
+ g_type_class_unref (self->object_class);
+ g_free (self->attr_types);
G_OBJECT_CLASS (gck_enumerator_parent_class)->finalize (obj);
}
@@ -690,7 +679,7 @@ created_enumerator (GckUriData *uri_data,
{
gchar *attrs, *uri;
attrs = uri_data->attributes ? gck_attributes_to_string (uri_data->attributes) : NULL;
- uri = uri_data ? gck_uri_build (uri_data, GCK_URI_FOR_TOKEN | GCK_URI_FOR_MODULE) : NULL;
+ uri = uri_data ? gck_uri_data_build (uri_data, GCK_URI_FOR_TOKEN | GCK_URI_FOR_MODULE) : NULL;
g_debug ("for = %s, tokens = %s, objects = %s", type, uri, attrs);
g_free (attrs);
g_free (uri);
@@ -705,7 +694,7 @@ _gck_enumerator_new_for_modules (GList *modules,
GckEnumeratorState *state;
self = g_object_new (GCK_TYPE_ENUMERATOR, NULL);
- state = self->pv->the_state;
+ state = self->the_state;
state->session_options = session_options;
@@ -727,7 +716,7 @@ _gck_enumerator_new_for_slots (GList *slots,
GckEnumeratorState *state;
self = g_object_new (GCK_TYPE_ENUMERATOR, NULL);
- state = self->pv->the_state;
+ state = self->the_state;
state->session_options = session_options;
@@ -749,7 +738,7 @@ _gck_enumerator_new_for_session (GckSession *session,
GckModule *module;
self = g_object_new (GCK_TYPE_ENUMERATOR, NULL);
- state = self->pv->the_state;
+ state = self->the_state;
state->session = g_object_ref (session);
state->modules = NULL;
@@ -827,11 +816,11 @@ gck_enumerator_get_object_type (GckEnumerator *self)
g_return_val_if_fail (GCK_IS_ENUMERATOR (self), 0);
- g_mutex_lock (self->pv->mutex);
+ g_mutex_lock (&self->mutex);
- result = self->pv->object_type;
+ result = self->object_type;
- g_mutex_unlock (self->pv->mutex);
+ g_mutex_unlock (&self->mutex);
return result;
}
@@ -887,23 +876,23 @@ gck_enumerator_set_object_type_full (GckEnumerator *self,
klass = g_type_class_ref (object_type);
- g_mutex_lock (self->pv->mutex);
+ g_mutex_lock (&self->mutex);
- if (self->pv->object_type)
- g_type_class_unref (self->pv->object_class);
- self->pv->object_type = object_type;
- self->pv->object_class = klass;
+ if (self->object_type)
+ g_type_class_unref (self->object_class);
+ self->object_type = object_type;
+ self->object_class = klass;
- g_free (self->pv->attr_types);
- self->pv->attr_types = NULL;
- self->pv->attr_count = 0;
+ g_free (self->attr_types);
+ self->attr_types = NULL;
+ self->attr_count = 0;
if (attr_types) {
- self->pv->attr_types = g_memdup (attr_types, sizeof (gulong) * attr_count);
- self->pv->attr_count = attr_count;
+ self->attr_types = g_memdup (attr_types, sizeof (gulong) * attr_count);
+ self->attr_count = attr_count;
}
- g_mutex_unlock (self->pv->mutex);
+ g_mutex_unlock (&self->mutex);
}
/**
@@ -922,12 +911,12 @@ gck_enumerator_get_chained (GckEnumerator *self)
g_return_val_if_fail (GCK_IS_ENUMERATOR (self), NULL);
- g_mutex_lock (self->pv->mutex);
+ g_mutex_lock (&self->mutex);
- if (self->pv->chained)
- chained = g_object_ref (self->pv->chained);
+ if (self->chained)
+ chained = g_object_ref (self->chained);
- g_mutex_unlock (self->pv->mutex);
+ g_mutex_unlock (&self->mutex);
return chained;
}
@@ -949,14 +938,14 @@ gck_enumerator_set_chained (GckEnumerator *self,
g_return_if_fail (GCK_IS_ENUMERATOR (self));
g_return_if_fail (chained == NULL || GCK_IS_ENUMERATOR (chained));
- g_mutex_lock (self->pv->mutex);
+ g_mutex_lock (&self->mutex);
- old_chained = self->pv->chained;
+ old_chained = self->chained;
if (chained)
g_object_ref (chained);
- self->pv->chained = chained;
+ self->chained = chained;
- g_mutex_unlock (self->pv->mutex);
+ g_mutex_unlock (&self->mutex);
if (old_chained)
g_object_unref (old_chained);
@@ -979,12 +968,12 @@ gck_enumerator_get_interaction (GckEnumerator *self)
g_return_val_if_fail (GCK_IS_ENUMERATOR (self), NULL);
- g_mutex_lock (self->pv->mutex);
+ g_mutex_lock (&self->mutex);
- if (self->pv->interaction)
- result = g_object_ref (self->pv->interaction);
+ if (self->interaction)
+ result = g_object_ref (self->interaction);
- g_mutex_unlock (self->pv->mutex);
+ g_mutex_unlock (&self->mutex);
return result;
}
@@ -1005,16 +994,16 @@ gck_enumerator_set_interaction (GckEnumerator *self,
g_return_if_fail (GCK_IS_ENUMERATOR (self));
g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction));
- g_mutex_lock (self->pv->mutex);
+ g_mutex_lock (&self->mutex);
- if (interaction != self->pv->interaction) {
- previous = self->pv->interaction;
- self->pv->interaction = interaction;
+ if (interaction != self->interaction) {
+ previous = self->interaction;
+ self->interaction = interaction;
if (interaction)
g_object_ref (interaction);
}
- g_mutex_unlock (self->pv->mutex);
+ g_mutex_unlock (&self->mutex);
g_clear_object (&previous);
g_object_notify (G_OBJECT (self), "interaction");
@@ -1027,7 +1016,7 @@ check_out_enumerator_state (GckEnumerator *self)
GTlsInteraction *old_interaction = NULL;
gpointer old_object_class = NULL;
GckEnumeratorState *chained_state = NULL;
- GckObjectCacheIface *object_iface;
+ GckObjectCacheInterface *object_iface;
GckEnumerator *chained;
chained = gck_enumerator_get_chained (self);
@@ -1036,35 +1025,35 @@ check_out_enumerator_state (GckEnumerator *self)
g_object_unref (chained);
}
- g_mutex_lock (self->pv->mutex);
+ g_mutex_lock (&self->mutex);
- if (self->pv->the_state) {
- state = self->pv->the_state;
- self->pv->the_state = NULL;
+ if (self->the_state) {
+ state = self->the_state;
+ self->the_state = NULL;
state->enumerator = g_object_ref (self);
g_assert (state->chained == NULL);
state->chained = chained_state;
old_interaction = state->interaction;
- if (self->pv->interaction)
- state->interaction = g_object_ref (self->pv->interaction);
+ if (self->interaction)
+ state->interaction = g_object_ref (self->interaction);
else
state->interaction = NULL;
old_object_class = state->object_class;
/* Must already be holding a reference, state also holds a ref */
- state->object_type = self->pv->object_type;
+ state->object_type = self->object_type;
state->object_class = g_type_class_peek (state->object_type);
- g_assert (state->object_class == self->pv->object_class);
+ g_assert (state->object_class == self->object_class);
object_iface = g_type_interface_peek (state->object_class,
GCK_TYPE_OBJECT_CACHE);
- if (self->pv->attr_types) {
- state->attr_types = self->pv->attr_types;
- state->attr_count = self->pv->attr_count;
+ if (self->attr_types) {
+ state->attr_types = self->attr_types;
+ state->attr_count = self->attr_count;
} else if (object_iface && object_iface->default_types) {
state->attr_types = object_iface->default_types;
state->attr_count = object_iface->n_default_types;
@@ -1073,7 +1062,7 @@ check_out_enumerator_state (GckEnumerator *self)
g_type_class_ref (state->object_type);
}
- g_mutex_unlock (self->pv->mutex);
+ g_mutex_unlock (&self->mutex);
if (state == NULL)
g_warning ("this enumerator is already running a next operation");
@@ -1096,15 +1085,15 @@ check_in_enumerator_state (GckEnumeratorState *state)
g_assert (GCK_IS_ENUMERATOR (state->enumerator));
self = state->enumerator;
- g_mutex_lock (self->pv->mutex);
+ g_mutex_lock (&self->mutex);
state->enumerator = NULL;
- g_assert (self->pv->the_state == NULL);
- self->pv->the_state = state;
+ g_assert (self->the_state == NULL);
+ self->the_state = state;
chained = state->chained;
state->chained = NULL;
- g_mutex_unlock (self->pv->mutex);
+ g_mutex_unlock (&self->mutex);
/* matches ref in check_in */
g_object_unref (self);
diff --git a/gck/gck-interaction.c b/gck/gck-interaction.c
deleted file mode 100644
index 3567a52..0000000
--- a/gck/gck-interaction.c
+++ /dev/null
@@ -1,176 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* gck-interaction.c - the GObject PKCS#11 wrapper library
-
- Copyright (C) 2011 Collabora Ltd
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#include "config.h"
-
-#include "gck-private.h"
-
-#include <string.h>
-
-#define GCK_INTERACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCK_TYPE_INTERACTION, GckInteraction))
-#define GCK_IS_INTERACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCK_TYPE_INTERACTION))
-#define GCK_INTERACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCK_TYPE_INTERACTION, GckInteractionClass))
-
-typedef struct _GckInteractionClass GckInteractionClass;
-
-struct _GckInteraction {
- GTlsInteraction interaction;
- GckModule *module;
-};
-
-struct _GckInteractionClass {
- GTlsInteractionClass parent;
-};
-
-enum {
- PROP_0,
- PROP_MODULE
-};
-
-G_DEFINE_TYPE (GckInteraction, _gck_interaction, G_TYPE_TLS_INTERACTION);
-
-static void
-_gck_interaction_init (GckInteraction *self)
-{
-
-}
-
-static void
-_gck_interaction_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GckInteraction *self = GCK_INTERACTION (obj);
-
- switch (prop_id) {
- case PROP_MODULE:
- g_value_set_object (value, self->module);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gck_interaction_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GckInteraction *self = GCK_INTERACTION (obj);
-
- switch (prop_id) {
- case PROP_MODULE:
- g_return_if_fail (self->module == NULL);
- self->module = g_value_dup_object (value);
- g_return_if_fail (self->module != NULL);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gck_interaction_dispose (GObject *obj)
-{
- GckInteraction *self = GCK_INTERACTION (obj);
-
- g_clear_object (&self->module);
-
- G_OBJECT_CLASS (_gck_interaction_parent_class)->dispose (obj);
-}
-
-static GTlsInteractionResult
-_gck_interaction_ask_password (GTlsInteraction *interaction,
- GTlsPassword *password,
- GCancellable *cancellable,
- GError **error)
-{
- GckInteraction *self = GCK_INTERACTION (interaction);
- gchar *value = NULL;
- gboolean ret = FALSE;
- GckSlot *token;
- GckObject *key;
-
- if (!self->module)
- return G_TLS_INTERACTION_UNHANDLED;
-
- token = gck_password_get_token (GCK_PASSWORD (password));
- if (token != NULL) {
- g_signal_emit_by_name (self->module, "authenticate-slot", token,
- g_tls_password_get_description (password),
- &value, &ret);
- g_object_unref (token);
-
- } else {
- key = gck_password_get_key (GCK_PASSWORD (password));
- g_return_val_if_fail (GCK_IS_OBJECT (key), G_TLS_INTERACTION_UNHANDLED);
-
- g_signal_emit_by_name (self->module, "authenticate-object", key,
- g_tls_password_get_description (password),
- &value, &ret);
- g_object_unref (key);
- }
-
- if (ret) {
- g_tls_password_set_value_full (password, (guchar *)value, -1, g_free);
- return G_TLS_INTERACTION_HANDLED;
- } else {
- return G_TLS_INTERACTION_UNHANDLED;
- }
-}
-
-static void
-_gck_interaction_class_init (GckInteractionClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- GTlsInteractionClass *interaction_class = G_TLS_INTERACTION_CLASS (klass);
-
- object_class->get_property = _gck_interaction_get_property;
- object_class->set_property = _gck_interaction_set_property;
- object_class->dispose = _gck_interaction_dispose;
-
- interaction_class->ask_password = _gck_interaction_ask_password;
-
- g_object_class_install_property (object_class, PROP_MODULE,
- g_param_spec_object ("module", "Module", "PKCS11 Module",
- GCK_TYPE_MODULE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-}
-
-GTlsInteraction *
-_gck_interaction_new (gpointer token_or_key)
-{
- GTlsInteraction *result;
- GModule *module = NULL;
-
- g_return_val_if_fail (GCK_IS_SLOT (token_or_key) ||
- GCK_IS_OBJECT (token_or_key), NULL);
-
- g_object_get (token_or_key, "module", &module, NULL);
- result = g_object_new (GCK_TYPE_INTERACTION, "module", module, NULL);
- g_object_unref (module);
-
- return result;
-}
diff --git a/gck/gck-misc.c b/gck/gck-misc.c
index e2fbbf8..ef8a19b 100644
--- a/gck/gck-misc.c
+++ b/gck/gck-misc.c
@@ -101,27 +101,7 @@ EGG_SECURE_DEFINE_GLIB_GLOBALS ();
*
* The error domain for gck library errors.
*/
-
-GQuark
-gck_get_error_quark (void)
-{
- /* This is the deprecated version */
- return gck_error_get_quark ();
-}
-
-GQuark
-gck_error_get_quark (void)
-{
- static GQuark domain = 0;
- static size_t quark_inited = 0;
-
- if (g_once_init_enter (&quark_inited)) {
- domain = g_quark_from_static_string ("gck-error");
- g_once_init_leave (&quark_inited, 1);
- }
-
- return domain;
-}
+G_DEFINE_QUARK(GckError, gck_error)
/**
* gck_message_from_rv:
diff --git a/gck/gck-mock.c b/gck/gck-mock.c
index 50a033c..bd61ed0 100644
--- a/gck/gck-mock.c
+++ b/gck/gck-mock.c
@@ -150,6 +150,14 @@ insert_template (guint handle, GckAttributes *template)
the_objects_list = g_slist_append (the_objects_list, data);
}
+/**
+ * gck_mock_module_add_object:
+ * @attrs: (transfer full):
+ *
+ * Insert the @attrsin the mock module
+ *
+ * Returns: a #CK_OBJECT_HANDLE
+ */
CK_OBJECT_HANDLE
gck_mock_module_add_object (GckAttributes *attrs)
{
@@ -163,13 +171,12 @@ gck_mock_module_add_object (GckAttributes *attrs)
handle = ++unique_identifier;
if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token)) {
g_return_val_if_fail (token == TRUE, 0);
- gck_attributes_ref_sink (attrs);
} else {
gck_builder_init (&builder);
gck_builder_add_except (&builder, attrs, CKA_TOKEN, GCK_INVALID);
gck_builder_add_boolean (&builder, CKA_TOKEN, TRUE);
gck_attributes_unref (attrs);
- attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ attrs = gck_builder_end (&builder);
}
insert_template (handle, attrs);
@@ -279,9 +286,6 @@ replace_attributes (GckAttributes *atts,
CK_ATTRIBUTE_PTR set;
gulong *types;
- if (!n_attrs)
- return gck_attributes_ref_sink (atts);
-
gck_builder_init (&builder);
types = g_new0 (gulong, n_attrs);
for (i = 0; i < n_attrs; ++i) {
@@ -291,7 +295,7 @@ replace_attributes (GckAttributes *atts,
}
gck_builder_add_exceptv (&builder, atts, types, n_attrs);
g_free (types);
- return gck_attributes_ref_sink (gck_builder_end (&builder));
+ return gck_builder_end (&builder);
}
void
@@ -354,8 +358,7 @@ gck_mock_C_Initialize (CK_VOID_PTR pInitArgs)
gck_builder_init (&builder);
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA);
gck_builder_add_string (&builder, CKA_LABEL, "TEST LABEL");
- insert_template (2,
- gck_attributes_ref_sink (gck_builder_end (&builder)));
+ insert_template (2, gck_builder_end (&builder));
/* Private capitalize key */
value = CKM_MOCK_CAPITALIZE;
@@ -369,8 +372,7 @@ gck_mock_C_Initialize (CK_VOID_PTR pInitArgs)
gck_builder_add_boolean (&builder, CKA_DERIVE, CK_TRUE);
gck_builder_add_string (&builder, CKA_VALUE, "value");
gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique1");
- insert_template (PRIVATE_KEY_CAPITALIZE,
- gck_attributes_ref_sink (gck_builder_end (&builder)));
+ insert_template (PRIVATE_KEY_CAPITALIZE, gck_builder_end (&builder));
/* Public capitalize key */
value = CKM_MOCK_CAPITALIZE;
@@ -393,8 +395,7 @@ gck_mock_C_Initialize (CK_VOID_PTR pInitArgs)
gck_builder_add_boolean (&builder, CKA_ALWAYS_AUTHENTICATE, CK_TRUE);
gck_builder_add_string (&builder, CKA_VALUE, "value");
gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique3");
- insert_template (PRIVATE_KEY_PREFIX,
- gck_attributes_ref_sink (gck_builder_end (&builder)));
+ insert_template (PRIVATE_KEY_PREFIX, gck_builder_end (&builder));
/* Private prefix key */
value = CKM_MOCK_PREFIX;
@@ -405,8 +406,7 @@ gck_mock_C_Initialize (CK_VOID_PTR pInitArgs)
gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_FALSE);
gck_builder_add_string (&builder, CKA_VALUE, "value");
gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique4");
- insert_template (PUBLIC_KEY_PREFIX,
- gck_attributes_ref_sink (gck_builder_end (&builder)));
+ insert_template (PUBLIC_KEY_PREFIX, gck_builder_end (&builder));
logged_in = FALSE;
initialized = TRUE;
@@ -905,7 +905,7 @@ gck_mock_C_CreateObject (CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate,
for (i = 0; i < ulCount; ++i)
gck_builder_add_data (&builder, pTemplate[i].type, pTemplate[i].pValue, pTemplate[i].ulValueLen);
- attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ attrs = gck_builder_end (&builder);
if (gck_attributes_find_boolean (attrs, CKA_PRIVATE, &priv) && priv) {
if (!logged_in) {
gck_attributes_unref (attrs);
@@ -1639,7 +1639,7 @@ gck_mock_unsupported_C_GenerateKeyPair (CK_SESSION_HANDLE hSession, CK_MECHANISM
pPublicKeyTemplate[i].pValue,
pPublicKeyTemplate[i].ulValueLen);
*phPublicKey = ++unique_identifier;
- attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ attrs = gck_builder_end (&builder);
if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token)
g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phPublicKey), attrs);
else
@@ -1652,7 +1652,7 @@ gck_mock_unsupported_C_GenerateKeyPair (CK_SESSION_HANDLE hSession, CK_MECHANISM
pPrivateKeyTemplate[i].pValue,
pPrivateKeyTemplate[i].ulValueLen);
*phPrivateKey = ++unique_identifier;
- attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ attrs = gck_builder_end (&builder);
if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token)
g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phPrivateKey), attrs);
else
@@ -1754,7 +1754,7 @@ gck_mock_unsupported_C_UnwrapKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR p
pTemplate[i].pValue,
pTemplate[i].ulValueLen);
*phKey = ++unique_identifier;
- attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ attrs = gck_builder_end (&builder);
if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token)
g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phKey), attrs);
else
@@ -1802,7 +1802,7 @@ gck_mock_unsupported_C_DeriveKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR p
pTemplate[i].ulValueLen);
gck_builder_add_all (&builder, attrs);
*phKey = ++unique_identifier;
- copy = gck_attributes_ref_sink (gck_builder_end (&builder));
+ copy = gck_builder_end (&builder);
if (gck_attributes_find_boolean (copy, CKA_TOKEN, &token) && token)
g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phKey), copy);
else
diff --git a/gck/gck-module.c b/gck/gck-module.c
index a50f78d..a3ecd46 100644
--- a/gck/gck-module.c
+++ b/gck/gck-module.c
@@ -77,13 +77,7 @@ enum {
PROP_FUNCTIONS
};
-enum {
- AUTHENTICATE_SLOT,
- AUTHENTICATE_OBJECT,
- LAST_SIGNAL
-};
-
-struct _GckModulePrivate {
+typedef struct {
gchar *path;
gboolean initialized;
CK_FUNCTION_LIST_PTR funcs;
@@ -91,32 +85,17 @@ struct _GckModulePrivate {
/* Modified atomically */
gint finalized;
-};
+} GckModulePrivate;
G_DEFINE_TYPE_WITH_PRIVATE (GckModule, gck_module, G_TYPE_OBJECT);
-static guint signals[LAST_SIGNAL] = { 0 };
-
/* ----------------------------------------------------------------------------
* OBJECT
*/
-static gboolean
-gck_module_real_authenticate_slot (GckModule *module, GckSlot *self, gchar *label, gchar **password)
-{
- return FALSE;
-}
-
-static gboolean
-gck_module_real_authenticate_object (GckModule *module, GckObject *object, gchar *label, gchar **password)
-{
- return FALSE;
-}
-
static void
gck_module_init (GckModule *self)
{
- self->pv = gck_module_get_instance_private (self);
}
static void
@@ -140,16 +119,17 @@ gck_module_set_property (GObject *obj, guint prop_id, const GValue *value,
GParamSpec *pspec)
{
GckModule *self = GCK_MODULE (obj);
+ GckModulePrivate *priv = gck_module_get_instance_private (self);
/* Only allowed during initialization */
switch (prop_id) {
case PROP_PATH:
- g_return_if_fail (!self->pv->path);
- self->pv->path = g_value_dup_string (value);
+ g_return_if_fail (!priv->path);
+ priv->path = g_value_dup_string (value);
break;
case PROP_FUNCTIONS:
- g_return_if_fail (!self->pv->funcs);
- self->pv->funcs = g_value_get_pointer (value);
+ g_return_if_fail (!priv->funcs);
+ priv->funcs = g_value_get_pointer (value);
break;
}
}
@@ -158,20 +138,21 @@ static void
gck_module_dispose (GObject *obj)
{
GckModule *self = GCK_MODULE (obj);
+ GckModulePrivate *priv = gck_module_get_instance_private (self);
gboolean finalize = FALSE;
CK_RV rv;
- if (self->pv->initialized && self->pv->funcs) {
- if (g_atomic_int_compare_and_exchange (&self->pv->finalized, 0, 1))
+ if (priv->initialized && priv->funcs) {
+ if (g_atomic_int_compare_and_exchange (&priv->finalized, 0, 1))
finalize = TRUE;
}
/* Must be careful when accessing funcs */
if (finalize) {
- rv = p11_kit_module_finalize (self->pv->funcs);
+ rv = p11_kit_module_finalize (priv->funcs);
if (rv != CKR_OK) {
g_warning ("C_Finalize on module '%s' failed: %s",
- self->pv->path, gck_message_from_rv (rv));
+ priv->path, gck_message_from_rv (rv));
}
}
@@ -182,13 +163,12 @@ static void
gck_module_finalize (GObject *obj)
{
GckModule *self = GCK_MODULE (obj);
+ GckModulePrivate *priv = gck_module_get_instance_private (self);
- if (self->pv->initialized && self->pv->funcs)
- p11_kit_module_release (self->pv->funcs);
- self->pv->funcs = NULL;
+ if (priv->initialized && priv->funcs)
+ g_clear_pointer (&priv->funcs, p11_kit_module_release);
- g_free (self->pv->path);
- self->pv->path = NULL;
+ g_clear_pointer (&priv->path, g_free);
G_OBJECT_CLASS (gck_module_parent_class)->finalize (obj);
}
@@ -205,9 +185,6 @@ gck_module_class_init (GckModuleClass *klass)
gobject_class->dispose = gck_module_dispose;
gobject_class->finalize = gck_module_finalize;
- klass->authenticate_object = gck_module_real_authenticate_object;
- klass->authenticate_slot = gck_module_real_authenticate_slot;
-
/**
* GckModule:path:
*
@@ -231,38 +208,6 @@ gck_module_class_init (GckModuleClass *klass)
g_object_class_install_property (gobject_class, PROP_FUNCTIONS,
g_param_spec_pointer ("functions", "Function List", "PKCS11 Function List",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
- /**
- * GckModule::authenticate-slot:
- * @module: The module
- * @slot: The slot to be authenticated.
- * @string: A displayable label which describes the object.
- * @password: A gchar** where a password should be returned.
- *
- * Use gck_session_set_interaction() instead of connecting to this signal.
- *
- * Deprecated: Since 3.4
- */
- signals[AUTHENTICATE_SLOT] = g_signal_new ("authenticate-slot", GCK_TYPE_MODULE,
- G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GckModuleClass, authenticate_slot),
- g_signal_accumulator_true_handled, NULL, _gck_marshal_BOOLEAN__OBJECT_STRING_POINTER,
- G_TYPE_BOOLEAN, 3, GCK_TYPE_SLOT, G_TYPE_STRING, G_TYPE_POINTER);
-
- /**
- * GckModule::authenticate-object:
- * @module: The module.
- * @object: The object to be authenticated.
- * @label: A displayable label which describes the object.
- * @password: A gchar** where a password should be returned.
- *
- * Use gck_session_set_interaction() instead of connecting to this signal.
- *
- * Deprecated: Since 3.4
- */
- signals[AUTHENTICATE_OBJECT] = g_signal_new ("authenticate-object", GCK_TYPE_MODULE,
- G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GckModuleClass, authenticate_object),
- g_signal_accumulator_true_handled, NULL, _gck_marshal_BOOLEAN__OBJECT_STRING_POINTER,
- G_TYPE_BOOLEAN, 3, GCK_TYPE_OBJECT, G_TYPE_STRING, G_TYPE_POINTER);
}
G_DEFINE_BOXED_TYPE (GckModuleInfo, gck_module_info,
@@ -300,9 +245,9 @@ gck_module_info_free (GckModuleInfo *module_info)
{
if (!module_info)
return;
- g_free (module_info->library_description);
- g_free (module_info->manufacturer_id);
- g_free (module_info);
+ g_clear_pointer (&module_info->library_description, g_free);
+ g_clear_pointer (&module_info->manufacturer_id, g_free);
+ g_clear_pointer (&module_info, g_free);
}
typedef struct {
@@ -317,19 +262,21 @@ perform_initialize (Initialize *args)
{
CK_FUNCTION_LIST_PTR funcs;
GckModule *result;
+ GckModulePrivate *priv;
CK_RV rv;
funcs = p11_kit_module_load (args->path, P11_KIT_MODULE_CRITICAL);
if (funcs == NULL) {
- g_set_error (&args->error, GCK_ERROR, (int)CKR_GCK_MODULE_PROBLEM,
+ g_set_error (&args->error, GCK_ERROR, (int)GCK_ERROR_MODULE_PROBLEM,
_("Error loading PKCS#11 module: %s"), p11_kit_message ());
- return CKR_GCK_MODULE_PROBLEM;
+ return GCK_ERROR_MODULE_PROBLEM;
}
result = g_object_new (GCK_TYPE_MODULE,
"functions", funcs,
"path", args->path,
NULL);
+ priv = gck_module_get_instance_private (result);
/* Now initialize the module */
rv = p11_kit_module_initialize (funcs);
@@ -342,7 +289,7 @@ perform_initialize (Initialize *args)
return rv;
}
- result->pv->initialized = TRUE;
+ priv->initialized = TRUE;
args->result = result;
return CKR_OK;
}
@@ -476,14 +423,15 @@ GckModule*
_gck_module_new_initialized (CK_FUNCTION_LIST_PTR funcs)
{
GckModule *module = gck_module_new (funcs);
- module->pv->initialized = TRUE; /* As if we initialized it */
+ GckModulePrivate *priv = gck_module_get_instance_private (module);
+ priv->initialized = TRUE; /* As if we initialized it */
return module;
}
/**
* gck_module_equal:
- * @module1: (type Gck.Module): a pointer to the first #GckModule
- * @module2: (type Gck.Module): a pointer to the second #GckModule
+ * @module1: a first #GckModule
+ * @module2: a second #GckModule
*
* Checks equality of two modules. Two GckModule objects can point to the same
* underlying PKCS#11 module.
@@ -492,19 +440,18 @@ _gck_module_new_initialized (CK_FUNCTION_LIST_PTR funcs)
* %FALSE if either is not a GckModule.
**/
gboolean
-gck_module_equal (gconstpointer module1, gconstpointer module2)
+gck_module_equal (GckModule *module1, GckModule *module2)
{
- GckModule *mod1, *mod2;
+ GckModulePrivate *priv1 = gck_module_get_instance_private (module1);
+ GckModulePrivate *priv2 = gck_module_get_instance_private (module2);
if (module1 == module2)
return TRUE;
+
if (!GCK_IS_MODULE (module1) || !GCK_IS_MODULE (module2))
return FALSE;
- mod1 = GCK_MODULE (module1);
- mod2 = GCK_MODULE (module2);
-
- return mod1->pv->funcs == mod2->pv->funcs;
+ return priv1->funcs == priv2->funcs;
}
/**
@@ -519,13 +466,13 @@ gck_module_equal (gconstpointer module1, gconstpointer module2)
* Return value: An integer that can be used as a hash value, or 0 if invalid.
**/
guint
-gck_module_hash (gconstpointer module)
+gck_module_hash (GckModule *module)
{
- GckModule *self;
+ GckModulePrivate *priv = gck_module_get_instance_private (module);
g_return_val_if_fail (GCK_IS_MODULE (module), 0);
- self = GCK_MODULE (module);
- return g_direct_hash (self->pv->funcs);
+
+ return g_direct_hash (priv->funcs);
}
GckModuleInfo*
@@ -577,14 +524,15 @@ _gck_module_info_to_pkcs11 (GckModuleInfo* module_info, CK_INFO_PTR info)
GckModuleInfo*
gck_module_get_info (GckModule *self)
{
+ GckModulePrivate *priv = gck_module_get_instance_private (self);
CK_INFO info;
CK_RV rv;
g_return_val_if_fail (GCK_IS_MODULE (self), NULL);
- g_return_val_if_fail (self->pv->funcs, NULL);
+ g_return_val_if_fail (priv->funcs, NULL);
memset (&info, 0, sizeof (info));
- rv = (self->pv->funcs->C_GetInfo (&info));
+ rv = (priv->funcs->C_GetInfo (&info));
if (rv != CKR_OK) {
g_warning ("couldn't get module info: %s", gck_message_from_rv (rv));
return NULL;
@@ -606,15 +554,16 @@ gck_module_get_info (GckModule *self)
GList*
gck_module_get_slots (GckModule *self, gboolean token_present)
{
+ GckModulePrivate *priv = gck_module_get_instance_private (self);
CK_SLOT_ID_PTR slot_list;
CK_ULONG count, i;
GList *result;
CK_RV rv;
g_return_val_if_fail (GCK_IS_MODULE (self), NULL);
- g_return_val_if_fail (self->pv->funcs, NULL);
+ g_return_val_if_fail (priv->funcs, NULL);
- rv = (self->pv->funcs->C_GetSlotList) (token_present ? CK_TRUE : CK_FALSE, NULL, &count);
+ rv = (priv->funcs->C_GetSlotList) (token_present ? CK_TRUE : CK_FALSE, NULL, &count);
if (rv != CKR_OK) {
g_warning ("couldn't get slot count: %s", gck_message_from_rv (rv));
return NULL;
@@ -624,7 +573,7 @@ gck_module_get_slots (GckModule *self, gboolean token_present)
return NULL;
slot_list = g_new (CK_SLOT_ID, count);
- rv = (self->pv->funcs->C_GetSlotList) (token_present ? CK_TRUE : CK_FALSE, slot_list, &count);
+ rv = (priv->funcs->C_GetSlotList) (token_present ? CK_TRUE : CK_FALSE, slot_list, &count);
if (rv != CKR_OK) {
g_warning ("couldn't get slot list: %s", gck_message_from_rv (rv));
g_free (slot_list);
@@ -654,8 +603,11 @@ gck_module_get_slots (GckModule *self, gboolean token_present)
const gchar*
gck_module_get_path (GckModule *self)
{
+ GckModulePrivate *priv = gck_module_get_instance_private (self);
+
g_return_val_if_fail (GCK_IS_MODULE (self), NULL);
- return self->pv->path;
+
+ return priv->path;
}
/**
@@ -669,8 +621,11 @@ gck_module_get_path (GckModule *self)
CK_FUNCTION_LIST_PTR
gck_module_get_functions (GckModule *self)
{
+ GckModulePrivate *priv = gck_module_get_instance_private (self);
+
g_return_val_if_fail (GCK_IS_MODULE (self), NULL);
- return self->pv->funcs;
+
+ return priv->funcs;
}
/**
diff --git a/gck/gck-modules.c b/gck/gck-modules.c
index 97d7f01..71a6ed9 100644
--- a/gck/gck-modules.c
+++ b/gck/gck-modules.c
@@ -56,9 +56,9 @@ perform_initialize_registered (InitializeRegistered *args)
modules = p11_kit_modules_load_and_initialize (0);
if (modules == NULL) {
- g_set_error (&args->error, GCK_ERROR, (int)CKR_GCK_MODULE_PROBLEM,
+ g_set_error (&args->error, GCK_ERROR, (int)GCK_ERROR_MODULE_PROBLEM,
_("Couldn’t initialize registered PKCS#11 modules: %s"), p11_kit_message ());
- return CKR_GCK_MODULE_PROBLEM;
+ return GCK_ERROR_MODULE_PROBLEM;
}
for (funcs = modules; *funcs; ++funcs) {
@@ -195,8 +195,6 @@ gck_modules_get_slots (GList *modules, gboolean token_present)
*
* This call will not block but will return an enumerator immediately.
*
- * If the @attrs [struct@Attributes] is floating, it is consumed.
- *
* Return value: (transfer full): A new enumerator, which should be released
* with g_object_unref().
**/
@@ -210,7 +208,7 @@ gck_modules_enumerate_objects (GList *modules,
g_return_val_if_fail (attrs, NULL);
uri_data = gck_uri_data_new ();
- uri_data->attributes = gck_attributes_ref_sink (attrs);
+ uri_data->attributes = gck_attributes_ref (attrs);
return _gck_enumerator_new_for_modules (modules, session_options, uri_data);
}
@@ -231,7 +229,7 @@ tokens_for_uri (GList *modules,
GckUriFlags flags;
flags = GCK_URI_FOR_OBJECT_ON_TOKEN_AND_MODULE | GCK_URI_FOR_MODULE_WITH_VERSION;
- uri_data = gck_uri_parse (uri, flags, error);
+ uri_data = gck_uri_data_parse (uri, flags, error);
if (uri_data == NULL)
return NULL;
@@ -418,7 +416,7 @@ gck_modules_enumerate_uri (GList *modules,
g_return_val_if_fail (uri != NULL, NULL);
- uri_data = gck_uri_parse (uri, GCK_URI_FOR_ANY, error);
+ uri_data = gck_uri_data_parse (uri, GCK_URI_FOR_ANY, error);
if (uri_data == NULL)
return NULL;
diff --git a/gck/gck-object-cache.c b/gck/gck-object-cache.c
index d86867d..2154867 100644
--- a/gck/gck-object-cache.c
+++ b/gck/gck-object-cache.c
@@ -37,7 +37,7 @@
*/
/**
- * GckObjectCacheIface:
+ * GckObjectCacheInterface:
* @interface: parent interface
* @default_types: (array length=n_default_types): attribute types that an
* enumerator should retrieve
@@ -53,26 +53,19 @@
* cache. It must be thread safe.
*/
-typedef GckObjectCacheIface GckObjectCacheInterface;
G_DEFINE_INTERFACE (GckObjectCache, gck_object_cache, GCK_TYPE_OBJECT);
static void
-gck_object_cache_default_init (GckObjectCacheIface *iface)
+gck_object_cache_default_init (GckObjectCacheInterface *iface)
{
- static size_t initialized = 0;
- if (g_once_init_enter (&initialized)) {
-
- /**
- * GckObjectCache:attributes:
- *
- * The attributes cached on this object.
- */
- g_object_interface_install_property (iface,
- g_param_spec_boxed ("attributes", "Attributes", "PKCS#11 Attributes",
- GCK_TYPE_ATTRIBUTES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_once_init_leave (&initialized, 1);
- }
+ /**
+ * GckObjectCache:attributes:
+ *
+ * The attributes cached on this object.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_boxed ("attributes", "Attributes", "PKCS#11 Attributes",
+ GCK_TYPE_ATTRIBUTES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}
/**
@@ -98,9 +91,6 @@ gck_object_cache_get_attributes (GckObjectCache *object)
* @attrs: (nullable): the attributes to set
*
* Sets the attributes cached on this object.
- *
- * If the @attrs #GckAttributes is floating, it is consumed.
- *
*/
void
gck_object_cache_set_attributes (GckObjectCache *object,
@@ -108,9 +98,7 @@ gck_object_cache_set_attributes (GckObjectCache *object,
{
g_return_if_fail (GCK_IS_OBJECT_CACHE (object));
- gck_attributes_ref_sink (attrs);
g_object_set (object, "attributes", attrs, NULL);
- gck_attributes_unref (attrs);
}
/**
@@ -122,24 +110,20 @@ gck_object_cache_set_attributes (GckObjectCache *object,
* already present in the cache it will be overridden by this value.
*
* This will be done in a thread-safe manner.
- *
- * If the @attrs #GckAttributes is floating, it is consumed.
*/
void
gck_object_cache_fill (GckObjectCache *object,
GckAttributes *attrs)
{
- GckObjectCacheIface *iface;
+ GckObjectCacheInterface *iface;
g_return_if_fail (GCK_IS_OBJECT_CACHE (object));
g_return_if_fail (attrs != NULL);
- iface = GCK_OBJECT_CACHE_GET_INTERFACE (object);
+ iface = GCK_OBJECT_CACHE_GET_IFACE (object);
g_return_if_fail (iface->fill != NULL);
- gck_attributes_ref_sink (attrs);
(iface->fill) (object, attrs);
- gck_attributes_unref (attrs);
}
/**
@@ -164,7 +148,7 @@ gck_object_cache_update (GckObjectCache *object,
GCancellable *cancellable,
GError **error)
{
- GckObjectCacheIface *iface;
+ GckObjectCacheInterface *iface;
GckAttributes *attrs;
g_return_val_if_fail (GCK_IS_OBJECT_CACHE (object), FALSE);
@@ -172,7 +156,7 @@ gck_object_cache_update (GckObjectCache *object,
g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- iface = GCK_OBJECT_CACHE_GET_INTERFACE (object);
+ iface = GCK_OBJECT_CACHE_GET_IFACE (object);
if (attr_types == NULL) {
attr_types = iface->default_types;
@@ -240,14 +224,14 @@ gck_object_cache_update_async (GckObjectCache *object,
GAsyncReadyCallback callback,
gpointer user_data)
{
- GckObjectCacheIface *iface;
+ GckObjectCacheInterface *iface;
GTask *task;
g_return_if_fail (GCK_IS_OBJECT_CACHE (object));
g_return_if_fail (attr_types != NULL || n_attr_types == 0);
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
- iface = GCK_OBJECT_CACHE_GET_INTERFACE (object);
+ iface = GCK_OBJECT_CACHE_GET_IFACE (object);
if (attr_types == NULL) {
attr_types = iface->default_types;
diff --git a/gck/gck-object.c b/gck/gck-object.c
index 284b1f3..da07bf8 100644
--- a/gck/gck-object.c
+++ b/gck/gck-object.c
@@ -61,11 +61,11 @@ enum {
PROP_HANDLE
};
-struct _GckObjectPrivate {
+typedef struct {
GckModule *module;
GckSession *session;
CK_OBJECT_HANDLE handle;
-};
+} GckObjectPrivate;
G_DEFINE_TYPE_WITH_PRIVATE (GckObject, gck_object, G_TYPE_OBJECT);
@@ -76,7 +76,6 @@ G_DEFINE_TYPE_WITH_PRIVATE (GckObject, gck_object, G_TYPE_OBJECT);
static void
gck_object_init (GckObject *self)
{
- self->pv = gck_object_get_instance_private (self);
}
static void
@@ -103,25 +102,24 @@ gck_object_set_property (GObject *obj, guint prop_id, const GValue *value,
GParamSpec *pspec)
{
GckObject *self = GCK_OBJECT (obj);
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
/* The sets to data below are only allowed during construction */
switch (prop_id) {
case PROP_MODULE:
- g_return_if_fail (!self->pv->module);
- self->pv->module = g_value_get_object (value);
- g_return_if_fail (self->pv->module);
- g_object_ref (self->pv->module);
+ g_return_if_fail (!priv->module);
+ priv->module = g_value_dup_object (value);
+ g_return_if_fail (priv->module);
break;
case PROP_SESSION:
- g_return_if_fail (!self->pv->session);
- self->pv->session = g_value_get_object (value);
- g_return_if_fail (self->pv->session);
- g_object_ref (self->pv->session);
+ g_return_if_fail (!priv->session);
+ priv->session = g_value_dup_object (value);
+ g_return_if_fail (priv->session);
break;
case PROP_HANDLE:
- g_return_if_fail (!self->pv->handle);
- self->pv->handle = g_value_get_ulong (value);
+ g_return_if_fail (!priv->handle);
+ priv->handle = g_value_get_ulong (value);
break;
}
}
@@ -130,16 +128,11 @@ static void
gck_object_finalize (GObject *obj)
{
GckObject *self = GCK_OBJECT (obj);
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
- if (self->pv->session)
- g_object_unref (self->pv->session);
- self->pv->session = NULL;
-
- if (self->pv->module)
- g_object_unref (self->pv->module);
- self->pv->module = NULL;
-
- self->pv->handle = 0;
+ g_clear_object (&priv->session);
+ g_clear_object (&priv->module);
+ priv->handle = 0;
G_OBJECT_CLASS (gck_object_parent_class)->finalize (obj);
}
@@ -256,8 +249,8 @@ gck_objects_from_handle_array (GckSession *session,
/**
* gck_object_equal:
- * @object1: (type Gck.Object): a pointer to the first #GckObject
- * @object2: (type Gck.Object): a pointer to the second #GckObject
+ * @object1: a pointer to the first #GckObject
+ * @object2: a pointer to the second #GckObject
*
* Checks equality of two objects. Two GckObject objects can point to the same
* underlying PKCS#11 object.
@@ -266,9 +259,10 @@ gck_objects_from_handle_array (GckSession *session,
* %FALSE if either is not a GckObject.
**/
gboolean
-gck_object_equal (gconstpointer object1, gconstpointer object2)
+gck_object_equal (GckObject *object1, GckObject *object2)
{
- GckObject *obj1, *obj2;
+ GckObjectPrivate *priv1 = gck_object_get_instance_private (object1);
+ GckObjectPrivate *priv2 = gck_object_get_instance_private (object2);
GckSlot *slot1, *slot2;
gboolean ret;
@@ -277,13 +271,10 @@ gck_object_equal (gconstpointer object1, gconstpointer object2)
if (!GCK_IS_OBJECT (object1) || !GCK_IS_OBJECT (object2))
return FALSE;
- obj1 = GCK_OBJECT (object1);
- obj2 = GCK_OBJECT (object2);
+ slot1 = gck_session_get_slot (priv1->session);
+ slot2 = gck_session_get_slot (priv2->session);
- slot1 = gck_session_get_slot (obj1->pv->session);
- slot2 = gck_session_get_slot (obj2->pv->session);
-
- ret = obj1->pv->handle == obj2->pv->handle &&
+ ret = priv1->handle == priv2->handle &&
gck_slot_equal (slot1, slot2);
g_object_unref (slot1);
@@ -304,18 +295,17 @@ gck_object_equal (gconstpointer object1, gconstpointer object2)
* Return value: An integer that can be used as a hash value, or 0 if invalid.
**/
guint
-gck_object_hash (gconstpointer object)
+gck_object_hash (GckObject *object)
{
- GckObject *self;
+ GckObjectPrivate *priv = gck_object_get_instance_private (object);
GckSlot *slot;
guint hash;
g_return_val_if_fail (GCK_IS_OBJECT (object), 0);
- self = GCK_OBJECT (object);
- slot = gck_session_get_slot (self->pv->session);
+ slot = gck_session_get_slot (priv->session);
- hash = _gck_ulong_hash (&self->pv->handle) ^
+ hash = _gck_ulong_hash (&priv->handle) ^
gck_slot_hash (slot);
g_object_unref (slot);
@@ -335,8 +325,11 @@ gck_object_hash (gconstpointer object)
gulong
gck_object_get_handle (GckObject *self)
{
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
+
g_return_val_if_fail (GCK_IS_OBJECT (self), (CK_OBJECT_HANDLE)-1);
- return self->pv->handle;
+
+ return priv->handle;
}
/**
@@ -350,9 +343,12 @@ gck_object_get_handle (GckObject *self)
GckModule *
gck_object_get_module (GckObject *self)
{
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
+
g_return_val_if_fail (GCK_IS_OBJECT (self), NULL);
- g_return_val_if_fail (GCK_IS_MODULE (self->pv->module), NULL);
- return g_object_ref (self->pv->module);
+ g_return_val_if_fail (GCK_IS_MODULE (priv->module), NULL);
+
+ return g_object_ref (priv->module);
}
@@ -372,9 +368,12 @@ gck_object_get_module (GckObject *self)
GckSession *
gck_object_get_session (GckObject *self)
{
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
+
g_return_val_if_fail (GCK_IS_OBJECT (self), NULL);
- g_return_val_if_fail (GCK_IS_SESSION (self->pv->session), NULL);
- return g_object_ref (self->pv->session);
+ g_return_val_if_fail (GCK_IS_SESSION (priv->session), NULL);
+
+ return g_object_ref (priv->session);
}
/* --------------------------------------------------------------------------------------
@@ -407,14 +406,15 @@ perform_destroy (Destroy *args)
gboolean
gck_object_destroy (GckObject *self, GCancellable *cancellable, GError **error)
{
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
Destroy args = { GCK_ARGUMENTS_INIT, 0 };
g_return_val_if_fail (GCK_IS_OBJECT (self), FALSE);
- g_return_val_if_fail (GCK_IS_SESSION (self->pv->session), FALSE);
+ g_return_val_if_fail (GCK_IS_SESSION (priv->session), FALSE);
g_return_val_if_fail (!error || !*error, FALSE);
- args.object = self->pv->handle;
- return _gck_call_sync (self->pv->session, perform_destroy, NULL, &args, cancellable, error);
+ args.object = priv->handle;
+ return _gck_call_sync (priv->session, perform_destroy, NULL, &args, cancellable, error);
}
/**
@@ -431,15 +431,16 @@ void
gck_object_destroy_async (GckObject *self, GCancellable *cancellable,
GAsyncReadyCallback callback, gpointer user_data)
{
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
GckCall *call;
Destroy* args;
g_return_if_fail (GCK_IS_OBJECT (self));
- g_return_if_fail (GCK_IS_SESSION (self->pv->session));
+ g_return_if_fail (GCK_IS_SESSION (priv->session));
- call = _gck_call_async_prep (self->pv->session, perform_destroy, NULL, sizeof (*args), NULL);
+ call = _gck_call_async_prep (priv->session, perform_destroy, NULL, sizeof (*args), NULL);
args = _gck_call_get_arguments (call);
- args->object = self->pv->handle;
+ args->object = priv->handle;
_gck_call_async_ready_go (call, self, cancellable, callback, user_data);
}
@@ -503,14 +504,13 @@ free_set_attributes (SetAttributes *args)
*
* Set PKCS#11 attributes on an object. This call may block for an indefinite period.
*
- * If the @attrs #GckAttributes is floating, it is consumed.
- *
* Return value: Whether the call was successful or not.
**/
gboolean
gck_object_set (GckObject *self, GckAttributes *attrs,
GCancellable *cancellable, GError **error)
{
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
SetAttributes args;
gboolean ret = FALSE;
@@ -520,13 +520,9 @@ gck_object_set (GckObject *self, GckAttributes *attrs,
memset (&args, 0, sizeof (args));
args.attrs = attrs;
- args.object = self->pv->handle;
-
- gck_attributes_ref_sink (attrs);
-
- ret = _gck_call_sync (self->pv->session, perform_set_attributes, NULL, &args, cancellable, error);
+ args.object = priv->handle;
- gck_attributes_unref (attrs);
+ ret = _gck_call_sync (priv->session, perform_set_attributes, NULL, &args, cancellable, error);
return ret;
}
@@ -541,25 +537,24 @@ gck_object_set (GckObject *self, GckAttributes *attrs,
*
* Set PKCS#11 attributes on an object. This call will return
* immediately and completes asynchronously.
- *
- * If the @attrs #GckAttributes is floating, it is consumed.
**/
void
gck_object_set_async (GckObject *self, GckAttributes *attrs, GCancellable *cancellable,
GAsyncReadyCallback callback, gpointer user_data)
{
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
GckCall *call;
SetAttributes *args;
g_return_if_fail (GCK_IS_OBJECT (self));
g_return_if_fail (attrs != NULL);
- call = _gck_call_async_prep (self->pv->session, perform_set_attributes,
+ call = _gck_call_async_prep (priv->session, perform_set_attributes,
NULL, sizeof (*args), free_set_attributes);
args = _gck_call_get_arguments (call);
- args->attrs = gck_attributes_ref_sink (attrs);
- args->object = self->pv->handle;
+ args->attrs = gck_attributes_ref (attrs);
+ args->object = priv->handle;
_gck_call_async_ready_go (call, self, cancellable, callback, user_data);
}
@@ -706,6 +701,7 @@ gck_object_get_full (GckObject *self,
GCancellable *cancellable,
GError **error)
{
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
GetAttributes args;
gboolean ret;
guint i;
@@ -719,12 +715,12 @@ gck_object_get_full (GckObject *self,
for (i = 0; i < n_attr_types; ++i)
gck_builder_add_empty (&args.builder, attr_types[i]);
- args.object = self->pv->handle;
+ args.object = priv->handle;
- ret = _gck_call_sync (self->pv->session, perform_get_attributes, NULL, &args, cancellable, error);
+ ret = _gck_call_sync (priv->session, perform_get_attributes, NULL, &args, cancellable, error);
if (ret) {
- return gck_attributes_ref_sink (gck_builder_end (&args.builder));
+ return gck_builder_end (&args.builder);
} else {
gck_builder_clear (&args.builder);
return NULL;
@@ -755,13 +751,14 @@ gck_object_get_async (GckObject *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
GckCall *call;
GetAttributes *args;
guint i;
g_return_if_fail (GCK_IS_OBJECT (self));
- call = _gck_call_async_prep (self->pv->session, perform_get_attributes,
+ call = _gck_call_async_prep (priv->session, perform_get_attributes,
NULL, sizeof (*args), free_get_attributes);
args = _gck_call_get_arguments (call);
@@ -769,7 +766,7 @@ gck_object_get_async (GckObject *self,
for (i = 0; i < n_attr_types; ++i)
gck_builder_add_empty (&args->builder, attr_types[i]);
- args->object = self->pv->handle;
+ args->object = priv->handle;
_gck_call_async_ready_go (call, self, cancellable, callback, user_data);
}
@@ -802,7 +799,7 @@ gck_object_get_finish (GckObject *self, GAsyncResult *result, GError **error)
if (!_gck_call_basic_finish (result, error))
return NULL;
- return gck_attributes_ref_sink (gck_builder_end (&args->builder));
+ return gck_builder_end (&args->builder);
}
/* ---------------------------------------------------------------------------------
@@ -913,6 +910,7 @@ guchar *
gck_object_get_data_full (GckObject *self, gulong attr_type, GckAllocator allocator,
GCancellable *cancellable, gsize *n_data, GError **error)
{
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
GetAttributeData args;
gboolean ret;
@@ -925,10 +923,10 @@ gck_object_get_data_full (GckObject *self, gulong attr_type, GckAllocator alloca
memset (&args, 0, sizeof (args));
args.allocator = allocator;
- args.object = self->pv->handle;
+ args.object = priv->handle;
args.type = attr_type;
- ret = _gck_call_sync (self->pv->session, perform_get_attribute_data, NULL, &args, cancellable, error);
+ ret = _gck_call_sync (priv->session, perform_get_attribute_data, NULL, &args, cancellable, error);
/* Free any value if failed */
if (!ret) {
@@ -959,6 +957,7 @@ gck_object_get_data_async (GckObject *self, gulong attr_type, GckAllocator alloc
GCancellable *cancellable, GAsyncReadyCallback callback,
gpointer user_data)
{
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
GckCall *call;
GetAttributeData *args;
@@ -967,12 +966,12 @@ gck_object_get_data_async (GckObject *self, gulong attr_type, GckAllocator alloc
if (!allocator)
allocator = g_realloc;
- call = _gck_call_async_prep (self->pv->session, perform_get_attribute_data,
+ call = _gck_call_async_prep (priv->session, perform_get_attribute_data,
NULL, sizeof (*args), free_get_attribute_data);
args = _gck_call_get_arguments (call);
args->allocator = allocator;
- args->object = self->pv->handle;
+ args->object = priv->handle;
args->type = attr_type;
_gck_call_async_ready_go (call, self, cancellable, callback, user_data);
@@ -1073,6 +1072,7 @@ gboolean
gck_object_set_template (GckObject *self, gulong attr_type, GckAttributes *attrs,
GCancellable *cancellable, GError **error)
{
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
set_template_args args;
gboolean ret = FALSE;
@@ -1083,13 +1083,9 @@ gck_object_set_template (GckObject *self, gulong attr_type, GckAttributes *attrs
memset (&args, 0, sizeof (args));
args.attrs = attrs;
args.type = attr_type;
- args.object = self->pv->handle;
-
- gck_attributes_ref_sink (attrs);
-
- ret = _gck_call_sync (self->pv->session, perform_set_template, NULL, &args, cancellable, error);
+ args.object = priv->handle;
- gck_attributes_unref (attrs);
+ ret = _gck_call_sync (priv->session, perform_set_template, NULL, &args, cancellable, error);
return ret;
}
@@ -1115,19 +1111,20 @@ gck_object_set_template_async (GckObject *self, gulong attr_type, GckAttributes
GCancellable *cancellable, GAsyncReadyCallback callback,
gpointer user_data)
{
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
GckCall *call;
set_template_args *args;
g_return_if_fail (GCK_IS_OBJECT (self));
g_return_if_fail (attrs);
- call = _gck_call_async_prep (self->pv->session, perform_set_template,
+ call = _gck_call_async_prep (priv->session, perform_set_template,
NULL, sizeof (*args), free_set_template);
args = _gck_call_get_arguments (call);
- args->attrs = gck_attributes_ref_sink (attrs);
+ args->attrs = gck_attributes_ref (attrs);
args->type = attr_type;
- args->object = self->pv->handle;
+ args->object = priv->handle;
_gck_call_async_ready_go (call, self, cancellable, callback, user_data);
}
@@ -1236,6 +1233,7 @@ GckAttributes *
gck_object_get_template (GckObject *self, gulong attr_type,
GCancellable *cancellable, GError **error)
{
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
get_template_args args;
gboolean ret;
@@ -1243,10 +1241,10 @@ gck_object_get_template (GckObject *self, gulong attr_type,
g_return_val_if_fail (!error || !*error, NULL);
memset (&args, 0, sizeof (args));
- args.object = self->pv->handle;
+ args.object = priv->handle;
args.type = attr_type;
- ret = _gck_call_sync (self->pv->session, perform_get_template, NULL, &args, cancellable, error);
+ ret = _gck_call_sync (priv->session, perform_get_template, NULL, &args, cancellable, error);
/* Free any value if failed */
if (!ret) {
@@ -1254,7 +1252,7 @@ gck_object_get_template (GckObject *self, gulong attr_type,
return NULL;
}
- return gck_attributes_ref_sink (gck_builder_end (&args.builder));
+ return gck_builder_end (&args.builder);
}
/**
@@ -1275,16 +1273,17 @@ gck_object_get_template_async (GckObject *self, gulong attr_type,
GCancellable *cancellable, GAsyncReadyCallback callback,
gpointer user_data)
{
+ GckObjectPrivate *priv = gck_object_get_instance_private (self);
GckCall *call;
get_template_args *args;
g_return_if_fail (GCK_IS_OBJECT (self));
- call = _gck_call_async_prep (self->pv->session, perform_get_template,
+ call = _gck_call_async_prep (priv->session, perform_get_template,
NULL, sizeof (*args), free_get_template);
args = _gck_call_get_arguments (call);
- args->object = self->pv->handle;
+ args->object = priv->handle;
args->type = attr_type;
_gck_call_async_ready_go (call, self, cancellable, callback, user_data);
@@ -1316,5 +1315,5 @@ gck_object_get_template_finish (GckObject *self, GAsyncResult *result,
return NULL;
args = _gck_call_async_result_arguments (result, get_template_args);
- return gck_attributes_ref_sink (gck_builder_end (&args->builder));
+ return gck_builder_end (&args->builder);
}
diff --git a/gck/gck-password.c b/gck/gck-password.c
index 13bb8f9..3c102e0 100644
--- a/gck/gck-password.c
+++ b/gck/gck-password.c
@@ -53,17 +53,18 @@ enum {
PROP_KEY
};
-struct _GckPasswordPrivate {
+struct _GckPassword {
+ GTlsPassword parent_instance;
+
gboolean for_token;
gpointer token_or_key;
};
-G_DEFINE_TYPE_WITH_PRIVATE (GckPassword, gck_password, G_TYPE_TLS_PASSWORD);
+G_DEFINE_TYPE (GckPassword, gck_password, G_TYPE_TLS_PASSWORD);
static void
gck_password_init (GckPassword *self)
{
- self->pv = gck_password_get_instance_private (self);
}
static void
@@ -73,8 +74,8 @@ gck_password_constructed (GObject *obj)
G_OBJECT_CLASS (gck_password_parent_class)->constructed (obj);
- g_return_if_fail (GCK_IS_SLOT (self->pv->token_or_key) ||
- GCK_IS_OBJECT (self->pv->token_or_key));
+ g_return_if_fail (GCK_IS_SLOT (self->token_or_key) ||
+ GCK_IS_OBJECT (self->token_or_key));
}
static void
@@ -116,17 +117,17 @@ gck_password_set_property (GObject *obj,
case PROP_TOKEN:
object = g_value_dup_object (value);
if (object != NULL) {
- g_assert (self->pv->token_or_key == NULL);
- self->pv->token_or_key = object;
- self->pv->for_token = TRUE;
+ g_assert (self->token_or_key == NULL);
+ self->token_or_key = object;
+ self->for_token = TRUE;
}
break;
case PROP_KEY:
object = g_value_dup_object (value);
if (object != NULL) {
- g_assert (self->pv->token_or_key == NULL);
- self->pv->token_or_key = object;
- self->pv->for_token = FALSE;
+ g_assert (self->token_or_key == NULL);
+ self->token_or_key = object;
+ self->for_token = FALSE;
}
break;
default:
@@ -140,7 +141,7 @@ gck_password_finalize (GObject *obj)
{
GckPassword *self = GCK_PASSWORD (obj);
- g_clear_object (&self->pv->token_or_key);
+ g_clear_object (&self->token_or_key);
G_OBJECT_CLASS (gck_password_parent_class)->finalize (obj);
}
@@ -198,10 +199,10 @@ GckModule *
gck_password_get_module (GckPassword *self)
{
g_return_val_if_fail (GCK_IS_PASSWORD (self), NULL);
- if (self->pv->for_token)
- return gck_slot_get_module (self->pv->token_or_key);
+ if (self->for_token)
+ return gck_slot_get_module (self->token_or_key);
else
- return gck_object_get_module (self->pv->token_or_key);
+ return gck_object_get_module (self->token_or_key);
}
/**
@@ -218,10 +219,10 @@ GckSlot *
gck_password_get_token (GckPassword *self)
{
g_return_val_if_fail (GCK_IS_PASSWORD (self), NULL);
- if (!self->pv->for_token)
+ if (!self->for_token)
return NULL;
- g_return_val_if_fail (GCK_IS_SLOT (self->pv->token_or_key), NULL);
- return g_object_ref (self->pv->token_or_key);
+ g_return_val_if_fail (GCK_IS_SLOT (self->token_or_key), NULL);
+ return g_object_ref (self->token_or_key);
}
/**
@@ -238,8 +239,8 @@ GckObject *
gck_password_get_key (GckPassword *self)
{
g_return_val_if_fail (GCK_IS_PASSWORD (self), NULL);
- if (self->pv->for_token)
+ if (self->for_token)
return NULL;
- g_return_val_if_fail (GCK_IS_OBJECT (self->pv->token_or_key), NULL);
- return g_object_ref (self->pv->token_or_key);
+ g_return_val_if_fail (GCK_IS_OBJECT (self->token_or_key), NULL);
+ return g_object_ref (self->token_or_key);
}
diff --git a/gck/gck-private.h b/gck/gck-private.h
index 6c4117c..93731d6 100644
--- a/gck/gck-private.h
+++ b/gck/gck-private.h
@@ -122,20 +122,6 @@ void _gck_password_update (GckPassword *self,
gboolean request_retry);
/* ----------------------------------------------------------------------------
- * INTERACTION
- */
-
-#define GCK_TYPE_INTERACTION (_gck_interaction_get_type ())
-#define GCK_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCK_TYPE_INTERACTION, GckInteraction))
-#define GCK_IS_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCK_TYPE_INTERACTION))
-
-typedef struct _GckInteraction GckInteraction;
-
-GType _gck_interaction_get_type (void) G_GNUC_CONST;
-
-GTlsInteraction * _gck_interaction_new (gpointer token_or_key);
-
-/* ----------------------------------------------------------------------------
* CALL
*/
diff --git a/gck/gck-session.c b/gck/gck-session.c
index 4c5fe08..29ef89e 100644
--- a/gck/gck-session.c
+++ b/gck/gck-session.c
@@ -74,7 +74,7 @@ enum {
PROP_APP_DATA
};
-struct _GckSessionPrivate {
+typedef struct {
/* Not modified after construct/init */
GckSlot *slot;
CK_SESSION_HANDLE handle;
@@ -83,10 +83,10 @@ struct _GckSessionPrivate {
gpointer app_data;
/* Changable data locked by mutex */
- GMutex *mutex;
+ GMutex mutex;
GTlsInteraction *interaction;
gboolean discarded;
-};
+} GckSessionPrivate;
static void gck_session_initable_iface (GInitableIface *iface);
@@ -132,9 +132,8 @@ gck_session_real_discard_handle (GckSession *self, CK_OBJECT_HANDLE handle)
static void
gck_session_init (GckSession *self)
{
- self->pv = gck_session_get_instance_private (self);
- self->pv->mutex = g_new0 (GMutex, 1);
- g_mutex_init (self->pv->mutex);
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
+ g_mutex_init (&priv->mutex);
}
static void
@@ -170,31 +169,32 @@ gck_session_set_property (GObject *obj, guint prop_id, const GValue *value,
GParamSpec *pspec)
{
GckSession *self = GCK_SESSION (obj);
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
/* Only valid calls are from constructor */
switch (prop_id) {
case PROP_HANDLE:
- g_return_if_fail (!self->pv->handle);
- self->pv->handle = g_value_get_ulong (value);
+ g_return_if_fail (!priv->handle);
+ priv->handle = g_value_get_ulong (value);
break;
case PROP_INTERACTION:
gck_session_set_interaction (self, g_value_get_object (value));
break;
case PROP_SLOT:
- g_return_if_fail (!self->pv->slot);
- self->pv->slot = g_value_dup_object (value);
- g_return_if_fail (self->pv->slot);
+ g_return_if_fail (!priv->slot);
+ priv->slot = g_value_dup_object (value);
+ g_return_if_fail (priv->slot);
break;
case PROP_OPTIONS:
- g_return_if_fail (!self->pv->options);
- self->pv->options = g_value_get_flags (value);
+ g_return_if_fail (!priv->options);
+ priv->options = g_value_get_flags (value);
break;
case PROP_OPENING_FLAGS:
- self->pv->opening_flags = g_value_get_ulong (value);
+ priv->opening_flags = g_value_get_ulong (value);
break;
case PROP_APP_DATA:
- self->pv->app_data = g_value_get_pointer (value);
+ priv->app_data = g_value_get_pointer (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
@@ -206,28 +206,30 @@ static void
gck_session_constructed (GObject *obj)
{
GckSession *self = GCK_SESSION (obj);
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
G_OBJECT_CLASS (gck_session_parent_class)->constructed (obj);
- self->pv->opening_flags |= CKF_SERIAL_SESSION;
- if (self->pv->options & GCK_SESSION_READ_WRITE)
- self->pv->opening_flags |= CKF_RW_SESSION;
+ priv->opening_flags |= CKF_SERIAL_SESSION;
+ if (priv->options & GCK_SESSION_READ_WRITE)
+ priv->opening_flags |= CKF_RW_SESSION;
}
static void
gck_session_dispose (GObject *obj)
{
GckSession *self = GCK_SESSION (obj);
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
gboolean discard = FALSE;
gboolean handled;
g_return_if_fail (GCK_IS_SESSION (self));
- if (self->pv->handle != 0) {
- g_mutex_lock (self->pv->mutex);
- discard = !self->pv->discarded;
- self->pv->discarded = TRUE;
- g_mutex_unlock (self->pv->mutex);
+ if (priv->handle != 0) {
+ g_mutex_lock (&priv->mutex);
+ discard = !priv->discarded;
+ priv->discarded = TRUE;
+ g_mutex_unlock (&priv->mutex);
}
if (discard) {
@@ -236,7 +238,7 @@ gck_session_dispose (GObject *obj)
* handle. This allows any necessary session reuse to work.
*/
- g_signal_emit_by_name (self, "discard-handle", self->pv->handle, &handled);
+ g_signal_emit_by_name (self, "discard-handle", priv->handle, &handled);
g_return_if_fail (handled);
}
@@ -247,14 +249,14 @@ static void
gck_session_finalize (GObject *obj)
{
GckSession *self = GCK_SESSION (obj);
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
- g_assert (self->pv->handle == 0 || self->pv->discarded);
+ g_assert (priv->handle == 0 || priv->discarded);
- g_clear_object (&self->pv->interaction);
- g_clear_object (&self->pv->slot);
+ g_clear_object (&priv->interaction);
+ g_clear_object (&priv->slot);
- g_mutex_clear (self->pv->mutex);
- g_free (self->pv->mutex);
+ g_mutex_clear (&priv->mutex);
G_OBJECT_CLASS (gck_session_parent_class)->finalize (obj);
}
@@ -384,7 +386,6 @@ free_open_session (OpenSession *args)
static CK_RV
perform_open_session (OpenSession *args)
{
- GTlsInteraction *interaction;
CK_RV rv = CKR_OK;
/* First step, open session */
@@ -396,16 +397,8 @@ perform_open_session (OpenSession *args)
if (rv != CKR_OK || !args->auto_login)
return rv;
- /* Compatibility, hook into GckModule signals if no interaction set */
- if (args->interaction)
- interaction = g_object_ref (args->interaction);
- else
- interaction = _gck_interaction_new (args->slot);
-
rv = _gck_session_authenticate_token (args->base.pkcs11, args->session,
- args->slot, interaction, NULL);
-
- g_object_unref (interaction);
+ args->slot, args->interaction, NULL);
return rv;
}
@@ -416,31 +409,32 @@ gck_session_initable_init (GInitable *initable,
GError **error)
{
GckSession *self = GCK_SESSION (initable);
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
OpenSession args = { GCK_ARGUMENTS_INIT, 0, };
GckModule *module = NULL;
gboolean ret = FALSE;
gboolean want_login;
- want_login = (self->pv->options & GCK_SESSION_LOGIN_USER) == GCK_SESSION_LOGIN_USER;
+ want_login = (priv->options & GCK_SESSION_LOGIN_USER) == GCK_SESSION_LOGIN_USER;
/* Already have a session setup? */
- if (self->pv->handle && !want_login)
+ if (priv->handle && !want_login)
return TRUE;
g_object_ref (self);
module = gck_session_get_module (self);
/* Open a new session */
- args.slot = self->pv->slot;
- args.app_data = self->pv->app_data;
+ args.slot = priv->slot;
+ args.app_data = priv->app_data;
args.notify = NULL;
- args.session = self->pv->handle;
- args.flags = self->pv->opening_flags;
- args.interaction = self->pv->interaction ? g_object_ref (self->pv->interaction) : NULL;
+ args.session = priv->handle;
+ args.flags = priv->opening_flags;
+ args.interaction = priv->interaction ? g_object_ref (priv->interaction) : NULL;
args.auto_login = want_login;
- if (_gck_call_sync (self->pv->slot, perform_open_session, NULL, &args, cancellable, error)) {
- self->pv->handle = args.session;
+ if (_gck_call_sync (priv->slot, perform_open_session, NULL, &args, cancellable, error)) {
+ priv->handle = args.session;
ret = TRUE;
}
@@ -465,34 +459,35 @@ gck_session_initable_init_async (GAsyncInitable *initable,
gpointer user_data)
{
GckSession *self = GCK_SESSION (initable);
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
OpenSession *args;
gboolean want_login;
GckCall *call;
g_object_ref (self);
- call = _gck_call_async_prep (self->pv->slot, perform_open_session, NULL,
+ call = _gck_call_async_prep (priv->slot, perform_open_session, NULL,
sizeof (*args), free_open_session);
args = _gck_call_get_arguments (call);
- want_login = (self->pv->options & GCK_SESSION_LOGIN_USER) == GCK_SESSION_LOGIN_USER;
- args->session = self->pv->handle;
+ want_login = (priv->options & GCK_SESSION_LOGIN_USER) == GCK_SESSION_LOGIN_USER;
+ args->session = priv->handle;
_gck_call_async_ready (call, self, cancellable, callback, user_data);
/* Already have a session setup? */
- if (self->pv->handle && !want_login) {
+ if (priv->handle && !want_login) {
_gck_call_async_short (call, CKR_OK);
g_object_unref (self);
return;
}
- args->app_data = self->pv->app_data;
+ args->app_data = priv->app_data;
args->notify = NULL;
- args->slot = g_object_ref (self->pv->slot);
- args->interaction = self->pv->interaction ? g_object_ref (self->pv->interaction) : NULL;
+ args->slot = g_object_ref (priv->slot);
+ args->interaction = priv->interaction ? g_object_ref (priv->interaction) : NULL;
args->auto_login = want_login;
- args->flags = self->pv->opening_flags;
+ args->flags = priv->opening_flags;
_gck_call_async_go (call);
g_object_unref (self);
@@ -504,6 +499,7 @@ gck_session_initable_init_finish (GAsyncInitable *initable,
GError **error)
{
GckSession *self = GCK_SESSION (initable);
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
gboolean ret = FALSE;
g_object_ref (self);
@@ -513,7 +509,7 @@ gck_session_initable_init_finish (GAsyncInitable *initable,
if (_gck_call_basic_finish (result, error)) {
args = _gck_call_async_result_arguments (result, OpenSession);
- self->pv->handle = args->session;
+ priv->handle = args->session;
ret = TRUE;
}
}
@@ -618,8 +614,11 @@ gck_session_from_handle (GckSlot *slot,
gulong
gck_session_get_handle (GckSession *self)
{
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
+
g_return_val_if_fail (GCK_IS_SESSION (self), (CK_SESSION_HANDLE)-1);
- return self->pv->handle;
+
+ return priv->handle;
}
/**
@@ -633,8 +632,11 @@ gck_session_get_handle (GckSession *self)
GckModule *
gck_session_get_module (GckSession *self)
{
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
+
g_return_val_if_fail (GCK_IS_SESSION (self), NULL);
- return gck_slot_get_module (self->pv->slot);
+
+ return gck_slot_get_module (priv->slot);
}
/**
@@ -648,9 +650,12 @@ gck_session_get_module (GckSession *self)
GckSlot *
gck_session_get_slot (GckSession *self)
{
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
+
g_return_val_if_fail (GCK_IS_SESSION (self), NULL);
- g_return_val_if_fail (GCK_IS_SLOT (self->pv->slot), NULL);
- return g_object_ref (self->pv->slot);
+ g_return_val_if_fail (GCK_IS_SLOT (priv->slot), NULL);
+
+ return g_object_ref (priv->slot);
}
/**
@@ -665,6 +670,7 @@ gck_session_get_slot (GckSession *self)
GckSessionInfo*
gck_session_get_info (GckSession *self)
{
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
GckSessionInfo *sessioninfo;
CK_FUNCTION_LIST_PTR funcs;
CK_SESSION_INFO info;
@@ -680,7 +686,7 @@ gck_session_get_info (GckSession *self)
g_return_val_if_fail (funcs, NULL);
memset (&info, 0, sizeof (info));
- rv = (funcs->C_GetSessionInfo) (self->pv->handle, &info);
+ rv = (funcs->C_GetSessionInfo) (priv->handle, &info);
g_object_unref (module);
@@ -709,6 +715,7 @@ gck_session_get_info (GckSession *self)
gulong
gck_session_get_state (GckSession *self)
{
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
CK_FUNCTION_LIST_PTR funcs;
CK_SESSION_INFO info;
GckModule *module;
@@ -723,7 +730,7 @@ gck_session_get_state (GckSession *self)
g_return_val_if_fail (funcs, 0);
memset (&info, 0, sizeof (info));
- rv = (funcs->C_GetSessionInfo) (self->pv->handle, &info);
+ rv = (funcs->C_GetSessionInfo) (priv->handle, &info);
g_object_unref (module);
@@ -746,8 +753,11 @@ gck_session_get_state (GckSession *self)
GckSessionOptions
gck_session_get_options (GckSession *self)
{
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
+
g_return_val_if_fail (GCK_IS_SESSION (self), 0);
- return self->pv->options;
+
+ return priv->options;
}
/**
@@ -762,10 +772,12 @@ gck_session_get_options (GckSession *self)
GTlsInteraction *
gck_session_get_interaction (GckSession *self)
{
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
+
g_return_val_if_fail (GCK_IS_SESSION (self), NULL);
- if (self->pv->interaction)
- return g_object_ref (self->pv->interaction);
+ if (priv->interaction)
+ return g_object_ref (priv->interaction);
return NULL;
}
@@ -782,22 +794,14 @@ void
gck_session_set_interaction (GckSession *self,
GTlsInteraction *interaction)
{
- GTlsInteraction *previous;
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
+
g_return_if_fail (GCK_IS_SESSION (self));
g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction));
- if (interaction)
- g_object_ref (interaction);
-
- g_mutex_lock (self->pv->mutex);
-
- previous = self->pv->interaction;
- self->pv->interaction = interaction;
-
- g_mutex_unlock (self->pv->mutex);
-
- if (previous)
- g_object_unref (previous);
+ g_mutex_lock (&priv->mutex);
+ g_set_object (&priv->interaction, interaction);
+ g_mutex_unlock (&priv->mutex);
}
/**
@@ -1224,6 +1228,7 @@ gck_session_login_interactive (GckSession *self,
GCancellable *cancellable,
GError **error)
{
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
Interactive args = { GCK_ARGUMENTS_INIT, interaction, cancellable, NULL, };
g_return_val_if_fail (GCK_IS_SESSION (self), FALSE);
@@ -1234,7 +1239,7 @@ gck_session_login_interactive (GckSession *self,
/* TODO: For now this is all we support */
g_return_val_if_fail (user_type == CKU_USER, FALSE);
- args.token = self->pv->slot;
+ args.token = priv->slot;
return _gck_call_sync (self, perform_interactive, NULL, &args, cancellable, error);
}
@@ -1259,6 +1264,7 @@ gck_session_login_interactive_async (GckSession *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
+ GckSessionPrivate *priv = gck_session_get_instance_private (self);
Interactive* args;
GckCall *call;
@@ -1274,7 +1280,7 @@ gck_session_login_interactive_async (GckSession *self,
args->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
args->interaction = interaction ? g_object_ref (interaction) : NULL;
- args->token = g_object_ref (self->pv->slot);
+ args->token = g_object_ref (priv->slot);
_gck_call_async_ready_go (call, self, cancellable, callback, user_data);
}
@@ -1410,8 +1416,6 @@ perform_create_object (CreateObject *args)
* Create a new PKCS#11 object. This call may block for an
* indefinite period.
*
- * If the @attrs #GckAttributes is floating, it is consumed.
- *
* Returns: (transfer full): the newly created object or %NULL if an error occurred
**/
GckObject *
@@ -1424,9 +1428,7 @@ gck_session_create_object (GckSession *self, GckAttributes *attrs,
g_return_val_if_fail (GCK_IS_SESSION (self), NULL);
g_return_val_if_fail (attrs != NULL, NULL);
- gck_attributes_ref_sink (attrs);
ret = _gck_call_sync (self, perform_create_object, NULL, &args, cancellable, error);
- gck_attributes_unref (attrs);
if (!ret)
return NULL;
@@ -1461,7 +1463,7 @@ gck_session_create_object_async (GckSession *self, GckAttributes *attrs,
g_return_if_fail (attrs);
- args->attrs = gck_attributes_ref_sink (attrs);
+ args->attrs = gck_attributes_ref (attrs);
_gck_call_async_ready_go (call, self, cancellable, callback, user_data);
}
@@ -1578,8 +1580,6 @@ perform_find_objects (FindObjects *args)
* Find the objects matching the passed attributes. This call may
* block for an indefinite period.
*
- * If @match is a floating reference, it is consumed.
- *
* Returns: (transfer full) (array length=n_handles) (nullable): a list of
* the matching objects, which may be empty
**/
@@ -1599,13 +1599,11 @@ gck_session_find_handles (GckSession *self,
g_return_val_if_fail (n_handles != NULL, NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
- gck_attributes_ref_sink (match);
if (_gck_call_sync (self, perform_find_objects, NULL, &args, cancellable, error)) {
results = args.objects;
*n_handles = args.n_objects;
args.objects = NULL;
}
- gck_attributes_unref (match);
g_free (args.objects);
return results;
@@ -1641,7 +1639,7 @@ gck_session_find_handles_async (GckSession *self,
call = _gck_call_async_prep (self, perform_find_objects,
NULL, sizeof (*args), free_find_objects);
args = _gck_call_get_arguments (call);
- args->attrs = gck_attributes_ref_sink (match);
+ args->attrs = gck_attributes_ref (match);
_gck_call_async_ready_go (call, self, cancellable, callback, user_data);
}
@@ -1786,8 +1784,6 @@ gck_session_find_objects_finish (GckSession *self,
*
* Setup an enumerator for listing matching objects available via this session.
*
- * If @match is a floating reference, it is consumed.
- *
* This call will not block but will return an enumerator immediately.
*
* Returns: (transfer full): a new enumerator
@@ -1801,7 +1797,7 @@ gck_session_enumerate_objects (GckSession *session,
g_return_val_if_fail (match != NULL, NULL);
uri_data = gck_uri_data_new ();
- uri_data->attributes = gck_attributes_ref_sink (match);
+ uri_data->attributes = gck_attributes_ref (match);
return _gck_enumerator_new_for_session (session, uri_data);
}
@@ -1822,8 +1818,8 @@ typedef struct _GenerateKeyPair {
static void
free_generate_key_pair (GenerateKeyPair *args)
{
- gck_attributes_unref (args->public_attrs);
- gck_attributes_unref (args->private_attrs);
+ g_clear_pointer (&args->public_attrs, gck_attributes_unref);
+ g_clear_pointer (&args->private_attrs, gck_attributes_unref);
g_free (args);
}
@@ -1889,9 +1885,6 @@ gck_session_generate_key_pair (GckSession *self, gulong mech_type,
* Generate a new key pair of public and private keys. This call may block for an
* indefinite period.
*
- * If @public_attrs and/or @private_attrs is a floating reference, it is
- * consumed.
- *
* Return value: %TRUE if the operation succeeded.
**/
gboolean
@@ -1915,14 +1908,8 @@ gck_session_generate_key_pair_full (GckSession *self,
/* Shallow copy of the mechanism structure */
memcpy (&args.mechanism, mechanism, sizeof (args.mechanism));
- gck_attributes_ref_sink (public_attrs);
- gck_attributes_ref_sink (private_attrs);
-
ret = _gck_call_sync (self, perform_generate_key_pair, NULL, &args, cancellable, error);
- gck_attributes_unref (private_attrs);
- gck_attributes_unref (public_attrs);
-
if (!ret)
return FALSE;
@@ -1970,8 +1957,8 @@ gck_session_generate_key_pair_async (GckSession *self, GckMechanism *mechanism,
/* Shallow copy of the mechanism structure */
memcpy (&args->mechanism, mechanism, sizeof (args->mechanism));
- args->public_attrs = gck_attributes_ref_sink (public_attrs);
- args->private_attrs = gck_attributes_ref_sink (private_attrs);
+ args->public_attrs = gck_attributes_ref (public_attrs);
+ args->private_attrs = gck_attributes_ref (private_attrs);
_gck_call_async_ready_go (call, self, cancellable, callback, user_data);
}
@@ -2029,7 +2016,7 @@ typedef struct _WrapKey {
static void
free_wrap_key (WrapKey *args)
{
- g_free (args->result);
+ g_clear_pointer (&args->result, g_free);
g_free (args);
}
@@ -2220,7 +2207,7 @@ typedef struct _UnwrapKey {
static void
free_unwrap_key (UnwrapKey *args)
{
- gck_attributes_unref (args->attrs);
+ g_clear_pointer (&args->attrs, gck_attributes_unref);
g_free (args);
}
@@ -2255,8 +2242,6 @@ perform_unwrap_key (UnwrapKey *args)
* Unwrap a key from a byte stream. This call may block for an
* indefinite period.
*
- * If @attrs is a floating reference, it is consumed.
- *
* Returns: (transfer full): the new unwrapped key or %NULL if the
* operation failed
**/
@@ -2288,8 +2273,6 @@ gck_session_unwrap_key (GckSession *self,
* Unwrap a key from a byte stream. This call may block for an
* indefinite period.
*
- * If @attrs is a floating reference, it is consumed.
- *
* Returns: (transfer full): the new unwrapped key or %NULL if the operation
* failed
**/
@@ -2317,12 +2300,8 @@ gck_session_unwrap_key_full (GckSession *self,
g_object_get (wrapper, "handle", &args.wrapper, NULL);
g_return_val_if_fail (args.wrapper != 0, NULL);
- gck_attributes_ref_sink (attrs);
-
ret = _gck_call_sync (self, perform_unwrap_key, NULL, &args, cancellable, error);
- gck_attributes_unref (attrs);
-
if (!ret)
return NULL;
@@ -2343,8 +2322,6 @@ gck_session_unwrap_key_full (GckSession *self,
*
* Unwrap a key from a byte stream. This call will
* return immediately and complete asynchronously.
- *
- * If @attrs is a floating reference, it is consumed.
**/
void
gck_session_unwrap_key_async (GckSession *self,
@@ -2374,7 +2351,7 @@ gck_session_unwrap_key_async (GckSession *self,
/* Shallow copy of the mechanism structure */
memcpy (&args->mechanism, mechanism, sizeof (args->mechanism));
- args->attrs = gck_attributes_ref_sink (attrs);
+ args->attrs = gck_attributes_ref (attrs);
args->input = input;
args->n_input = n_input;
@@ -2421,7 +2398,7 @@ typedef struct _DeriveKey {
static void
free_derive_key (DeriveKey *args)
{
- gck_attributes_unref (args->attrs);
+ g_clear_pointer (&args->attrs, gck_attributes_unref);
g_free (args);
}
@@ -2478,8 +2455,6 @@ gck_session_derive_key (GckSession *self, GckObject *base, gulong mech_type,
* Derive a key from another key. This call may block for an
* indefinite period.
*
- * If the @attrs #GckAttributes is floating, it is consumed.
- *
* Returns: (transfer full): the new derived key or %NULL if the operation
* failed
**/
@@ -2501,12 +2476,8 @@ gck_session_derive_key_full (GckSession *self, GckObject *base, GckMechanism *me
g_object_get (base, "handle", &args.key, NULL);
g_return_val_if_fail (args.key != 0, NULL);
- gck_attributes_ref_sink (attrs);
-
ret = _gck_call_sync (self, perform_derive_key, NULL, &args, cancellable, error);
- gck_attributes_unref (attrs);
-
if (!ret)
return NULL;
@@ -2525,8 +2496,6 @@ gck_session_derive_key_full (GckSession *self, GckObject *base, GckMechanism *me
*
* Derive a key from another key. This call will
* return immediately and complete asynchronously.
- *
- * If the @attrs #GckAttributes is floating, it is consumed.
**/
void
gck_session_derive_key_async (GckSession *self, GckObject *base, GckMechanism *mechanism,
@@ -2550,7 +2519,7 @@ gck_session_derive_key_async (GckSession *self, GckObject *base, GckMechanism *m
/* Shallow copy of the mechanism structure */
memcpy (&args->mechanism, mechanism, sizeof (args->mechanism));
- args->attrs = gck_attributes_ref_sink (attrs);
+ args->attrs = gck_attributes_ref (attrs);
_gck_call_async_ready_go (call, self, cancellable, callback, user_data);
}
@@ -2611,7 +2580,6 @@ typedef struct _Crypt {
static CK_RV
perform_crypt (Crypt *args)
{
- GTlsInteraction *interaction;
CK_RV rv;
g_assert (args);
@@ -2625,16 +2593,8 @@ perform_crypt (Crypt *args)
if (rv != CKR_OK)
return rv;
- /* Compatibility, hook into GckModule signals if no interaction set */
- if (args->interaction)
- interaction = g_object_ref (args->interaction);
- else
- interaction = _gck_interaction_new (args->key_object);
-
rv = _gck_session_authenticate_key (args->base.pkcs11, args->base.handle,
- args->key_object, interaction, NULL);
-
- g_object_unref (interaction);
+ args->key_object, args->interaction, NULL);
if (rv != CKR_OK)
return rv;
@@ -2655,8 +2615,8 @@ free_crypt (Crypt *args)
g_clear_object (&args->interaction);
g_clear_object (&args->key_object);
- g_free (args->input);
- g_free (args->result);
+ g_clear_pointer (&args->input, g_free);
+ g_clear_pointer (&args->result, g_free);
g_free (args);
}
@@ -3135,7 +3095,6 @@ typedef struct _Verify {
static CK_RV
perform_verify (Verify *args)
{
- GTlsInteraction *interaction;
CK_RV rv;
/* Initialize the crypt operation */
@@ -3143,17 +3102,8 @@ perform_verify (Verify *args)
if (rv != CKR_OK)
return rv;
- /* Compatibility, hook into GckModule signals if no interaction set */
- if (args->interaction)
- interaction = g_object_ref (args->interaction);
- else
- interaction = _gck_interaction_new (args->key_object);
-
-
rv = _gck_session_authenticate_key (args->base.pkcs11, args->base.handle,
- args->key_object, interaction, NULL);
-
- g_object_unref (interaction);
+ args->key_object, args->interaction, NULL);
if (rv != CKR_OK)
return rv;
@@ -3169,8 +3119,8 @@ free_verify (Verify *args)
g_clear_object (&args->interaction);
g_clear_object (&args->key_object);
- g_free (args->input);
- g_free (args->signature);
+ g_clear_pointer (&args->input, g_free);
+ g_clear_pointer (&args->signature, g_free);
g_free (args);
}
diff --git a/gck/gck-slot.c b/gck/gck-slot.c
index 8ec121e..b297629 100644
--- a/gck/gck-slot.c
+++ b/gck/gck-slot.c
@@ -46,12 +46,14 @@ enum {
PROP_HANDLE
};
-struct _GckSlotPrivate {
+struct _GckSlot {
+ GObject parent_instance;
+
GckModule *module;
CK_SLOT_ID handle;
};
-G_DEFINE_TYPE_WITH_PRIVATE (GckSlot, gck_slot, G_TYPE_OBJECT);
+G_DEFINE_TYPE (GckSlot, gck_slot, G_TYPE_OBJECT);
/* ----------------------------------------------------------------------------
* OBJECT
@@ -60,7 +62,6 @@ G_DEFINE_TYPE_WITH_PRIVATE (GckSlot, gck_slot, G_TYPE_OBJECT);
static void
gck_slot_init (GckSlot *self)
{
- self->pv = gck_slot_get_instance_private (self);
}
static void
@@ -92,14 +93,13 @@ gck_slot_set_property (GObject *obj, guint prop_id, const GValue *value,
switch (prop_id) {
case PROP_MODULE:
- g_assert (!self->pv->module);
- self->pv->module = g_value_get_object (value);
- g_assert (self->pv->module);
- g_object_ref (self->pv->module);
+ g_assert (!self->module);
+ self->module = g_value_dup_object (value);
+ g_assert (self->module);
break;
case PROP_HANDLE:
- g_assert (!self->pv->handle);
- self->pv->handle = g_value_get_ulong (value);
+ g_assert (!self->handle);
+ self->handle = g_value_get_ulong (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
@@ -112,7 +112,7 @@ gck_slot_finalize (GObject *obj)
{
GckSlot *self = GCK_SLOT (obj);
- g_clear_object (&self->pv->module);
+ g_clear_object (&self->module);
G_OBJECT_CLASS (gck_slot_parent_class)->finalize (obj);
}
@@ -207,9 +207,9 @@ gck_slot_info_free (GckSlotInfo *slot_info)
{
if (!slot_info)
return;
- g_free (slot_info->slot_description);
- g_free (slot_info->manufacturer_id);
- g_free (slot_info);
+ g_clear_pointer (&slot_info->slot_description, g_free);
+ g_clear_pointer (&slot_info->manufacturer_id, g_free);
+ g_clear_pointer (&slot_info, g_free);
}
/**
@@ -422,20 +422,15 @@ gck_mechanisms_check (GArray *mechanisms, ...)
* %FALSE if either is not a GckSlot.
**/
gboolean
-gck_slot_equal (gconstpointer slot1, gconstpointer slot2)
+gck_slot_equal (GckSlot *slot1, GckSlot *slot2)
{
- GckSlot *s1, *s2;
-
if (slot1 == slot2)
return TRUE;
if (!GCK_IS_SLOT (slot1) || !GCK_IS_SLOT (slot2))
return FALSE;
- s1 = GCK_SLOT (slot1);
- s2 = GCK_SLOT (slot2);
-
- return s1->pv->handle == s2->pv->handle &&
- gck_module_equal (s1->pv->module, s2->pv->module);
+ return slot1->handle == slot2->handle &&
+ gck_module_equal (slot1->module, slot2->module);
}
/**
@@ -450,16 +445,12 @@ gck_slot_equal (gconstpointer slot1, gconstpointer slot2)
* Return value: An integer that can be used as a hash value, or 0 if invalid.
**/
guint
-gck_slot_hash (gconstpointer slot)
+gck_slot_hash (GckSlot *slot)
{
- GckSlot *self;
-
g_return_val_if_fail (GCK_IS_SLOT (slot), 0);
- self = GCK_SLOT (slot);
-
- return _gck_ulong_hash (&self->pv->handle) ^
- gck_module_hash (self->pv->module);
+ return _gck_ulong_hash (&slot->handle) ^
+ gck_module_hash (slot->module);
}
/**
@@ -493,7 +484,7 @@ gulong
gck_slot_get_handle (GckSlot *self)
{
g_return_val_if_fail (GCK_IS_SLOT (self), (CK_SLOT_ID)-1);
- return self->pv->handle;
+ return self->handle;
}
/**
@@ -509,8 +500,8 @@ GckModule *
gck_slot_get_module (GckSlot *self)
{
g_return_val_if_fail (GCK_IS_SLOT (self), NULL);
- g_return_val_if_fail (GCK_IS_MODULE (self->pv->module), NULL);
- return g_object_ref (self->pv->module);
+ g_return_val_if_fail (GCK_IS_MODULE (self->module), NULL);
+ return g_object_ref (self->module);
}
/**
@@ -925,8 +916,6 @@ gck_slot_enumerate_objects (GckSlot *self,
*
* Setup an enumerator for listing matching objects on the slots.
*
- * If the @match #GckAttributes is floating, it is consumed.
- *
* This call will not block but will return an enumerator immediately.
*
* Returns: (transfer full): a new enumerator
@@ -941,7 +930,7 @@ gck_slots_enumerate_objects (GList *slots,
g_return_val_if_fail (match != NULL, NULL);
uri_data = gck_uri_data_new ();
- uri_data->attributes = gck_attributes_ref_sink (match);
+ uri_data->attributes = gck_attributes_ref (match);
return _gck_enumerator_new_for_slots (slots, options, uri_data);
}
@@ -951,6 +940,7 @@ gck_slots_enumerate_objects (GList *slots,
* gck_slot_open_session:
* @self: The slot ot open a session on.
* @options: The #GckSessionOptions to open a session with.
+ * @interaction: (nullable): The #GTlsInteraction to use, or %NULL.
* @cancellable: An optional cancellation object, or %NULL.
* @error: A location to return an error, or %NULL.
*
@@ -964,16 +954,18 @@ gck_slots_enumerate_objects (GList *slots,
GckSession *
gck_slot_open_session (GckSlot *self,
GckSessionOptions options,
+ GTlsInteraction *interaction,
GCancellable *cancellable,
GError **error)
{
- return gck_slot_open_session_full (self, options, 0, NULL, NULL, cancellable, error);
+ return gck_slot_open_session_full (self, options, interaction, 0, NULL, NULL, cancellable, error);
}
/**
* gck_slot_open_session_full: (skip)
* @self: The slot to open a session on.
* @options: The options to open the new session with.
+ * @interaction: (nullable): The #GTlsInteraction to use, or %NULL.
* @pkcs11_flags: Additional raw PKCS#11 flags.
* @app_data: Application data for notification callback.
* @notify: PKCS#11 notification callback.
@@ -990,6 +982,7 @@ gck_slot_open_session (GckSlot *self,
GckSession *
gck_slot_open_session_full (GckSlot *self,
GckSessionOptions options,
+ GTlsInteraction *interaction,
gulong pkcs11_flags,
gpointer app_data,
CK_NOTIFY notify,
@@ -998,6 +991,7 @@ gck_slot_open_session_full (GckSlot *self,
{
return g_initable_new (GCK_TYPE_SESSION, cancellable, error,
"options", options,
+ "interaction", interaction,
"slot", self,
"opening-flags", pkcs11_flags,
"app-data", app_data,
@@ -1008,6 +1002,7 @@ gck_slot_open_session_full (GckSlot *self,
* gck_slot_open_session_async:
* @self: The slot to open a session on.
* @options: The options to open the new session with.
+ * @interaction: (nullable): The #GTlsInteraction to use, or %NULL.
* @cancellable: Optional cancellation object, or %NULL.
* @callback: Called when the operation completes.
* @user_data: Data to pass to the callback.
@@ -1020,11 +1015,12 @@ gck_slot_open_session_full (GckSlot *self,
void
gck_slot_open_session_async (GckSlot *self,
GckSessionOptions options,
+ GTlsInteraction *interaction,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
{
- gck_slot_open_session_full_async (self, options, 0UL, NULL, NULL, cancellable, callback, user_data);
+ gck_slot_open_session_full_async (self, options, interaction, 0UL, NULL, NULL, cancellable, callback, user_data);
}
static void
@@ -1049,6 +1045,7 @@ on_open_session_complete (GObject *source,
* gck_slot_open_session_full_async: (skip)
* @self: The slot to open a session on.
* @options: Options to open the new session with.
+ * @interaction: (nullable): The #GTlsInteraction to use, or %NULL.
* @pkcs11_flags: Additional raw PKCS#11 flags.
* @app_data: Application data for notification callback.
* @notify: PKCS#11 notification callback.
@@ -1064,6 +1061,7 @@ on_open_session_complete (GObject *source,
void
gck_slot_open_session_full_async (GckSlot *self,
GckSessionOptions options,
+ GTlsInteraction *interaction,
gulong pkcs11_flags,
gpointer app_data,
CK_NOTIFY notify,
@@ -1083,6 +1081,7 @@ gck_slot_open_session_full_async (GckSlot *self,
cancellable, on_open_session_complete,
g_steal_pointer (&task),
"options", options,
+ "interaction", interaction,
"slot", self,
"opening-flags", pkcs11_flags,
"app-data", app_data,
diff --git a/gck/gck-uri.c b/gck/gck-uri.c
index ba92715..e034ed5 100644
--- a/gck/gck-uri.c
+++ b/gck/gck-uri.c
@@ -96,22 +96,6 @@
* Error domain for URI errors.
*/
-/**
- * GCK_URI_BAD_PREFIX:
- *
- * Use %GCK_URI_BAD_SCHEME instead.
- *
- * Deprecated: Since 3.2
- */
-
-/**
- * CKR_GCK_MODULE_PROBLEM:
- *
- * Use %GCK_ERROR_MODULE_PROBLEM instead.
- *
- * Deprecated: Since 3.4
- */
-
#define URI_PREFIX "pkcs11:"
#define N_URI_PREFIX 7
@@ -122,26 +106,7 @@ struct _GckUri {
GckAttributes *attributes;
};
-GQuark
-gck_uri_get_error_quark (void)
-{
- /* This is deprecated version */
- return gck_uri_error_get_quark ();
-}
-
-GQuark
-gck_uri_error_get_quark (void)
-{
- static GQuark domain = 0;
- static size_t quark_inited = 0;
-
- if (g_once_init_enter (&quark_inited)) {
- domain = g_quark_from_static_string ("gck-uri-error");
- g_once_init_leave (&quark_inited, 1);
- }
-
- return domain;
-}
+G_DEFINE_QUARK(GckUriError, gck_uri_error)
/**
* gck_uri_data_new:
@@ -155,11 +120,11 @@ gck_uri_error_get_quark (void)
GckUriData *
gck_uri_data_new (void)
{
- return g_slice_new0 (GckUriData);
+ return g_new0 (GckUriData, 1);
}
/**
- * gck_uri_parse:
+ * gck_uri_data_parse:
* @string: the URI to parse.
* @flags: the context in which the URI will be used.
* @error: a #GError, or %NULL.
@@ -174,7 +139,7 @@ gck_uri_data_new (void)
* freed with gck_uri_data_free()
*/
GckUriData*
-gck_uri_parse (const gchar *string, GckUriFlags flags, GError **error)
+gck_uri_data_parse (const gchar *string, GckUriFlags flags, GError **error)
{
GckUriData *uri_data = NULL;
GckBuilder builder;
@@ -231,7 +196,7 @@ gck_uri_parse (const gchar *string, GckUriFlags flags, GError **error)
gck_builder_init (&builder);
for (i = 0; i < n_attrs; ++i)
gck_builder_add_data (&builder, attrs[i].type, attrs[i].pValue, attrs[i].ulValueLen);
- uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder));
+ uri_data->attributes = gck_builder_end (&builder);
}
uri_data->any_unrecognized = p11_kit_uri_any_unrecognized (p11_uri);
@@ -240,7 +205,7 @@ gck_uri_parse (const gchar *string, GckUriFlags flags, GError **error)
}
/**
- * gck_uri_build:
+ * gck_uri_data_build:
* @uri_data: the info to build the URI from.
* @flags: The context that the URI is for
*
@@ -250,7 +215,7 @@ gck_uri_parse (const gchar *string, GckUriFlags flags, GError **error)
* Return value: a newly allocated string containing a PKCS#11 URI.
*/
gchar*
-gck_uri_build (GckUriData *uri_data, GckUriFlags flags)
+gck_uri_data_build (GckUriData *uri_data, GckUriFlags flags)
{
const GckAttribute *attr;
P11KitUri *p11_uri = 0;
@@ -321,13 +286,11 @@ gck_uri_data_copy (GckUriData *uri_data)
void
gck_uri_data_free (GckUriData *uri_data)
{
- if (uri_data) {
- if (uri_data->attributes)
- gck_attributes_unref (uri_data->attributes);
- if (uri_data->module_info)
- gck_module_info_free (uri_data->module_info);
- if (uri_data->token_info)
- gck_token_info_free (uri_data->token_info);
- g_slice_free (GckUriData, uri_data);
- }
+ if (!uri_data)
+ return;
+
+ g_clear_pointer (&uri_data->attributes, gck_attributes_unref);
+ g_clear_pointer (&uri_data->module_info, gck_module_info_free);
+ g_clear_pointer (&uri_data->token_info, gck_token_info_free);
+ g_free (uri_data);
}
diff --git a/gck/gck.h b/gck/gck.h
index bb52c01..3b65ed2 100644
--- a/gck/gck.h
+++ b/gck/gck.h
@@ -54,9 +54,9 @@ typedef enum {
GCK_ERROR_MODULE_PROBLEM = (CKR_VENDOR_DEFINED | (GCK_VENDOR_CODE + 1)),
} GckError;
-#define GCK_ERROR (gck_error_get_quark ())
+#define GCK_ERROR (gck_error_quark ())
-GQuark gck_error_get_quark (void) G_GNUC_CONST;
+GQuark gck_error_quark (void) G_GNUC_CONST;
#define GCK_TYPE_LIST (gck_list_get_boxed_type ())
@@ -213,7 +213,7 @@ GckBuilder * gck_builder_new (GckBuilderFlags fla
GckBuilder * gck_builder_ref (GckBuilder *builder);
-void gck_builder_unref (gpointer builder);
+void gck_builder_unref (GckBuilder *builder);
void gck_builder_init (GckBuilder *builder);
@@ -331,8 +331,6 @@ gboolean gck_builder_find_date (GckBuilder *builder
gulong attr_type,
GDate *value);
-GckAttributes * gck_builder_steal (GckBuilder *builder);
-
GckAttributes * gck_builder_end (GckBuilder *builder);
GckBuilder * gck_builder_copy (GckBuilder *builder);
@@ -345,7 +343,7 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckBuilder, gck_builder_unref);
GType gck_attributes_get_type (void) G_GNUC_CONST;
-GckAttributes * gck_attributes_new (gulong reserved);
+GckAttributes * gck_attributes_new (void);
GckAttributes * gck_attributes_new_empty (gulong first_type,
...);
@@ -376,8 +374,6 @@ gulong gck_attributes_count (GckAttributes *attr
GckAttributes * gck_attributes_ref (GckAttributes *attrs);
-GckAttributes * gck_attributes_ref_sink (GckAttributes *attrs);
-
void gck_attributes_unref (gpointer attrs);
gboolean gck_attributes_contains (GckAttributes *attrs,
@@ -429,22 +425,7 @@ void gck_module_info_free (GckModuleInfo *modul
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckModuleInfo, gck_module_info_free);
#define GCK_TYPE_MODULE (gck_module_get_type())
-#define GCK_MODULE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_MODULE, GckModule))
-#define GCK_MODULE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_MODULE, GckModule))
-#define GCK_IS_MODULE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_MODULE))
-#define GCK_IS_MODULE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_MODULE))
-#define GCK_MODULE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_MODULE, GckModuleClass))
-
-typedef struct _GckModuleClass GckModuleClass;
-typedef struct _GckModulePrivate GckModulePrivate;
-
-struct _GckModule {
- GObject parent;
-
- /*< private >*/
- GckModulePrivate *pv;
- gpointer reserved[4];
-};
+G_DECLARE_DERIVABLE_TYPE (GckModule, gck_module, GCK, MODULE, GObject)
struct _GckModuleClass {
GObjectClass parent;
@@ -457,8 +438,6 @@ struct _GckModuleClass {
gpointer reserved[8];
};
-GType gck_module_get_type (void) G_GNUC_CONST;
-
GckModule* gck_module_new (CK_FUNCTION_LIST_PTR funcs);
GckModule* gck_module_initialize (const gchar *path,
@@ -473,10 +452,10 @@ void gck_module_initialize_async (const gchar *path
GckModule * gck_module_initialize_finish (GAsyncResult *result,
GError **error);
-gboolean gck_module_equal (gconstpointer module1,
- gconstpointer module2);
+gboolean gck_module_equal (GckModule *module1,
+ GckModule *module2);
-guint gck_module_hash (gconstpointer module);
+guint gck_module_hash (GckModule *module);
gboolean gck_module_match (GckModule *self,
GckUriData *uri);
@@ -530,39 +509,13 @@ GckEnumerator* gck_modules_enumerate_uri (GList *modules,
GckSessionOptions session_options,
GError **error);
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckModule, g_object_unref);
-
/* ------------------------------------------------------------------------
* ENUMERATOR
*/
#define GCK_TYPE_ENUMERATOR (gck_enumerator_get_type())
-#define GCK_ENUMERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_ENUMERATOR, GckEnumerator))
-#define GCK_ENUMERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_ENUMERATOR, GckEnumerator))
-#define GCK_IS_ENUMERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_ENUMERATOR))
-#define GCK_IS_ENUMERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_ENUMERATOR))
-#define GCK_ENUMERATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_ENUMERATOR, GckEnumeratorClass))
-
-typedef struct _GckEnumeratorClass GckEnumeratorClass;
-typedef struct _GckEnumeratorPrivate GckEnumeratorPrivate;
-
-struct _GckEnumerator {
- GObject parent;
-
- /*< private >*/
- GckEnumeratorPrivate *pv;
- gpointer reserved[2];
-};
-
-struct _GckEnumeratorClass {
- GObjectClass parent;
-
- /*< private >*/
- gpointer reserved[2];
-};
-
-GType gck_enumerator_get_type (void) G_GNUC_CONST;
+G_DECLARE_FINAL_TYPE (GckEnumerator, gck_enumerator, GCK, ENUMERATOR, GObject)
GTlsInteraction * gck_enumerator_get_interaction (GckEnumerator *self);
@@ -603,8 +556,6 @@ GList* gck_enumerator_next_finish (GckEnumerator *se
GAsyncResult *result,
GError **error);
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckEnumerator, g_object_unref);
-
/* ------------------------------------------------------------------------
* SLOT
*/
@@ -692,36 +643,12 @@ gboolean gck_mechanisms_check (GArray *mechanisms,
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckMechanismInfo, gck_mechanism_info_free);
#define GCK_TYPE_SLOT (gck_slot_get_type())
-#define GCK_SLOT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_SLOT, GckSlot))
-#define GCK_SLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_SLOT, GckSlot))
-#define GCK_IS_SLOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_SLOT))
-#define GCK_IS_SLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_SLOT))
-#define GCK_SLOT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_SLOT, GckSlotClass))
-
-typedef struct _GckSlotClass GckSlotClass;
-typedef struct _GckSlotPrivate GckSlotPrivate;
-
-struct _GckSlot {
- GObject parent;
-
- /*< private >*/
- GckSlotPrivate *pv;
- gpointer reserved[4];
-};
-
-struct _GckSlotClass {
- GObjectClass parent;
-
- /*< private >*/
- gpointer reserved[9];
-};
+G_DECLARE_FINAL_TYPE (GckSlot, gck_slot, GCK, SLOT, GObject)
-GType gck_slot_get_type (void) G_GNUC_CONST;
+gboolean gck_slot_equal (GckSlot *slot1,
+ GckSlot *slot2);
-gboolean gck_slot_equal (gconstpointer slot1,
- gconstpointer slot2);
-
-guint gck_slot_hash (gconstpointer slot);
+guint gck_slot_hash (GckSlot *slot);
gboolean gck_slot_match (GckSlot *self,
GckUriData *uri);
@@ -747,11 +674,13 @@ gboolean gck_slot_has_flags (GckSlot *self,
GckSession* gck_slot_open_session (GckSlot *self,
GckSessionOptions options,
+ GTlsInteraction *interaction,
GCancellable *cancellable,
GError **error);
GckSession* gck_slot_open_session_full (GckSlot *self,
GckSessionOptions options,
+ GTlsInteraction *interaction,
gulong pkcs11_flags,
gpointer app_data,
CK_NOTIFY notify,
@@ -760,12 +689,14 @@ GckSession* gck_slot_open_session_full (GckSlot *self,
void gck_slot_open_session_async (GckSlot *self,
GckSessionOptions options,
+ GTlsInteraction *interaction,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
void gck_slot_open_session_full_async (GckSlot *self,
GckSessionOptions options,
+ GTlsInteraction *interaction,
gulong pkcs11_flags,
gpointer app_data,
CK_NOTIFY notify,
@@ -785,8 +716,6 @@ GckEnumerator* gck_slots_enumerate_objects (GList *slots,
GckAttributes *match,
GckSessionOptions options);
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckSlot, g_object_unref);
-
/* ------------------------------------------------------------------------
* SESSION
*/
@@ -811,22 +740,7 @@ void gck_session_info_free (GckSessionInfo *sess
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckSessionInfo, gck_session_info_free);
#define GCK_TYPE_SESSION (gck_session_get_type())
-#define GCK_SESSION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_SESSION, GckSession))
-#define GCK_SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_SESSION, GckSession))
-#define GCK_IS_SESSION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_SESSION))
-#define GCK_IS_SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_SESSION))
-#define GCK_SESSION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_SESSION, GckSessionClass))
-
-typedef struct _GckSessionClass GckSessionClass;
-typedef struct _GckSessionPrivate GckSessionPrivate;
-
-struct _GckSession {
- GObject parent;
-
- /*< private >*/
- GckSessionPrivate *pv;
- gpointer reserved[4];
-};
+G_DECLARE_DERIVABLE_TYPE (GckSession, gck_session, GCK, SESSION, GObject)
struct _GckSessionClass {
GObjectClass parent;
@@ -837,8 +751,6 @@ struct _GckSessionClass {
gpointer reserved[8];
};
-GType gck_session_get_type (void) G_GNUC_CONST;
-
GckSession * gck_session_from_handle (GckSlot *slot,
gulong session_handle,
GckSessionOptions options);
@@ -1263,29 +1175,12 @@ GckObject* gck_session_derive_key_finish (GckSession *self,
GAsyncResult *result,
GError **error);
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckSession, g_object_unref);
-
/* ------------------------------------------------------------------------
* OBJECT
*/
#define GCK_TYPE_OBJECT (gck_object_get_type())
-#define GCK_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_OBJECT, GckObject))
-#define GCK_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_OBJECT, GckObjectClass))
-#define GCK_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_OBJECT))
-#define GCK_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_OBJECT))
-#define GCK_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_OBJECT, GckObjectClass))
-
-typedef struct _GckObjectClass GckObjectClass;
-typedef struct _GckObjectPrivate GckObjectPrivate;
-
-struct _GckObject {
- GObject parent;
-
- /*< private >*/
- GckObjectPrivate *pv;
- gpointer reserved[4];
-};
+G_DECLARE_DERIVABLE_TYPE (GckObject, gck_object, GCK, OBJECT, GObject)
struct _GckObjectClass {
GObjectClass parent;
@@ -1294,8 +1189,6 @@ struct _GckObjectClass {
gpointer reserved[8];
};
-GType gck_object_get_type (void) G_GNUC_CONST;
-
GckObject * gck_object_from_handle (GckSession *session,
gulong object_handle);
@@ -1303,10 +1196,10 @@ GList* gck_objects_from_handle_array (GckSession *session
gulong *object_handles,
gulong n_object_handles);
-gboolean gck_object_equal (gconstpointer object1,
- gconstpointer object2);
+gboolean gck_object_equal (GckObject *object1,
+ GckObject *object2);
-guint gck_object_hash (gconstpointer object);
+guint gck_object_hash (GckObject *object);
GckModule* gck_object_get_module (GckObject *self);
@@ -1421,20 +1314,14 @@ GckAttributes* gck_object_get_template_finish (GckObject *self,
GAsyncResult *result,
GError **error);
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckObject, g_object_unref);
-
/* ------------------------------------------------------------------------
* OBJECT ATTRIBUTES
*/
-#define GCK_TYPE_OBJECT_CACHE (gck_object_cache_get_type ())
-#define GCK_OBJECT_CACHE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCK_TYPE_OBJECT_CACHE, GckObjectCache))
-#define GCK_IS_OBJECT_CACHE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCK_TYPE_OBJECT_CACHE))
-#define GCK_OBJECT_CACHE_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCK_TYPE_OBJECT_CACHE, GckObjectCacheIface))
-
-typedef struct _GckObjectCacheIface GckObjectCacheIface;
+#define GCK_TYPE_OBJECT_CACHE gck_object_cache_get_type ()
+G_DECLARE_INTERFACE (GckObjectCache, gck_object_cache, GCK, OBJECT_CACHE, GckObject)
-struct _GckObjectCacheIface {
+struct _GckObjectCacheInterface {
GTypeInterface interface;
const gulong * default_types;
@@ -1447,8 +1334,6 @@ struct _GckObjectCacheIface {
gpointer reserved[6];
};
-GType gck_object_cache_get_type (void) G_GNUC_CONST;
-
GckAttributes * gck_object_cache_get_attributes (GckObjectCache *object);
void gck_object_cache_set_attributes (GckObjectCache *object,
@@ -1491,39 +1376,12 @@ GckAttributes * gck_object_cache_lookup_finish (GckObject *object,
GAsyncResult *result,
GError **error);
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckObjectCache, g_object_unref);
-
/* ------------------------------------------------------------------------
* PASSWORD
*/
#define GCK_TYPE_PASSWORD (gck_password_get_type ())
-#define GCK_PASSWORD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCK_TYPE_PASSWORD, GckPassword))
-#define GCK_PASSWORD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCK_TYPE_PASSWORD, GckPassword))
-#define GCK_IS_PASSWORD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCK_TYPE_PASSWORD))
-#define GCK_IS_PASSWORD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCK_TYPE_PASSWORD))
-#define GCK_PASSWORD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCK_TYPE_PASSWORD, GckPasswordClass))
-
-typedef struct _GckPassword GckPassword;
-typedef struct _GckPasswordClass GckPasswordClass;
-typedef struct _GckPasswordPrivate GckPasswordPrivate;
-
-struct _GckPassword {
- GTlsPassword parent;
-
- /*< private >*/
- GckPasswordPrivate *pv;
- gpointer reserved[4];
-};
-
-struct _GckPasswordClass {
- GTlsPasswordClass parent;
-
- /*< private >*/
- gpointer reserved[4];
-};
-
-GType gck_password_get_type (void) G_GNUC_CONST;
+G_DECLARE_FINAL_TYPE (GckPassword, gck_password, GCK, PASSWORD, GTlsPassword)
GckModule * gck_password_get_module (GckPassword *self);
@@ -1531,8 +1389,6 @@ GckSlot * gck_password_get_token (GckPassword *self);
GckObject * gck_password_get_key (GckPassword *self);
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckPassword, g_object_unref);
-
/* ----------------------------------------------------------------------------
* URI
*/
@@ -1570,16 +1426,16 @@ struct _GckUriData {
gpointer dummy[4];
};
-#define GCK_URI_ERROR (gck_uri_error_get_quark ())
+#define GCK_URI_ERROR (gck_uri_error_quark ())
-GQuark gck_uri_error_get_quark (void) G_GNUC_CONST;
+GQuark gck_uri_error_quark (void) G_GNUC_CONST;
GckUriData* gck_uri_data_new (void);
-gchar* gck_uri_build (GckUriData *uri_data,
+gchar* gck_uri_data_build (GckUriData *uri_data,
GckUriFlags flags);
-GckUriData* gck_uri_parse (const gchar *string,
+GckUriData* gck_uri_data_parse (const gchar *string,
GckUriFlags flags,
GError **error);
@@ -1595,8 +1451,6 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckUriData, gck_uri_data_free);
G_END_DECLS
-#include "gck-deprecated.h"
-
#undef __GCK_INSIDE_HEADER__
#endif /* GCK_H */
diff --git a/gck/gck.symbols b/gck/gck.symbols
index ae784c9..0bd62e5 100644
--- a/gck/gck.symbols
+++ b/gck/gck.symbols
@@ -55,7 +55,6 @@ gck_attributes_new
gck_attributes_new_empty
gck_attributes_new_full
gck_attributes_ref
-gck_attributes_ref_sink
gck_attributes_set
gck_attributes_set_all
gck_attributes_set_boolean
@@ -99,7 +98,6 @@ gck_builder_set_empty
gck_builder_set_invalid
gck_builder_set_string
gck_builder_set_ulong
-gck_builder_steal
gck_builder_take_data
gck_builder_unref
gck_enumerator_get_chained
diff --git a/gck/meson.build b/gck/meson.build
index e461509..fa108ef 100644
--- a/gck/meson.build
+++ b/gck/meson.build
@@ -18,7 +18,6 @@ gck_sources_public = files(
gck_sources_private = files(
'gck-call.c',
- 'gck-interaction.c',
)
gck_headers = files(
@@ -57,7 +56,6 @@ gck_sources = [
gck_exported_headers = [
gck_headers,
gck_version_h,
- 'gck-deprecated.h',
'pkcs11.h',
'pkcs11n.h',
'pkcs11x.h',
@@ -94,7 +92,8 @@ gck_lib = shared_library(gck_basename,
link_args: gck_linkflags,
link_depends: gck_symbolmap,
include_directories: config_h_dir,
- version: gck_soversion,
+ version: gck_version,
+ soversion: gck_soversion,
install: true,
)
diff --git a/gck/test-gck-crypto.c b/gck/test-gck-crypto.c
index b7e2118..2bc535c 100644
--- a/gck/test-gck-crypto.c
+++ b/gck/test-gck-crypto.c
@@ -27,6 +27,7 @@
#include "gck/gck-test.h"
#include "egg/egg-testing.h"
+#include "egg/mock-interaction.h"
#include <glib.h>
@@ -54,6 +55,7 @@ setup (Test *test, gconstpointer unused)
GError *err = NULL;
GList *slots;
GckSlot *slot;
+ GTlsInteraction *interaction;
/* Successful load */
test->module = gck_module_initialize (_GCK_TEST_MODULE_PATH, NULL, &err);
@@ -64,7 +66,7 @@ setup (Test *test, gconstpointer unused)
slots = gck_module_get_slots (test->module, TRUE);
g_assert_nonnull (slots);
- test->session = gck_slot_open_session (slots->data, 0, NULL, &err);
+ test->session = gck_slot_open_session (slots->data, 0, NULL, NULL, &err);
g_assert_no_error (err);
g_assert_true (GCK_IS_SESSION (test->session));
g_object_add_weak_pointer (G_OBJECT (test->session), (gpointer *)&test->session);
@@ -74,6 +76,10 @@ setup (Test *test, gconstpointer unused)
test->session_with_auth = gck_session_from_handle (slot, gck_session_get_handle (test->session), GCK_SESSION_AUTHENTICATE);
g_signal_connect (test->session_with_auth, "discard-handle", G_CALLBACK (on_discard_handle_ignore), NULL);
+ interaction = mock_interaction_new ("booo");
+ gck_session_set_interaction (test->session_with_auth, interaction);
+ g_object_unref (interaction);
+
g_assert_nonnull (test->session_with_auth);
g_object_add_weak_pointer (G_OBJECT (test->session_with_auth), (gpointer *)&test->session_with_auth);
@@ -109,12 +115,15 @@ find_key (GckSession *session, CK_ATTRIBUTE_TYPE method, CK_MECHANISM_TYPE mech)
GckBuilder builder = GCK_BUILDER_INIT;
GList *objects, *l;
GckObject *object = NULL;
+ GckAttributes *attributes;
CK_MECHANISM_TYPE_PTR mechs;
gboolean match;
gsize n_mechs;
gck_builder_add_boolean (&builder, method, TRUE);
- objects = gck_session_find_objects (session, gck_builder_end (&builder), NULL, NULL);
+ attributes = gck_builder_end (&builder);
+ objects = gck_session_find_objects (session, attributes, NULL, NULL);
+ gck_attributes_unref (attributes);
g_assert_nonnull (objects);
for (l = objects; l; l = g_list_next (l)) {
@@ -144,11 +153,14 @@ static GckObject*
find_key_with_value (GckSession *session, const gchar *value)
{
GckBuilder builder = GCK_BUILDER_INIT;
+ GckAttributes *attributes;
GList *objects;
GckObject *object;
gck_builder_add_string (&builder, CKA_VALUE, value);
- objects = gck_session_find_objects (session, gck_builder_end (&builder), NULL, NULL);
+ attributes = gck_builder_end (&builder);
+ objects = gck_session_find_objects (session, attributes, NULL, NULL);
+ gck_attributes_unref (attributes);
g_assert_nonnull (objects);
object = g_object_ref (objects->data);
@@ -178,18 +190,6 @@ check_key_with_value (GckSession *session, GckObject *key, CK_OBJECT_CLASS klass
gck_attributes_unref (attrs);
}
-static gboolean
-authenticate_object (GckSlot *module, GckObject *object, gchar *label, gchar **password)
-{
- g_assert_true (GCK_IS_MODULE (module));
- g_assert_true (GCK_IS_OBJECT (object));
- g_assert_nonnull (password);
- g_assert_null (*password);
-
- *password = g_strdup ("booo");
- return TRUE;
-}
-
static void
test_encrypt (Test *test, gconstpointer unused)
{
@@ -306,9 +306,6 @@ test_sign (Test *test, gconstpointer unused)
guchar *output;
gsize n_output;
- /* Enable auto-login on this test->session, see previous test */
- g_signal_connect (test->module, "authenticate-object", G_CALLBACK (authenticate_object), NULL);
-
/* Find the right key */
key = find_key (test->session_with_auth, CKA_SIGN, CKM_MOCK_PREFIX);
g_assert_nonnull (key);
@@ -345,11 +342,14 @@ test_verify (Test *test, gconstpointer unused)
GckMechanism mech = { CKM_MOCK_PREFIX, (guchar *)"my-prefix:", 10 };
GError *error = NULL;
GAsyncResult *result = NULL;
+ GTlsInteraction *interaction;
GckObject *key;
gboolean ret;
/* Enable auto-login on this session, shouldn't be needed */
- g_signal_connect (test->module, "authenticate-object", G_CALLBACK (authenticate_object), NULL);
+ interaction = mock_interaction_new ("booo");
+ gck_session_set_interaction (test->session, interaction);
+ g_object_unref (interaction);
/* Find the right key */
key = find_key (test->session, CKA_VERIFY, CKM_MOCK_PREFIX);
@@ -408,9 +408,9 @@ test_generate_key_pair (Test *test, gconstpointer unused)
gboolean ret;
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY);
- pub_attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ pub_attrs = gck_builder_end (&builder);
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY);
- prv_attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ prv_attrs = gck_builder_end (&builder);
/* Full One*/
ret = gck_session_generate_key_pair_full (test->session, &mech, pub_attrs, prv_attrs,
@@ -540,7 +540,7 @@ test_unwrap_key (Test *test, gconstpointer unused)
wrapper = find_key (test->session, CKA_UNWRAP, 0);
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_SECRET_KEY);
- attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ attrs = gck_builder_end (&builder);
/* Full One*/
unwrapped = gck_session_unwrap_key_full (test->session, wrapper, &mech, (const guchar *)"special", 7, attrs, NULL, &error);
@@ -596,7 +596,7 @@ test_derive_key (Test *test, gconstpointer unused)
wrapper = find_key (test->session, CKA_DERIVE, 0);
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_SECRET_KEY);
- attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ attrs = gck_builder_end (&builder);
/* Full One*/
derived = gck_session_derive_key_full (test->session, wrapper, &mech, attrs, NULL, &error);
diff --git a/gck/test-gck-enumerator.c b/gck/test-gck-enumerator.c
index e7ad139..4776ce5 100644
--- a/gck/test-gck-enumerator.c
+++ b/gck/test-gck-enumerator.c
@@ -230,6 +230,7 @@ test_enumerate_session (Test *test,
gconstpointer unused)
{
GckBuilder builder = GCK_BUILDER_INIT;
+ GckAttributes *attributes;
GckEnumerator *en;
GError *error = NULL;
GckSession *session;
@@ -243,7 +244,9 @@ test_enumerate_session (Test *test,
session = gck_session_open (slots->data, 0, NULL, NULL, &error);
g_assert_no_error (error);
- en = gck_session_enumerate_objects (session, gck_builder_end (&builder));
+ attributes = gck_builder_end (&builder);
+ en = gck_session_enumerate_objects (session, attributes);
+ gck_attributes_unref (attributes);
g_assert_true (GCK_IS_ENUMERATOR (en));
obj = gck_enumerator_next (en, NULL, &error);
@@ -266,7 +269,7 @@ test_attribute_match (Test *test, gconstpointer unused)
uri_data = gck_uri_data_new ();
gck_builder_add_string (&builder, CKA_LABEL, "Private Capitalize Key");
- uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder));
+ uri_data->attributes = gck_builder_end (&builder);
en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
g_assert_true (GCK_IS_ENUMERATOR (en));
@@ -280,8 +283,8 @@ test_attribute_match (Test *test, gconstpointer unused)
}
static void
-test_authenticate_interaction (Test *test,
- gconstpointer unused)
+test_authenticate (Test *test,
+ gconstpointer unused)
{
GTlsInteraction *interaction;
GTlsInteraction *check;
@@ -317,54 +320,6 @@ test_authenticate_interaction (Test *test,
g_assert_null (interaction);
}
-static gboolean
-on_authenticate_token (GckModule *module,
- GckSlot *slot,
- gchar *label,
- gchar **password,
- gpointer unused)
-{
- g_assert_true (unused == GUINT_TO_POINTER (35));
- g_assert_nonnull (password);
- g_assert_null (*password);
- g_assert_true (GCK_IS_MODULE (module));
- g_assert_true (GCK_IS_SLOT (slot));
-
- *password = g_strdup ("booo");
- return TRUE;
-}
-
-static void
-test_authenticate_compat (Test *test,
- gconstpointer unused)
-{
- GckUriData *uri_data;
- GError *error = NULL;
- GckEnumerator *en;
- GckObject *obj;
- gulong sig;
-
- sig = g_signal_connect (test->modules->data, "authenticate-slot",
- G_CALLBACK (on_authenticate_token), GUINT_TO_POINTER (35));
-
- uri_data = gck_uri_data_new ();
- en = _gck_enumerator_new_for_modules (test->modules, GCK_SESSION_LOGIN_USER, uri_data);
- g_assert_true (GCK_IS_ENUMERATOR (en));
- g_object_add_weak_pointer (G_OBJECT (en), (gpointer *)&en);
-
- obj = gck_enumerator_next (en, NULL, &error);
- g_assert_true (GCK_IS_OBJECT (obj));
- g_object_add_weak_pointer (G_OBJECT (obj), (gpointer *)&obj);
-
- g_object_unref (obj);
- g_object_unref (en);
-
- g_signal_handler_disconnect (test->modules->data, sig);
-
- g_assert_null (obj);
- g_assert_null (en);
-}
-
static void
test_token_match (Test *test, gconstpointer unused)
{
@@ -408,7 +363,7 @@ typedef struct {
} MockObjectClass;
GType mock_object_get_type (void) G_GNUC_CONST;
-static void mock_object_cache_init (GckObjectCacheIface *iface);
+static void mock_object_cache_init (GckObjectCacheInterface *iface);
#define MOCK_TYPE_OBJECT (mock_object_get_type())
#define MOCK_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), MOCK_TYPE_OBJECT, MockObject))
@@ -494,11 +449,11 @@ mock_object_fill (GckObjectCache *object,
gck_builder_set_all (&builder, attrs);
gck_attributes_unref (self->attrs);
- self->attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ self->attrs = gck_builder_end (&builder);
}
static void
-mock_object_cache_init (GckObjectCacheIface *iface)
+mock_object_cache_init (GckObjectCacheInterface *iface)
{
iface->default_types = mock_attribute_types;
iface->n_default_types = G_N_ELEMENTS (mock_attribute_types);
@@ -576,18 +531,18 @@ test_chained (Test *test,
uri_data = gck_uri_data_new ();
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY);
- uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder));
+ uri_data->attributes = gck_builder_end (&builder);
one = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
uri_data = gck_uri_data_new ();
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY);
- uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder));
+ uri_data->attributes = gck_builder_end (&builder);
two = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
gck_enumerator_set_chained (one, two);
uri_data = gck_uri_data_new ();
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA);
- uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder));
+ uri_data->attributes = gck_builder_end (&builder);
three = _gck_enumerator_new_for_modules (test->modules, 0, uri_data);
gck_enumerator_set_chained (two, three);
@@ -617,8 +572,7 @@ main (int argc, char **argv)
g_test_add ("/gck/enumerator/next_n", Test, NULL, setup, test_next_n, teardown);
g_test_add ("/gck/enumerator/next_async", Test, NULL, setup, test_next_async, teardown);
g_test_add ("/gck/enumerator/session", Test, NULL, setup, test_enumerate_session, teardown);
- g_test_add ("/gck/enumerator/authenticate-interaction", Test, NULL, setup, test_authenticate_interaction, teardown);
- g_test_add ("/gck/enumerator/authenticate-compat", Test, NULL, setup, test_authenticate_compat, teardown);
+ g_test_add ("/gck/enumerator/authenticate", Test, NULL, setup, test_authenticate, teardown);
g_test_add ("/gck/enumerator/attribute_match", Test, NULL, setup, test_attribute_match, teardown);
g_test_add ("/gck/enumerator/token_match", Test, NULL, setup, test_token_match, teardown);
g_test_add ("/gck/enumerator/attribute_get", Test, NULL, setup, test_attribute_get, teardown);
diff --git a/gck/test-gck-module.c b/gck/test-gck-module.c
index 91e7e4d..4ffdbc6 100644
--- a/gck/test-gck-module.c
+++ b/gck/test-gck-module.c
@@ -95,14 +95,14 @@ test_invalid_modules (Test *test, gconstpointer unused)
/* Shouldn't be able to load modules */
invalid = gck_module_initialize ("blah-blah-non-existant", NULL, &error);
- g_assert_error (error, GCK_ERROR, (int)CKR_GCK_MODULE_PROBLEM);
+ g_assert_error (error, GCK_ERROR, (int)GCK_ERROR_MODULE_PROBLEM);
g_assert_null (invalid);
g_clear_error (&error);
/* Shouldn't be able to load any file successfully */
invalid = gck_module_initialize ("/usr/lib/libm.so", NULL, &error);
- g_assert_error (error, GCK_ERROR, (int)CKR_GCK_MODULE_PROBLEM);
+ g_assert_error (error, GCK_ERROR, (int)GCK_ERROR_MODULE_PROBLEM);
g_assert_null (invalid);
g_clear_error (&error);
@@ -126,7 +126,7 @@ test_module_equals_hash (Test *test, gconstpointer unused)
g_assert_true (gck_module_equal (test->module, other));
/* TODO: Could do with another test for inequality */
- g_assert_false (gck_module_equal (test->module, obj));
+ g_assert_false (gck_module_equal (test->module, (GckModule *) obj));
g_object_unref (other);
g_object_unref (obj);
diff --git a/gck/test-gck-modules.c b/gck/test-gck-modules.c
index 1468b9b..96928da 100644
--- a/gck/test-gck-modules.c
+++ b/gck/test-gck-modules.c
@@ -67,10 +67,13 @@ test_enumerate_objects (Test *test, gconstpointer unused)
GckBuilder builder = GCK_BUILDER_INIT;
GError *error = NULL;
GckEnumerator *en;
+ GckAttributes *attributes;
GList *objects;
gck_builder_add_string (&builder, CKA_LABEL, "Private Capitalize Key");
- en = gck_modules_enumerate_objects (test->modules, gck_builder_end (&builder), 0);
+ attributes = gck_builder_end (&builder);
+ en = gck_modules_enumerate_objects (test->modules, attributes, 0);
+ gck_attributes_unref (attributes);
g_assert_true (GCK_IS_ENUMERATOR (en));
objects = gck_enumerator_next_n (en, -1, NULL, &error);
@@ -114,7 +117,7 @@ test_token_for_uri_error (Test *test, gconstpointer unused)
slot = gck_modules_token_for_uri (test->modules, "http://invalid.uri", &error);
g_assert_null (slot);
- g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_PREFIX);
+ g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_SCHEME);
g_error_free (error);
}
@@ -148,7 +151,7 @@ test_object_for_uri_error (Test *test, gconstpointer unused)
object = gck_modules_object_for_uri (test->modules, "http://invalid.uri", 0, &error);
g_assert_null (object);
- g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_PREFIX);
+ g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_SCHEME);
g_error_free (error);
}
diff --git a/gck/test-gck-object.c b/gck/test-gck-object.c
index 4741898..d75f970 100644
--- a/gck/test-gck-object.c
+++ b/gck/test-gck-object.c
@@ -60,7 +60,7 @@ setup (Test *test, gconstpointer unused)
g_object_ref (test->slot);
gck_list_unref_free (slots);
- test->session = gck_slot_open_session (test->slot, 0, NULL, &err);
+ test->session = gck_slot_open_session (test->slot, 0, NULL, NULL, &err);
g_assert_no_error (err);
g_assert_true (GCK_IS_SESSION (test->session));
@@ -108,7 +108,7 @@ test_object_equals_hash (Test *test, gconstpointer unused)
g_assert_true (gck_object_equal (test->object, test->object));
other_slot = g_object_new (GCK_TYPE_SLOT, "module", test->module, "handle", GCK_MOCK_SLOT_TWO_ID, NULL);
- other_session = gck_slot_open_session (other_slot, 0, NULL, &err);
+ other_session = gck_slot_open_session (other_slot, 0, NULL, NULL, &err);
g_assert_no_error (err);
g_assert_true (GCK_IS_SESSION (other_session));
other_object = gck_object_from_handle (other_session, gck_object_get_handle (test->object));
@@ -118,7 +118,7 @@ test_object_equals_hash (Test *test, gconstpointer unused)
g_object_unref (other_object);
obj = g_object_new (G_TYPE_OBJECT, NULL);
- g_assert_false (gck_object_equal (test->object, obj));
+ g_assert_false (gck_object_equal (test->object, (GckObject *) obj));
g_object_unref (obj);
other_object = gck_object_from_handle (test->session, 383838);
@@ -152,7 +152,7 @@ test_create_object (Test *test, gconstpointer unused)
gck_builder_add_string (&builder, CKA_LABEL, "TEST LABEL");
gck_builder_add_boolean (&builder, CKA_TOKEN, CK_FALSE);
gck_builder_add_data (&builder, CKA_VALUE, (const guchar *)"BLAH", 4);
- attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ attrs = gck_builder_end (&builder);
object = gck_session_create_object (test->session, attrs, NULL, &err);
g_assert_true (GCK_IS_OBJECT (object));
@@ -190,7 +190,7 @@ test_destroy_object (Test *test, gconstpointer unused)
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA);
gck_builder_add_string (&builder, CKA_LABEL, "TEST OBJECT");
gck_builder_add_boolean (&builder, CKA_TOKEN, CK_TRUE);
- attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ attrs = gck_builder_end (&builder);
/* Using simple */
object = gck_session_create_object (test->session, attrs, NULL, &err);
@@ -322,7 +322,9 @@ test_set_attributes (Test *test, gconstpointer unused)
gck_builder_add_string (&builder, CKA_LABEL, "CHANGE TWO");
/* Full */
- ret = gck_object_set (test->object, gck_builder_end (&builder), NULL, &err);
+ attrs = gck_builder_end (&builder);
+ ret = gck_object_set (test->object, attrs, NULL, &err);
+ gck_attributes_unref (attrs);
g_assert_no_error (err);
g_assert_true (ret);
attrs = gck_object_get (test->object, NULL, &err, CKA_CLASS, CKA_LABEL, GCK_INVALID);
@@ -335,7 +337,9 @@ test_set_attributes (Test *test, gconstpointer unused)
gck_builder_add_string (&builder, CKA_LABEL, "CHANGE THREE");
/* Async */
- gck_object_set_async (test->object, gck_builder_end (&builder), NULL, fetch_async_result, &result);
+ attrs = gck_builder_end (&builder);
+ gck_object_set_async (test->object, attrs, NULL, fetch_async_result, &result);
+ gck_attributes_unref (attrs);
egg_test_wait_until (500);
g_assert_nonnull (result);
@@ -355,36 +359,47 @@ test_find_objects (Test *test, gconstpointer unused)
{
GckBuilder builder = GCK_BUILDER_INIT;
GAsyncResult *result = NULL;
+ GckAttributes *attributes;
GList *objects;
GckObject *testobj;
GError *err = NULL;
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA);
gck_builder_add_string (&builder, CKA_LABEL, "UNIQUE LABEL");
- testobj = gck_session_create_object (test->session, gck_builder_end (&builder), NULL, &err);
+ attributes = gck_builder_end (&builder);
+ testobj = gck_session_create_object (test->session, attributes, NULL, &err);
+ gck_attributes_unref (attributes);
g_object_unref (testobj);
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA);
gck_builder_add_string (&builder, CKA_LABEL, "OTHER LABEL");
- testobj = gck_session_create_object (test->session, gck_builder_end (&builder), NULL, &err);
+ attributes = gck_builder_end (&builder);
+ testobj = gck_session_create_object (test->session, attributes, NULL, &err);
+ gck_attributes_unref (attributes);
g_object_unref (testobj);
/* Simple, "TEST LABEL" */
gck_builder_add_string (&builder, CKA_LABEL, "UNIQUE LABEL");
- objects = gck_session_find_objects (test->session, gck_builder_end (&builder), NULL, &err);
+ attributes = gck_builder_end (&builder);
+ objects = gck_session_find_objects (test->session, attributes, NULL, &err);
+ gck_attributes_unref (attributes);
g_assert_no_error (err);
g_assert_cmpuint (g_list_length (objects), ==, 1);
gck_list_unref_free (objects);
/* Full, All */
- objects = gck_session_find_objects (test->session, gck_builder_end (&builder), NULL, &err);
+ attributes = gck_builder_end (&builder);
+ objects = gck_session_find_objects (test->session, attributes, NULL, &err);
+ gck_attributes_unref (attributes);
g_assert_no_error (err);
g_assert_cmpuint (g_list_length (objects), >, 1);
gck_list_unref_free (objects);
/* Async, None */
gck_builder_add_string (&builder, CKA_LABEL, "blah blah");
- gck_session_find_objects_async (test->session, gck_builder_end (&builder), NULL, fetch_async_result, &result);
+ attributes = gck_builder_end (&builder);
+ gck_session_find_objects_async (test->session, attributes, NULL, fetch_async_result, &result);
+ gck_attributes_unref (attributes);
egg_test_wait_until (500);
g_assert_nonnull (result);
diff --git a/gck/test-gck-session.c b/gck/test-gck-session.c
index 0a296df..055a92d 100644
--- a/gck/test-gck-session.c
+++ b/gck/test-gck-session.c
@@ -61,7 +61,7 @@ setup (Test *test, gconstpointer unused)
gck_list_unref_free (slots);
g_object_add_weak_pointer (G_OBJECT (test->slot), (gpointer *)&test->slot);
- test->session = gck_slot_open_session (test->slot, 0, NULL, &err);
+ test->session = gck_slot_open_session (test->slot, 0, NULL, NULL, &err);
g_assert_no_error (err);
g_assert_true (GCK_IS_SESSION (test->session));
g_object_add_weak_pointer (G_OBJECT (test->session), (gpointer *)&test->session);
@@ -127,14 +127,14 @@ test_open_close_session (Test *test, gconstpointer unused)
GAsyncResult *result = NULL;
GError *err = NULL;
- sess = gck_slot_open_session (test->slot, 0, NULL, &err);
+ sess = gck_slot_open_session (test->slot, 0, NULL, NULL, &err);
g_assert_no_error (err);
g_assert_true (GCK_IS_SESSION (sess));
g_object_unref (sess);
/* Test opening async */
- gck_slot_open_session_async (test->slot, 0, NULL, fetch_async_result, &result);
+ gck_slot_open_session_async (test->slot, 0, NULL, NULL, fetch_async_result, &result);
egg_test_wait_until (500);
g_assert_nonnull (result);
@@ -418,19 +418,6 @@ test_login_interactive (Test *test,
g_object_unref (interaction);
}
-static gboolean
-authenticate_token (GckModule *module, GckSlot *slot, gchar *label, gchar **password, gpointer unused)
-{
- g_assert_true (unused == GUINT_TO_POINTER (35));
- g_assert_nonnull (password);
- g_assert_null (*password);
- g_assert_true (GCK_IS_MODULE (module));
- g_assert_true (GCK_IS_SLOT (slot));
-
- *password = g_strdup ("booo");
- return TRUE;
-}
-
static void
test_auto_login (Test *test, gconstpointer unused)
{
@@ -440,12 +427,13 @@ test_auto_login (Test *test, gconstpointer unused)
GAsyncResult *result = NULL;
GError *err = NULL;
GckAttributes *attrs;
+ GTlsInteraction *test_interaction;
gboolean ret;
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA);
gck_builder_add_string (&builder, CKA_LABEL, "TEST OBJECT");
gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_TRUE);
- attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ attrs = gck_builder_end (&builder);
/* Try to do something that requires a login */
object = gck_session_create_object (test->session, attrs, NULL, &err);
@@ -454,8 +442,9 @@ test_auto_login (Test *test, gconstpointer unused)
g_clear_error (&err);
/* Setup for auto login */
- g_signal_connect (test->module, "authenticate-slot", G_CALLBACK (authenticate_token), GUINT_TO_POINTER (35));
- new_session = gck_slot_open_session (test->slot, GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER, NULL, &err);
+ test_interaction = mock_interaction_new ("booo");
+ new_session = gck_slot_open_session (test->slot, GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER, test_interaction, NULL, &err);
+ g_object_unref (test_interaction);
g_assert_no_error (err);
g_assert_true (GCK_IS_SESSION (new_session));
@@ -473,10 +462,12 @@ test_auto_login (Test *test, gconstpointer unused)
g_object_unref (new_session);
/* Now try the same thing, but asyncronously */
- gck_slot_open_session_async (test->slot, GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER, NULL, fetch_async_result, &result);
+ test_interaction = mock_interaction_new ("booo");
+ gck_slot_open_session_async (test->slot, GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER, test_interaction, NULL, fetch_async_result, &result);
egg_test_wait_until (500);
g_assert_nonnull (result);
new_session = gck_slot_open_session_finish (test->slot, result, &err);
+ g_object_unref (test_interaction);
g_assert_no_error (err);
g_assert_true (GCK_IS_SESSION (new_session));
g_object_unref (result);
diff --git a/gck/test-gck-slot.c b/gck/test-gck-slot.c
index c314233..6d09c42 100644
--- a/gck/test-gck-slot.c
+++ b/gck/test-gck-slot.c
@@ -156,7 +156,7 @@ test_slot_equals_hash (Test *test, gconstpointer unused)
g_object_unref (other_slot);
obj = g_object_new (G_TYPE_OBJECT, NULL);
- g_assert_false (gck_slot_equal (test->slot, obj));
+ g_assert_false (gck_slot_equal (test->slot, (GckSlot *) obj));
g_object_unref (obj);
other_slot = g_object_new (GCK_TYPE_SLOT, "module", test->module, "handle", 8909, NULL);
@@ -182,7 +182,7 @@ test_slot_mechanisms (Test *test, gconstpointer unused)
gck_mechanism_info_free (info);
}
- gck_mechanisms_free (mechs);
+ g_array_unref (mechs);
}
static void
diff --git a/gck/test-gck-uri.c b/gck/test-gck-uri.c
index bbfddda..1d76975 100644
--- a/gck/test-gck-uri.c
+++ b/gck/test-gck-uri.c
@@ -37,7 +37,7 @@ test_parse (void)
GError *error = NULL;
GckUriData *uri_data;
- uri_data = gck_uri_parse ("pkcs11:", GCK_URI_FOR_MODULE, &error);
+ uri_data = gck_uri_data_parse ("pkcs11:", GCK_URI_FOR_MODULE, &error);
g_assert_nonnull (uri_data);
g_assert_no_error (error);
@@ -57,9 +57,9 @@ test_parse_bad_scheme (void)
GError *error = NULL;
GckUriData *uri_data;
- uri_data = gck_uri_parse ("http:\\example.com\test", GCK_URI_FOR_ANY, &error);
+ uri_data = gck_uri_data_parse ("http:\\example.com\test", GCK_URI_FOR_ANY, &error);
g_assert_null (uri_data);
- g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_PREFIX);
+ g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_SCHEME);
g_error_free (error);
}
@@ -70,7 +70,7 @@ test_parse_with_label (void)
GckUriData *uri_data;
gchar *value;
- uri_data = gck_uri_parse ("pkcs11:object=Test%20Label", GCK_URI_FOR_ANY, &error);
+ uri_data = gck_uri_data_parse ("pkcs11:object=Test%20Label", GCK_URI_FOR_ANY, &error);
g_assert_nonnull (uri_data);
g_assert_nonnull (uri_data->attributes);
@@ -91,7 +91,7 @@ test_parse_with_label_and_klass (void)
gchar *value;
gulong klass;
- uri_data = gck_uri_parse ("pkcs11:object=Test%20Label;objecttype=cert", GCK_URI_FOR_ANY, &error);
+ uri_data = gck_uri_data_parse ("pkcs11:object=Test%20Label;objecttype=cert", GCK_URI_FOR_ANY, &error);
g_assert_nonnull (uri_data);
g_assert_nonnull (uri_data->attributes);
@@ -115,7 +115,7 @@ test_parse_with_id (void)
const GckAttribute *attr;
GckUriData *uri_data;
- uri_data = gck_uri_parse ("pkcs11:id=%54%45%53%54%00", GCK_URI_FOR_OBJECT, &error);
+ uri_data = gck_uri_data_parse ("pkcs11:id=%54%45%53%54%00", GCK_URI_FOR_OBJECT, &error);
g_assert_nonnull (uri_data);
g_assert_nonnull (uri_data->attributes);
@@ -133,7 +133,7 @@ test_parse_with_bad_string_encoding (void)
GError *error = NULL;
GckUriData *uri_data;
- uri_data = gck_uri_parse ("pkcs11:object=Test%", GCK_URI_FOR_OBJECT, &error);
+ uri_data = gck_uri_data_parse ("pkcs11:object=Test%", GCK_URI_FOR_OBJECT, &error);
g_assert_null (uri_data);
g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING);
g_error_free (error);
@@ -144,7 +144,7 @@ test_parse_with_bad_binary_encoding (void)
{
GError *error = NULL;
GckUriData *uri_data;
- uri_data = gck_uri_parse ("pkcs11:id=%%", GCK_URI_FOR_ANY, &error);
+ uri_data = gck_uri_data_parse ("pkcs11:id=%%", GCK_URI_FOR_ANY, &error);
g_assert_null (uri_data);
g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING);
g_error_free (error);
@@ -156,7 +156,7 @@ test_parse_with_token (void)
GError *error = NULL;
GckUriData *uri_data = NULL;
- uri_data = gck_uri_parse ("pkcs11:token=Token%20Label;serial=3333;model=Deluxe;manufacturer=Me",
+ uri_data = gck_uri_data_parse ("pkcs11:token=Token%20Label;serial=3333;model=Deluxe;manufacturer=Me",
GCK_URI_FOR_TOKEN, &error);
g_assert_nonnull (uri_data);
@@ -174,7 +174,7 @@ test_parse_with_token_bad_encoding (void)
GError *error = NULL;
GckUriData *uri_data;
- uri_data = gck_uri_parse ("pkcs11:token=Token%", GCK_URI_FOR_TOKEN, &error);
+ uri_data = gck_uri_data_parse ("pkcs11:token=Token%", GCK_URI_FOR_TOKEN, &error);
g_assert_null (uri_data);
g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING);
g_error_free (error);
@@ -186,7 +186,7 @@ test_parse_with_bad_syntax (void)
GError *error = NULL;
GckUriData *uri_data;
- uri_data = gck_uri_parse ("pkcs11:token", GCK_URI_FOR_ANY, &error);
+ uri_data = gck_uri_data_parse ("pkcs11:token", GCK_URI_FOR_ANY, &error);
g_assert_null (uri_data);
g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_SYNTAX);
g_error_free (error);
@@ -198,7 +198,7 @@ test_parse_with_library (void)
GError *error = NULL;
GckUriData *uri_data = NULL;
- uri_data = gck_uri_parse ("pkcs11:library-description=The%20Library;library-manufacturer=Me",
+ uri_data = gck_uri_data_parse ("pkcs11:library-description=The%20Library;library-manufacturer=Me",
GCK_URI_FOR_MODULE, &error);
g_assert_nonnull (uri_data);
@@ -214,7 +214,7 @@ test_parse_with_library_bad_encoding (void)
GError *error = NULL;
GckUriData *uri_data;
- uri_data = gck_uri_parse ("pkcs11:library-description=Library%", GCK_URI_FOR_MODULE, &error);
+ uri_data = gck_uri_data_parse ("pkcs11:library-description=Library%", GCK_URI_FOR_MODULE, &error);
g_assert_null (uri_data);
g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING);
g_error_free (error);
@@ -227,7 +227,7 @@ test_build_empty (void)
gchar *uri;
memset (&uri_data, 0, sizeof (uri_data));
- uri = gck_uri_build (&uri_data, 0);
+ uri = gck_uri_data_build (&uri_data, 0);
g_assert_cmpstr (uri, ==, "pkcs11:");
g_free (uri);
}
@@ -246,10 +246,10 @@ test_build_with_token_info (void)
uri_data.token_info->manufacturer_id = g_strdup ("Me");
uri_data.token_info->model = g_strdup ("Deluxe");
- uri = gck_uri_build (&uri_data, GCK_URI_FOR_TOKEN);
+ uri = gck_uri_data_build (&uri_data, GCK_URI_FOR_TOKEN);
g_assert_nonnull (uri);
- check = gck_uri_parse (uri, GCK_URI_FOR_TOKEN, NULL);
+ check = gck_uri_data_parse (uri, GCK_URI_FOR_TOKEN, NULL);
g_assert_nonnull (check);
g_assert_nonnull (check->token_info);
@@ -277,7 +277,7 @@ test_build_with_token_null_info (void)
uri_data.token_info = g_new0 (GckTokenInfo, 1);
uri_data.token_info->label = g_strdup ("The Label");
- uri = gck_uri_build (&uri_data, GCK_URI_FOR_TOKEN);
+ uri = gck_uri_data_build (&uri_data, GCK_URI_FOR_TOKEN);
g_assert_nonnull (uri);
g_assert_true (g_str_has_prefix (uri, "pkcs11:"));
@@ -299,7 +299,7 @@ test_build_with_token_empty_info (void)
uri_data.token_info->label = g_strdup ("The Label");
uri_data.token_info->serial_number = g_strdup ("");
- uri = gck_uri_build (&uri_data, GCK_URI_FOR_TOKEN);
+ uri = gck_uri_data_build (&uri_data, GCK_URI_FOR_TOKEN);
g_assert_nonnull (uri);
g_assert_true (g_str_has_prefix (uri, "pkcs11:"));
@@ -325,14 +325,14 @@ test_build_with_attributes (void)
gck_builder_add_string (&builder, CKA_LABEL, "The Label");
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA);
gck_builder_add_data (&builder, CKA_ID, (const guchar *)"TEST", 5);
- uri_data.attributes = gck_attributes_ref_sink (gck_builder_end (&builder));
+ uri_data.attributes = gck_builder_end (&builder);
- uri = gck_uri_build (&uri_data, GCK_URI_FOR_OBJECT);
+ uri = gck_uri_data_build (&uri_data, GCK_URI_FOR_OBJECT);
g_assert_nonnull (uri);
gck_attributes_unref (uri_data.attributes);
- check = gck_uri_parse (uri, GCK_URI_FOR_ANY, NULL);
+ check = gck_uri_data_parse (uri, GCK_URI_FOR_ANY, NULL);
g_assert_nonnull (check);
g_assert_nonnull (check->attributes);
@@ -366,7 +366,7 @@ test_parse_private_key (void)
GError *error = NULL;
gulong klass;
- uri_data = gck_uri_parse ("pkcs11:objecttype=private", GCK_URI_FOR_OBJECT, &error);
+ uri_data = gck_uri_data_parse ("pkcs11:objecttype=private", GCK_URI_FOR_OBJECT, &error);
g_assert_nonnull (uri_data);
g_assert_no_error (error);
@@ -385,7 +385,7 @@ test_parse_secret_key (void)
GError *error = NULL;
gulong klass;
- uri_data = gck_uri_parse ("pkcs11:objecttype=secretkey", GCK_URI_FOR_OBJECT, &error);
+ uri_data = gck_uri_data_parse ("pkcs11:objecttype=secretkey", GCK_URI_FOR_OBJECT, &error);
g_assert_nonnull (uri_data);
g_assert_no_error (error);
@@ -405,7 +405,7 @@ test_parse_unknown_objecttype (void)
GError *error = NULL;
gulong klass;
- uri_data = gck_uri_parse ("pkcs11:objecttype=unknown", GCK_URI_FOR_OBJECT, &error);
+ uri_data = gck_uri_data_parse ("pkcs11:objecttype=unknown", GCK_URI_FOR_OBJECT, &error);
g_assert_nonnull (uri_data);
g_assert_no_error (error);
@@ -426,9 +426,9 @@ test_build_objecttype_cert (void)
uri_data = gck_uri_data_new ();
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE);
- uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder));
+ uri_data->attributes = gck_builder_end (&builder);
- uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT);
+ uri = gck_uri_data_build (uri_data, GCK_URI_FOR_OBJECT);
g_assert_nonnull (uri);
g_assert_true (strstr (uri, "object-type=cert") || strstr (uri, "type=cert"));
@@ -445,9 +445,9 @@ test_build_objecttype_private (void)
uri_data = gck_uri_data_new ();
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY);
- uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder));
+ uri_data->attributes = gck_builder_end (&builder);
- uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT);
+ uri = gck_uri_data_build (uri_data, GCK_URI_FOR_OBJECT);
g_assert_nonnull (uri);
g_assert_true (strstr (uri, "object-type=private") || strstr (uri, "type=private"));
@@ -464,9 +464,9 @@ test_build_objecttype_public (void)
uri_data = gck_uri_data_new ();
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY);
- uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder));
+ uri_data->attributes = gck_builder_end (&builder);
- uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT);
+ uri = gck_uri_data_build (uri_data, GCK_URI_FOR_OBJECT);
g_assert_nonnull (uri);
g_assert_true (strstr (uri, "object-type=public") ||
strstr (uri, "type=public"));
@@ -484,9 +484,9 @@ test_build_objecttype_secret (void)
uri_data = gck_uri_data_new ();
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_SECRET_KEY);
- uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder));
+ uri_data->attributes = gck_builder_end (&builder);
- uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT);
+ uri = gck_uri_data_build (uri_data, GCK_URI_FOR_OBJECT);
g_assert_nonnull (uri);
g_assert_true (strstr (uri, "object-type=secret-key") ||
strstr (uri, "type=secret-key"));
@@ -505,7 +505,7 @@ test_build_with_library (void)
uri_data->module_info = g_new0 (GckModuleInfo, 1);
uri_data->module_info->library_description = g_strdup ("The Description");
- uri = gck_uri_build (uri_data, GCK_URI_FOR_MODULE);
+ uri = gck_uri_data_build (uri_data, GCK_URI_FOR_MODULE);
g_assert_nonnull (uri);
g_assert_true (strstr (uri, "library-description=The%20Description"));
diff --git a/ui/fixtures/ca-certificates.crt b/gcr-gtk3/fixtures/ca-certificates.crt
index c30335f..c30335f 100644
--- a/ui/fixtures/ca-certificates.crt
+++ b/gcr-gtk3/fixtures/ca-certificates.crt
diff --git a/ui/fixtures/der-certificate.crt b/gcr-gtk3/fixtures/der-certificate.crt
index 56fa849..56fa849 100644
--- a/ui/fixtures/der-certificate.crt
+++ b/gcr-gtk3/fixtures/der-certificate.crt
Binary files differ
diff --git a/ui/fixtures/der-rsa-2048.p10 b/gcr-gtk3/fixtures/der-rsa-2048.p10
index 6355622..6355622 100644
--- a/ui/fixtures/der-rsa-2048.p10
+++ b/gcr-gtk3/fixtures/der-rsa-2048.p10
Binary files differ
diff --git a/ui/fixtures/email.p12 b/gcr-gtk3/fixtures/email.p12
index d45d0f8..d45d0f8 100644
--- a/ui/fixtures/email.p12
+++ b/gcr-gtk3/fixtures/email.p12
Binary files differ
diff --git a/ui/fixtures/pem-dsa-1024.key b/gcr-gtk3/fixtures/pem-dsa-1024.key
index ccb1e7b..ccb1e7b 100644
--- a/ui/fixtures/pem-dsa-1024.key
+++ b/gcr-gtk3/fixtures/pem-dsa-1024.key
diff --git a/ui/frob-certificate.c b/gcr-gtk3/frob-certificate.c
index f9cc259..41a5c0b 100644
--- a/ui/frob-certificate.c
+++ b/gcr-gtk3/frob-certificate.c
@@ -22,6 +22,7 @@
#include "config.h"
#include "gcr/gcr.h"
+#include "gcr-gtk3/gcr-gtk3.h"
#include "egg/egg-hex.h"
@@ -106,7 +107,7 @@ main(int argc, char *argv[])
if (argc > 1)
test_certificate (argv[1]);
else
- test_certificate (SRCDIR "/ui/fixtures/der-certificate.crt");
+ test_certificate (SRCDIR "/gcr-gtk3/fixtures/der-certificate.crt");
return 0;
}
diff --git a/gcr-gtk3/gcr-certificate-widget.c b/gcr-gtk3/gcr-certificate-widget.c
new file mode 100644
index 0000000..e5fefdc
--- /dev/null
+++ b/gcr-gtk3/gcr-certificate-widget.c
@@ -0,0 +1,677 @@
+/*
+ * Copyright 2021 Collabora Ltd.
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#include "config.h"
+
+#include <glib/gi18n-lib.h>
+
+#include <gcr-gtk3/gcr-certificate-widget.h>
+#include "gcr/gcr-certificate-extensions.h"
+#include "gcr/gcr-fingerprint.h"
+#include "gcr/gcr-oids.h"
+
+#include "gcr-section.h"
+
+#include "egg/egg-asn1x.h"
+#include "egg/egg-asn1-defs.h"
+#include "egg/egg-dn.h"
+#include "egg/egg-oid.h"
+#include "egg/egg-hex.h"
+
+struct _GcrCertificateWidget
+{
+ GtkBox parent_instance;
+
+ GcrCertificate *certificate;
+ GtkWidget *reveal_button;
+ GtkWidget *revealer;
+ GtkWidget *secondary_info;
+ GtkSizeGroup *size_group;
+};
+
+G_DEFINE_TYPE (GcrCertificateWidget, gcr_certificate_widget, GTK_TYPE_BOX)
+
+enum {
+ PROP_CERTIFICATE = 1,
+ N_PROPERTIES
+};
+
+static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
+
+static void
+gcr_certificate_widget_finalize (GObject *object)
+{
+ GcrCertificateWidget *self = (GcrCertificateWidget *)object;
+
+ g_clear_object (&self->size_group);
+
+ G_OBJECT_CLASS (gcr_certificate_widget_parent_class)->finalize (object);
+}
+
+static void
+gcr_certificate_widget_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (object);
+
+ switch (prop_id)
+ {
+ case PROP_CERTIFICATE:
+ g_value_set_object (value, gcr_certificate_widget_get_certificate (self));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gcr_certificate_widget_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (object);
+
+ switch (prop_id)
+ {
+ case PROP_CERTIFICATE:
+ gcr_certificate_widget_set_certificate (self, g_value_get_object (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+gcr_certificate_widget_class_init (GcrCertificateWidgetClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = gcr_certificate_widget_finalize;
+ object_class->get_property = gcr_certificate_widget_get_property;
+ object_class->set_property = gcr_certificate_widget_set_property;
+
+ obj_properties[PROP_CERTIFICATE] =
+ g_param_spec_object ("certificate",
+ "Certificate",
+ "Certificate to display.",
+ GCR_TYPE_CERTIFICATE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class,
+ N_PROPERTIES,
+ obj_properties);
+}
+
+static void
+on_reveal_button_clicked (GtkWidget *button,
+ GcrCertificateWidget *self)
+{
+ g_assert (GCR_IS_CERTIFICATE_WIDGET (self));
+ gtk_widget_hide (button);
+ gtk_revealer_set_reveal_child (GTK_REVEALER (self->revealer), TRUE);
+}
+
+static void
+gcr_certificate_widget_init (GcrCertificateWidget *self)
+{
+ gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL);
+ self->reveal_button = gtk_button_new_with_label ("…");
+ gtk_widget_set_halign (self->reveal_button, GTK_ALIGN_CENTER);
+ gtk_box_pack_end (GTK_BOX (self), self->reveal_button, FALSE, TRUE, 0);
+ self->secondary_info = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ self->revealer = g_object_new (GTK_TYPE_REVEALER,
+ "child", self->secondary_info,
+ "transition-type", GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN,
+ NULL);
+ gtk_box_pack_end (GTK_BOX (self), self->revealer, FALSE, TRUE, 0);
+ g_signal_connect (self->reveal_button, "clicked", G_CALLBACK (on_reveal_button_clicked), self);
+ self->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+}
+
+static GtkWidget*
+_gcr_certificate_widget_add_section (GcrCertificateWidget *self,
+ const gchar *title,
+ GIcon *icon,
+ gboolean important)
+{
+ GtkWidget *widget;
+
+ g_assert (GCR_IS_CERTIFICATE_WIDGET (self));
+
+ if (icon)
+ widget = gcr_section_new_with_icon (title, icon);
+ else
+ widget = gcr_section_new (title);
+
+ gtk_size_group_add_widget (self->size_group, widget);
+ if (important)
+ gtk_box_pack_start (GTK_BOX (self), widget, FALSE, TRUE, 0);
+ else
+ gtk_container_add (GTK_CONTAINER (self->secondary_info), widget);
+
+ return widget;
+}
+
+static GtkWidget*
+create_value_label (const gchar *label)
+{
+ return g_object_new (GTK_TYPE_LABEL,
+ "label", label,
+ "xalign", 1.0,
+ "halign", GTK_ALIGN_END,
+ "hexpand", TRUE,
+ "selectable", TRUE,
+ "wrap", TRUE,
+ NULL);
+}
+
+static gchar*
+calculate_label (GcrCertificateWidget *self)
+{
+ gchar *label;
+
+ label = gcr_certificate_get_subject_cn (self->certificate);
+ if (label != NULL)
+ return label;
+
+ return g_strdup (_("Certificate"));
+}
+
+static void
+on_parsed_dn_part (guint index,
+ GQuark oid,
+ GNode *value,
+ gpointer user_data)
+{
+ GtkWidget *section = user_data;
+ const gchar *attr;
+ const gchar *desc;
+ gchar *field = NULL;
+ gchar *display;
+
+ attr = egg_oid_get_name (oid);
+ desc = egg_oid_get_description (oid);
+
+ /* Combine them into something sane */
+ if (attr && desc) {
+ if (strcmp (attr, desc) == 0)
+ field = g_strdup (attr);
+ else
+ field = g_strdup_printf ("%s (%s)", attr, desc);
+ } else if (!attr && !desc) {
+ field = g_strdup ("");
+ } else if (attr) {
+ field = g_strdup (attr);
+ } else if (desc) {
+ field = g_strdup (desc);
+ } else {
+ g_assert_not_reached ();
+ }
+
+ display = egg_dn_print_value (oid, value);
+ if (display == NULL)
+ display = g_strdup ("");
+
+ gcr_section_add_child (GCR_SECTION (section), field, create_value_label (display));
+
+ g_free (field);
+ g_free (display);
+}
+
+static inline gchar *
+hex_encode_bytes (GBytes *bytes)
+{
+ gsize size;
+ gconstpointer data = g_bytes_get_data (bytes, &size);
+ return egg_hex_encode_full (data, size, TRUE, " ", 1);
+}
+
+static void
+append_subject_public_key (GcrCertificateWidget *self,
+ GcrSection *section,
+ GNode *subject_public_key)
+{
+ guint key_nbits;
+ const gchar *text;
+ gchar *display;
+ GBytes *value;
+ guchar *raw;
+ gsize n_raw;
+ GQuark oid;
+ guint bits;
+
+ key_nbits = gcr_certificate_get_key_size (self->certificate);
+
+ oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (subject_public_key,
+ "algorithm", "algorithm", NULL));
+ text = egg_oid_get_description (oid);
+ gcr_section_add_child (section, _("Key Algorithm"), create_value_label (text));
+
+ value = egg_asn1x_get_element_raw (egg_asn1x_node (subject_public_key,
+ "algorithm", "parameters", NULL));
+ if (value) {
+ display = hex_encode_bytes (value);
+ gcr_section_add_child (section, _("Key Parameters"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ g_bytes_unref (value);
+ }
+
+ if (key_nbits > 0) {
+ display = g_strdup_printf ("%u", key_nbits);
+ gcr_section_add_child (section, _("Key Size"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ }
+
+ value = egg_asn1x_get_element_raw (subject_public_key);
+ raw = gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (value, NULL),
+ g_bytes_get_size (value),
+ G_CHECKSUM_SHA1, &n_raw);
+ g_bytes_unref (value);
+ display = egg_hex_encode_full (raw, n_raw, TRUE, " ", 1);
+ g_free (raw);
+ gcr_section_add_child (section, _("Key SHA1 Fingerprint"), create_value_label (text));
+ g_clear_pointer (&display, g_free);
+
+ value = egg_asn1x_get_bits_as_raw (egg_asn1x_node (subject_public_key, "subjectPublicKey", NULL), &bits);
+ display = egg_hex_encode_full (g_bytes_get_data (value, NULL), bits / 8, TRUE, " ", 1);
+ gcr_section_add_child (section, _("Public Key"), create_value_label (text));
+ g_clear_pointer (&display, g_free);
+ g_bytes_unref (value);
+}
+
+static GcrSection *
+append_extension_basic_constraints (GcrCertificateWidget *self,
+ GBytes *data)
+{
+ GcrSection *section;
+ gboolean is_ca = FALSE;
+ gint path_len = -1;
+ gchar *number;
+
+ if (!_gcr_certificate_extension_basic_constraints (data, &is_ca, &path_len))
+ return NULL;
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Basic Constraints"), NULL, FALSE));
+ gcr_section_add_child (section, _("Certificate Authority"), create_value_label (is_ca ? _("Yes") : _("No")));
+
+ number = g_strdup_printf ("%d", path_len);
+ gcr_section_add_child (section, _("Max Path Length"), create_value_label (path_len < 0 ? _("Unlimited") : number));
+ g_free (number);
+
+ return section;
+}
+
+static GcrSection *
+append_extension_extended_key_usage (GcrCertificateWidget *self,
+ GBytes *data)
+{
+ GcrSection *section;
+ GQuark *oids;
+ GString *text;
+ guint i;
+
+ oids = _gcr_certificate_extension_extended_key_usage (data);
+ if (oids == NULL)
+ return NULL;
+
+ text = g_string_new ("");
+ for (i = 0; oids[i] != 0; i++) {
+ if (i > 0)
+ g_string_append_unichar (text, '\n');
+ g_string_append (text, egg_oid_get_description (oids[i]));
+ }
+
+ g_free (oids);
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Extended Key Usage"), NULL, FALSE));
+ gcr_section_add_child (section, _("Allowed Purposes"), create_value_label (text->str));
+
+ g_string_free (text, TRUE);
+
+ return section;
+}
+
+static GcrSection *
+append_extension_subject_key_identifier (GcrCertificateWidget *self,
+ GBytes *data)
+{
+ GcrSection *section;
+ gpointer keyid;
+ gsize n_keyid;
+
+ keyid = _gcr_certificate_extension_subject_key_identifier (data, &n_keyid);
+ if (keyid == NULL)
+ return NULL;
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Subject Key Identifier"), NULL, FALSE));
+ gchar *display = egg_hex_encode_full (keyid, n_keyid, TRUE, " ", 1);
+ g_free (keyid);
+ gcr_section_add_child (section, _("Key Identifier"), create_value_label (display));
+ g_free (display);
+
+ return section;
+}
+
+static const struct {
+ guint usage;
+ const gchar *description;
+} usage_descriptions[] = {
+ { GCR_KEY_USAGE_DIGITAL_SIGNATURE, N_("Digital signature") },
+ { GCR_KEY_USAGE_NON_REPUDIATION, N_("Non repudiation") },
+ { GCR_KEY_USAGE_KEY_ENCIPHERMENT, N_("Key encipherment") },
+ { GCR_KEY_USAGE_DATA_ENCIPHERMENT, N_("Data encipherment") },
+ { GCR_KEY_USAGE_KEY_AGREEMENT, N_("Key agreement") },
+ { GCR_KEY_USAGE_KEY_CERT_SIGN, N_("Certificate signature") },
+ { GCR_KEY_USAGE_CRL_SIGN, N_("Revocation list signature") },
+ { GCR_KEY_USAGE_ENCIPHER_ONLY, N_("Encipher only") },
+ { GCR_KEY_USAGE_DECIPHER_ONLY, N_("Decipher only") }
+};
+
+static GcrSection *
+append_extension_key_usage (GcrCertificateWidget *self,
+ GBytes *data)
+{
+ GcrSection *section;
+ gulong key_usage;
+ GString *text;
+ guint i;
+
+ if (!_gcr_certificate_extension_key_usage (data, &key_usage))
+ return NULL;
+
+ text = g_string_new ("");
+
+ for (i = 0; i < G_N_ELEMENTS (usage_descriptions); i++) {
+ if (key_usage & usage_descriptions[i].usage) {
+ if (text->len > 0)
+ g_string_append_unichar (text, '\n');
+ g_string_append (text, _(usage_descriptions[i].description));
+ }
+ }
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Key Usage"), NULL, FALSE));
+ gcr_section_add_child (section, _("Usages"), create_value_label (text->str));
+
+ g_string_free (text, TRUE);
+
+ return section;
+}
+
+static GcrSection *
+append_extension_subject_alt_name (GcrCertificateWidget *self,
+ GBytes *data)
+{
+ GcrSection *section;
+ GArray *general_names;
+ GcrGeneralName *general;
+ guint i;
+
+ general_names = _gcr_certificate_extension_subject_alt_name (data);
+ if (general_names == NULL)
+ return FALSE;
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Subject Alternative Names"), NULL, FALSE));
+
+ for (i = 0; i < general_names->len; i++) {
+ general = &g_array_index (general_names, GcrGeneralName, i);
+ if (general->display == NULL) {
+ gchar *display = hex_encode_bytes (general->raw);
+ gcr_section_add_child (section, general->description, create_value_label (display));
+ g_free (display);
+ } else
+ gcr_section_add_child (section, general->description, create_value_label (general->display));
+ }
+
+ _gcr_general_names_free (general_names);
+
+ return section;
+}
+
+static GcrSection *
+append_extension_hex (GcrCertificateWidget *self,
+ GQuark oid,
+ GBytes *value)
+{
+ GcrSection *section;
+ const gchar *text;
+ gchar *display;
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Extension"), NULL, FALSE));
+
+ /* Extension type */
+ text = egg_oid_get_description (oid);
+ gcr_section_add_child (section, _("Identifier"), create_value_label (text));
+ display = hex_encode_bytes (value);
+ gcr_section_add_child (section, _("Value"), create_value_label (display));
+ g_free (display);
+
+ return section;
+}
+
+static void
+append_extension (GcrCertificateWidget *self,
+ GNode *node)
+{
+ GQuark oid;
+ GBytes *value;
+ gboolean critical;
+ GcrSection *section = NULL;
+
+ /* Dig out the OID */
+ oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (node, "extnID", NULL));
+ g_return_if_fail (oid);
+
+ /* Extension value */
+ value = egg_asn1x_get_string_as_bytes (egg_asn1x_node (node, "extnValue", NULL));
+
+ /* The custom parsers */
+ if (oid == GCR_OID_BASIC_CONSTRAINTS)
+ section = append_extension_basic_constraints (self, value);
+ else if (oid == GCR_OID_EXTENDED_KEY_USAGE)
+ section = append_extension_extended_key_usage (self, value);
+ else if (oid == GCR_OID_SUBJECT_KEY_IDENTIFIER)
+ section = append_extension_subject_key_identifier (self, value);
+ else if (oid == GCR_OID_KEY_USAGE)
+ section = append_extension_key_usage (self, value);
+ else if (oid == GCR_OID_SUBJECT_ALT_NAME)
+ section = append_extension_subject_alt_name (self, value);
+
+ /* Otherwise the default raw display */
+ if (!section) {
+ section = append_extension_hex (self, oid, value);
+ }
+
+ /* Critical */
+ if (section && egg_asn1x_get_boolean (egg_asn1x_node (node, "critical", NULL), &critical)) {
+ gcr_section_add_child (section, _("Critical"), create_value_label (critical ? _("Yes") : _("No")));
+ }
+
+ g_bytes_unref (value);
+}
+
+/**
+ * gcr_certificate_widget_new:
+ * @certificate: (nullable): certificate to display, or %NULL
+ *
+ * Create a new certificate widget which displays a given certificate.
+ *
+ * Returns: (transfer full): a newly allocated #GcrCertificateWidget, which
+ * should be freed with g_object_unref()
+ */
+GtkWidget *
+gcr_certificate_widget_new (GcrCertificate *certificate)
+{
+ return g_object_new (GCR_TYPE_CERTIFICATE_WIDGET, "certificate", certificate, NULL);
+}
+
+/**
+ * gcr_certificate_widget_get_certificate:
+ * @self: The certificate widget
+ *
+ * Get the certificate displayed in the widget.
+ *
+ * Returns: (nullable) (transfer none): the certificate
+ */
+GcrCertificate *
+gcr_certificate_widget_get_certificate (GcrCertificateWidget *self)
+{
+ g_return_val_if_fail (GCR_IS_CERTIFICATE_WIDGET (self), NULL);
+ return self->certificate;
+}
+
+/**
+ * gcr_certificate_widget_set_certificate:
+ * @self: The certificate widget
+ * @certificate: (nullable): the certificate to display
+ *
+ * Set the certificate displayed in the widget
+ */
+void
+gcr_certificate_widget_set_certificate (GcrCertificateWidget *self, GcrCertificate *certificate)
+{
+ GtkWidget *section, *label;
+ PangoAttrList *attributes;
+ gchar *display;
+ GIcon *icon;
+ GBytes *bytes, *number;
+ GNode *asn, *subject_public_key;
+ GQuark oid;
+ gconstpointer data;
+ gsize n_data;
+ GDate date;
+ gulong version;
+ guint bits, index;
+
+ g_return_if_fail (GCR_IS_CERTIFICATE_WIDGET (self));
+
+ g_set_object (&self->certificate, certificate);
+
+ data = gcr_certificate_get_der_data (self->certificate, &n_data);
+ if (!data) {
+ g_set_object (&self->certificate, NULL);
+ }
+
+ icon = gcr_certificate_get_icon (self->certificate);
+ display = calculate_label (self);
+ section = _gcr_certificate_widget_add_section (self, display, icon, TRUE);
+ g_clear_pointer (&display, g_free);
+ g_object_unref (icon);
+
+ bytes = g_bytes_new_static (data, n_data);
+ asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", bytes);
+ g_bytes_unref (bytes);
+
+ display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL), "CN");
+ gcr_section_add_child (GCR_SECTION (section), _("Identity"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+
+ display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL), "CN");
+ gcr_section_add_child (GCR_SECTION (section), _("Verified by"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+
+ if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) {
+ display = g_malloc0 (128);
+ if (!g_date_strftime (display, 128, "%x", &date))
+ g_return_if_reached ();
+ gcr_section_add_child (GCR_SECTION (section), _("Expires"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ }
+
+ /* The subject */
+ section = _gcr_certificate_widget_add_section (self, _("Subject Name"), NULL, FALSE);
+ egg_dn_parse (egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL), on_parsed_dn_part, section);
+
+ /* The Issuer */
+ section = _gcr_certificate_widget_add_section (self, _("Issuer Name"), NULL, FALSE);
+ egg_dn_parse (egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL), on_parsed_dn_part, section);
+
+ /* The Issued Parameters */
+ section = _gcr_certificate_widget_add_section (self, _("Issued Certificate"), NULL, FALSE);
+
+ if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "tbsCertificate", "version", NULL), &version)) {
+ g_critical ("Unable to parse certificate version");
+ } else {
+ display = g_strdup_printf ("%lu", version + 1);
+ gcr_section_add_child (GCR_SECTION (section), _("Version"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ }
+
+ number = egg_asn1x_get_integer_as_raw (egg_asn1x_node (asn, "tbsCertificate", "serialNumber", NULL));
+ if (!number) {
+ g_critical ("Unable to parse certificate serial number");
+ } else {
+ display = hex_encode_bytes (number);
+ gcr_section_add_child (GCR_SECTION (section), _("Serial Number"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ g_bytes_unref (number);
+ }
+
+ display = g_malloc0 (128);
+ if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notBefore", NULL), &date)) {
+ if (!g_date_strftime (display, 128, "%x", &date))
+ g_return_if_reached ();
+ gcr_section_add_child (GCR_SECTION (section), _("Not Valid Before"), create_value_label (display));
+ }
+ if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) {
+ if (!g_date_strftime (display, 128, "%x", &date))
+ g_return_if_reached ();
+ gcr_section_add_child (GCR_SECTION (section), _("Not Valid After"), create_value_label (display));
+ }
+ g_clear_pointer (&display, g_free);
+
+ /* Fingerprints */
+ section = _gcr_certificate_widget_add_section (self, _("Certificate Fingerprints"), NULL, FALSE);
+ display = g_compute_checksum_for_bytes (G_CHECKSUM_SHA1, bytes);
+ gcr_section_add_child (GCR_SECTION (section), "SHA1", create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ display = g_compute_checksum_for_bytes (G_CHECKSUM_MD5, bytes);
+ gcr_section_add_child (GCR_SECTION (section), "MD5", create_value_label (display));
+ g_clear_pointer (&display, g_free);
+
+ /* Public Key Info */
+ section = _gcr_certificate_widget_add_section (self, _("Public Key Info"), NULL, FALSE);
+ subject_public_key = egg_asn1x_node (asn, "tbsCertificate", "subjectPublicKeyInfo", NULL);
+ append_subject_public_key (self, GCR_SECTION (section), subject_public_key);
+
+ /* Extensions */
+ for (index = 1; TRUE; ++index) {
+ GNode *extension = egg_asn1x_node (asn, "tbsCertificate", "extensions", index, NULL);
+ if (extension == NULL)
+ break;
+ append_extension (self, extension);
+ }
+
+ /* Signature */
+ section = _gcr_certificate_widget_add_section (self, _("Signature"), NULL, FALSE);
+
+ oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "signatureAlgorithm", "algorithm", NULL));
+ gcr_section_add_child (GCR_SECTION (section), _("Signature Algorithm"), create_value_label (egg_oid_get_description (oid)));
+
+ bytes = egg_asn1x_get_element_raw (egg_asn1x_node (asn, "signatureAlgorithm", "parameters", NULL));
+ if (bytes) {
+ display = hex_encode_bytes (bytes);
+ gcr_section_add_child (GCR_SECTION (section), _("Signature Parameters"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ g_bytes_unref (bytes);
+ }
+
+ bytes = egg_asn1x_get_bits_as_raw (egg_asn1x_node (asn, "signature", NULL), &bits);
+ display = egg_hex_encode_full (g_bytes_get_data (bytes, NULL), bits / 8, TRUE, " ", 1);
+ g_bytes_unref (bytes);
+ label = create_value_label (display);
+ attributes = pango_attr_list_new ();
+ pango_attr_list_insert (attributes, pango_attr_family_new ("Monospace"));
+ gtk_label_set_attributes (GTK_LABEL (label), attributes);
+ pango_attr_list_unref (attributes);
+ gcr_section_add_child (GCR_SECTION (section), _("Signature"), label);
+ g_clear_pointer (&display, g_free);
+
+ egg_asn1x_destroy (asn);
+}
diff --git a/gcr-gtk3/gcr-certificate-widget.h b/gcr-gtk3/gcr-certificate-widget.h
new file mode 100644
index 0000000..dab5a82
--- /dev/null
+++ b/gcr-gtk3/gcr-certificate-widget.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2021 Collabora Ltd.
+ * Copyright 2010 Stefan Walter
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
+#ifndef __GCR_CERTIFICATE_WIDGET_H__
+#define __GCR_CERTIFICATE_WIDGET_H__
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+#include <gcr/gcr-certificate.h>
+
+G_BEGIN_DECLS
+
+#define GCR_TYPE_CERTIFICATE_WIDGET gcr_certificate_widget_get_type ()
+G_DECLARE_FINAL_TYPE (GcrCertificateWidget, gcr_certificate_widget, GCR, CERTIFICATE_WIDGET, GtkBox)
+
+GtkWidget *gcr_certificate_widget_new (GcrCertificate *certificate);
+
+GcrCertificate *gcr_certificate_widget_get_certificate (GcrCertificateWidget *self);
+
+void gcr_certificate_widget_set_certificate (GcrCertificateWidget *self,
+ GcrCertificate *certificate);
+
+G_END_DECLS
+
+#endif /* __GCR_CERTIFICATE_WIDGET_H__ */
diff --git a/ui/gcr-crypto-types.xml b/gcr-gtk3/gcr-crypto-types.xml
index 4b5037b..2f402c9 100644
--- a/ui/gcr-crypto-types.xml
+++ b/gcr-gtk3/gcr-crypto-types.xml
@@ -166,3 +166,4 @@
</magic>
</mime-type>
</mime-info>
+
diff --git a/ui/gcr-list-selector-private.h b/gcr-gtk3/gcr-gtk3.h
index b1c4739..53b5850 100644
--- a/ui/gcr-list-selector-private.h
+++ b/gcr-gtk3/gcr-gtk3.h
@@ -1,7 +1,7 @@
/*
* gnome-keyring
*
- * Copyright (C) 2011 Collabora Ltd.
+ * Copyright (C) 2010 Collabora Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
@@ -19,21 +19,22 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#ifndef __GCR_LIST_SELECTOR_PRIVATE_H__
-#define __GCR_LIST_SELECTOR_PRIVATE_H__
+#ifndef GCR_API_SUBJECT_TO_CHANGE
+#error "This API has not yet reached stability."
+#endif
-#include "gcr/gcr-types.h"
+#ifndef __GCR_GTK3_H__
+#define __GCR_GTK3_H__
-#include "gcr-list-selector.h"
-#include "gcr-live-search.h"
+#include <glib.h>
-#include <gtk/gtk.h>
+#include <gcr/gcr.h>
-G_BEGIN_DECLS
+#define __GCR_INSIDE_HEADER__
-void _gcr_list_selector_set_live_search (GcrListSelector *self,
- GcrLiveSearch *search);
+#include <gcr-gtk3/gcr-certificate-widget.h>
+#include <gcr-gtk3/gcr-secure-entry-buffer.h>
-G_END_DECLS
+#undef __GCR_INSIDE_HEADER__
-#endif /* __GCR_LIST_SELECTOR_PRIVATE_H__ */
+#endif /* __GCR_GTK3_H__ */
diff --git a/ui/gcr-ui.pc.in b/gcr-gtk3/gcr-gtk3.pc.in
index 1b994d0..1b994d0 100644
--- a/ui/gcr-ui.pc.in
+++ b/gcr-gtk3/gcr-gtk3.pc.in
diff --git a/ui/gcr-ui.symbols b/gcr-gtk3/gcr-gtk3.symbols
index d258eb5..d258eb5 100644
--- a/ui/gcr-ui.symbols
+++ b/gcr-gtk3/gcr-gtk3.symbols
diff --git a/gcr-gtk3/gcr-section.c b/gcr-gtk3/gcr-section.c
new file mode 100644
index 0000000..24c1502
--- /dev/null
+++ b/gcr-gtk3/gcr-section.c
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2021 Collabora Ltd.
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#include "gcr-section.h"
+
+struct _GcrSection
+{
+ GtkGrid parent_instance;
+
+ GtkWidget *frame;
+ GtkWidget *label;
+ GtkWidget *image;
+ GtkWidget *listbox;
+ GtkSizeGroup *size_group;
+};
+
+G_DEFINE_TYPE (GcrSection, gcr_section, GTK_TYPE_GRID)
+
+enum {
+ PROP_TITLE = 1,
+ PROP_ICON,
+ N_PROPERTIES
+};
+
+static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
+
+static void
+gcr_section_dispose (GObject *object)
+{
+ GcrSection *self = (GcrSection *)object;
+
+ g_clear_object (&self->size_group);
+ /* g_clear_pointer (&self->label, gtk_widget_unparent); */
+ /* g_clear_pointer (&self->image, gtk_widget_unparent); */
+ /* g_clear_pointer (&self->frame, gtk_widget_unparent); */
+
+ G_OBJECT_CLASS (gcr_section_parent_class)->dispose (object);
+}
+
+static void
+gcr_section_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GcrSection *self = GCR_SECTION (object);
+
+ switch (prop_id)
+ {
+ case PROP_TITLE:
+ g_value_set_string (value, gtk_label_get_label (GTK_LABEL (self->label)));
+ break;
+ case PROP_ICON:
+ {
+ GIcon *icon;
+ gtk_image_get_gicon (GTK_IMAGE (self->image), &icon, NULL);
+ g_value_set_object (value, icon);
+ }
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+gcr_section_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GcrSection *self = GCR_SECTION (object);
+
+ switch (prop_id)
+ {
+ case PROP_TITLE:
+ gtk_label_set_label (GTK_LABEL (self->label), g_value_get_string (value));
+ break;
+ case PROP_ICON:
+ if (!self->image)
+ {
+ self->image = gtk_image_new ();
+ gtk_grid_attach (GTK_GRID (self), self->image, 1, 0, 1, 1);
+ gtk_container_child_set (GTK_CONTAINER (self), self->frame, "width", 2, NULL);
+ }
+
+ gtk_image_set_from_gicon (GTK_IMAGE (self->image), g_value_get_object (value), GTK_ICON_SIZE_BUTTON);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+gcr_section_class_init (GcrSectionClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->dispose = gcr_section_dispose;
+ object_class->get_property = gcr_section_get_property;
+ object_class->set_property = gcr_section_set_property;
+ obj_properties[PROP_TITLE] =
+ g_param_spec_string ("title",
+ "Title",
+ "The title of the section",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+
+ obj_properties[PROP_ICON] =
+ g_param_spec_object ("icon",
+ "Icon",
+ "The Icon to use",
+ G_TYPE_ICON,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class,
+ N_PROPERTIES,
+ obj_properties);
+}
+
+static void
+gcr_section_init (GcrSection *self)
+{
+ gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL);
+ self->label = gtk_label_new (NULL);
+ g_object_set (G_OBJECT (self->label),
+ "margin-start", 12,
+ "margin-end", 12,
+ "margin-top", 8,
+ "margin-bottom", 8,
+ "xalign", 0.0,
+ "halign", GTK_ALIGN_START,
+ "hexpand", TRUE,
+ NULL);
+ gtk_style_context_add_class (gtk_widget_get_style_context (self->label), "heading");
+ gtk_style_context_add_class (gtk_widget_get_style_context (self->label), "h4");
+ self->listbox = gtk_list_box_new ();
+ gtk_list_box_set_selection_mode (GTK_LIST_BOX (self->listbox), GTK_SELECTION_NONE);
+ self->frame = gtk_frame_new (NULL);
+ g_object_set (G_OBJECT (self->frame),
+ "child", self->listbox,
+ "hexpand", TRUE,
+ NULL);
+ self->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+ gtk_container_add (GTK_CONTAINER (self), self->label);
+ gtk_container_add (GTK_CONTAINER (self), self->frame);
+
+ g_object_set (self,
+ "margin-start", 12,
+ "margin-end", 12,
+ "margin-top", 8,
+ "margin-bottom", 8,
+ NULL);
+}
+
+GtkWidget *
+gcr_section_new (const gchar *title)
+{
+ return g_object_new (GCR_TYPE_SECTION, "title", title, NULL);
+}
+
+GtkWidget *
+gcr_section_new_with_icon (const gchar *title,
+ GIcon *icon)
+{
+ return g_object_new (GCR_TYPE_SECTION, "title", title, "icon", icon, NULL);
+}
+
+void
+gcr_section_add_child (GcrSection *self,
+ const gchar *description,
+ GtkWidget *child)
+{
+ GtkWidget *row, *box, *label;
+ g_return_if_fail (GCR_IS_SECTION (self));
+
+ row = gtk_list_box_row_new ();
+ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+ gtk_container_add (GTK_CONTAINER (row), box);
+ label = gtk_label_new (description);
+ gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+ g_object_set (label,
+ "margin-start", 12,
+ "margin-end", 12,
+ "margin-top", 8,
+ "margin-bottom", 8,
+ "xalign", 0.0,
+ "halign", GTK_ALIGN_START,
+ NULL);
+ gtk_style_context_add_class (gtk_widget_get_style_context (label), "caption");
+ g_object_set (child,
+ "margin-start", 12,
+ "margin-end", 12,
+ "margin-top", 8,
+ "margin-bottom", 8,
+ "halign", GTK_ALIGN_END,
+ NULL);
+ gtk_size_group_add_widget (self->size_group, label);
+ gtk_container_add (GTK_CONTAINER (box), label);
+ gtk_container_add (GTK_CONTAINER (box), child);
+ gtk_container_add (GTK_CONTAINER (self->listbox), row);
+}
diff --git a/gcr-gtk3/gcr-section.h b/gcr-gtk3/gcr-section.h
new file mode 100644
index 0000000..69950cc
--- /dev/null
+++ b/gcr-gtk3/gcr-section.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2021 Collabora Ltd.
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#ifndef __GCR_SECTION_H__
+#define __GCR_SECTION_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GCR_TYPE_SECTION gcr_section_get_type()
+G_DECLARE_FINAL_TYPE (GcrSection, gcr_section, GCR, SECTION, GtkGrid)
+
+GtkWidget *gcr_section_new (const gchar *title);
+GtkWidget *gcr_section_new_with_icon (const gchar *title,
+ GIcon *icon);
+
+void gcr_section_add_child (GcrSection *self,
+ const gchar *description,
+ GtkWidget *child);
+
+G_END_DECLS
+
+#endif /* __GCR_SECTION_H__ */
diff --git a/ui/gcr-secure-entry-buffer.c b/gcr-gtk3/gcr-secure-entry-buffer.c
index a209a22..a209a22 100644
--- a/ui/gcr-secure-entry-buffer.c
+++ b/gcr-gtk3/gcr-secure-entry-buffer.c
diff --git a/ui/gcr-secure-entry-buffer.h b/gcr-gtk3/gcr-secure-entry-buffer.h
index c7a0c60..c7a0c60 100644
--- a/ui/gcr-secure-entry-buffer.h
+++ b/gcr-gtk3/gcr-secure-entry-buffer.h
diff --git a/ui/gcr.gresource.xml b/gcr-gtk3/gcr.gresource.xml
index 3ab232d..3ab232d 100644
--- a/ui/gcr.gresource.xml
+++ b/gcr-gtk3/gcr.gresource.xml
diff --git a/ui/icons/16x16/gcr-gnupg.png b/gcr-gtk3/icons/16x16/gcr-gnupg.png
index 6595ca1..6595ca1 100644
--- a/ui/icons/16x16/gcr-gnupg.png
+++ b/gcr-gtk3/icons/16x16/gcr-gnupg.png
Binary files differ
diff --git a/ui/icons/16x16/gcr-key-pair.png b/gcr-gtk3/icons/16x16/gcr-key-pair.png
index 5cabf18..5cabf18 100644
--- a/ui/icons/16x16/gcr-key-pair.png
+++ b/gcr-gtk3/icons/16x16/gcr-key-pair.png
Binary files differ
diff --git a/ui/icons/16x16/gcr-key.png b/gcr-gtk3/icons/16x16/gcr-key.png
index e4c2ccc..e4c2ccc 100644
--- a/ui/icons/16x16/gcr-key.png
+++ b/gcr-gtk3/icons/16x16/gcr-key.png
Binary files differ
diff --git a/ui/icons/16x16/gcr-password.png b/gcr-gtk3/icons/16x16/gcr-password.png
index 10f4142..10f4142 100644
--- a/ui/icons/16x16/gcr-password.png
+++ b/gcr-gtk3/icons/16x16/gcr-password.png
Binary files differ
diff --git a/ui/icons/16x16/gcr-smart-card.png b/gcr-gtk3/icons/16x16/gcr-smart-card.png
index 2860eb4..2860eb4 100644
--- a/ui/icons/16x16/gcr-smart-card.png
+++ b/gcr-gtk3/icons/16x16/gcr-smart-card.png
Binary files differ
diff --git a/ui/icons/22x22/gcr-gnupg.png b/gcr-gtk3/icons/22x22/gcr-gnupg.png
index 4210e97..4210e97 100644
--- a/ui/icons/22x22/gcr-gnupg.png
+++ b/gcr-gtk3/icons/22x22/gcr-gnupg.png
Binary files differ
diff --git a/ui/icons/22x22/gcr-key-pair.png b/gcr-gtk3/icons/22x22/gcr-key-pair.png
index 8787443..8787443 100644
--- a/ui/icons/22x22/gcr-key-pair.png
+++ b/gcr-gtk3/icons/22x22/gcr-key-pair.png
Binary files differ
diff --git a/ui/icons/22x22/gcr-key.png b/gcr-gtk3/icons/22x22/gcr-key.png
index 7c0a2a3..7c0a2a3 100644
--- a/ui/icons/22x22/gcr-key.png
+++ b/gcr-gtk3/icons/22x22/gcr-key.png
Binary files differ
diff --git a/ui/icons/22x22/gcr-password.png b/gcr-gtk3/icons/22x22/gcr-password.png
index b613f16..b613f16 100644
--- a/ui/icons/22x22/gcr-password.png
+++ b/gcr-gtk3/icons/22x22/gcr-password.png
Binary files differ
diff --git a/ui/icons/22x22/gcr-smart-card.png b/gcr-gtk3/icons/22x22/gcr-smart-card.png
index 8474ff6..8474ff6 100644
--- a/ui/icons/22x22/gcr-smart-card.png
+++ b/gcr-gtk3/icons/22x22/gcr-smart-card.png
Binary files differ
diff --git a/ui/icons/24x24/gcr-gnupg.png b/gcr-gtk3/icons/24x24/gcr-gnupg.png
index 27b5adf..27b5adf 100644
--- a/ui/icons/24x24/gcr-gnupg.png
+++ b/gcr-gtk3/icons/24x24/gcr-gnupg.png
Binary files differ
diff --git a/ui/icons/24x24/gcr-key-pair.png b/gcr-gtk3/icons/24x24/gcr-key-pair.png
index ec78b77..ec78b77 100644
--- a/ui/icons/24x24/gcr-key-pair.png
+++ b/gcr-gtk3/icons/24x24/gcr-key-pair.png
Binary files differ
diff --git a/ui/icons/24x24/gcr-key.png b/gcr-gtk3/icons/24x24/gcr-key.png
index a44b24b..a44b24b 100644
--- a/ui/icons/24x24/gcr-key.png
+++ b/gcr-gtk3/icons/24x24/gcr-key.png
Binary files differ
diff --git a/ui/icons/24x24/gcr-password.png b/gcr-gtk3/icons/24x24/gcr-password.png
index 5647789..5647789 100644
--- a/ui/icons/24x24/gcr-password.png
+++ b/gcr-gtk3/icons/24x24/gcr-password.png
Binary files differ
diff --git a/ui/icons/24x24/gcr-smart-card.png b/gcr-gtk3/icons/24x24/gcr-smart-card.png
index ce1b5ba..ce1b5ba 100644
--- a/ui/icons/24x24/gcr-smart-card.png
+++ b/gcr-gtk3/icons/24x24/gcr-smart-card.png
Binary files differ
diff --git a/ui/icons/256x256/gcr-gnupg.png b/gcr-gtk3/icons/256x256/gcr-gnupg.png
index 200a42a..200a42a 100644
--- a/ui/icons/256x256/gcr-gnupg.png
+++ b/gcr-gtk3/icons/256x256/gcr-gnupg.png
Binary files differ
diff --git a/ui/icons/256x256/gcr-password.png b/gcr-gtk3/icons/256x256/gcr-password.png
index 50f7fb1..50f7fb1 100644
--- a/ui/icons/256x256/gcr-password.png
+++ b/gcr-gtk3/icons/256x256/gcr-password.png
Binary files differ
diff --git a/ui/icons/256x256/gcr-smart-card.png b/gcr-gtk3/icons/256x256/gcr-smart-card.png
index ef5820d..ef5820d 100644
--- a/ui/icons/256x256/gcr-smart-card.png
+++ b/gcr-gtk3/icons/256x256/gcr-smart-card.png
Binary files differ
diff --git a/ui/icons/32x32/gcr-gnupg.png b/gcr-gtk3/icons/32x32/gcr-gnupg.png
index f151fdf..f151fdf 100644
--- a/ui/icons/32x32/gcr-gnupg.png
+++ b/gcr-gtk3/icons/32x32/gcr-gnupg.png
Binary files differ
diff --git a/ui/icons/32x32/gcr-key-pair.png b/gcr-gtk3/icons/32x32/gcr-key-pair.png
index 2ba1f15..2ba1f15 100644
--- a/ui/icons/32x32/gcr-key-pair.png
+++ b/gcr-gtk3/icons/32x32/gcr-key-pair.png
Binary files differ
diff --git a/ui/icons/32x32/gcr-key.png b/gcr-gtk3/icons/32x32/gcr-key.png
index af1abf7..af1abf7 100644
--- a/ui/icons/32x32/gcr-key.png
+++ b/gcr-gtk3/icons/32x32/gcr-key.png
Binary files differ
diff --git a/ui/icons/32x32/gcr-password.png b/gcr-gtk3/icons/32x32/gcr-password.png
index 0b96362..0b96362 100644
--- a/ui/icons/32x32/gcr-password.png
+++ b/gcr-gtk3/icons/32x32/gcr-password.png
Binary files differ
diff --git a/ui/icons/32x32/gcr-smart-card.png b/gcr-gtk3/icons/32x32/gcr-smart-card.png
index b4eaa92..b4eaa92 100644
--- a/ui/icons/32x32/gcr-smart-card.png
+++ b/gcr-gtk3/icons/32x32/gcr-smart-card.png
Binary files differ
diff --git a/ui/icons/48x48/gcr-gnupg.png b/gcr-gtk3/icons/48x48/gcr-gnupg.png
index 56ddfef..56ddfef 100644
--- a/ui/icons/48x48/gcr-gnupg.png
+++ b/gcr-gtk3/icons/48x48/gcr-gnupg.png
Binary files differ
diff --git a/ui/icons/48x48/gcr-key-pair.png b/gcr-gtk3/icons/48x48/gcr-key-pair.png
index 6a373e6..6a373e6 100644
--- a/ui/icons/48x48/gcr-key-pair.png
+++ b/gcr-gtk3/icons/48x48/gcr-key-pair.png
Binary files differ
diff --git a/ui/icons/48x48/gcr-key.png b/gcr-gtk3/icons/48x48/gcr-key.png
index 939fbb7..939fbb7 100644
--- a/ui/icons/48x48/gcr-key.png
+++ b/gcr-gtk3/icons/48x48/gcr-key.png
Binary files differ
diff --git a/ui/icons/48x48/gcr-password.png b/gcr-gtk3/icons/48x48/gcr-password.png
index 8c13323..8c13323 100644
--- a/ui/icons/48x48/gcr-password.png
+++ b/gcr-gtk3/icons/48x48/gcr-password.png
Binary files differ
diff --git a/ui/icons/48x48/gcr-smart-card.png b/gcr-gtk3/icons/48x48/gcr-smart-card.png
index 6cd16f6..6cd16f6 100644
--- a/ui/icons/48x48/gcr-smart-card.png
+++ b/gcr-gtk3/icons/48x48/gcr-smart-card.png
Binary files differ
diff --git a/ui/icons/meson.build b/gcr-gtk3/icons/meson.build
index fe7953b..fe7953b 100644
--- a/ui/icons/meson.build
+++ b/gcr-gtk3/icons/meson.build
diff --git a/ui/icons/render-icons.py b/gcr-gtk3/icons/render-icons.py
index cc5be3a..650d1a6 100755
--- a/ui/icons/render-icons.py
+++ b/gcr-gtk3/icons/render-icons.py
@@ -12,8 +12,8 @@ import subprocess
INKSCAPE = '/usr/bin/inkscape'
OPTIPNG = '/usr/bin/optipng'
-SRC = 'ui/icons/src'
-OUT = 'ui/icons'
+SRC = 'gcr-gtk3/icons/src'
+OUT = 'gcr-gtk3/icons'
inkscape_process = None
diff --git a/ui/icons/src/gcr-gnupg.svg b/gcr-gtk3/icons/src/gcr-gnupg.svg
index ce68a4b..ce68a4b 100644
--- a/ui/icons/src/gcr-gnupg.svg
+++ b/gcr-gtk3/icons/src/gcr-gnupg.svg
diff --git a/ui/icons/src/gcr-key-and-keypair.svg b/gcr-gtk3/icons/src/gcr-key-and-keypair.svg
index 0ccbbb7..0ccbbb7 100644
--- a/ui/icons/src/gcr-key-and-keypair.svg
+++ b/gcr-gtk3/icons/src/gcr-key-and-keypair.svg
diff --git a/ui/icons/src/gcr-password.svg b/gcr-gtk3/icons/src/gcr-password.svg
index d5fc9b4..d5fc9b4 100644
--- a/ui/icons/src/gcr-password.svg
+++ b/gcr-gtk3/icons/src/gcr-password.svg
diff --git a/ui/icons/src/gcr-smart-card.svg b/gcr-gtk3/icons/src/gcr-smart-card.svg
index 51a3761..51a3761 100644
--- a/ui/icons/src/gcr-smart-card.svg
+++ b/gcr-gtk3/icons/src/gcr-smart-card.svg
diff --git a/gcr/libgcr-base.map b/gcr-gtk3/libgcr-gtk3.map
index 4a16138..4a16138 100644
--- a/gcr/libgcr-base.map
+++ b/gcr-gtk3/libgcr-gtk3.map
diff --git a/gcr-gtk3/meson.build b/gcr-gtk3/meson.build
new file mode 100644
index 0000000..5737586
--- /dev/null
+++ b/gcr-gtk3/meson.build
@@ -0,0 +1,156 @@
+subdir('icons')
+
+gcr_gtk3_headers_install_dir = gcr_headers_subdir / 'gcr-gtk3'
+
+gcr_gtk3_public_sources = files(
+ 'gcr-certificate-widget.c',
+ 'gcr-secure-entry-buffer.c',
+)
+
+gcr_gtk3_private_sources = files(
+ 'gcr-section.c',
+)
+
+gcr_gtk3_headers = files(
+ 'gcr-gtk3.h',
+ 'gcr-certificate-widget.h',
+ 'gcr-secure-entry-buffer.h',
+)
+
+# Generated sources
+gcr_gtk3_enums_gen = gnome.mkenums_simple('gcr-enum-types',
+ sources: gcr_gtk3_headers,
+ install_header: true,
+ install_dir: get_option('includedir') / gcr_gtk3_headers_install_dir,
+)
+
+gcr_gtk3_sources = [
+ gcr_gtk3_private_sources,
+ gcr_gtk3_public_sources,
+ gcr_gtk3_enums_gen,
+]
+
+gcr_gtk3_deps = [
+ glib_deps,
+ p11kit_dep,
+ libegg_dep,
+ gck_dep,
+ gcr_dep,
+ gtk3_dep,
+]
+
+gcr_gtk3_cflags = [
+ '-DG_LOG_DOMAIN="Gcr"',
+ '-DGCR_COMPILATION',
+ '-DGCR_API_SUBJECT_TO_CHANGE',
+ '-DGCK_API_SUBJECT_TO_CHANGE',
+ '-DP11_KIT_API_SUBJECT_TO_CHANGE',
+]
+
+gcr_gtk3_symbolmap = meson.current_source_dir() / 'libgcr-gtk3.map'
+gcr_gtk3_linkflags = cc.get_supported_link_arguments(
+ '-Wl,--version-script,@0@'.format(gcr_gtk3_symbolmap),
+)
+
+gcr_gtk3_lib = shared_library(gcr_gtk3_basename,
+ gcr_gtk3_sources,
+ dependencies: gcr_gtk3_deps,
+ c_args: gcr_gtk3_cflags,
+ link_args: gcr_gtk3_linkflags,
+ link_depends: gcr_gtk3_symbolmap,
+ include_directories: config_h_dir,
+ version: gcr_version,
+ soversion: gcr_soversion,
+ install: true,
+)
+
+gcr_gtk3_pkgconf_deps = [
+ glib_dep,
+ gio_dep,
+ gobject_dep,
+ gck_lib,
+ gcr_lib,
+ gtk3_dep,
+]
+
+pkgconfig.generate(gcr_gtk3_lib,
+ subdirs: gcr_headers_subdir,
+ requires: gcr_gtk3_pkgconf_deps,
+ description: 'GObject and GUI library for high level crypto parsing and display',
+)
+
+install_headers(gcr_gtk3_headers,
+ subdir: gcr_gtk3_headers_install_dir,
+)
+
+gcr_gtk3_dep = declare_dependency(
+ link_with: gcr_gtk3_lib,
+ sources: gcr_gtk3_enums_gen[1], # Make sure gcr-enum-types.h can be included
+)
+
+if get_option('introspection')
+ gcr_gtk3_gir = gnome.generate_gir(gcr_gtk3_lib,
+ sources: [ gcr_gtk3_headers, gcr_gtk3_public_sources ],
+ namespace: 'GcrGtk3',
+ nsversion: gcr_api_version,
+ export_packages: gcr_gtk3_basename,
+ identifier_prefix: 'Gcr',
+ symbol_prefix: 'gcr',
+ includes: [
+ 'GObject-2.0',
+ 'Gio-2.0',
+ 'Gtk-3.0',
+ gck_gir[0],
+ gcr_gir[0],
+ ],
+ header: 'gcr-gtk3/gcr-gtk3.h',
+ extra_args: [
+ '-DGCR_COMPILATION',
+ '-DGCR_API_SUBJECT_TO_CHANGE',
+ ],
+ install: true,
+ )
+
+ gcr_gtk3_vapi = gnome.generate_vapi(gcr_gtk3_basename,
+ sources: gcr_gtk3_gir[0],
+ packages: [
+ 'glib-2.0',
+ 'gio-2.0',
+ gck_vapi,
+ gcr_vapi,
+ 'gtk+-3.0'
+ ],
+ vapi_dirs: [
+ build_root / 'gck',
+ build_root / 'gcr',
+ ],
+ gir_dirs: [
+ build_root / 'gck',
+ build_root / 'gcr',
+ ],
+ install: true,
+ )
+endif
+
+# Register new mime types
+install_data('gcr-crypto-types.xml',
+ install_dir: get_option('datadir') / 'mime' / 'packages',
+)
+
+# Manual UI testing programs
+gcr_gtk3_manual_tests = [
+ 'frob-certificate',
+]
+
+gcr_gtk3_test_cflags = [
+ '-DSRCDIR="@0@"'.format(source_root),
+]
+
+foreach _test : gcr_gtk3_manual_tests
+ test_bin = executable('test-'+_test,
+ '@0@.c'.format(_test),
+ dependencies: [ gcr_gtk3_deps, gcr_gtk3_dep ],
+ c_args: [ gcr_gtk3_cflags, gcr_gtk3_test_cflags ],
+ include_directories: config_h_dir,
+ )
+endforeach
diff --git a/gcr-gtk4/gcr-certificate-widget.c b/gcr-gtk4/gcr-certificate-widget.c
new file mode 100644
index 0000000..58e3e55
--- /dev/null
+++ b/gcr-gtk4/gcr-certificate-widget.c
@@ -0,0 +1,684 @@
+/*
+ * Copyright 2021 Collabora Ltd.
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#include "config.h"
+
+#include <glib/gi18n-lib.h>
+
+#include <gcr-gtk4/gcr-certificate-widget.h>
+#include "gcr/gcr-certificate-extensions.h"
+#include "gcr/gcr-fingerprint.h"
+#include "gcr/gcr-oids.h"
+
+#include "gcr-section.h"
+
+#include "egg/egg-asn1x.h"
+#include "egg/egg-asn1-defs.h"
+#include "egg/egg-dn.h"
+#include "egg/egg-oid.h"
+#include "egg/egg-hex.h"
+
+struct _GcrCertificateWidget
+{
+ GtkWidget parent_instance;
+
+ GcrCertificate *certificate;
+ GtkWidget *reveal_button;
+ GtkWidget *revealer;
+ GtkWidget *secondary_info;
+ GtkSizeGroup *size_group;
+};
+
+G_DEFINE_TYPE (GcrCertificateWidget, gcr_certificate_widget, GTK_TYPE_WIDGET)
+
+enum {
+ PROP_CERTIFICATE = 1,
+ N_PROPERTIES
+};
+
+static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
+
+static void
+gcr_certificate_widget_finalize (GObject *object)
+{
+ GtkWidget *child;
+ GcrCertificateWidget *self = (GcrCertificateWidget *)object;
+
+ g_clear_object (&self->size_group);
+ while ((child = gtk_widget_get_first_child (GTK_WIDGET (self)))) {
+ gtk_widget_unparent (child);
+ }
+
+ G_OBJECT_CLASS (gcr_certificate_widget_parent_class)->finalize (object);
+}
+
+static void
+gcr_certificate_widget_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (object);
+
+ switch (prop_id)
+ {
+ case PROP_CERTIFICATE:
+ g_value_set_object (value, gcr_certificate_widget_get_certificate (self));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gcr_certificate_widget_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (object);
+
+ switch (prop_id)
+ {
+ case PROP_CERTIFICATE:
+ gcr_certificate_widget_set_certificate (self, g_value_get_object (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+gcr_certificate_widget_class_init (GcrCertificateWidgetClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ object_class->finalize = gcr_certificate_widget_finalize;
+ object_class->get_property = gcr_certificate_widget_get_property;
+ object_class->set_property = gcr_certificate_widget_set_property;
+
+ obj_properties[PROP_CERTIFICATE] =
+ g_param_spec_object ("certificate",
+ "Certificate",
+ "Certificate to display.",
+ GCR_TYPE_CERTIFICATE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class,
+ N_PROPERTIES,
+ obj_properties);
+
+ gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT);
+}
+
+static void
+on_reveal_button_clicked (GtkWidget *button,
+ GcrCertificateWidget *self)
+{
+ g_assert (GCR_IS_CERTIFICATE_WIDGET (self));
+ gtk_widget_hide (button);
+ gtk_revealer_set_reveal_child (GTK_REVEALER (self->revealer), TRUE);
+}
+
+static void
+gcr_certificate_widget_init (GcrCertificateWidget *self)
+{
+ gtk_orientable_set_orientation (GTK_ORIENTABLE (gtk_widget_get_layout_manager (GTK_WIDGET (self))), GTK_ORIENTATION_VERTICAL);
+ self->reveal_button = gtk_button_new_with_label ("…");
+ gtk_widget_set_halign (self->reveal_button, GTK_ALIGN_CENTER);
+ gtk_widget_insert_before (self->reveal_button, GTK_WIDGET (self), NULL);
+ self->secondary_info = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ self->revealer = g_object_new (GTK_TYPE_REVEALER,
+ "child", self->secondary_info,
+ "transition-type", GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN,
+ NULL);
+ gtk_widget_insert_after (self->revealer, GTK_WIDGET (self), self->reveal_button);
+ g_signal_connect (self->reveal_button, "clicked", G_CALLBACK (on_reveal_button_clicked), self);
+ self->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+}
+
+static GtkWidget*
+_gcr_certificate_widget_add_section (GcrCertificateWidget *self,
+ const gchar *title,
+ GIcon *icon,
+ gboolean important)
+{
+ GtkWidget *widget;
+
+ g_assert (GCR_IS_CERTIFICATE_WIDGET (self));
+
+ if (icon)
+ widget = gcr_section_new_with_icon (title, icon);
+ else
+ widget = gcr_section_new (title);
+
+ gtk_size_group_add_widget (self->size_group, widget);
+ if (important)
+ gtk_widget_insert_before (widget, GTK_WIDGET (self), self->reveal_button);
+ else
+ gtk_box_append (GTK_BOX (self->secondary_info), widget);
+
+ return widget;
+}
+
+static GtkWidget*
+create_value_label (const gchar *label)
+{
+ return g_object_new (GTK_TYPE_LABEL,
+ "label", label,
+ "xalign", 1.0,
+ "halign", GTK_ALIGN_END,
+ "hexpand", TRUE,
+ "selectable", TRUE,
+ "wrap", TRUE,
+ NULL);
+}
+
+static gchar*
+calculate_label (GcrCertificateWidget *self)
+{
+ gchar *label;
+
+ label = gcr_certificate_get_subject_cn (self->certificate);
+ if (label != NULL)
+ return label;
+
+ return g_strdup (_("Certificate"));
+}
+
+static void
+on_parsed_dn_part (guint index,
+ GQuark oid,
+ GNode *value,
+ gpointer user_data)
+{
+ GtkWidget *section = user_data;
+ const gchar *attr;
+ const gchar *desc;
+ gchar *field = NULL;
+ gchar *display;
+
+ attr = egg_oid_get_name (oid);
+ desc = egg_oid_get_description (oid);
+
+ /* Combine them into something sane */
+ if (attr && desc) {
+ if (strcmp (attr, desc) == 0)
+ field = g_strdup (attr);
+ else
+ field = g_strdup_printf ("%s (%s)", attr, desc);
+ } else if (!attr && !desc) {
+ field = g_strdup ("");
+ } else if (attr) {
+ field = g_strdup (attr);
+ } else if (desc) {
+ field = g_strdup (desc);
+ } else {
+ g_assert_not_reached ();
+ }
+
+ display = egg_dn_print_value (oid, value);
+ if (display == NULL)
+ display = g_strdup ("");
+
+ gcr_section_add_child (GCR_SECTION (section), field, create_value_label (display));
+
+ g_free (field);
+ g_free (display);
+}
+
+static inline gchar *
+hex_encode_bytes (GBytes *bytes)
+{
+ gsize size;
+ gconstpointer data = g_bytes_get_data (bytes, &size);
+ return egg_hex_encode_full (data, size, TRUE, " ", 1);
+}
+
+static void
+append_subject_public_key (GcrCertificateWidget *self,
+ GcrSection *section,
+ GNode *subject_public_key)
+{
+ guint key_nbits;
+ const gchar *text;
+ gchar *display;
+ GBytes *value;
+ guchar *raw;
+ gsize n_raw;
+ GQuark oid;
+ guint bits;
+
+ key_nbits = gcr_certificate_get_key_size (self->certificate);
+
+ oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (subject_public_key,
+ "algorithm", "algorithm", NULL));
+ text = egg_oid_get_description (oid);
+ gcr_section_add_child (section, _("Key Algorithm"), create_value_label (text));
+
+ value = egg_asn1x_get_element_raw (egg_asn1x_node (subject_public_key,
+ "algorithm", "parameters", NULL));
+ if (value) {
+ display = hex_encode_bytes (value);
+ gcr_section_add_child (section, _("Key Parameters"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ g_bytes_unref (value);
+ }
+
+ if (key_nbits > 0) {
+ display = g_strdup_printf ("%u", key_nbits);
+ gcr_section_add_child (section, _("Key Size"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ }
+
+ value = egg_asn1x_get_element_raw (subject_public_key);
+ raw = gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (value, NULL),
+ g_bytes_get_size (value),
+ G_CHECKSUM_SHA1, &n_raw);
+ g_bytes_unref (value);
+ display = egg_hex_encode_full (raw, n_raw, TRUE, " ", 1);
+ g_free (raw);
+ gcr_section_add_child (section, _("Key SHA1 Fingerprint"), create_value_label (text));
+ g_clear_pointer (&display, g_free);
+
+ value = egg_asn1x_get_bits_as_raw (egg_asn1x_node (subject_public_key, "subjectPublicKey", NULL), &bits);
+ display = egg_hex_encode_full (g_bytes_get_data (value, NULL), bits / 8, TRUE, " ", 1);
+ gcr_section_add_child (section, _("Public Key"), create_value_label (text));
+ g_clear_pointer (&display, g_free);
+ g_bytes_unref (value);
+}
+
+static GcrSection *
+append_extension_basic_constraints (GcrCertificateWidget *self,
+ GBytes *data)
+{
+ GcrSection *section;
+ gboolean is_ca = FALSE;
+ gint path_len = -1;
+ gchar *number;
+
+ if (!_gcr_certificate_extension_basic_constraints (data, &is_ca, &path_len))
+ return NULL;
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Basic Constraints"), NULL, FALSE));
+ gcr_section_add_child (section, _("Certificate Authority"), create_value_label (is_ca ? _("Yes") : _("No")));
+
+ number = g_strdup_printf ("%d", path_len);
+ gcr_section_add_child (section, _("Max Path Length"), create_value_label (path_len < 0 ? _("Unlimited") : number));
+ g_free (number);
+
+ return section;
+}
+
+static GcrSection *
+append_extension_extended_key_usage (GcrCertificateWidget *self,
+ GBytes *data)
+{
+ GcrSection *section;
+ GQuark *oids;
+ GString *text;
+ guint i;
+
+ oids = _gcr_certificate_extension_extended_key_usage (data);
+ if (oids == NULL)
+ return NULL;
+
+ text = g_string_new ("");
+ for (i = 0; oids[i] != 0; i++) {
+ if (i > 0)
+ g_string_append_unichar (text, '\n');
+ g_string_append (text, egg_oid_get_description (oids[i]));
+ }
+
+ g_free (oids);
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Extended Key Usage"), NULL, FALSE));
+ gcr_section_add_child (section, _("Allowed Purposes"), create_value_label (text->str));
+
+ g_string_free (text, TRUE);
+
+ return section;
+}
+
+static GcrSection *
+append_extension_subject_key_identifier (GcrCertificateWidget *self,
+ GBytes *data)
+{
+ GcrSection *section;
+ gpointer keyid;
+ gsize n_keyid;
+
+ keyid = _gcr_certificate_extension_subject_key_identifier (data, &n_keyid);
+ if (keyid == NULL)
+ return NULL;
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Subject Key Identifier"), NULL, FALSE));
+ gchar *display = egg_hex_encode_full (keyid, n_keyid, TRUE, " ", 1);
+ g_free (keyid);
+ gcr_section_add_child (section, _("Key Identifier"), create_value_label (display));
+ g_free (display);
+
+ return section;
+}
+
+static const struct {
+ guint usage;
+ const gchar *description;
+} usage_descriptions[] = {
+ { GCR_KEY_USAGE_DIGITAL_SIGNATURE, N_("Digital signature") },
+ { GCR_KEY_USAGE_NON_REPUDIATION, N_("Non repudiation") },
+ { GCR_KEY_USAGE_KEY_ENCIPHERMENT, N_("Key encipherment") },
+ { GCR_KEY_USAGE_DATA_ENCIPHERMENT, N_("Data encipherment") },
+ { GCR_KEY_USAGE_KEY_AGREEMENT, N_("Key agreement") },
+ { GCR_KEY_USAGE_KEY_CERT_SIGN, N_("Certificate signature") },
+ { GCR_KEY_USAGE_CRL_SIGN, N_("Revocation list signature") },
+ { GCR_KEY_USAGE_ENCIPHER_ONLY, N_("Encipher only") },
+ { GCR_KEY_USAGE_DECIPHER_ONLY, N_("Decipher only") }
+};
+
+static GcrSection *
+append_extension_key_usage (GcrCertificateWidget *self,
+ GBytes *data)
+{
+ GcrSection *section;
+ gulong key_usage;
+ GString *text;
+ guint i;
+
+ if (!_gcr_certificate_extension_key_usage (data, &key_usage))
+ return NULL;
+
+ text = g_string_new ("");
+
+ for (i = 0; i < G_N_ELEMENTS (usage_descriptions); i++) {
+ if (key_usage & usage_descriptions[i].usage) {
+ if (text->len > 0)
+ g_string_append_unichar (text, '\n');
+ g_string_append (text, _(usage_descriptions[i].description));
+ }
+ }
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Key Usage"), NULL, FALSE));
+ gcr_section_add_child (section, _("Usages"), create_value_label (text->str));
+
+ g_string_free (text, TRUE);
+
+ return section;
+}
+
+static GcrSection *
+append_extension_subject_alt_name (GcrCertificateWidget *self,
+ GBytes *data)
+{
+ GcrSection *section;
+ GArray *general_names;
+ GcrGeneralName *general;
+ guint i;
+
+ general_names = _gcr_certificate_extension_subject_alt_name (data);
+ if (general_names == NULL)
+ return FALSE;
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Subject Alternative Names"), NULL, FALSE));
+
+ for (i = 0; i < general_names->len; i++) {
+ general = &g_array_index (general_names, GcrGeneralName, i);
+ if (general->display == NULL) {
+ gchar *display = hex_encode_bytes (general->raw);
+ gcr_section_add_child (section, general->description, create_value_label (display));
+ g_free (display);
+ } else
+ gcr_section_add_child (section, general->description, create_value_label (general->display));
+ }
+
+ _gcr_general_names_free (general_names);
+
+ return section;
+}
+
+static GcrSection *
+append_extension_hex (GcrCertificateWidget *self,
+ GQuark oid,
+ GBytes *value)
+{
+ GcrSection *section;
+ const gchar *text;
+ gchar *display;
+
+ section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Extension"), NULL, FALSE));
+
+ /* Extension type */
+ text = egg_oid_get_description (oid);
+ gcr_section_add_child (section, _("Identifier"), create_value_label (text));
+ display = hex_encode_bytes (value);
+ gcr_section_add_child (section, _("Value"), create_value_label (display));
+ g_free (display);
+
+ return section;
+}
+
+static void
+append_extension (GcrCertificateWidget *self,
+ GNode *node)
+{
+ GQuark oid;
+ GBytes *value;
+ gboolean critical;
+ GcrSection *section = NULL;
+
+ /* Dig out the OID */
+ oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (node, "extnID", NULL));
+ g_return_if_fail (oid);
+
+ /* Extension value */
+ value = egg_asn1x_get_string_as_bytes (egg_asn1x_node (node, "extnValue", NULL));
+
+ /* The custom parsers */
+ if (oid == GCR_OID_BASIC_CONSTRAINTS)
+ section = append_extension_basic_constraints (self, value);
+ else if (oid == GCR_OID_EXTENDED_KEY_USAGE)
+ section = append_extension_extended_key_usage (self, value);
+ else if (oid == GCR_OID_SUBJECT_KEY_IDENTIFIER)
+ section = append_extension_subject_key_identifier (self, value);
+ else if (oid == GCR_OID_KEY_USAGE)
+ section = append_extension_key_usage (self, value);
+ else if (oid == GCR_OID_SUBJECT_ALT_NAME)
+ section = append_extension_subject_alt_name (self, value);
+
+ /* Otherwise the default raw display */
+ if (!section) {
+ section = append_extension_hex (self, oid, value);
+ }
+
+ /* Critical */
+ if (section && egg_asn1x_get_boolean (egg_asn1x_node (node, "critical", NULL), &critical)) {
+ gcr_section_add_child (section, _("Critical"), create_value_label (critical ? _("Yes") : _("No")));
+ }
+
+ g_bytes_unref (value);
+}
+
+/**
+ * gcr_certificate_widget_new:
+ * @certificate: (nullable): certificate to display, or %NULL
+ *
+ * Create a new certificate widget which displays a given certificate.
+ *
+ * Returns: (transfer full): a newly allocated #GcrCertificateWidget, which
+ * should be freed with g_object_unref()
+ */
+GtkWidget *
+gcr_certificate_widget_new (GcrCertificate *certificate)
+{
+ return g_object_new (GCR_TYPE_CERTIFICATE_WIDGET, "certificate", certificate, NULL);
+}
+
+/**
+ * gcr_certificate_widget_get_certificate:
+ * @self: The certificate widget
+ *
+ * Get the certificate displayed in the widget.
+ *
+ * Returns: (nullable) (transfer none): the certificate
+ */
+GcrCertificate *
+gcr_certificate_widget_get_certificate (GcrCertificateWidget *self)
+{
+ g_return_val_if_fail (GCR_IS_CERTIFICATE_WIDGET (self), NULL);
+ return self->certificate;
+}
+
+/**
+ * gcr_certificate_widget_set_certificate:
+ * @self: The certificate widget
+ * @certificate: (nullable): the certificate to display
+ *
+ * Set the certificate displayed in the widget
+ */
+void
+gcr_certificate_widget_set_certificate (GcrCertificateWidget *self, GcrCertificate *certificate)
+{
+ GtkWidget *section, *label;
+ PangoAttrList *attributes;
+ gchar *display;
+ GIcon *icon;
+ GBytes *bytes, *number;
+ GNode *asn, *subject_public_key;
+ GQuark oid;
+ gconstpointer data;
+ gsize n_data;
+ GDate date;
+ gulong version;
+ guint bits, index;
+
+ g_return_if_fail (GCR_IS_CERTIFICATE_WIDGET (self));
+
+ g_set_object (&self->certificate, certificate);
+
+ data = gcr_certificate_get_der_data (self->certificate, &n_data);
+ if (!data) {
+ g_set_object (&self->certificate, NULL);
+ }
+
+ icon = gcr_certificate_get_icon (self->certificate);
+ display = calculate_label (self);
+ section = _gcr_certificate_widget_add_section (self, display, icon, TRUE);
+ g_clear_pointer (&display, g_free);
+ g_object_unref (icon);
+
+ bytes = g_bytes_new_static (data, n_data);
+ asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", bytes);
+ g_bytes_unref (bytes);
+
+ display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL), "CN");
+ gcr_section_add_child (GCR_SECTION (section), _("Identity"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+
+ display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL), "CN");
+ gcr_section_add_child (GCR_SECTION (section), _("Verified by"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+
+ if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) {
+ display = g_malloc0 (128);
+ if (!g_date_strftime (display, 128, "%x", &date))
+ g_return_if_reached ();
+ gcr_section_add_child (GCR_SECTION (section), _("Expires"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ }
+
+ /* The subject */
+ section = _gcr_certificate_widget_add_section (self, _("Subject Name"), NULL, FALSE);
+ egg_dn_parse (egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL), on_parsed_dn_part, section);
+
+ /* The Issuer */
+ section = _gcr_certificate_widget_add_section (self, _("Issuer Name"), NULL, FALSE);
+ egg_dn_parse (egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL), on_parsed_dn_part, section);
+
+ /* The Issued Parameters */
+ section = _gcr_certificate_widget_add_section (self, _("Issued Certificate"), NULL, FALSE);
+
+ if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "tbsCertificate", "version", NULL), &version)) {
+ g_critical ("Unable to parse certificate version");
+ } else {
+ display = g_strdup_printf ("%lu", version + 1);
+ gcr_section_add_child (GCR_SECTION (section), _("Version"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ }
+
+ number = egg_asn1x_get_integer_as_raw (egg_asn1x_node (asn, "tbsCertificate", "serialNumber", NULL));
+ if (!number) {
+ g_critical ("Unable to parse certificate serial number");
+ } else {
+ display = hex_encode_bytes (number);
+ gcr_section_add_child (GCR_SECTION (section), _("Serial Number"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ g_bytes_unref (number);
+ }
+
+ display = g_malloc0 (128);
+ if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notBefore", NULL), &date)) {
+ if (!g_date_strftime (display, 128, "%x", &date))
+ g_return_if_reached ();
+ gcr_section_add_child (GCR_SECTION (section), _("Not Valid Before"), create_value_label (display));
+ }
+ if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) {
+ if (!g_date_strftime (display, 128, "%x", &date))
+ g_return_if_reached ();
+ gcr_section_add_child (GCR_SECTION (section), _("Not Valid After"), create_value_label (display));
+ }
+ g_clear_pointer (&display, g_free);
+
+ /* Fingerprints */
+ section = _gcr_certificate_widget_add_section (self, _("Certificate Fingerprints"), NULL, FALSE);
+ display = g_compute_checksum_for_bytes (G_CHECKSUM_SHA1, bytes);
+ gcr_section_add_child (GCR_SECTION (section), "SHA1", create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ display = g_compute_checksum_for_bytes (G_CHECKSUM_MD5, bytes);
+ gcr_section_add_child (GCR_SECTION (section), "MD5", create_value_label (display));
+ g_clear_pointer (&display, g_free);
+
+ /* Public Key Info */
+ section = _gcr_certificate_widget_add_section (self, _("Public Key Info"), NULL, FALSE);
+ subject_public_key = egg_asn1x_node (asn, "tbsCertificate", "subjectPublicKeyInfo", NULL);
+ append_subject_public_key (self, GCR_SECTION (section), subject_public_key);
+
+ /* Extensions */
+ for (index = 1; TRUE; ++index) {
+ GNode *extension = egg_asn1x_node (asn, "tbsCertificate", "extensions", index, NULL);
+ if (extension == NULL)
+ break;
+ append_extension (self, extension);
+ }
+
+ /* Signature */
+ section = _gcr_certificate_widget_add_section (self, _("Signature"), NULL, FALSE);
+
+ oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "signatureAlgorithm", "algorithm", NULL));
+ gcr_section_add_child (GCR_SECTION (section), _("Signature Algorithm"), create_value_label (egg_oid_get_description (oid)));
+
+ bytes = egg_asn1x_get_element_raw (egg_asn1x_node (asn, "signatureAlgorithm", "parameters", NULL));
+ if (bytes) {
+ display = hex_encode_bytes (bytes);
+ gcr_section_add_child (GCR_SECTION (section), _("Signature Parameters"), create_value_label (display));
+ g_clear_pointer (&display, g_free);
+ g_bytes_unref (bytes);
+ }
+
+ bytes = egg_asn1x_get_bits_as_raw (egg_asn1x_node (asn, "signature", NULL), &bits);
+ display = egg_hex_encode_full (g_bytes_get_data (bytes, NULL), bits / 8, TRUE, " ", 1);
+ g_bytes_unref (bytes);
+ label = create_value_label (display);
+ attributes = pango_attr_list_new ();
+ pango_attr_list_insert (attributes, pango_attr_family_new ("Monospace"));
+ gtk_label_set_attributes (GTK_LABEL (label), attributes);
+ pango_attr_list_unref (attributes);
+ gcr_section_add_child (GCR_SECTION (section), _("Signature"), label);
+ g_clear_pointer (&display, g_free);
+
+ egg_asn1x_destroy (asn);
+}
diff --git a/gcr-gtk4/gcr-certificate-widget.h b/gcr-gtk4/gcr-certificate-widget.h
new file mode 100644
index 0000000..fb36733
--- /dev/null
+++ b/gcr-gtk4/gcr-certificate-widget.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2021 Collabora Ltd.
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#ifndef __GCR_CERTIFICATE_WIDGET_H__
+#define __GCR_CERTIFICATE_WIDGET_H__
+
+#include <gck/gck.h>
+#include <gcr/gcr.h>
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GCR_TYPE_CERTIFICATE_WIDGET gcr_certificate_widget_get_type ()
+G_DECLARE_FINAL_TYPE (GcrCertificateWidget, gcr_certificate_widget, GCR, CERTIFICATE_WIDGET, GtkWidget)
+
+GtkWidget *gcr_certificate_widget_new (GcrCertificate *certificate);
+
+GcrCertificate *gcr_certificate_widget_get_certificate (GcrCertificateWidget *self);
+
+void gcr_certificate_widget_set_certificate (GcrCertificateWidget *self,
+ GcrCertificate *certificate);
+
+G_END_DECLS
+
+#endif /* __GCR_CERTIFICATE_WIDGET_H__ */
diff --git a/gcr-gtk4/gcr-gtk4.h b/gcr-gtk4/gcr-gtk4.h
new file mode 100644
index 0000000..f94bf92
--- /dev/null
+++ b/gcr-gtk4/gcr-gtk4.h
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2021 Collabora Ltd.
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#ifndef __GCR_GTK4_H__
+#define __GCR_GTK4_H__
+
+#include <glib.h>
+
+#include <gcr/gcr.h>
+
+#define __GCR_GTK4_INSIDE_HEADER__
+
+#include <gcr-gtk4/gcr-certificate-widget.h>
+
+#undef __GCR_GTK4_INSIDE_HEADER__
+
+#endif /* __GCR_GTK4_H__ */
diff --git a/gcr-gtk4/gcr-section.c b/gcr-gtk4/gcr-section.c
new file mode 100644
index 0000000..33aa1c3
--- /dev/null
+++ b/gcr-gtk4/gcr-section.c
@@ -0,0 +1,222 @@
+/*
+ * Copyright 2021 Collabora Ltd.
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#include "gcr-section.h"
+
+struct _GcrSection
+{
+ GtkWidget parent_instance;
+
+ GtkWidget *frame;
+ GtkWidget *label;
+ GtkWidget *image;
+ GtkWidget *listbox;
+ GtkSizeGroup *size_group;
+};
+
+G_DEFINE_TYPE (GcrSection, gcr_section, GTK_TYPE_WIDGET)
+
+enum {
+ PROP_TITLE = 1,
+ PROP_ICON,
+ N_PROPERTIES
+};
+
+static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
+
+static void
+gcr_section_dispose (GObject *object)
+{
+ GcrSection *self = (GcrSection *)object;
+
+ g_clear_object (&self->size_group);
+ g_clear_pointer (&self->label, gtk_widget_unparent);
+ g_clear_pointer (&self->image, gtk_widget_unparent);
+ g_clear_pointer (&self->frame, gtk_widget_unparent);
+
+ G_OBJECT_CLASS (gcr_section_parent_class)->dispose (object);
+}
+
+static void
+gcr_section_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GcrSection *self = GCR_SECTION (object);
+
+ switch (prop_id)
+ {
+ case PROP_TITLE:
+ g_value_set_string (value, gtk_label_get_label (GTK_LABEL (self->label)));
+ break;
+ case PROP_ICON:
+ g_value_set_object (value, gtk_image_get_gicon (GTK_IMAGE (self->image)));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+gcr_section_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GcrSection *self = GCR_SECTION (object);
+
+ switch (prop_id)
+ {
+ case PROP_TITLE:
+ gtk_label_set_label (GTK_LABEL (self->label), g_value_get_string (value));
+ break;
+ case PROP_ICON:
+ if (!self->image)
+ {
+ GtkLayoutManager *layout_manager;
+ GtkLayoutChild *child;
+
+ self->image = gtk_image_new ();
+ gtk_widget_insert_after (self->image, GTK_WIDGET (self), self->label);
+ layout_manager = gtk_widget_get_layout_manager (GTK_WIDGET (self));
+
+ child = gtk_layout_manager_get_layout_child (layout_manager, self->image);
+ g_object_set (G_OBJECT (child),
+ "column", 1,
+ NULL);
+
+ child = gtk_layout_manager_get_layout_child (layout_manager, self->frame);
+ g_object_set (G_OBJECT (child),
+ "column-span", 2,
+ NULL);
+ }
+
+ gtk_image_set_from_gicon (GTK_IMAGE (self->image), g_value_get_object (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+gcr_section_class_init (GcrSectionClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ object_class->dispose = gcr_section_dispose;
+ object_class->get_property = gcr_section_get_property;
+ object_class->set_property = gcr_section_set_property;
+ obj_properties[PROP_TITLE] =
+ g_param_spec_string ("title",
+ "Title",
+ "The title of the section",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+
+ obj_properties[PROP_ICON] =
+ g_param_spec_object ("icon",
+ "Icon",
+ "The Icon to use",
+ G_TYPE_ICON,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class,
+ N_PROPERTIES,
+ obj_properties);
+
+ gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_GRID_LAYOUT);
+}
+
+static void
+gcr_section_init (GcrSection *self)
+{
+ GtkLayoutManager *layout_manager;
+ GtkLayoutChild *child;
+
+ self->label = gtk_label_new (NULL);
+ g_object_set (G_OBJECT (self->label),
+ "margin-start", 12,
+ "margin-end", 12,
+ "margin-top", 8,
+ "margin-bottom", 8,
+ "xalign", 0.0,
+ "halign", GTK_ALIGN_START,
+ "hexpand", TRUE,
+ NULL);
+ gtk_style_context_add_class (gtk_widget_get_style_context (self->label), "caption-heading");
+ self->listbox = gtk_list_box_new ();
+ gtk_list_box_set_selection_mode (GTK_LIST_BOX (self->listbox), GTK_SELECTION_NONE);
+ self->frame = gtk_frame_new (NULL);
+ g_object_set (G_OBJECT (self->frame),
+ "child", self->listbox,
+ "hexpand", TRUE,
+ NULL);
+ self->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+ gtk_widget_insert_after (self->label, GTK_WIDGET (self), NULL);
+ gtk_widget_insert_after (self->frame, GTK_WIDGET (self), self->label);
+ layout_manager = gtk_widget_get_layout_manager (GTK_WIDGET (self));
+
+ child = gtk_layout_manager_get_layout_child (layout_manager, self->frame);
+ g_object_set (G_OBJECT (child),
+ "row", 1,
+ NULL);
+ g_object_set (self,
+ "margin-start", 12,
+ "margin-end", 12,
+ "margin-top", 8,
+ "margin-bottom", 8,
+ NULL);
+}
+
+GtkWidget *
+gcr_section_new (const gchar *title)
+{
+ return g_object_new (GCR_TYPE_SECTION, "title", title, NULL);
+}
+
+GtkWidget *
+gcr_section_new_with_icon (const gchar *title,
+ GIcon *icon)
+{
+ return g_object_new (GCR_TYPE_SECTION, "title", title, "icon", icon, NULL);
+}
+
+void
+gcr_section_add_child (GcrSection *self,
+ const gchar *description,
+ GtkWidget *child)
+{
+ GtkWidget *row, *box, *label;
+ g_return_if_fail (GCR_IS_SECTION (self));
+
+ row = gtk_list_box_row_new ();
+ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+ gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), box);
+ label = gtk_label_new (description);
+ gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+ g_object_set (label,
+ "margin-start", 12,
+ "margin-end", 12,
+ "margin-top", 8,
+ "margin-bottom", 8,
+ "xalign", 0.0,
+ "halign", GTK_ALIGN_START,
+ NULL);
+ gtk_style_context_add_class (gtk_widget_get_style_context (label), "caption");
+ g_object_set (child,
+ "margin-start", 12,
+ "margin-end", 12,
+ "margin-top", 8,
+ "margin-bottom", 8,
+ "halign", GTK_ALIGN_END,
+ NULL);
+ gtk_size_group_add_widget (self->size_group, label);
+ gtk_box_append (GTK_BOX (box), label);
+ gtk_box_append (GTK_BOX (box), child);
+ gtk_list_box_insert (GTK_LIST_BOX (self->listbox), row, -1);
+}
diff --git a/gcr-gtk4/gcr-section.h b/gcr-gtk4/gcr-section.h
new file mode 100644
index 0000000..9f275d9
--- /dev/null
+++ b/gcr-gtk4/gcr-section.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2021 Collabora Ltd.
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#ifndef __GCR_SECTION_H__
+#define __GCR_SECTION_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GCR_TYPE_SECTION gcr_section_get_type()
+
+G_DECLARE_FINAL_TYPE (GcrSection, gcr_section, GCR, SECTION, GtkWidget)
+
+GtkWidget *gcr_section_new (const gchar *title);
+GtkWidget *gcr_section_new_with_icon (const gchar *title,
+ GIcon *icon);
+
+void gcr_section_add_child (GcrSection *self,
+ const gchar *description,
+ GtkWidget *child);
+
+G_END_DECLS
+
+#endif /* __GCR_SECTION_H__ */
diff --git a/ui/libgcr-ui.map b/gcr-gtk4/libgcr-gtk4.map
index 4a16138..4a16138 100644
--- a/ui/libgcr-ui.map
+++ b/gcr-gtk4/libgcr-gtk4.map
diff --git a/gcr-gtk4/meson.build b/gcr-gtk4/meson.build
new file mode 100644
index 0000000..aa3f669
--- /dev/null
+++ b/gcr-gtk4/meson.build
@@ -0,0 +1,129 @@
+gcr_gtk4_headers_install_dir = gcr_headers_subdir / 'gcr-gtk4'
+
+gcr_gtk4_public_sources = files(
+ 'gcr-certificate-widget.c',
+)
+
+gcr_gtk4_private_sources = files(
+ 'gcr-section.c',
+)
+
+gcr_gtk4_headers = files(
+ 'gcr-certificate-widget.h',
+)
+
+
+gcr_gtk4_enums_gen = gnome.mkenums_simple('gcr-gtk4-enum-types',
+ sources: gcr_gtk4_headers,
+ install_header: true,
+ install_dir: get_option('includedir') / gcr_gtk4_headers_install_dir,
+)
+
+gcr_gtk4_sources = [
+ gcr_gtk4_private_sources,
+ gcr_gtk4_public_sources,
+ gcr_gtk4_enums_gen,
+]
+
+gcr_gtk4_deps = [
+ glib_deps,
+ p11kit_dep,
+ libegg_dep,
+ gck_dep,
+ gcr_dep,
+ gtk4_dep,
+]
+
+gcr_gtk4_cflags = [
+ '-DG_LOG_DOMAIN="GcrGtk4"',
+ '-DGCR_COMPILATION',
+ '-DGCR_API_SUBJECT_TO_CHANGE',
+ '-DGCK_API_SUBJECT_TO_CHANGE',
+ '-DP11_KIT_API_SUBJECT_TO_CHANGE',
+]
+
+gcr_gtk4_symbolmap = meson.current_source_dir() / 'libgcr-gtk4.map'
+gcr_gtk4_linkflags = cc.get_supported_link_arguments(
+ '-Wl,--version-script,@0@'.format(gcr_gtk4_symbolmap),
+)
+
+gcr_gtk4_lib = shared_library(gcr_gtk4_basename,
+ gcr_gtk4_sources,
+ dependencies: gcr_gtk4_deps,
+ c_args: gcr_gtk4_cflags,
+ link_args: gcr_gtk4_linkflags,
+ link_depends: gcr_gtk4_symbolmap,
+ include_directories: config_h_dir,
+ version: gcr_version,
+ soversion: gcr_soversion,
+ install: true,
+)
+
+gcr_gtk4_pkgconf_deps = [
+ glib_dep,
+ gio_dep,
+ gobject_dep,
+ gck_lib,
+ gcr_lib,
+ gtk4_dep,
+]
+
+pkgconfig.generate(gcr_gtk4_lib,
+ subdirs: gcr_headers_subdir,
+ requires: gcr_gtk4_pkgconf_deps,
+ description: 'Library providing Gtk4 widgets for high level crypto parsing and display',
+)
+
+install_headers([gcr_gtk4_headers ],
+ subdir: gcr_gtk4_headers_install_dir,
+)
+
+gcr_gtk4_dep = declare_dependency(
+ link_with: gcr_gtk4_lib,
+ sources: gcr_gtk4_enums_gen[1], # Make sure gcr-enum-types.h can be included
+)
+
+if get_option('introspection')
+ gcr_gtk4_gir = gnome.generate_gir(gcr_gtk4_lib,
+ sources: [ gcr_gtk4_headers, gcr_gtk4_public_sources ],
+ namespace: 'GcrGtk4',
+ nsversion: gcr_api_version,
+ export_packages: gcr_gtk4_basename,
+ identifier_prefix: 'Gcr',
+ symbol_prefix: 'gcr',
+ includes: [
+ 'GObject-2.0',
+ 'Gio-2.0',
+ 'Gtk-4.0',
+ gck_gir[0],
+ gcr_gir[0],
+ ],
+ header: 'gcr-gtk4/gcr-gtk4.h',
+ extra_args: [
+ '-DGCR_COMPILATION',
+ '-DGCR_API_SUBJECT_TO_CHANGE',
+ ],
+ install: true,
+ )
+
+ gcr_gtk4_vapi = gnome.generate_vapi(gcr_gtk4_basename,
+ sources: gcr_gtk4_gir[0],
+ packages: [
+ 'glib-2.0',
+ 'gio-2.0',
+ gck_vapi,
+ gcr_vapi,
+ 'gtk4'
+ ],
+ metadata_dirs: meson.current_source_dir(),
+ vapi_dirs: [
+ build_root / 'gck',
+ build_root / 'gcr',
+ ],
+ gir_dirs: [
+ build_root / 'gck',
+ build_root / 'gcr',
+ ],
+ install: true,
+ )
+endif
diff --git a/gcr/frob-certificate-request.c b/gcr/frob-certificate-request.c
index 6801b8c..459f391 100644
--- a/gcr/frob-certificate-request.c
+++ b/gcr/frob-certificate-request.c
@@ -23,7 +23,7 @@
#include "console-interaction.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "egg/egg-armor.h"
diff --git a/gcr/frob-openpgp.c b/gcr/frob-openpgp.c
index 433056b..7846f29 100644
--- a/gcr/frob-openpgp.c
+++ b/gcr/frob-openpgp.c
@@ -21,7 +21,7 @@
#include "config.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "gcr/gcr-openpgp.h"
#include "gcr/gcr-record.h"
diff --git a/gcr/frob-parser.c b/gcr/frob-parser.c
index 1abf2e9..f071eb5 100644
--- a/gcr/frob-parser.c
+++ b/gcr/frob-parser.c
@@ -21,7 +21,7 @@
#include "config.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include <unistd.h>
#include <string.h>
diff --git a/gcr/gcr-base.h b/gcr/gcr-base.h
deleted file mode 100644
index ea80d8e..0000000
--- a/gcr/gcr-base.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GI_SCANNER__
-#ifndef GCR_API_SUBJECT_TO_CHANGE
-#error <gcr/This API has not yet reached stability.>
-#endif
-#endif
-
-#ifndef __GCR_BASE_H__
-#define __GCR_BASE_H__
-
-#include <glib.h>
-
-#define __GCR_INSIDE_HEADER__
-
-#include <gcr/gcr-types.h>
-
-#include <gcr/gcr-certificate.h>
-#include <gcr/gcr-certificate-chain.h>
-#include <gcr/gcr-certificate-request.h>
-#include <gcr/gcr-column.h>
-#include <gcr/gcr-deprecated-base.h>
-#include <gcr/gcr-enum-types-base.h>
-#include <gcr/gcr-filter-collection.h>
-#include <gcr/gcr-icons.h>
-#include <gcr/gcr-importer.h>
-#include <gcr/gcr-library.h>
-#include <gcr/gcr-mock-prompter.h>
-#include <gcr/gcr-parser.h>
-#include <gcr/gcr-pkcs11-certificate.h>
-#include <gcr/gcr-prompt.h>
-#include <gcr/gcr-secret-exchange.h>
-#include <gcr/gcr-secure-memory.h>
-#include <gcr/gcr-simple-certificate.h>
-#include <gcr/gcr-simple-collection.h>
-#include <gcr/gcr-ssh-askpass.h>
-#include <gcr/gcr-system-prompt.h>
-#include <gcr/gcr-system-prompter.h>
-#include <gcr/gcr-trust.h>
-#include <gcr/gcr-union-collection.h>
-#include <gcr/gcr-unlock-options.h>
-#include <gcr/gcr-version.h>
-
-#undef __GCR_INSIDE_HEADER__
-
-#endif /* __GCR_BASE_H__ */
diff --git a/gcr/gcr-callback-output-stream.h b/gcr/gcr-callback-output-stream.h
index b4ba031..668ce5f 100644
--- a/gcr/gcr-callback-output-stream.h
+++ b/gcr/gcr-callback-output-stream.h
@@ -22,9 +22,8 @@
#ifndef GCR_CALLBACK_OUTPUT_STREAM_H
#define GCR_CALLBACK_OUTPUT_STREAM_H
-#include "gcr-collection.h"
-
#include <glib-object.h>
+#include <gio/gio.h>
G_BEGIN_DECLS
diff --git a/gcr/gcr-certificate-chain.c b/gcr/gcr-certificate-chain.c
index f34eae8..c5cb8b8 100644
--- a/gcr/gcr-certificate-chain.c
+++ b/gcr/gcr-certificate-chain.c
@@ -28,7 +28,7 @@
#include "gcr-simple-certificate.h"
#include "gcr-trust.h"
-#include "gcr/gcr-enum-types-base.h"
+#include "gcr/gcr-enum-types.h"
#include "egg/egg-error.h"
diff --git a/gcr/gcr-certificate-chain.h b/gcr/gcr-certificate-chain.h
index 002db1b..78decd5 100644
--- a/gcr/gcr-certificate-chain.h
+++ b/gcr/gcr-certificate-chain.h
@@ -19,13 +19,13 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_CERTIFICATE_CHAIN_H__
#define __GCR_CERTIFICATE_CHAIN_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include <glib-object.h>
#include "gcr-certificate.h"
diff --git a/gcr/gcr-certificate-extensions.h b/gcr/gcr-certificate-extensions.h
index 0e5d135..6b42d44 100644
--- a/gcr/gcr-certificate-extensions.h
+++ b/gcr/gcr-certificate-extensions.h
@@ -20,7 +20,7 @@
*/
#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
+#error "Only <gcr/gcr.h> can be included directly."
#endif
#ifndef GCR_CERTIFICATE_EXTENSIONS_H
diff --git a/gcr/gcr-certificate-request.c b/gcr/gcr-certificate-request.c
index dd58d42..452d1e1 100644
--- a/gcr/gcr-certificate-request.c
+++ b/gcr/gcr-certificate-request.c
@@ -23,7 +23,7 @@
#include "gcr-key-mechanisms.h"
#include "gcr-subject-public-key.h"
-#include "gcr/gcr-enum-types-base.h"
+#include "gcr/gcr-enum-types.h"
#include "gcr/gcr-oids.h"
#include <egg/egg-armor.h>
diff --git a/gcr/gcr-certificate-request.h b/gcr/gcr-certificate-request.h
index d8acdbd..623dc3d 100644
--- a/gcr/gcr-certificate-request.h
+++ b/gcr/gcr-certificate-request.h
@@ -17,13 +17,13 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_CERTIFICATE_REQUEST_H__
#define __GCR_CERTIFICATE_REQUEST_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include <glib-object.h>
#include "gcr-types.h"
diff --git a/gcr/gcr-certificate.c b/gcr/gcr-certificate.c
index dd2b666..eb1b10a 100644
--- a/gcr/gcr-certificate.c
+++ b/gcr/gcr-certificate.c
@@ -1081,7 +1081,7 @@ gcr_certificate_mixin_emit_notify (GcrCertificate *self)
* macro instead of this function.
*/
void
-gcr_certificate_mixin_comparable_init (GcrComparableIface *iface)
+gcr_certificate_mixin_comparable_init (GcrComparableInterface *iface)
{
iface->compare = gcr_certificate_compare;
}
diff --git a/gcr/gcr-certificate.h b/gcr/gcr-certificate.h
index b414325..12a1275 100644
--- a/gcr/gcr-certificate.h
+++ b/gcr/gcr-certificate.h
@@ -17,13 +17,13 @@
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_CERTIFICATE_H__
#define __GCR_CERTIFICATE_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include "gcr-types.h"
#include "gcr-column.h"
#include "gcr-comparable.h"
@@ -137,7 +137,7 @@ gboolean gcr_certificate_get_basic_constraints (GcrCertificate *self
void gcr_certificate_mixin_emit_notify (GcrCertificate *self);
-void gcr_certificate_mixin_comparable_init (GcrComparableIface *iface);
+void gcr_certificate_mixin_comparable_init (GcrComparableInterface *iface);
void gcr_certificate_mixin_class_init (GObjectClass *object_class);
diff --git a/gcr/gcr-collection.c b/gcr/gcr-collection.c
deleted file mode 100644
index c4c05e5..0000000
--- a/gcr/gcr-collection.c
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr-collection.h"
-
-/**
- * GcrCollection:
- *
- * A #GcrCollection is used to group a set of objects.
- *
- * This is an abstract interface which can be used to determine which objects
- * show up in a selector or other user interface element.
- *
- * Use [ctor@SimpleCollection.new] to create a concrete implementation of this
- * interface which you can add objects to.
- */
-
-enum {
- ADDED,
- REMOVED,
- LAST_SIGNAL,
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-
-typedef GcrCollectionIface GcrCollectionInterface;
-
-G_DEFINE_INTERFACE (GcrCollection, gcr_collection, G_TYPE_OBJECT);
-
-static void
-gcr_collection_default_init (GcrCollectionIface *iface)
-{
- static size_t initialized = 0;
-
- if (g_once_init_enter (&initialized)) {
-
- /**
- * GcrCollection::added:
- * @self: the collection
- * @object: (type GObject.Object): object that was added
- *
- * This signal is emitted when an object is added to the collection.
- */
- signals[ADDED] = g_signal_new ("added", GCR_TYPE_COLLECTION,
- G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GcrCollectionIface, added),
- NULL, NULL, NULL,
- G_TYPE_NONE, 1, G_TYPE_OBJECT);
-
- /**
- * GcrCollection::removed:
- * @self: the collection
- * @object: (type GObject.Object): object that was removed
- *
- * This signal is emitted when an object is removed from the collection.
- */
- signals[REMOVED] = g_signal_new ("removed", GCR_TYPE_COLLECTION,
- G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GcrCollectionIface, removed),
- NULL, NULL, NULL,
- G_TYPE_NONE, 1, G_TYPE_OBJECT);
-
- g_once_init_leave (&initialized, 1);
- }
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-
-/**
- * gcr_collection_get_length:
- * @self: The collection
- *
- * Get the number of objects in this collection.
- *
- * Returns: The number of objects.
- */
-guint
-gcr_collection_get_length (GcrCollection *self)
-{
- g_return_val_if_fail (GCR_IS_COLLECTION (self), 0);
- g_return_val_if_fail (GCR_COLLECTION_GET_INTERFACE (self)->get_length, 0);
- return GCR_COLLECTION_GET_INTERFACE (self)->get_length (self);
-}
-
-/**
- * gcr_collection_get_objects:
- * @self: The collection
- *
- * Get a list of the objects in this collection.
- *
- * Returns: (transfer container) (element-type GObject.Object): a list of the objects
- * in this collection, which should be freed with g_list_free()
- */
-GList*
-gcr_collection_get_objects (GcrCollection *self)
-{
- g_return_val_if_fail (GCR_IS_COLLECTION (self), 0);
- g_return_val_if_fail (GCR_COLLECTION_GET_INTERFACE (self)->get_objects, 0);
- return GCR_COLLECTION_GET_INTERFACE (self)->get_objects (self);
-}
-
-/**
- * gcr_collection_contains:
- * @self: the collection
- * @object: object to check
- *
- * Check whether the collection contains an object or not.
- *
- * Returns: whether the collection contains this object
- */
-gboolean
-gcr_collection_contains (GcrCollection *self,
- GObject *object)
-{
- g_return_val_if_fail (GCR_IS_COLLECTION (self), FALSE);
- g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
- g_return_val_if_fail (GCR_COLLECTION_GET_INTERFACE (self)->contains, FALSE);
- return GCR_COLLECTION_GET_INTERFACE (self)->contains (self, object);
-}
-
-/**
- * gcr_collection_emit_added:
- * @self: The collection
- * @object: The object that was added
- *
- * Emit the #GcrCollection::added signal for the given object. This function
- * is used by implementors of this interface.
- */
-void
-gcr_collection_emit_added (GcrCollection *self, GObject *object)
-{
- g_return_if_fail (GCR_IS_COLLECTION (self));
- g_signal_emit (self, signals[ADDED], 0, object);
-}
-
-/**
- * gcr_collection_emit_removed:
- * @self: The collection
- * @object: The object that was removed
- *
- * Emit the #GcrCollection::removed signal for the given object. This function
- * is used by implementors of this interface.
- */
-void
-gcr_collection_emit_removed (GcrCollection *self, GObject *object)
-{
- g_return_if_fail (GCR_IS_COLLECTION (self));
- g_signal_emit (self, signals[REMOVED], 0, object);
-}
diff --git a/gcr/gcr-collection.h b/gcr/gcr-collection.h
deleted file mode 100644
index 6a1d193..0000000
--- a/gcr/gcr-collection.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __GCR_COLLECTION_H__
-#define __GCR_COLLECTION_H__
-
-#include "gcr-types.h"
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_COLLECTION (gcr_collection_get_type())
-#define GCR_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COLLECTION, GcrCollection))
-#define GCR_IS_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COLLECTION))
-#define GCR_COLLECTION_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_COLLECTION, GcrCollectionIface))
-
-typedef struct _GcrCollection GcrCollection;
-typedef struct _GcrCollectionIface GcrCollectionIface;
-
-struct _GcrCollectionIface {
- GTypeInterface parent;
-
- /* signals */
- void (*added) (GcrCollection *self, GObject *object);
-
- void (*removed) (GcrCollection *self, GObject *object);
-
- /* virtual */
- guint (*get_length) (GcrCollection *self);
-
- GList* (*get_objects) (GcrCollection *self);
-
- gboolean (*contains) (GcrCollection *self,
- GObject *object);
-
- /*< private >*/
- gpointer dummy1;
- gpointer dummy2;
- gpointer dummy3;
- gpointer dummy5;
- gpointer dummy6;
- gpointer dummy7;
- gpointer dummy8;
-};
-
-GType gcr_collection_get_type (void);
-
-guint gcr_collection_get_length (GcrCollection *self);
-
-GList* gcr_collection_get_objects (GcrCollection *self);
-
-gboolean gcr_collection_contains (GcrCollection *self,
- GObject *object);
-
-void gcr_collection_emit_added (GcrCollection *self,
- GObject *object);
-
-void gcr_collection_emit_removed (GcrCollection *self,
- GObject *object);
-
-G_END_DECLS
-
-#endif /* __GCR_COLLECTION_H__ */
diff --git a/gcr/gcr-column.h b/gcr/gcr-column.h
index a6eb75b..9867575 100644
--- a/gcr/gcr-column.h
+++ b/gcr/gcr-column.h
@@ -20,6 +20,10 @@
#ifndef __GCR_COLUMN_H__
#define __GCR_COLUMN_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include "gcr-types.h"
#include <glib-object.h>
diff --git a/gcr/gcr-comparable.c b/gcr/gcr-comparable.c
index 91d54e9..4572dd1 100644
--- a/gcr/gcr-comparable.c
+++ b/gcr/gcr-comparable.c
@@ -30,18 +30,17 @@
*/
/**
- * GcrComparableIface:
+ * GcrComparableInterface:
* @parent: type interface
* @compare: Compare whether tow objects represent the same thing.
*
* The interface to implement for [iface@Comparable]
*/
-typedef GcrComparableIface GcrComparableInterface;
G_DEFINE_INTERFACE (GcrComparable, gcr_comparable, G_TYPE_OBJECT);
static void
-gcr_comparable_default_init (GcrComparableIface *iface)
+gcr_comparable_default_init (GcrComparableInterface *iface)
{
}
@@ -61,9 +60,9 @@ gint
gcr_comparable_compare (GcrComparable *self, GcrComparable *other)
{
g_return_val_if_fail (GCR_IS_COMPARABLE (self), -1);
- g_return_val_if_fail (GCR_COMPARABLE_GET_INTERFACE (self)->compare, -1);
+ g_return_val_if_fail (GCR_COMPARABLE_GET_IFACE (self)->compare, -1);
g_return_val_if_fail (G_IS_OBJECT (self), -1);
- return GCR_COMPARABLE_GET_INTERFACE (self)->compare (self, other);
+ return GCR_COMPARABLE_GET_IFACE (self)->compare (self, other);
}
/**
diff --git a/gcr/gcr-comparable.h b/gcr/gcr-comparable.h
index 5a8e28f..8e1fb65 100644
--- a/gcr/gcr-comparable.h
+++ b/gcr/gcr-comparable.h
@@ -20,25 +20,22 @@
#ifndef __GCR_COMPARABLE_H__
#define __GCR_COMPARABLE_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include <glib-object.h>
G_BEGIN_DECLS
-#define GCR_TYPE_COMPARABLE (gcr_comparable_get_type())
-#define GCR_COMPARABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COMPARABLE, GcrComparable))
-#define GCR_IS_COMPARABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COMPARABLE))
-#define GCR_COMPARABLE_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_COMPARABLE, GcrComparableIface))
-
-typedef struct _GcrComparable GcrComparable;
-typedef struct _GcrComparableIface GcrComparableIface;
+#define GCR_TYPE_COMPARABLE gcr_comparable_get_type ()
+G_DECLARE_INTERFACE (GcrComparable, gcr_comparable, GCR, COMPARABLE, GObject)
-struct _GcrComparableIface {
+struct _GcrComparableInterface {
GTypeInterface parent;
gint (*compare) (GcrComparable *self, GcrComparable *other);
};
-GType gcr_comparable_get_type (void);
-
gint gcr_comparable_compare (GcrComparable *self,
GcrComparable *other);
diff --git a/gcr/gcr-deprecated-base.h b/gcr/gcr-deprecated-base.h
deleted file mode 100644
index 55dc087..0000000
--- a/gcr/gcr-deprecated-base.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef GCR_BASE_DEPRECATED_H_
-#define GCR_BASE_DEPRECATED_H_
-#ifndef GCR_DISABLE_DEPRECATED
-#ifndef __GI_SCANNER__
-
-#include <glib.h>
-
-#include "gcr-importer.h"
-#include "gcr-parser.h"
-#include "gcr-simple-collection.h"
-
-G_BEGIN_DECLS
-
-#define GCR_ERROR (gcr_error_get_domain ())
-
-G_DEPRECATED
-GQuark gcr_error_get_domain (void) G_GNUC_CONST;
-
-G_DEPRECATED_FOR(gcr_collection_contains)
-gboolean gcr_simple_collection_contains (GcrSimpleCollection *self,
- GObject *object);
-
-G_DEPRECATED_FOR(gcr_importer_listen)
-GcrParser * gcr_importer_get_parser (GcrImporter *self);
-
-G_DEPRECATED_FOR(gcr_importer_listen)
-void gcr_importer_set_parser (GcrImporter *self,
- GcrParser *parser);
-
-G_DEPRECATED
-GckSlot * gcr_importer_get_slot (GcrImporter *self);
-
-G_DEPRECATED
-void gcr_importer_set_slot (GcrImporter *self,
- GckSlot *slot);
-
-typedef enum {
- GCR_IMPORTER_PROMPT_NEEDED,
- GCR_IMPORTER_PROMPT_ALWAYS,
- GCR_IMPORTER_PROMPT_NEVER
-} GcrImporterPromptBehavior;
-
-G_DEPRECATED
-GcrImporterPromptBehavior gcr_importer_get_prompt_behavior (GcrImporter *self);
-
-G_DEPRECATED
-void gcr_importer_set_prompt_behavior (GcrImporter *self,
- GcrImporterPromptBehavior behavior);
-
-G_END_DECLS
-
-#endif /* __GI_SCANNER__ */
-#endif /* GCR_DISABLE_DEPRECATED */
-#endif /* GCRTYPES_H_ */
diff --git a/gcr/gcr-filter-collection.c b/gcr/gcr-filter-collection.c
deleted file mode 100644
index c62abae..0000000
--- a/gcr/gcr-filter-collection.c
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr-collection.h"
-#include "gcr-filter-collection.h"
-
-#include <string.h>
-
-/**
- * GcrFilterCollection:
- *
- * A collection which filters a [iface@Collection].
- *
- * An implementation of [iface@Collection] which filters objects from another
- * underlying collection. Use [ctor@FilterCollection.new_with_callback]
- * to create a new filter collection.
- *
- * The callback will determine the criteria for whether an object shows through
- * the filter or not.
- */
-
-/**
- * GcrFilterCollectionClass:
- * @parent_class: the parent class
- *
- * The class struct for [class@FilterCollection].
- */
-
-/**
- * GcrFilterCollectionFunc:
- * @object: object to filter
- * @user_data: user data passed to the callback
- *
- * A function which is called by [class@FilterCollection] in order to determine
- * whether an object should show through the filter or not.
- *
- * Returns: %TRUE if an object should be included in the filtered collection
- */
-
-enum {
- PROP_0,
- PROP_UNDERLYING
-};
-
-struct _GcrFilterCollectionPrivate {
- GHashTable *items;
- GcrCollection *underlying;
- GcrFilterCollectionFunc filter_func;
- gpointer user_data;
- GDestroyNotify destroy_func;
-};
-
-static void gcr_filter_collection_iface (GcrCollectionIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GcrFilterCollection, gcr_filter_collection, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrFilterCollection);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_COLLECTION, gcr_filter_collection_iface));
-
-static void
-add_object (GcrFilterCollection *self,
- GObject *object)
-{
- g_assert (g_hash_table_lookup (self->pv->items, object) == NULL);
- g_hash_table_insert (self->pv->items, g_object_ref (object), object);
- gcr_collection_emit_added (GCR_COLLECTION (self), object);
-}
-
-static void
-remove_object (GcrFilterCollection *self,
- GObject *object)
-{
- g_object_ref (object);
- if (!g_hash_table_remove (self->pv->items, object))
- g_assert_not_reached ();
- gcr_collection_emit_removed (GCR_COLLECTION (self), object);
- g_object_unref (object);
-}
-
-static gboolean
-filter_object (GcrFilterCollection *self,
- GObject *object)
-{
- gboolean match = TRUE;
-
- if (self->pv->filter_func)
- match = (self->pv->filter_func) (object, self->pv->user_data);
-
- return match;
-}
-
-static void
-on_collection_added (GcrCollection *collection,
- GObject *object,
- gpointer user_data)
-{
- GcrFilterCollection *self = GCR_FILTER_COLLECTION (user_data);
- if (filter_object (self, object))
- add_object (self, object);
-}
-
-static void
-on_collection_removed (GcrCollection *collection,
- GObject *object,
- gpointer user_data)
-{
- GcrFilterCollection *self = GCR_FILTER_COLLECTION (user_data);
- if (g_hash_table_lookup (self->pv->items, object))
- remove_object (self, object);
-}
-
-static void
-gcr_filter_collection_init (GcrFilterCollection *self)
-{
- self->pv = gcr_filter_collection_get_instance_private (self);
- self->pv->items = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL);
-}
-
-static void
-gcr_filter_collection_set_property (GObject *obj,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrFilterCollection *self = GCR_FILTER_COLLECTION (obj);
-
- switch (property_id) {
- case PROP_UNDERLYING:
- g_return_if_fail (self->pv->underlying == NULL);
- self->pv->underlying = g_value_dup_object (value);
- g_return_if_fail (self->pv->underlying != NULL);
- g_signal_connect (self->pv->underlying, "added",
- G_CALLBACK (on_collection_added), self);
- g_signal_connect (self->pv->underlying, "removed",
- G_CALLBACK (on_collection_removed), self);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
- break;
- }
-}
-
-static void
-gcr_filter_collection_get_property (GObject *obj,
- guint property_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrFilterCollection *self = GCR_FILTER_COLLECTION (obj);
-
- switch (property_id) {
- case PROP_UNDERLYING:
- g_value_set_object (value, gcr_filter_collection_get_underlying (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
- break;
- }
-}
-
-static void
-gcr_filter_collection_finalize (GObject *obj)
-{
- GcrFilterCollection *self = GCR_FILTER_COLLECTION (obj);
-
- if (self->pv->underlying) {
- g_signal_handlers_disconnect_by_func (self->pv->underlying,
- on_collection_added, self);
- g_signal_handlers_disconnect_by_func (self->pv->underlying,
- on_collection_removed, self);
- g_object_unref (self->pv->underlying);
- }
-
- if (self->pv->destroy_func)
- (self->pv->destroy_func) (self->pv->user_data);
-
- g_assert (self->pv->items);
- g_hash_table_destroy (self->pv->items);
- self->pv->items = NULL;
-
- G_OBJECT_CLASS (gcr_filter_collection_parent_class)->finalize (obj);
-}
-
-static void
-gcr_filter_collection_class_init (GcrFilterCollectionClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->get_property = gcr_filter_collection_get_property;
- gobject_class->set_property = gcr_filter_collection_set_property;
- gobject_class->finalize = gcr_filter_collection_finalize;
-
- g_object_class_install_property (gobject_class, PROP_UNDERLYING,
- g_param_spec_object ("underlying", "Underlying", "Underlying collection",
- GCR_TYPE_COLLECTION, G_PARAM_STATIC_STRINGS |
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-}
-
-static guint
-gcr_filter_collection_get_length (GcrCollection *coll)
-{
- GcrFilterCollection *self = GCR_FILTER_COLLECTION (coll);
- return g_hash_table_size (self->pv->items);
-}
-
-static GList*
-gcr_filter_collection_get_objects (GcrCollection *coll)
-{
- GcrFilterCollection *self = GCR_FILTER_COLLECTION (coll);
- return g_hash_table_get_keys (self->pv->items);
-}
-
-static gboolean
-gcr_filter_collection_contains (GcrCollection *collection,
- GObject *object)
-{
- GcrFilterCollection *self = GCR_FILTER_COLLECTION (collection);
- return g_hash_table_lookup (self->pv->items, object) ? TRUE : FALSE;
-}
-
-static void
-gcr_filter_collection_iface (GcrCollectionIface *iface)
-{
- iface->get_length = gcr_filter_collection_get_length;
- iface->get_objects = gcr_filter_collection_get_objects;
- iface->contains = gcr_filter_collection_contains;
-}
-
-/**
- * gcr_filter_collection_new_with_callback:
- * @underlying: the underlying collection
- * @callback: (nullable): function to call for each object
- * @user_data: data to pass to the callback
- * @destroy_func: called for user_data when it is no longer needed
- *
- * Create a new #GcrFilterCollection.
- *
- * The callback should return %TRUE if an object should appear in the
- * filtered collection.
- *
- * If a %NULL callback is set, then all underlynig objects will appear in the
- * filtered collection.
- *
- * Returns: (transfer full) (type Gcr.FilterCollection): a newly allocated
- * filtered collection, which should be freed with g_object_unref()
- */
-GcrCollection *
-gcr_filter_collection_new_with_callback (GcrCollection *underlying,
- GcrFilterCollectionFunc callback,
- gpointer user_data,
- GDestroyNotify destroy_func)
-{
- GcrCollection *collection;
-
- collection = g_object_new (GCR_TYPE_FILTER_COLLECTION,
- "underlying", underlying,
- NULL);
- gcr_filter_collection_set_callback (GCR_FILTER_COLLECTION (collection),
- callback, user_data, destroy_func);
-
- return collection;
-}
-
-/**
- * gcr_filter_collection_set_callback:
- * @self: a filter collection
- * @callback: (nullable): function to call for each object
- * @user_data: data to pass to the callback
- * @destroy_func: called for user_data when it is no longer needed
- *
- * Set the callback used to filter the objects in the underlying collection.
- * The callback should return %TRUE if an object should appear in the
- * filtered collection.
- *
- * If a %NULL callback is set, then all underlynig objects will appear in the
- * filtered collection.
- *
- * This will refilter the collection.
- */
-void
-gcr_filter_collection_set_callback (GcrFilterCollection *self,
- GcrFilterCollectionFunc callback,
- gpointer user_data,
- GDestroyNotify destroy_func)
-{
- g_return_if_fail (GCR_IS_FILTER_COLLECTION (self));
-
- if (self->pv->destroy_func)
- (self->pv->destroy_func) (self->pv->user_data);
- self->pv->filter_func = callback;
- self->pv->user_data = user_data;
- self->pv->destroy_func = destroy_func;
-
- gcr_filter_collection_refilter (self);
-}
-
-/**
- * gcr_filter_collection_refilter:
- * @self: a filter collection
- *
- * Refilter all objects in the underlying collection. Call this function if
- * the filter callback function changes its filtering criteria.
- */
-void
-gcr_filter_collection_refilter (GcrFilterCollection *self)
-{
- GList *objects = NULL;
- GHashTable *snapshot;
- GHashTableIter iter;
- GObject *object;
- gboolean have;
- gboolean should;
- GList *l;
-
- g_return_if_fail (GCR_IS_FILTER_COLLECTION (self));
-
- snapshot = g_hash_table_new (g_direct_hash, g_direct_equal);
- g_hash_table_iter_init (&iter, self->pv->items);
- while (g_hash_table_iter_next (&iter, (gpointer *)&object, NULL))
- g_hash_table_insert (snapshot, object, object);
-
- if (self->pv->underlying)
- objects = gcr_collection_get_objects (self->pv->underlying);
-
- for (l = objects; l != NULL; l = g_list_next (l)) {
- have = g_hash_table_remove (snapshot, l->data);
- should = filter_object (self, l->data);
- if (have && !should)
- remove_object (self, l->data);
- else if (!have && should)
- add_object (self, l->data);
- }
-
- g_hash_table_iter_init (&iter, snapshot);
- while (g_hash_table_iter_next (&iter, (gpointer *)&object, NULL))
- remove_object (self, object);
- g_hash_table_destroy (snapshot);
-
- g_list_free (objects);
-}
-
-/**
- * gcr_filter_collection_get_underlying:
- * @self: a filter collection
- *
- * Get the collection that is being filtered by this filter collection.
- *
- * Returns: (transfer none): the underlying collection
- */
-GcrCollection *
-gcr_filter_collection_get_underlying (GcrFilterCollection *self)
-{
- g_return_val_if_fail (GCR_IS_FILTER_COLLECTION (self), NULL);
- return self->pv->underlying;
-}
diff --git a/gcr/gcr-filter-collection.h b/gcr/gcr-filter-collection.h
deleted file mode 100644
index 65e37db..0000000
--- a/gcr/gcr-filter-collection.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_FILTER_COLLECTION_H__
-#define __GCR_FILTER_COLLECTION_H__
-
-#include "gcr-collection.h"
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_FILTER_COLLECTION (gcr_filter_collection_get_type ())
-#define GCR_FILTER_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_FILTER_COLLECTION, GcrFilterCollection))
-#define GCR_FILTER_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_FILTER_COLLECTION, GcrFilterCollectionClass))
-#define GCR_IS_FILTER_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_FILTER_COLLECTION))
-#define GCR_IS_FILTER_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_FILTER_COLLECTION))
-#define GCR_FILTER_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_FILTER_COLLECTION, GcrFilterCollectionClass))
-
-typedef struct _GcrFilterCollection GcrFilterCollection;
-typedef struct _GcrFilterCollectionClass GcrFilterCollectionClass;
-typedef struct _GcrFilterCollectionPrivate GcrFilterCollectionPrivate;
-
-struct _GcrFilterCollection {
- GObject parent;
-
- /*< private >*/
- GcrFilterCollectionPrivate *pv;
-};
-
-struct _GcrFilterCollectionClass {
- GObjectClass parent_class;
-};
-
-GType gcr_filter_collection_get_type (void);
-
-typedef gboolean (* GcrFilterCollectionFunc) (GObject *object,
- gpointer user_data);
-
-GcrCollection * gcr_filter_collection_new_with_callback (GcrCollection *underlying,
- GcrFilterCollectionFunc callback,
- gpointer user_data,
- GDestroyNotify destroy_func);
-
-void gcr_filter_collection_set_callback (GcrFilterCollection *self,
- GcrFilterCollectionFunc callback,
- gpointer user_data,
- GDestroyNotify destroy_func);
-
-void gcr_filter_collection_refilter (GcrFilterCollection *self);
-
-GcrCollection * gcr_filter_collection_get_underlying (GcrFilterCollection *self);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrFilterCollection, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_FILTER_COLLECTION_H__ */
diff --git a/gcr/gcr-fingerprint.h b/gcr/gcr-fingerprint.h
index 299f087..9b19719 100644
--- a/gcr/gcr-fingerprint.h
+++ b/gcr/gcr-fingerprint.h
@@ -19,13 +19,13 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef GCR_FINGERPRINT_H
#define GCR_FINGERPRINT_H
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include <glib.h>
#include "gcr-types.h"
diff --git a/gcr/gcr-gnupg-collection.c b/gcr/gcr-gnupg-collection.c
deleted file mode 100644
index d2f90bf..0000000
--- a/gcr/gcr-gnupg-collection.c
+++ /dev/null
@@ -1,738 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr-callback-output-stream.h"
-#include "gcr-collection.h"
-#include "gcr-gnupg-collection.h"
-#include "gcr-gnupg-key.h"
-#include "gcr-gnupg-process.h"
-#include "gcr-gnupg-records.h"
-#include "gcr-gnupg-util.h"
-#include "gcr-internal.h"
-#include "gcr-record.h"
-#include "gcr-util.h"
-
-#include <sys/wait.h>
-#include <string.h>
-
-enum {
- PROP_0,
- PROP_DIRECTORY
-};
-
-struct _GcrGnupgCollectionPrivate {
- GHashTable *items; /* char *keyid -> GcrGnupgKey* */
- gchar *directory;
-};
-
-/* Forward declarations */
-static void _gcr_collection_iface (GcrCollectionIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GcrGnupgCollection, _gcr_gnupg_collection, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrGnupgCollection);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_COLLECTION, _gcr_collection_iface)
-);
-
-
-static void
-_gcr_gnupg_collection_init (GcrGnupgCollection *self)
-{
- self->pv = _gcr_gnupg_collection_get_instance_private (self);
-
- self->pv->items = g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free, g_object_unref);
-}
-
-static void
-_gcr_gnupg_collection_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (obj);
-
- switch (prop_id) {
- case PROP_DIRECTORY:
- g_return_if_fail (!self->pv->directory);
- self->pv->directory = g_value_dup_string (value);
- if (self->pv->directory && !g_path_is_absolute (self->pv->directory)) {
- g_warning ("gnupg collection directory path should be absolute: %s",
- self->pv->directory);
- }
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_gnupg_collection_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (obj);
-
- switch (prop_id) {
- case PROP_DIRECTORY:
- g_value_set_string (value, self->pv->directory);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_gnupg_collection_dispose (GObject *obj)
-{
- GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (obj);
-
- g_hash_table_remove_all (self->pv->items);
-
- G_OBJECT_CLASS (_gcr_gnupg_collection_parent_class)->dispose (obj);
-}
-
-static void
-_gcr_gnupg_collection_finalize (GObject *obj)
-{
- GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (obj);
-
- g_assert (self->pv->items);
- g_assert (g_hash_table_size (self->pv->items) == 0);
- g_hash_table_destroy (self->pv->items);
- self->pv->items = NULL;
-
- g_free (self->pv->directory);
- self->pv->directory = NULL;
-
- G_OBJECT_CLASS (_gcr_gnupg_collection_parent_class)->finalize (obj);
-}
-
-static void
-_gcr_gnupg_collection_class_init (GcrGnupgCollectionClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->get_property = _gcr_gnupg_collection_get_property;
- gobject_class->set_property = _gcr_gnupg_collection_set_property;
- gobject_class->dispose = _gcr_gnupg_collection_dispose;
- gobject_class->finalize = _gcr_gnupg_collection_finalize;
-
- /**
- * GcrGnupgCollection:directory:
- *
- * Directory to load the gnupg keys from, or %NULL for default
- * ~/.gnupg/ directory.
- */
- g_object_class_install_property (gobject_class, PROP_DIRECTORY,
- g_param_spec_string ("directory", "Directory", "Gnupg Directory",
- NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
-
- _gcr_initialize_library ();
-}
-
-static guint
-gcr_gnupg_collection_real_get_length (GcrCollection *coll)
-{
- GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (coll);
- return g_hash_table_size (self->pv->items);
-}
-
-static GList*
-gcr_gnupg_collection_real_get_objects (GcrCollection *coll)
-{
- GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (coll);
- return g_hash_table_get_values (self->pv->items);
-}
-
-static gboolean
-gcr_gnupg_collection_real_contains (GcrCollection *collection,
- GObject *object)
-{
- GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (collection);
- GcrGnupgKey *key;
-
- if (!GCR_IS_GNUPG_KEY (object))
- return FALSE;
- key = g_hash_table_lookup (self->pv->items,
- _gcr_gnupg_key_get_keyid (GCR_GNUPG_KEY (object)));
- if (key != NULL && G_OBJECT (key) == object)
- return TRUE;
- return FALSE;
-}
-
-static void
-_gcr_collection_iface (GcrCollectionIface *iface)
-{
- iface->get_length = gcr_gnupg_collection_real_get_length;
- iface->get_objects = gcr_gnupg_collection_real_get_objects;
- iface->contains = gcr_gnupg_collection_real_contains;
-}
-
-/**
- * _gcr_gnupg_collection_new:
- * @directory: (nullable): The gnupg home directory.
- *
- * Create a new GcrGnupgCollection.
- *
- * The gnupg home directory is where the keyring files live. If directory is
- * %NULL then the default gnupg home directory is used.
- *
- * Returns: (transfer full) (type Gcr.GnupgCollection): A newly allocated collection.
- */
-GcrCollection*
-_gcr_gnupg_collection_new (const gchar *directory)
-{
- return g_object_new (GCR_TYPE_GNUPG_COLLECTION,
- "directory", directory,
- NULL);
-}
-
-/*
- * We have to run the gnupg process twice to list the public and then the
- * secret keys. These phases are tracked by GcrLoadingPhase. If the first
- * phase completes successfully (using gpg --list-keys) then we move on to
- * the second phase where the secret keys are loaded (using gpg --list-secret-keys)
- *
- * If a key is loaded as a public key by the public phase, it can be updated by
- * the secret phase. A key discovered in the secret phase must have a public
- * counterpart already loaded by the public phase.
- */
-
-typedef enum {
- GCR_LOADING_PHASE_PUBLIC = 1,
- GCR_LOADING_PHASE_SECRET = 2,
-} GcrLoadingPhase;
-
-/*
- * We use @difference to track the keys that were in the collection before
- * the load process, and then remove any not found, at the end of the load
- * process. Strings are directly used from collection->pv->items keys.
- */
-
-typedef struct {
- GcrGnupgCollection *collection; /* reffed pointer back to collection */
- GcrLoadingPhase loading_phase; /* Whether loading public or private */
- GPtrArray *records; /* GcrRecord* not yet made into a key */
- GcrGnupgProcess *process; /* The gnupg process itself */
- GString *out_data; /* Pending output not yet parsed into colons */
- GHashTable *difference; /* Hashset gchar *keyid -> gchar *keyid */
-
- guint error_sig;
- guint status_sig;
- GOutputStream *output;
- GOutputStream *outattr;
-
- GQueue *attribute_queue; /* Queue of unprocessed GcrRecord* status records */
- GByteArray *attribute_buf; /* Buffer of unprocessed attribute data received */
- GHashTable *attributes; /* Processed attributes waiting for a matching key */
-} GcrGnupgCollectionLoad;
-
-/* Forward declarations */
-static void spawn_gnupg_list_process (GcrGnupgCollectionLoad *load, GTask *task);
-
-static void
-_gcr_gnupg_collection_load_free (gpointer data)
-{
- GcrGnupgCollectionLoad *load = data;
- g_assert (load);
-
- g_ptr_array_unref (load->records);
- g_string_free (load->out_data, TRUE);
- g_hash_table_destroy (load->difference);
- g_object_unref (load->collection);
-
- if (load->process) {
- if (load->error_sig)
- g_signal_handler_disconnect (load->process, load->error_sig);
- if (load->status_sig)
- g_signal_handler_disconnect (load->process, load->status_sig);
- g_object_unref (load->process);
- }
-
- g_output_stream_close (load->output, NULL, NULL);
- g_object_unref (load->output);
- g_output_stream_close (load->outattr, NULL, NULL);
- g_object_unref (load->outattr);
-
- if (load->attribute_queue) {
- while (!g_queue_is_empty (load->attribute_queue))
- _gcr_record_free (g_queue_pop_head (load->attribute_queue));
- g_queue_free (load->attribute_queue);
- }
- if (load->attribute_buf)
- g_byte_array_unref (load->attribute_buf);
- if (load->attributes)
- g_hash_table_destroy (load->attributes);
-
- g_slice_free (GcrGnupgCollectionLoad, load);
-}
-
-static void
-process_records_as_public_key (GcrGnupgCollectionLoad *load, GPtrArray *records,
- const gchar *keyid)
-{
- GPtrArray *attr_records = NULL;
- const gchar *fingerprint;
- gchar *orig_fingerprint;
- GcrGnupgKey *key;
- guint i;
-
- /* Add in any attributes we have loaded */
- fingerprint = _gcr_gnupg_records_get_fingerprint (records);
- if (fingerprint && load->attributes)
- attr_records = g_hash_table_lookup (load->attributes, fingerprint);
- if (attr_records) {
- g_debug ("adding %d user id attribute(s) to key/fingerprint: %s/%s",
- (gint)attr_records->len, keyid, fingerprint);
-
- if (!g_hash_table_lookup_extended (load->attributes, fingerprint,
- (gpointer*)&orig_fingerprint, NULL))
- g_assert_not_reached ();
- if (!g_hash_table_steal (load->attributes, fingerprint))
- g_assert_not_reached ();
- g_free (orig_fingerprint);
-
- /* Move all the attribute records over to main records set */
- for (i = 0; i < attr_records->len; i++)
- g_ptr_array_add (records, attr_records->pdata[i]);
-
- /* Shallow free of attr_records array */
- g_free (g_ptr_array_free (attr_records, FALSE));
- }
-
- /* Note that we've seen this keyid */
- g_hash_table_remove (load->difference, keyid);
-
- key = g_hash_table_lookup (load->collection->pv->items, keyid);
-
- /* Already have this key, just update */
- if (key) {
- g_debug ("updating public key: %s", keyid);
- _gcr_gnupg_key_set_public_records (key, records);
-
- /* Add a new key */
- } else {
- key = _gcr_gnupg_key_new (records, NULL);
- g_debug ("creating public key: %s", keyid);
- g_hash_table_insert (load->collection->pv->items, g_strdup (keyid), key);
- gcr_collection_emit_added (GCR_COLLECTION (load->collection), G_OBJECT (key));
- }
-}
-
-static void
-process_records_as_secret_key (GcrGnupgCollectionLoad *load, GPtrArray *records,
- const gchar *keyid)
-{
- GcrGnupgKey *key;
-
- key = g_hash_table_lookup (load->collection->pv->items, keyid);
-
- /* Don't have this key */
- if (key == NULL) {
- g_message ("Secret key seen but no public key for: %s", keyid);
-
- /* Tell the private key that it's a secret one */
- } else {
- g_debug ("adding secret records to key: %s", keyid);
- _gcr_gnupg_key_set_secret_records (key, records);
- }
-}
-
-static void
-process_records_as_key (GcrGnupgCollectionLoad *load)
-{
- GPtrArray *records;
- const gchar *keyid;
- GQuark schema;
-
- g_assert (load->records->len);
-
- records = load->records;
- load->records = g_ptr_array_new_with_free_func (_gcr_record_free);
-
- keyid = _gcr_gnupg_records_get_keyid (records);
- if (keyid) {
- schema = _gcr_record_get_schema (records->pdata[0]);
-
- /* A public key */
- if (schema == GCR_RECORD_SCHEMA_PUB)
- process_records_as_public_key (load, records, keyid);
-
- /* A secret key */
- else if (schema == GCR_RECORD_SCHEMA_SEC)
- process_records_as_secret_key (load, records, keyid);
-
- else
- g_assert_not_reached ();
-
- } else {
- g_warning ("parsed gnupg data had no keyid");
- }
-
- g_ptr_array_unref (records);
-}
-
-static gboolean
-process_outstanding_attribute (GcrGnupgCollectionLoad *load, GcrRecord *record)
-{
- const gchar *fingerprint;
- GPtrArray *records;
- GcrRecord *xa1;
- guint length;
-
- if (!_gcr_record_get_uint (record, GCR_RECORD_ATTRIBUTE_LENGTH, &length))
- g_return_val_if_reached (FALSE);
- fingerprint = _gcr_record_get_raw (record, GCR_RECORD_ATTRIBUTE_KEY_FINGERPRINT);
- g_return_val_if_fail (fingerprint != NULL, FALSE);
-
- /* Do we have enough data for this attribute? */
- if (!load->attribute_buf || load->attribute_buf->len < length) {
- g_debug ("not enough attribute data in buffer: %u", length);
- return FALSE;
- }
-
- if (!load->attributes)
- load->attributes = g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free, (GDestroyNotify)g_ptr_array_unref);
-
- records = g_hash_table_lookup (load->attributes, fingerprint);
- if (!records) {
- records = g_ptr_array_new_with_free_func (_gcr_record_free);
- g_hash_table_insert (load->attributes, g_strdup (fingerprint), records);
- }
-
- g_debug ("new attribute of length %d for key with fingerprint %s",
- length, fingerprint);
-
- xa1 = _gcr_gnupg_build_xa1_record (record, load->attribute_buf->data, length);
- g_ptr_array_add (records, xa1);
-
- /* Did we use up all the attribute data? Get rid of the buffer */
- if (length == load->attribute_buf->len) {
- g_byte_array_unref (load->attribute_buf);
- load->attribute_buf = NULL;
-
- /* Otherwise clear out the used data from buffer */
- } else {
- g_byte_array_remove_range (load->attribute_buf, 0, length);
- }
-
- return TRUE;
-}
-
-static void
-process_outstanding_attributes (GcrGnupgCollectionLoad *load)
-{
- GcrRecord *record;
-
- if (load->attribute_queue == NULL)
- return;
-
- g_debug ("%d outstanding attribute records",
- (gint)g_queue_get_length (load->attribute_queue));
-
- for (;;) {
- record = g_queue_peek_head (load->attribute_queue);
- if (record == NULL)
- break;
- if (!process_outstanding_attribute (load, record))
- break;
- g_queue_pop_head (load->attribute_queue);
- _gcr_record_free (record);
- }
-}
-
-static void
-on_line_parse_output (const gchar *line, gpointer user_data)
-{
- GcrGnupgCollectionLoad *load = user_data;
- GcrRecord *record;
- GQuark schema;
-
- g_debug ("output: %s", line);
-
- record = _gcr_record_parse_colons (line, -1);
- if (!record) {
- g_warning ("invalid gnupg output line: %s", line);
- return;
- }
-
- schema = _gcr_record_get_schema (record);
-
- /*
- * Each time we see a line with 'pub' or 'sec' schema we assume that
- * it's a new key being listed.
- */
- if (schema == GCR_RECORD_SCHEMA_PUB || schema == GCR_RECORD_SCHEMA_SEC) {
- g_debug ("start of new key");
- if (load->records->len)
- process_records_as_key (load);
- g_assert (!load->records->len);
- g_ptr_array_add (load->records, record);
- record = NULL;
-
- /*
- * 'uid' and 'fpr' schema lines get added to the key that came before.
- */
- } else if (schema == GCR_RECORD_SCHEMA_UID ||
- schema == GCR_RECORD_SCHEMA_FPR) {
- if (load->records->len) {
- g_ptr_array_add (load->records, record);
- record = NULL;
- }
- }
-
- if (record != NULL)
- _gcr_record_free (record);
-}
-
-
-static gssize
-on_gnupg_process_output_data (gconstpointer buffer,
- gsize count,
- GCancellable *cancellable,
- gpointer user_data,
- GError **error)
-{
- GTask *task = G_TASK (user_data);
- GcrGnupgCollectionLoad *load = g_task_get_task_data (task);
-
- g_string_append_len (load->out_data, buffer, count);
- _gcr_util_parse_lines (load->out_data, FALSE, on_line_parse_output, load);
- return count;
-}
-
-static void
-on_gnupg_process_error_line (GcrGnupgProcess *process, const gchar *line,
- gpointer user_data)
-{
- g_printerr ("%s\n", line);
-}
-
-static void
-on_gnupg_process_status_record (GcrGnupgProcess *process, GcrRecord *record,
- gpointer user_data)
-{
- GTask *task = G_TASK (user_data);
- GcrGnupgCollectionLoad *load = g_task_get_task_data (task);
-
- if (GCR_RECORD_SCHEMA_ATTRIBUTE != _gcr_record_get_schema (record))
- return;
-
- if (!load->attribute_queue)
- load->attribute_queue = g_queue_new ();
-
- g_queue_push_tail (load->attribute_queue, _gcr_record_copy (record));
- process_outstanding_attributes (load);
-}
-
-static gssize
-on_gnupg_process_attribute_data (gconstpointer buffer,
- gsize count,
- GCancellable *cancellable,
- gpointer user_data,
- GError **error)
-{
- GTask *task = G_TASK (user_data);
- GcrGnupgCollectionLoad *load = g_task_get_task_data (task);
-
- /* If we don't have a buffer, just claim this one */
- if (!load->attribute_buf)
- load->attribute_buf = g_byte_array_new ();
-
- g_byte_array_append (load->attribute_buf, buffer, count);
-
- process_outstanding_attributes (load);
- return count;
-}
-
-static void
-on_gnupg_process_completed (GObject *source, GAsyncResult *result, gpointer user_data)
-{
- GTask *task = G_TASK (user_data);
- GcrGnupgCollectionLoad *load = g_task_get_task_data (task);
- GHashTableIter iter;
- GError *error = NULL;
- GObject *object;
- gpointer keyid;
-
- if (!_gcr_gnupg_process_run_finish (GCR_GNUPG_PROCESS (source), result, &error)) {
- g_task_return_error (task, g_steal_pointer (&error));
- g_clear_object (&task);
- return;
- }
-
- /* Process any remaining output */
- _gcr_util_parse_lines (load->out_data, TRUE, on_line_parse_output, load);
-
- /* Process last bit as a key, if any */
- if (load->records->len)
- process_records_as_key (load);
-
- /* If we completed loading public keys, then go and load secret */
- switch (load->loading_phase) {
- case GCR_LOADING_PHASE_PUBLIC:
- g_debug ("public load phase completed");
- load->loading_phase = GCR_LOADING_PHASE_SECRET;
- spawn_gnupg_list_process (load, task);
- g_clear_object (&task);
- return;
- case GCR_LOADING_PHASE_SECRET:
- g_debug ("secret load phase completed");
- /* continue below */
- break;
- default:
- g_assert_not_reached ();
- }
-
- /* Remove any keys that we still have in the difference */
- g_hash_table_iter_init (&iter, load->difference);
- while (g_hash_table_iter_next (&iter, &keyid, NULL)) {
- object = g_hash_table_lookup (load->collection->pv->items, keyid);
- if (object != NULL) {
- g_object_ref (object);
- g_debug ("removing key no longer present in keyring: %s", (gchar*)keyid);
- g_hash_table_remove (load->collection->pv->items, keyid);
- gcr_collection_emit_removed (GCR_COLLECTION (load->collection), object);
- g_object_unref (object);
- }
- }
-
- g_task_return_boolean (task, TRUE);
- g_clear_object (&task);
-}
-
-static void
-spawn_gnupg_list_process (GcrGnupgCollectionLoad *load, GTask *task)
-{
- GCancellable *cancellable = g_task_get_cancellable (task);
- GcrGnupgProcessFlags flags = 0;
- GPtrArray *argv;
-
- argv = g_ptr_array_new ();
-
- switch (load->loading_phase) {
- case GCR_LOADING_PHASE_PUBLIC:
- g_debug ("starting public load phase");
- g_ptr_array_add (argv, (gpointer)"--list-keys");
- /* Load photos in public phase */
- flags = GCR_GNUPG_PROCESS_WITH_ATTRIBUTES |
- GCR_GNUPG_PROCESS_WITH_STATUS;
- break;
- case GCR_LOADING_PHASE_SECRET:
- g_debug ("starting secret load phase");
- g_ptr_array_add (argv, (gpointer)"--list-secret-keys");
- break;
- default:
- g_assert_not_reached ();
- }
-
- g_ptr_array_add (argv, (gpointer)"--fixed-list-mode");
- g_ptr_array_add (argv, (gpointer)"--with-colons");
- g_ptr_array_add (argv, (gpointer)"--with-fingerprint");
- g_ptr_array_add (argv, NULL);
-
- /* res is unreffed in on_gnupg_process_completed */
- _gcr_gnupg_process_run_async (load->process, (const gchar**)argv->pdata, NULL, flags,
- cancellable, on_gnupg_process_completed,
- g_object_ref (task));
-
- g_ptr_array_unref (argv);
-}
-
-/**
- * _gcr_gnupg_collection_load_async:
- * @self: The collection
- * @cancellable: (nullable): Cancellation object or %NULL
- * @callback: Callback to call when result is ready
- * @user_data: Data for callback
- *
- * Start an operation to load or reload the list of gnupg keys in this
- * collection.
- */
-void
-_gcr_gnupg_collection_load_async (GcrGnupgCollection *self, GCancellable *cancellable,
- GAsyncReadyCallback callback, gpointer user_data)
-{
- GTask *task;
- GcrGnupgCollectionLoad *load;
- GHashTableIter iter;
- gpointer keyid;
-
- g_return_if_fail (GCR_IS_GNUPG_COLLECTION (self));
-
- /* TODO: Cancellation not yet implemented */
-
- task = g_task_new (self, cancellable, callback, user_data);
- g_task_set_source_tag (task, _gcr_gnupg_collection_load_async);
-
- load = g_slice_new0 (GcrGnupgCollectionLoad);
- load->records = g_ptr_array_new_with_free_func (_gcr_record_free);
- load->out_data = g_string_sized_new (1024);
- load->collection = g_object_ref (self);
-
- load->output = _gcr_callback_output_stream_new (on_gnupg_process_output_data, task, NULL);
- load->outattr = _gcr_callback_output_stream_new (on_gnupg_process_attribute_data, task, NULL);
-
- load->process = _gcr_gnupg_process_new (self->pv->directory, NULL);
- _gcr_gnupg_process_set_output_stream (load->process, load->output);
- _gcr_gnupg_process_set_attribute_stream (load->process, load->outattr);
- load->error_sig = g_signal_connect (load->process, "error-line", G_CALLBACK (on_gnupg_process_error_line), task);
- load->status_sig = g_signal_connect (load->process, "status-record", G_CALLBACK (on_gnupg_process_status_record), task);
-
- /*
- * Track all the keys we currently have, at end remove those that
- * didn't get listed by the gpg process.
- */
- load->difference = g_hash_table_new (g_str_hash, g_str_equal);
- g_hash_table_iter_init (&iter, self->pv->items);
- while (g_hash_table_iter_next (&iter, &keyid, NULL))
- g_hash_table_insert (load->difference, keyid, keyid);
-
- g_task_set_task_data (task, load, _gcr_gnupg_collection_load_free);
-
- load->loading_phase = GCR_LOADING_PHASE_PUBLIC;
- spawn_gnupg_list_process (load, task);
-
- g_clear_object (&task);
-}
-
-/**
- * _gcr_gnupg_collection_load_finish:
- * @self: The collection
- * @result: The result passed to the callback
- * @error: Location to raise an error on failure.
- *
- * Get the result of an operation to load or reload the list of gnupg keys
- * in this collection.
- */
-gboolean
-_gcr_gnupg_collection_load_finish (GcrGnupgCollection *self, GAsyncResult *result,
- GError **error)
-{
- g_return_val_if_fail (GCR_IS_GNUPG_COLLECTION (self), FALSE);
- g_return_val_if_fail (!error || !*error, FALSE);
-
- g_return_val_if_fail (g_task_is_valid (result, self), FALSE);
-
- return g_task_propagate_boolean (G_TASK (result), error);
-}
diff --git a/gcr/gcr-gnupg-collection.h b/gcr/gcr-gnupg-collection.h
deleted file mode 100644
index ca22a9b..0000000
--- a/gcr/gcr-gnupg-collection.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef GCR_GNUPG_COLLECTION_H
-#define GCR_GNUPG_COLLECTION_H
-
-#include "gcr-collection.h"
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_GNUPG_COLLECTION (_gcr_gnupg_collection_get_type ())
-#define GCR_GNUPG_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_GNUPG_COLLECTION, GcrGnupgCollection))
-#define GCR_GNUPG_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_GNUPG_COLLECTION, GcrGnupgCollectionClass))
-#define GCR_IS_GNUPG_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_GNUPG_COLLECTION))
-#define GCR_IS_GNUPG_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_GNUPG_COLLECTION))
-#define GCR_GNUPG_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_GNUPG_COLLECTION, GcrGnupgCollectionClass))
-
-typedef struct _GcrGnupgCollection GcrGnupgCollection;
-typedef struct _GcrGnupgCollectionClass GcrGnupgCollectionClass;
-typedef struct _GcrGnupgCollectionPrivate GcrGnupgCollectionPrivate;
-
-struct _GcrGnupgCollection {
- /*< private >*/
- GObject parent;
- GcrGnupgCollectionPrivate *pv;
-};
-
-struct _GcrGnupgCollectionClass {
- GObjectClass parent_class;
-};
-
-GType _gcr_gnupg_collection_get_type (void);
-
-GcrCollection* _gcr_gnupg_collection_new (const gchar *directory);
-
-void _gcr_gnupg_collection_load_async (GcrGnupgCollection *self,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
-
-gboolean _gcr_gnupg_collection_load_finish (GcrGnupgCollection *self,
- GAsyncResult *result,
- GError **error);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrGnupgCollection, g_object_unref)
-
-G_END_DECLS
-
-#endif /* GCR_GNUPG_COLLECTION_H */
diff --git a/gcr/gcr-gnupg-importer.c b/gcr/gcr-gnupg-importer.c
index 79fa043..63b7b58 100644
--- a/gcr/gcr-gnupg-importer.c
+++ b/gcr/gcr-gnupg-importer.c
@@ -45,7 +45,7 @@ struct _GcrGnupgImporterPrivate {
GArray *imported;
};
-static void gcr_gnupg_importer_iface (GcrImporterIface *iface);
+static void gcr_gnupg_importer_iface (GcrImporterInterface *iface);
G_DEFINE_TYPE_WITH_CODE (GcrGnupgImporter, _gcr_gnupg_importer, G_TYPE_OBJECT,
G_ADD_PRIVATE (GcrGnupgImporter);
@@ -348,7 +348,7 @@ _gcr_gnupg_importer_import_finish (GcrImporter *importer,
}
static void
-gcr_gnupg_importer_iface (GcrImporterIface *iface)
+gcr_gnupg_importer_iface (GcrImporterInterface *iface)
{
iface->create_for_parsed = _gcr_gnupg_importer_create_for_parsed;
iface->queue_for_parsed = _gcr_gnupg_importer_queue_for_parsed;
diff --git a/gcr/gcr-gnupg-importer.h b/gcr/gcr-gnupg-importer.h
index 4bb9550..6b75607 100644
--- a/gcr/gcr-gnupg-importer.h
+++ b/gcr/gcr-gnupg-importer.h
@@ -19,13 +19,13 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> can be included directly."
-#endif
-
#ifndef __GCR_GNUPG_IMPORTER_H__
#define __GCR_GNUPG_IMPORTER_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include "gcr-importer.h"
#include <glib-object.h>
diff --git a/gcr/gcr-gnupg-key.h b/gcr/gcr-gnupg-key.h
index 1daed6d..9a3da2b 100644
--- a/gcr/gcr-gnupg-key.h
+++ b/gcr/gcr-gnupg-key.h
@@ -17,13 +17,13 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef GCR_GNUPG_KEY_H
#define GCR_GNUPG_KEY_H
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include <glib-object.h>
#include "gcr-column.h"
diff --git a/gcr/gcr-gnupg-records.h b/gcr/gcr-gnupg-records.h
index 4f4e673..1f26538 100644
--- a/gcr/gcr-gnupg-records.h
+++ b/gcr/gcr-gnupg-records.h
@@ -17,10 +17,6 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> can be included directly."
-#endif
-
#ifndef GCR_GNUPG_RECORDS_H
#define GCR_GNUPG_RECORDS_H
diff --git a/gcr/gcr-gnupg-util.h b/gcr/gcr-gnupg-util.h
index 300cda8..48c8b6a 100644
--- a/gcr/gcr-gnupg-util.h
+++ b/gcr/gcr-gnupg-util.h
@@ -17,10 +17,6 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef GCR_GNUPG_UTIL_H
#define GCR_GNUPG_UTIL_H
diff --git a/gcr/gcr-icons.h b/gcr/gcr-icons.h
index f4b981a..4915fe1 100644
--- a/gcr/gcr-icons.h
+++ b/gcr/gcr-icons.h
@@ -18,13 +18,13 @@
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_ICONS_H__
#define __GCR_ICONS_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include <gck/gck.h>
#include <gio/gio.h>
diff --git a/gcr/gcr-import-interaction.c b/gcr/gcr-import-interaction.c
index b8da073..edf0675 100644
--- a/gcr/gcr-import-interaction.c
+++ b/gcr/gcr-import-interaction.c
@@ -33,7 +33,7 @@
*/
/**
- * GcrImportInteractionIface:
+ * GcrImportInteractionInterface:
* @parent: parent interface
* @supplement_prep: method which prepares for supplementing the given attributes before import
* @supplement: method which synchronously supplements attributes before import
@@ -43,18 +43,11 @@
* Interface implemented by implementations of [iface@ImportInteraction].
*/
-typedef GcrImportInteractionIface GcrImportInteractionInterface;
-
G_DEFINE_INTERFACE (GcrImportInteraction, gcr_import_interaction, G_TYPE_TLS_INTERACTION);
static void
-gcr_import_interaction_default_init (GcrImportInteractionIface *iface)
+gcr_import_interaction_default_init (GcrImportInteractionInterface *iface)
{
- static size_t initialized = 0;
-
- if (g_once_init_enter (&initialized)) {
- g_once_init_leave (&initialized, 1);
- }
}
/**
@@ -74,12 +67,12 @@ void
gcr_import_interaction_supplement_prep (GcrImportInteraction *interaction,
GckBuilder *builder)
{
- GcrImportInteractionIface *iface;
+ GcrImportInteractionInterface *iface;
g_return_if_fail (GCR_IS_IMPORT_INTERACTION (interaction));
g_return_if_fail (builder != NULL);
- iface = GCR_IMPORT_INTERACTION_GET_INTERFACE (interaction);
+ iface = GCR_IMPORT_INTERACTION_GET_IFACE (interaction);
if (iface->supplement != NULL)
(iface->supplement_prep) (interaction, builder);
}
@@ -106,14 +99,14 @@ gcr_import_interaction_supplement (GcrImportInteraction *interaction,
GCancellable *cancellable,
GError **error)
{
- GcrImportInteractionIface *iface;
+ GcrImportInteractionInterface *iface;
g_return_val_if_fail (GCR_IS_IMPORT_INTERACTION (interaction), G_TLS_INTERACTION_UNHANDLED);
g_return_val_if_fail (builder != NULL, G_TLS_INTERACTION_UNHANDLED);
g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), G_TLS_INTERACTION_UNHANDLED);
g_return_val_if_fail (error == NULL || *error == NULL, G_TLS_INTERACTION_UNHANDLED);
- iface = GCR_IMPORT_INTERACTION_GET_INTERFACE (interaction);
+ iface = GCR_IMPORT_INTERACTION_GET_IFACE (interaction);
g_return_val_if_fail (iface->supplement != NULL, G_TLS_INTERACTION_UNHANDLED);
return (iface->supplement) (interaction, builder, cancellable, error);
@@ -141,13 +134,13 @@ gcr_import_interaction_supplement_async (GcrImportInteraction *interaction,
GAsyncReadyCallback callback,
gpointer user_data)
{
- GcrImportInteractionIface *iface;
+ GcrImportInteractionInterface *iface;
g_return_if_fail (GCR_IS_IMPORT_INTERACTION (interaction));
g_return_if_fail (builder != NULL);
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
- iface = GCR_IMPORT_INTERACTION_GET_INTERFACE (interaction);
+ iface = GCR_IMPORT_INTERACTION_GET_IFACE (interaction);
g_return_if_fail (iface->supplement != NULL);
(iface->supplement_async) (interaction, builder, cancellable, callback, user_data);
@@ -171,13 +164,13 @@ gcr_import_interaction_supplement_finish (GcrImportInteraction *interaction,
GAsyncResult *result,
GError **error)
{
- GcrImportInteractionIface *iface;
+ GcrImportInteractionInterface *iface;
g_return_val_if_fail (GCR_IS_IMPORT_INTERACTION (interaction), G_TLS_INTERACTION_UNHANDLED);
g_return_val_if_fail (G_IS_ASYNC_RESULT (result), G_TLS_INTERACTION_UNHANDLED);
g_return_val_if_fail (error == NULL || *error == NULL, G_TLS_INTERACTION_UNHANDLED);
- iface = GCR_IMPORT_INTERACTION_GET_INTERFACE (interaction);
+ iface = GCR_IMPORT_INTERACTION_GET_IFACE (interaction);
g_return_val_if_fail (iface->supplement != NULL, G_TLS_INTERACTION_UNHANDLED);
return (iface->supplement_finish) (interaction, result, error);
diff --git a/gcr/gcr-import-interaction.h b/gcr/gcr-import-interaction.h
index 79d615b..180cbb9 100644
--- a/gcr/gcr-import-interaction.h
+++ b/gcr/gcr-import-interaction.h
@@ -19,13 +19,13 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_IMPORT_INTERACTION_H__
#define __GCR_IMPORT_INTERACTION_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include "gcr-importer.h"
#include <glib-object.h>
@@ -34,15 +34,10 @@
G_BEGIN_DECLS
-#define GCR_TYPE_IMPORT_INTERACTION (gcr_import_interaction_get_type ())
-#define GCR_IMPORT_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_IMPORT_INTERACTION, GcrImportInteraction))
-#define GCR_IS_IMPORT_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_IMPORT_INTERACTION))
-#define GCR_IMPORT_INTERACTION_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_IMPORT_INTERACTION, GcrImportInteractionIface))
+#define GCR_TYPE_IMPORT_INTERACTION gcr_import_interaction_get_type ()
+G_DECLARE_INTERFACE(GcrImportInteraction, gcr_import_interaction, GCR, IMPORT_INTERACTION, GTlsInteraction)
-typedef struct _GcrImportInteraction GcrImportInteraction;
-typedef struct _GcrImportInteractionIface GcrImportInteractionIface;
-
-struct _GcrImportInteractionIface {
+struct _GcrImportInteractionInterface {
GTypeInterface parent;
void (*supplement_prep) (GcrImportInteraction *interaction,
@@ -67,8 +62,6 @@ struct _GcrImportInteractionIface {
gpointer reserved[6];
};
-GType gcr_import_interaction_get_type (void);
-
void gcr_import_interaction_supplement_prep (GcrImportInteraction *interaction,
GckBuilder *builder);
diff --git a/gcr/gcr-importer.c b/gcr/gcr-importer.c
index 802ded0..f1916f0 100644
--- a/gcr/gcr-importer.c
+++ b/gcr/gcr-importer.c
@@ -21,7 +21,6 @@
#include "config.h"
-#include "gcr-deprecated-base.h"
#include "gcr-importer.h"
#include "gcr-internal.h"
#include "gcr-gnupg-importer.h"
@@ -53,7 +52,7 @@
*/
/**
- * GcrImporterIface:
+ * GcrImporterInterface:
* @parent: parent interface
* @create_for_parsed: implementation of gcr_importer_create_for_parsed(), required
* @queue_for_parsed: implementation of gcr_importer_queue_for_parsed(), required
@@ -64,8 +63,6 @@
* Interface implemented for a #GcrImporter.
*/
-typedef GcrImporterIface GcrImporterInterface;
-
G_DEFINE_INTERFACE (GcrImporter, gcr_importer, G_TYPE_OBJECT);
typedef struct _GcrRegistered {
@@ -77,7 +74,7 @@ static GArray *registered_importers = NULL;
static gboolean registered_sorted = FALSE;
static void
-gcr_importer_default_init (GcrImporterIface *iface)
+gcr_importer_default_init (GcrImporterInterface *iface)
{
static size_t initialized = 0;
@@ -131,11 +128,9 @@ gcr_importer_default_init (GcrImporterIface *iface)
/**
* gcr_importer_register:
* @importer_type: the GType of the importer being registered
- * @attrs: the attributes that this importer is compatible with
+ * @attrs: (transfer full): the attributes that this importer is compatible with
*
* Register an importer to handle parsed items that match the given attributes.
- *
- * If @attrs are a floating reference, then it is consumed.
*/
void
gcr_importer_register (GType importer_type,
@@ -147,7 +142,7 @@ gcr_importer_register (GType importer_type,
registered_importers = g_array_new (FALSE, FALSE, sizeof (GcrRegistered));
registered.importer_type = importer_type;
- registered.attrs = gck_attributes_ref_sink (attrs);
+ registered.attrs = attrs;
g_array_append_val (registered_importers, registered);
registered_sorted = FALSE;
}
@@ -197,7 +192,7 @@ GList *
gcr_importer_create_for_parsed (GcrParsed *parsed)
{
GcrRegistered *registered;
- GcrImporterIface *iface;
+ GcrImporterInterface *iface;
gpointer instance_class;
GckAttributes *attrs;
gboolean matched;
@@ -286,12 +281,12 @@ gboolean
gcr_importer_queue_for_parsed (GcrImporter *importer,
GcrParsed *parsed)
{
- GcrImporterIface *iface;
+ GcrImporterInterface *iface;
g_return_val_if_fail (GCR_IS_IMPORTER (importer), FALSE);
g_return_val_if_fail (parsed != NULL, FALSE);
- iface = GCR_IMPORTER_GET_INTERFACE (importer);
+ iface = GCR_IMPORTER_GET_IFACE (importer);
g_return_val_if_fail (iface != NULL, FALSE);
g_return_val_if_fail (iface->queue_for_parsed != NULL, FALSE);
@@ -378,13 +373,13 @@ gcr_importer_import (GcrImporter *importer,
{
gboolean result;
ImportClosure *closure;
- GcrImporterIface *iface;
+ GcrImporterInterface *iface;
g_return_val_if_fail (GCR_IS_IMPORTER (importer), FALSE);
g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- iface = GCR_IMPORTER_GET_INTERFACE (importer);
+ iface = GCR_IMPORTER_GET_IFACE (importer);
if (iface->import_sync)
return (iface->import_sync) (importer, cancellable, error);
@@ -455,12 +450,12 @@ gcr_importer_import_async (GcrImporter *importer,
GAsyncReadyCallback callback,
gpointer user_data)
{
- GcrImporterIface *iface;
+ GcrImporterInterface *iface;
g_return_if_fail (GCR_IS_IMPORTER (importer));
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
- iface = GCR_IMPORTER_GET_INTERFACE (importer);
+ iface = GCR_IMPORTER_GET_IFACE (importer);
g_return_if_fail (iface != NULL);
g_return_if_fail (iface->import_async != NULL);
@@ -482,13 +477,13 @@ gcr_importer_import_finish (GcrImporter *importer,
GAsyncResult *result,
GError **error)
{
- GcrImporterIface *iface;
+ GcrImporterInterface *iface;
g_return_val_if_fail (GCR_IS_IMPORTER (importer), FALSE);
g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- iface = GCR_IMPORTER_GET_INTERFACE (importer);
+ iface = GCR_IMPORTER_GET_IFACE (importer);
g_return_val_if_fail (iface != NULL, FALSE);
g_return_val_if_fail (iface->import_finish != NULL, FALSE);
@@ -546,105 +541,3 @@ gcr_importer_register_well_known (void)
g_type_class_unref (g_type_class_ref (GCR_TYPE_PKCS11_IMPORTER));
g_type_class_unref (g_type_class_ref (GCR_TYPE_GNUPG_IMPORTER));
}
-
-#ifndef GCR_DISABLE_DEPRECATED
-
-/**
- * gcr_importer_get_parser:
- * @self: An importer
- *
- * Has no effect. Use gcr_importer_listen() instead.
- *
- * Returns: %NULL is always returned.
- * Deprecated: Since 3.0.0
- */
-GcrParser*
-gcr_importer_get_parser (GcrImporter *self)
-{
- g_warning ("gcr_importer_get_parser() is no longer supported "
- "Use gcr_importer_listen() instead.");
- return NULL;
-}
-
-/**
- * gcr_importer_set_parser:
- * @self: An importer
- * @parser: A parser
- *
- * Has no effect. Use gcr_importer_listen() instead.
- *
- * Deprecated: Since 3.0.0
- */
-void
-gcr_importer_set_parser (GcrImporter *self,
- GcrParser *parser)
-{
- g_warning ("gcr_importer_set_parser() is no longer supported "
- "Use gcr_importer_listen() instead.");
-}
-
-/*
- * gcr_importer_get_slot:
- * @self: The importer
- *
- * Returns %NULL.
- *
- * Deprecated: since 3.4.0
- */
-GckSlot *
-gcr_importer_get_slot (GcrImporter *self)
-{
- g_warning ("gcr_importer_get_slot() is no longer supported.");
- return NULL;
-}
-
-/**
- * gcr_importer_set_slot:
- * @self: The importer
- * @slot: The slot to import to
- *
- * Has no effect.
- *
- * Deprecated: since 3.4.0
- */
-void
-gcr_importer_set_slot (GcrImporter *self,
- GckSlot *slot)
-{
- g_warning ("gcr_importer_set_slot() is no longer supported.");
-}
-
-/**
- * gcr_importer_get_prompt_behavior:
- * @self: The importer
- *
- * Does nothing.
- *
- * Returns: zero
- *
- * Deprecated: since 3.4.0
- */
-GcrImporterPromptBehavior
-gcr_importer_get_prompt_behavior (GcrImporter *self)
-{
- g_warning ("gcr_importer_get_prompt_behavior() is no longer supported.");
- return 0;
-}
-
-/**
- * gcr_importer_set_prompt_behavior:
- * @self: The importer
- * @behavior: The prompt behavior flag
- *
- * Has no effect.
- *
- * Deprecated: since 3.4.0
- */
-void
-gcr_importer_set_prompt_behavior (GcrImporter *self,
- GcrImporterPromptBehavior behavior)
-{
- g_warning ("gcr_importer_set_prompt_behavior() is no longer supported.");
-}
-
-#endif /* GCR_DISABLE_DEPRECATED */
diff --git a/gcr/gcr-importer.h b/gcr/gcr-importer.h
index 7a1bcc1..3eab68c 100644
--- a/gcr/gcr-importer.h
+++ b/gcr/gcr-importer.h
@@ -19,13 +19,13 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_IMPORTER_H__
#define __GCR_IMPORTER_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include "gcr-parser.h"
#include <glib-object.h>
@@ -34,15 +34,10 @@
G_BEGIN_DECLS
-#define GCR_TYPE_IMPORTER (gcr_importer_get_type ())
-#define GCR_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_IMPORTER, GcrImporter))
-#define GCR_IS_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_IMPORTER))
-#define GCR_IMPORTER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_IMPORTER, GcrImporterIface))
+#define GCR_TYPE_IMPORTER gcr_importer_get_type ()
+G_DECLARE_INTERFACE (GcrImporter, gcr_importer, GCR, IMPORTER, GObject)
-typedef struct _GcrImporter GcrImporter;
-typedef struct _GcrImporterIface GcrImporterIface;
-
-struct _GcrImporterIface {
+struct _GcrImporterInterface {
GTypeInterface parent;
GList * (*create_for_parsed) (GcrParsed *parsed);
@@ -67,8 +62,6 @@ struct _GcrImporterIface {
gpointer reserved[14];
};
-GType gcr_importer_get_type (void);
-
GList * gcr_importer_create_for_parsed (GcrParsed *parsed);
gboolean gcr_importer_queue_for_parsed (GcrImporter *importer,
diff --git a/gcr/gcr-key-mechanisms.c b/gcr/gcr-key-mechanisms.c
index 7d82908..89f968a 100644
--- a/gcr/gcr-key-mechanisms.c
+++ b/gcr/gcr-key-mechanisms.c
@@ -70,7 +70,7 @@ find_first_usable_mechanism (GckObject *key,
break;
}
- gck_mechanisms_free (mechs);
+ g_array_unref (mechs);
if (i < n_mechanisms)
return mechanisms[i];
diff --git a/gcr/gcr-key-mechanisms.h b/gcr/gcr-key-mechanisms.h
index 37cf46c..dc33085 100644
--- a/gcr/gcr-key-mechanisms.h
+++ b/gcr/gcr-key-mechanisms.h
@@ -17,10 +17,6 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_KEY_MECHANISMS_H__
#define __GCR_KEY_MECHANISMS_H__
diff --git a/gcr/gcr-library.c b/gcr/gcr-library.c
index 44460ee..efc4b4a 100644
--- a/gcr/gcr-library.c
+++ b/gcr/gcr-library.c
@@ -19,7 +19,6 @@
#include "config.h"
-#include "gcr-deprecated-base.h"
#include "gcr-internal.h"
#include "gcr-library.h"
#include "gcr-types.h"
@@ -95,15 +94,6 @@ gcr_data_error_get_domain (void)
return domain;
}
-GQuark
-gcr_error_get_domain (void)
-{
- static GQuark domain = 0;
- if (domain == 0)
- domain = g_quark_from_static_string ("gcr-error");
- return domain;
-}
-
/* -----------------------------------------------------------------------------
* INITIALIZATION
*/
diff --git a/gcr/gcr-library.h b/gcr/gcr-library.h
index 9650497..91c240a 100644
--- a/gcr/gcr-library.h
+++ b/gcr/gcr-library.h
@@ -19,13 +19,13 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef GCR_LIBRARY_H_
#define GCR_LIBRARY_H_
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include "gcr-types.h"
#include <glib.h>
diff --git a/gcr/gcr-mock-prompter.c b/gcr/gcr-mock-prompter.c
index 1ca4589..0fb6221 100644
--- a/gcr/gcr-mock-prompter.c
+++ b/gcr/gcr-mock-prompter.c
@@ -101,7 +101,7 @@ typedef struct {
static gint prompts_a_prompting = 0;
static ThreadData *running = NULL;
-static void gcr_mock_prompt_iface (GcrPromptIface *iface);
+static void gcr_mock_prompt_iface (GcrPromptInterface *iface);
G_DEFINE_TYPE_WITH_CODE (GcrMockPrompt, _gcr_mock_prompt, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (GCR_TYPE_PROMPT, gcr_mock_prompt_iface);
@@ -558,7 +558,7 @@ gcr_mock_prompt_password_finish (GcrPrompt *prompt,
}
static void
-gcr_mock_prompt_iface (GcrPromptIface *iface)
+gcr_mock_prompt_iface (GcrPromptInterface *iface)
{
iface->prompt_confirm_async = gcr_mock_prompt_confirm_async;
iface->prompt_confirm_finish = gcr_mock_prompt_confirm_finish;
diff --git a/gcr/gcr-mock-prompter.h b/gcr/gcr-mock-prompter.h
index 369fd5f..f0585d7 100644
--- a/gcr/gcr-mock-prompter.h
+++ b/gcr/gcr-mock-prompter.h
@@ -19,13 +19,13 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_MOCK_PROMPTER_H__
#define __GCR_MOCK_PROMPTER_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include "gcr-system-prompter.h"
#include <glib-object.h>
diff --git a/gcr/gcr-openpgp.h b/gcr/gcr-openpgp.h
index f4825e1..c98c927 100644
--- a/gcr/gcr-openpgp.h
+++ b/gcr/gcr-openpgp.h
@@ -19,10 +19,6 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> can be included directly."
-#endif
-
#ifndef __GCR_OPENPGP_H__
#define __GCR_OPENPGP_H__
diff --git a/gcr/gcr-openssh.c b/gcr/gcr-openssh.c
index af4d550..a4b7ebe 100644
--- a/gcr/gcr-openssh.c
+++ b/gcr/gcr-openssh.c
@@ -230,7 +230,7 @@ parse_v1_public_line (const gchar *line,
if (word_options)
options = g_strndup (word_options, len_options);
- attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ attrs = gck_builder_end (&builder);
if (callback != NULL) {
bytes = g_bytes_new_with_free_func (outer, n_outer,
@@ -542,7 +542,7 @@ parse_v2_public_line (const gchar *line,
gck_builder_add_string (&builder, CKA_LABEL, label);
}
- attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ attrs = gck_builder_end (&builder);
if (callback != NULL) {
bytes = g_bytes_new_with_free_func (outer, n_outer,
diff --git a/gcr/gcr-openssh.h b/gcr/gcr-openssh.h
index a179afa..6fe75d5 100644
--- a/gcr/gcr-openssh.h
+++ b/gcr/gcr-openssh.h
@@ -19,10 +19,6 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> can be included directly."
-#endif
-
#ifndef __GCR_OPENSSH_H__
#define __GCR_OPENSSH_H__
diff --git a/gcr/gcr-parser.c b/gcr/gcr-parser.c
index ba3927e..1de17f9 100644
--- a/gcr/gcr-parser.c
+++ b/gcr/gcr-parser.c
@@ -482,7 +482,7 @@ parsed_fire (GcrParser *self,
g_assert (parsed == self->pv->parsed);
g_assert (parsed->attrs == NULL);
- parsed->attrs = gck_attributes_ref_sink (gck_builder_end (&parsed->builder));
+ parsed->attrs = gck_builder_end (&parsed->builder);
g_object_notify (G_OBJECT (self), "parsed-description");
g_object_notify (G_OBJECT (self), "parsed-attributes");
diff --git a/gcr/gcr-parser.h b/gcr/gcr-parser.h
index a19a98f..67b3bca 100644
--- a/gcr/gcr-parser.h
+++ b/gcr/gcr-parser.h
@@ -17,13 +17,13 @@
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_PARSER_H__
#define __GCR_PARSER_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include <glib-object.h>
#include <gio/gio.h>
diff --git a/gcr/gcr-pkcs11-certificate.c b/gcr/gcr-pkcs11-certificate.c
index e3c3b55..db35aba 100644
--- a/gcr/gcr-pkcs11-certificate.c
+++ b/gcr/gcr-pkcs11-certificate.c
@@ -74,7 +74,7 @@ prepare_lookup_certificate_issuer (GcrCertificate *cert)
gck_builder_add_data (&builder, CKA_SUBJECT, data, n_data);
g_free (data);
- return gck_attributes_ref_sink (gck_builder_end (&builder));
+ return gck_builder_end (&builder);
}
static GcrCertificate*
diff --git a/gcr/gcr-pkcs11-certificate.h b/gcr/gcr-pkcs11-certificate.h
index a1cd444..2ed2085 100644
--- a/gcr/gcr-pkcs11-certificate.h
+++ b/gcr/gcr-pkcs11-certificate.h
@@ -19,13 +19,13 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_PKCS11_CERTIFICATE_H__
#define __GCR_PKCS11_CERTIFICATE_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include "gcr-types.h"
#include "gcr-certificate.h"
diff --git a/gcr/gcr-pkcs11-importer.c b/gcr/gcr-pkcs11-importer.c
index 302eb72..8f65f35 100644
--- a/gcr/gcr-pkcs11-importer.c
+++ b/gcr/gcr-pkcs11-importer.c
@@ -72,7 +72,7 @@ static void state_cancelled (GTask *task,
gboolean async);
static void state_create_object (GTask *task,
gboolean async);
-static void _gcr_pkcs11_importer_init_iface (GcrImporterIface *iface);
+static void _gcr_pkcs11_importer_init_iface (GcrImporterInterface *iface);
G_DEFINE_TYPE_WITH_CODE (GcrPkcs11Importer, _gcr_pkcs11_importer, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (GCR_TYPE_IMPORTER, _gcr_pkcs11_importer_init_iface);
@@ -306,7 +306,7 @@ supplement_attributes (GcrPkcs11Importer *self,
}
gck_attributes_unref (attrs);
- l->data = attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ l->data = attrs = gck_builder_end (&builder);
switch (klass) {
case CKO_CERTIFICATE:
@@ -340,14 +340,14 @@ supplement_attributes (GcrPkcs11Importer *self,
supplement_with_attributes (&builder, supplements);
supplement_id_for_data (&builder, nonce, sizeof (nonce),
fingerprint, strlen (fingerprint));
- g_queue_push_tail (queue, gck_attributes_ref_sink (gck_builder_end (&builder)));
+ g_queue_push_tail (queue, gck_builder_end (&builder));
g_hash_table_insert (paired, pair->private_key, "present");
gck_builder_add_all (&builder, pair->certificate);
supplement_with_attributes (&builder, supplements);
supplement_id_for_data (&builder, nonce, sizeof (nonce),
fingerprint, strlen (fingerprint));
- g_queue_push_tail (queue, gck_attributes_ref_sink (gck_builder_end (&builder)));
+ g_queue_push_tail (queue, gck_builder_end (&builder));
g_hash_table_insert (paired, pair->certificate, "present");
/* Used the suplements for the pairs, don't use for unpaired stuff */
@@ -371,7 +371,7 @@ supplement_attributes (GcrPkcs11Importer *self,
supplement_id_for_data (&builder, nonce, sizeof (nonce),
&attrs, sizeof (gpointer));
- g_queue_push_tail (queue, gck_attributes_ref_sink (gck_builder_end (&builder)));
+ g_queue_push_tail (queue, gck_builder_end (&builder));
}
}
@@ -392,7 +392,7 @@ complete_supplement (GTask *task,
GckAttributes *attributes;
if (error == NULL) {
- attributes = gck_attributes_ref_sink (gck_builder_end (data->supplement));
+ attributes = gck_builder_end (data->supplement);
supplement_attributes (data->importer, attributes);
gck_attributes_unref (attributes);
@@ -628,7 +628,7 @@ calculate_uri (GcrPkcs11Importer *self)
data = gck_uri_data_new ();
data->token_info = gck_slot_get_token_info (self->slot);
- uri = gck_uri_build (data, GCK_URI_FOR_TOKEN);
+ uri = gck_uri_data_build (data, GCK_URI_FOR_TOKEN);
data->token_info = NULL;
gck_uri_data_free (data);
@@ -754,7 +754,7 @@ is_slot_importable (GckSlot *slot,
}
for (i = 0; token_blacklist[i] != NULL; i++) {
- uri = gck_uri_parse (token_blacklist[i], GCK_URI_FOR_TOKEN | GCK_URI_FOR_MODULE, &error);
+ uri = gck_uri_data_parse (token_blacklist[i], GCK_URI_FOR_TOKEN | GCK_URI_FOR_MODULE, &error);
if (uri == NULL) {
g_warning ("couldn't parse pkcs11 blacklist uri: %s", error->message);
g_clear_error (&error);
@@ -851,7 +851,7 @@ _gcr_pkcs11_importer_import_finish (GcrImporter *importer,
}
static void
-_gcr_pkcs11_importer_init_iface (GcrImporterIface *iface)
+_gcr_pkcs11_importer_init_iface (GcrImporterInterface *iface)
{
iface->create_for_parsed = _gcr_pkcs11_importer_create_for_parsed;
iface->queue_for_parsed = _gcr_pkcs11_importer_queue_for_parsed;
@@ -911,7 +911,9 @@ _gcr_pkcs11_importer_queue (GcrPkcs11Importer *self,
gck_builder_add_all (&builder, attrs);
gck_builder_add_string (&builder, CKA_LABEL, label);
attrs = gck_builder_end (&builder);
+ } else {
+ gck_attributes_ref (attrs);
}
- g_queue_push_tail (self->queue, gck_attributes_ref_sink (attrs));
+ g_queue_push_tail (self->queue, attrs);
}
diff --git a/gcr/gcr-pkcs11-importer.h b/gcr/gcr-pkcs11-importer.h
index 3b1780d..c35655f 100644
--- a/gcr/gcr-pkcs11-importer.h
+++ b/gcr/gcr-pkcs11-importer.h
@@ -20,10 +20,6 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> can be included directly."
-#endif
-
#ifndef __GCR_PKCS11_IMPORTER_H__
#define __GCR_PKCS11_IMPORTER_H__
diff --git a/gcr/gcr-prompt.c b/gcr/gcr-prompt.c
index 1cae21e..17b6a46 100644
--- a/gcr/gcr-prompt.c
+++ b/gcr/gcr-prompt.c
@@ -49,7 +49,7 @@
*/
/**
- * GcrPromptIface:
+ * GcrPromptInterface:
* @parent_iface: parent interface
* @prompt_password_async: begin a password prompt
* @prompt_password_finish: complete a password prompt
@@ -81,14 +81,12 @@ typedef struct {
GMainContext *context;
} RunClosure;
-typedef GcrPromptIface GcrPromptInterface;
-
-static void gcr_prompt_default_init (GcrPromptIface *iface);
+static void gcr_prompt_default_init (GcrPromptInterface *iface);
G_DEFINE_INTERFACE (GcrPrompt, gcr_prompt, G_TYPE_OBJECT);
static void
-gcr_prompt_default_init (GcrPromptIface *iface)
+gcr_prompt_default_init (GcrPromptInterface *iface)
{
static gsize initialized = 0;
@@ -240,7 +238,7 @@ gcr_prompt_default_init (GcrPromptIface *iface)
* You can use the [method@Prompt.close] method to emit this signal.
*/
signals[PROMPT_CLOSE] = g_signal_new ("prompt-close", GCR_TYPE_PROMPT, G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (GcrPromptIface, prompt_close),
+ G_STRUCT_OFFSET (GcrPromptInterface, prompt_close),
NULL, NULL, NULL,
G_TYPE_NONE, 0);
@@ -297,12 +295,12 @@ void
gcr_prompt_reset (GcrPrompt *prompt)
{
GParamSpec **params;
- GcrPromptIface *iface;
+ GcrPromptInterface *iface;
guint i, n_params;
g_return_if_fail (GCR_IS_PROMPT (prompt));
- iface = GCR_PROMPT_GET_INTERFACE (prompt);
+ iface = GCR_PROMPT_GET_IFACE (prompt);
params = g_object_interface_list_properties (iface, &n_params);
g_object_freeze_notify (G_OBJECT (prompt));
@@ -770,12 +768,12 @@ gcr_prompt_password_async (GcrPrompt *prompt,
GAsyncReadyCallback callback,
gpointer user_data)
{
- GcrPromptIface *iface;
+ GcrPromptInterface *iface;
g_return_if_fail (GCR_IS_PROMPT (prompt));
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
- iface = GCR_PROMPT_GET_INTERFACE (prompt);
+ iface = GCR_PROMPT_GET_IFACE (prompt);
g_return_if_fail (iface->prompt_password_async);
(iface->prompt_password_async) (prompt, cancellable, callback, user_data);
@@ -803,13 +801,13 @@ gcr_prompt_password_finish (GcrPrompt *prompt,
GAsyncResult *result,
GError **error)
{
- GcrPromptIface *iface;
+ GcrPromptInterface *iface;
g_return_val_if_fail (GCR_IS_PROMPT (prompt), NULL);
g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
- iface = GCR_PROMPT_GET_INTERFACE (prompt);
+ iface = GCR_PROMPT_GET_IFACE (prompt);
g_return_val_if_fail (iface->prompt_password_async, NULL);
return (iface->prompt_password_finish) (prompt, result, error);
@@ -924,12 +922,12 @@ gcr_prompt_confirm_async (GcrPrompt *prompt,
GAsyncReadyCallback callback,
gpointer user_data)
{
- GcrPromptIface *iface;
+ GcrPromptInterface *iface;
g_return_if_fail (GCR_IS_PROMPT (prompt));
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
- iface = GCR_PROMPT_GET_INTERFACE (prompt);
+ iface = GCR_PROMPT_GET_IFACE (prompt);
g_return_if_fail (iface->prompt_confirm_async);
(iface->prompt_confirm_async) (prompt, cancellable, callback, user_data);
@@ -954,13 +952,13 @@ gcr_prompt_confirm_finish (GcrPrompt *prompt,
GAsyncResult *result,
GError **error)
{
- GcrPromptIface *iface;
+ GcrPromptInterface *iface;
g_return_val_if_fail (GCR_IS_PROMPT (prompt), GCR_PROMPT_REPLY_CANCEL);
g_return_val_if_fail (G_IS_ASYNC_RESULT (result), GCR_PROMPT_REPLY_CANCEL);
g_return_val_if_fail (error == NULL || *error == NULL, GCR_PROMPT_REPLY_CANCEL);
- iface = GCR_PROMPT_GET_INTERFACE (prompt);
+ iface = GCR_PROMPT_GET_IFACE (prompt);
g_return_val_if_fail (iface->prompt_confirm_async, GCR_PROMPT_REPLY_CANCEL);
return (iface->prompt_confirm_finish) (prompt, result, error);
diff --git a/gcr/gcr-prompt.h b/gcr/gcr-prompt.h
index 56b9339..7c741fc 100644
--- a/gcr/gcr-prompt.h
+++ b/gcr/gcr-prompt.h
@@ -19,13 +19,13 @@
* Author: Stef Walter <stef@thewalter.net>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_PROMPT_H__
#define __GCR_PROMPT_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include "gcr-types.h"
#include <glib-object.h>
@@ -37,15 +37,10 @@ typedef enum {
GCR_PROMPT_REPLY_CONTINUE = 1,
} GcrPromptReply;
-#define GCR_TYPE_PROMPT (gcr_prompt_get_type ())
-#define GCR_PROMPT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_PROMPT, GcrPrompt))
-#define GCR_IS_PROMPT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_PROMPT))
-#define GCR_PROMPT_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_PROMPT, GcrPromptIface))
+#define GCR_TYPE_PROMPT gcr_prompt_get_type ()
+G_DECLARE_INTERFACE (GcrPrompt, gcr_prompt, GCR, PROMPT, GObject)
-typedef struct _GcrPrompt GcrPrompt;
-typedef struct _GcrPromptIface GcrPromptIface;
-
-struct _GcrPromptIface {
+struct _GcrPromptInterface {
GTypeInterface parent_iface;
void (* prompt_password_async) (GcrPrompt *prompt,
@@ -69,8 +64,6 @@ struct _GcrPromptIface {
void (* prompt_close) (GcrPrompt *prompt);
};
-GType gcr_prompt_get_type (void);
-
void gcr_prompt_reset (GcrPrompt *prompt);
gchar * gcr_prompt_get_title (GcrPrompt *prompt);
diff --git a/gcr/gcr-record.h b/gcr/gcr-record.h
index 755de10..640f157 100644
--- a/gcr/gcr-record.h
+++ b/gcr/gcr-record.h
@@ -19,10 +19,6 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef GCR_RECORD_H
#define GCR_RECORD_H
diff --git a/gcr/gcr-secret-exchange.h b/gcr/gcr-secret-exchange.h
index 582558f..a5f3663 100644
--- a/gcr/gcr-secret-exchange.h
+++ b/gcr/gcr-secret-exchange.h
@@ -19,13 +19,13 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_SECRET_EXCHANGE_H__
#define __GCR_SECRET_EXCHANGE_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include <gck/gck.h>
#include <glib-object.h>
diff --git a/gcr/gcr-secure-memory.h b/gcr/gcr-secure-memory.h
index 2d562fc..5f46e13 100644
--- a/gcr/gcr-secure-memory.h
+++ b/gcr/gcr-secure-memory.h
@@ -21,13 +21,13 @@
Author: Stef Walter <stefw@gnome.org>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef GCR_SECURE_MEMORY_H
#define GCR_SECURE_MEMORY_H
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include <glib.h>
G_BEGIN_DECLS
diff --git a/gcr/gcr-simple-certificate.c b/gcr/gcr-simple-certificate.c
index 0331a3b..59bf633 100644
--- a/gcr/gcr-simple-certificate.c
+++ b/gcr/gcr-simple-certificate.c
@@ -37,9 +37,7 @@
*/
struct _GcrSimpleCertificatePrivate {
- const guchar *data;
- gsize n_data;
- guchar *owned;
+ GBytes *bytes;
};
/* Forward declarations */
@@ -66,10 +64,7 @@ gcr_simple_certificate_real_finalize (GObject *obj)
{
GcrSimpleCertificate *self = GCR_SIMPLE_CERTIFICATE (obj);
- g_free (self->pv->owned);
- self->pv->owned = NULL;
- self->pv->data = NULL;
- self->pv->n_data = 0;
+ g_clear_pointer (&self->pv->bytes, g_bytes_unref);
G_OBJECT_CLASS (gcr_simple_certificate_parent_class)->finalize (obj);
}
@@ -94,11 +89,10 @@ gcr_simple_certificate_get_der_data (GcrCertificate *cert,
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
g_return_val_if_fail (n_data, NULL);
- g_return_val_if_fail (self->pv->data, NULL);
+ g_return_val_if_fail (self->pv->bytes, NULL);
/* This is called when we're not a base class */
- *n_data = self->pv->n_data;
- return self->pv->data;
+ return g_bytes_get_data (self->pv->bytes, n_data);
}
static void
@@ -131,9 +125,7 @@ gcr_simple_certificate_new (const guchar *data,
g_return_val_if_fail (n_data, NULL);
cert = g_object_new (GCR_TYPE_SIMPLE_CERTIFICATE, NULL);
-
- cert->pv->data = cert->pv->owned = g_memdup (data, n_data);
- cert->pv->n_data = n_data;
+ cert->pv->bytes = g_bytes_new (data, n_data);
return GCR_CERTIFICATE (cert);
}
@@ -158,9 +150,6 @@ gcr_simple_certificate_new_static (const guchar *data,
g_return_val_if_fail (n_data, NULL);
cert = g_object_new (GCR_TYPE_SIMPLE_CERTIFICATE, NULL);
-
- cert->pv->owned = NULL;
- cert->pv->data = data;
- cert->pv->n_data = n_data;
+ cert->pv->bytes = g_bytes_new_static (data, n_data);
return GCR_CERTIFICATE (cert);
}
diff --git a/gcr/gcr-simple-certificate.h b/gcr/gcr-simple-certificate.h
index 14e54c6..eb97635 100644
--- a/gcr/gcr-simple-certificate.h
+++ b/gcr/gcr-simple-certificate.h
@@ -17,13 +17,13 @@
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_SIMPLE_CERTIFICATE_H__
#define __GCR_SIMPLE_CERTIFICATE_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include <glib-object.h>
#include "gcr-certificate.h"
diff --git a/gcr/gcr-simple-collection.c b/gcr/gcr-simple-collection.c
deleted file mode 100644
index d0c5a30..0000000
--- a/gcr/gcr-simple-collection.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr-collection.h"
-#include "gcr-deprecated-base.h"
-#include "gcr-internal.h"
-#include "gcr-simple-collection.h"
-
-#include <string.h>
-
-/**
- * GcrSimpleCollection:
- *
- * A simple implementation of [iface@Collection], which you can add and remove
- * objects from.
- *
- * You can use [method@SimpleCollection.add] to add objects, and
- * [method@SimpleCollection.remove] to remove them again.
- */
-
-struct _GcrSimpleCollectionPrivate {
- GHashTable *items;
-};
-
-static void gcr_collection_iface (GcrCollectionIface *iface);
-G_DEFINE_TYPE_WITH_CODE (GcrSimpleCollection, gcr_simple_collection, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrSimpleCollection);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_COLLECTION, gcr_collection_iface));
-
-#define UNUSED_VALUE GUINT_TO_POINTER (1)
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static void
-gcr_simple_collection_init (GcrSimpleCollection *self)
-{
- self->pv = gcr_simple_collection_get_instance_private (self);
- self->pv->items = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL);
-}
-
-static void
-gcr_simple_collection_dispose (GObject *obj)
-{
- GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (obj);
-
- g_hash_table_remove_all (self->pv->items);
-
- G_OBJECT_CLASS (gcr_simple_collection_parent_class)->dispose (obj);
-}
-
-static void
-gcr_simple_collection_finalize (GObject *obj)
-{
- GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (obj);
-
- g_assert (self->pv->items);
- g_assert (g_hash_table_size (self->pv->items) == 0);
- g_hash_table_destroy (self->pv->items);
- self->pv->items = NULL;
-
- G_OBJECT_CLASS (gcr_simple_collection_parent_class)->finalize (obj);
-}
-
-static void
-gcr_simple_collection_class_init (GcrSimpleCollectionClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->dispose = gcr_simple_collection_dispose;
- gobject_class->finalize = gcr_simple_collection_finalize;
-}
-
-static guint
-gcr_simple_collection_real_get_length (GcrCollection *coll)
-{
- GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (coll);
- return g_hash_table_size (self->pv->items);
-}
-
-static GList*
-gcr_simple_collection_real_get_objects (GcrCollection *coll)
-{
- GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (coll);
- return g_hash_table_get_keys (self->pv->items);
-}
-
-static gboolean
-gcr_simple_collection_real_contains (GcrCollection *collection,
- GObject *object)
-{
- GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (collection);
- return g_hash_table_lookup (self->pv->items, object) ? TRUE : FALSE;
-}
-
-static void
-gcr_collection_iface (GcrCollectionIface *iface)
-{
- iface->get_length = gcr_simple_collection_real_get_length;
- iface->get_objects = gcr_simple_collection_real_get_objects;
- iface->contains = gcr_simple_collection_real_contains;
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_simple_collection_new:
- *
- * Create a new #GcrSimpleCollection.
- *
- * Returns: (transfer full) (type Gcr.SimpleCollection): a newly allocated
- * collection, which should be freed with g_object_unref()
- */
-GcrCollection *
-gcr_simple_collection_new (void)
-{
- return g_object_new (GCR_TYPE_SIMPLE_COLLECTION, NULL);
-}
-
-/**
- * gcr_simple_collection_add:
- * @self: The collection
- * @object: The object to add
- *
- * Add an object to this collection
- */
-void
-gcr_simple_collection_add (GcrSimpleCollection *self, GObject *object)
-{
- g_return_if_fail (GCR_IS_SIMPLE_COLLECTION (self));
- g_return_if_fail (G_IS_OBJECT (object));
- g_return_if_fail (!g_hash_table_lookup (self->pv->items, object));
- g_hash_table_insert (self->pv->items, g_object_ref (object), UNUSED_VALUE);
- gcr_collection_emit_added (GCR_COLLECTION (self), object);
-}
-
-/**
- * gcr_simple_collection_remove:
- * @self: The collection
- * @object: The object to remove from the collection
- *
- * Remove an object from the collection.
- */
-void
-gcr_simple_collection_remove (GcrSimpleCollection *self, GObject *object)
-{
- g_return_if_fail (GCR_IS_SIMPLE_COLLECTION (self));
- g_return_if_fail (G_IS_OBJECT (object));
- g_return_if_fail (g_hash_table_lookup (self->pv->items, object));
- g_object_ref (object);
- g_hash_table_remove (self->pv->items, object);
- gcr_collection_emit_removed (GCR_COLLECTION (self), object);
- g_object_unref (object);
-}
-
-/**
- * gcr_simple_collection_contains:
- * @self: The collection
- * @object: The object to check
- *
- * Check if the collection contains a certain object.
- *
- * Deprecated: use gcr_collection_contains() instead
- *
- * Returns: %TRUE if the collection contains the object.
- */
-gboolean
-gcr_simple_collection_contains (GcrSimpleCollection *self, GObject *object)
-{
- g_return_val_if_fail (GCR_IS_SIMPLE_COLLECTION (self), FALSE);
- g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
- return gcr_collection_contains (GCR_COLLECTION (self), object);
-}
diff --git a/gcr/gcr-simple-collection.h b/gcr/gcr-simple-collection.h
deleted file mode 100644
index 4623dae..0000000
--- a/gcr/gcr-simple-collection.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __GCR_SIMPLE_COLLECTION_H__
-#define __GCR_SIMPLE_COLLECTION_H__
-
-#include "gcr-collection.h"
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_SIMPLE_COLLECTION (gcr_simple_collection_get_type ())
-#define GCR_SIMPLE_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COLLECTION, GcrSimpleCollection))
-#define GCR_SIMPLE_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_COLLECTION, GcrSimpleCollectionClass))
-#define GCR_IS_SIMPLE_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COLLECTION))
-#define GCR_IS_SIMPLE_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_COLLECTION))
-#define GCR_SIMPLE_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_COLLECTION, GcrSimpleCollectionClass))
-
-typedef struct _GcrSimpleCollection GcrSimpleCollection;
-typedef struct _GcrSimpleCollectionClass GcrSimpleCollectionClass;
-typedef struct _GcrSimpleCollectionPrivate GcrSimpleCollectionPrivate;
-
-struct _GcrSimpleCollection {
- GObject parent;
-
- /*< private >*/
- GcrSimpleCollectionPrivate *pv;
-};
-
-struct _GcrSimpleCollectionClass {
- GObjectClass parent_class;
-};
-
-GType gcr_simple_collection_get_type (void);
-
-GcrCollection* gcr_simple_collection_new (void);
-
-void gcr_simple_collection_add (GcrSimpleCollection *self,
- GObject *object);
-
-void gcr_simple_collection_remove (GcrSimpleCollection *self,
- GObject *object);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrSimpleCollection, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_SIMPLE_COLLECTION_H__ */
diff --git a/gcr/gcr-single-collection.c b/gcr/gcr-single-collection.c
deleted file mode 100644
index 478af1e..0000000
--- a/gcr/gcr-single-collection.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr-collection.h"
-#include "gcr-single-collection.h"
-
-#include <string.h>
-
-/**
- * GcrSingleCollection:
- *
- * A single implementation of #GcrCollection.
- */
-
-struct _GcrSingleCollection {
- GObject parent;
- GObject *object;
-};
-
-/**
- * GcrSingleCollectionClass:
- * @parent_class: The parent class
- *
- * The class for #GcrSingleCollection.
- */
-
-static void _gcr_single_collection_iface (GcrCollectionIface *iface);
-G_DEFINE_TYPE_WITH_CODE (GcrSingleCollection, _gcr_single_collection, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (GCR_TYPE_COLLECTION, _gcr_single_collection_iface));
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static void
-_gcr_single_collection_init (GcrSingleCollection *self)
-{
-
-}
-
-static void
-_gcr_single_collection_dispose (GObject *obj)
-{
- GcrSingleCollection *self = GCR_SINGLE_COLLECTION (obj);
-
- _gcr_single_collection_set_object (self, NULL);
-
- G_OBJECT_CLASS (_gcr_single_collection_parent_class)->dispose (obj);
-}
-
-static void
-_gcr_single_collection_class_init (GcrSingleCollectionClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->dispose = _gcr_single_collection_dispose;
-}
-
-static guint
-_gcr_single_collection_real_get_length (GcrCollection *coll)
-{
- GcrSingleCollection *self = GCR_SINGLE_COLLECTION (coll);
- return self->object == NULL ? 0 : 1;
-}
-
-static GList*
-_gcr_single_collection_real_get_objects (GcrCollection *coll)
-{
- GcrSingleCollection *self = GCR_SINGLE_COLLECTION (coll);
- return self->object == NULL ? NULL : g_list_append (NULL, self->object);
-}
-
-static gboolean
-_gcr_single_collection_real_contains (GcrCollection *collection,
- GObject *object)
-{
- GcrSingleCollection *self = GCR_SINGLE_COLLECTION (collection);
- return self->object == object;
-}
-
-static void
-_gcr_single_collection_iface (GcrCollectionIface *iface)
-{
- iface->get_length = _gcr_single_collection_real_get_length;
- iface->get_objects = _gcr_single_collection_real_get_objects;
- iface->contains = _gcr_single_collection_real_contains;
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-GcrCollection *
-_gcr_single_collection_new (GObject *object)
-{
- GcrSingleCollection *self;
-
- self = g_object_new (GCR_TYPE_SINGLE_COLLECTION, NULL);
- _gcr_single_collection_set_object (self, object);
-
- return GCR_COLLECTION (self);
-}
-
-GObject *
-_gcr_single_collection_get_object (GcrSingleCollection *self)
-{
- g_return_val_if_fail (GCR_IS_SINGLE_COLLECTION (self), NULL);
- return self->object;
-}
-
-void
-_gcr_single_collection_set_object (GcrSingleCollection *self,
- GObject *object)
-{
- GObject *obj;
-
- g_return_if_fail (GCR_IS_SINGLE_COLLECTION (self));
- g_return_if_fail (object == NULL || G_IS_OBJECT (object));
-
- if (object == self->object)
- return;
-
- if (self->object) {
- obj = self->object;
- self->object = NULL;
- gcr_collection_emit_removed (GCR_COLLECTION (self), obj);
- g_object_unref (obj);
- }
-
- if (object) {
- self->object = g_object_ref (object);
- gcr_collection_emit_added (GCR_COLLECTION (self), self->object);
- }
-}
diff --git a/gcr/gcr-single-collection.h b/gcr/gcr-single-collection.h
deleted file mode 100644
index 7dee26e..0000000
--- a/gcr/gcr-single-collection.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_SINGLE_COLLECTION_H__
-#define __GCR_SINGLE_COLLECTION_H__
-
-#include "gcr-collection.h"
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_SINGLE_COLLECTION (_gcr_single_collection_get_type ())
-G_DECLARE_FINAL_TYPE (GcrSingleCollection, _gcr_single_collection,
- GCR, SINGLE_COLLECTION,
- GObject)
-
-GcrCollection * _gcr_single_collection_new (GObject *object);
-
-GObject * _gcr_single_collection_get_object (GcrSingleCollection *self);
-
-void _gcr_single_collection_set_object (GcrSingleCollection *self,
- GObject *object);
-
-G_END_DECLS
-
-#endif /* __GCR_SINGLE_COLLECTION_H__ */
diff --git a/gcr/gcr-ssh-agent-service.c b/gcr/gcr-ssh-agent-service.c
index b7e8928..beae47b 100644
--- a/gcr/gcr-ssh-agent-service.c
+++ b/gcr/gcr-ssh-agent-service.c
@@ -37,7 +37,7 @@
#include <gio/gunixsocketaddress.h>
#include <glib/gstdio.h>
-#include <gcr/gcr-base.h>
+#include <gcr/gcr.h>
#if WITH_SYSTEMD
#include <systemd/sd-daemon.h>
diff --git a/gcr/gcr-ssh-askpass.h b/gcr/gcr-ssh-askpass.h
index b766974..fb54a7e 100644
--- a/gcr/gcr-ssh-askpass.h
+++ b/gcr/gcr-ssh-askpass.h
@@ -17,13 +17,13 @@
* Author: Stef Walter <stefw@gnome.org>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_SSH_ASKPASS_H__
#define __GCR_SSH_ASKPASS_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include <glib-object.h>
#include <gio/gio.h>
diff --git a/gcr/gcr-subject-public-key.c b/gcr/gcr-subject-public-key.c
index 7ff78f4..1a3f383 100644
--- a/gcr/gcr-subject-public-key.c
+++ b/gcr/gcr-subject-public-key.c
@@ -206,7 +206,9 @@ lookup_public_key (GckObject *object,
gck_attributes_unref (attrs);
session = gck_object_get_session (object);
- objects = gck_session_find_objects (session, gck_builder_end (&builder), cancellable, &error);
+ attrs = gck_builder_end (&builder);
+ objects = gck_session_find_objects (session, attrs, cancellable, &error);
+ gck_attributes_unref (attrs);
g_object_unref (session);
if (error != NULL) {
@@ -567,7 +569,7 @@ _gcr_subject_public_key_load_finish (GAsyncResult *result,
return NULL;
closure = g_task_get_task_data (G_TASK (result));
- attributes = gck_attributes_ref_sink (gck_builder_end (&closure->builder));
+ attributes = gck_builder_end (&closure->builder);
asn = _gcr_subject_public_key_for_attributes (attributes);
if (asn == NULL) {
g_set_error_literal (error, GCK_ERROR, CKR_TEMPLATE_INCONSISTENT,
diff --git a/gcr/gcr-subject-public-key.h b/gcr/gcr-subject-public-key.h
index 9e7c1d9..066fa22 100644
--- a/gcr/gcr-subject-public-key.h
+++ b/gcr/gcr-subject-public-key.h
@@ -19,10 +19,6 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef GCR_SUBJECT_PUBLIC_KEY_H
#define GCR_SUBJECT_PUBLIC_KEY_H
diff --git a/gcr/gcr-system-prompt.c b/gcr/gcr-system-prompt.c
index ceba221..0c27abc 100644
--- a/gcr/gcr-system-prompt.c
+++ b/gcr/gcr-system-prompt.c
@@ -106,7 +106,7 @@ struct _GcrSystemPromptPrivate {
gchar *last_response;
};
-static void gcr_system_prompt_prompt_iface (GcrPromptIface *iface);
+static void gcr_system_prompt_prompt_iface (GcrPromptInterface *iface);
static void gcr_system_prompt_initable_iface (GInitableIface *iface);
@@ -1322,7 +1322,7 @@ gcr_system_prompt_real_close (GcrPrompt *prompt)
}
static void
-gcr_system_prompt_prompt_iface (GcrPromptIface *iface)
+gcr_system_prompt_prompt_iface (GcrPromptInterface *iface)
{
iface->prompt_password_async = gcr_system_prompt_password_async;
iface->prompt_password_finish = gcr_system_prompt_password_finish;
diff --git a/gcr/gcr-system-prompt.h b/gcr/gcr-system-prompt.h
index 0d20782..017ebef 100644
--- a/gcr/gcr-system-prompt.h
+++ b/gcr/gcr-system-prompt.h
@@ -19,13 +19,13 @@
* Author: Stef Walter <stef@thewalter.net>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_SYSTEM_PROMPT_H__
#define __GCR_SYSTEM_PROMPT_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include "gcr-types.h"
#include "gcr-secret-exchange.h"
diff --git a/gcr/gcr-system-prompter.c b/gcr/gcr-system-prompter.c
index dbb51b0..0f993ee 100644
--- a/gcr/gcr-system-prompter.c
+++ b/gcr/gcr-system-prompter.c
@@ -30,7 +30,7 @@
#include "gcr-system-prompt.h"
#include "gcr/gcr-dbus-generated.h"
-#include "gcr/gcr-enum-types-base.h"
+#include "gcr/gcr-enum-types.h"
#include "gcr/gcr-marshal.h"
#include "egg/egg-error.h"
@@ -439,7 +439,7 @@ prompt_build_properties (GcrPrompt *prompt,
while (g_hash_table_iter_next (&iter, (gpointer *)&property_name, NULL)) {
/* Make sure this property is on the prompt interface */
- pspec = g_object_interface_find_property (GCR_PROMPT_GET_INTERFACE (obj),
+ pspec = g_object_interface_find_property (GCR_PROMPT_GET_IFACE (obj),
property_name);
if (pspec == NULL)
continue;
diff --git a/gcr/gcr-system-prompter.h b/gcr/gcr-system-prompter.h
index 72b7c69..653383b 100644
--- a/gcr/gcr-system-prompter.h
+++ b/gcr/gcr-system-prompter.h
@@ -19,13 +19,13 @@
* Author: Stef Walter <stef@thewalter.net>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_SYSTEM_PROMPTER_H__
#define __GCR_SYSTEM_PROMPTER_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include "gcr-prompt.h"
#include "gcr-secret-exchange.h"
#include "gcr-types.h"
diff --git a/gcr/gcr-trust.c b/gcr/gcr-trust.c
index 786ab4f..c6ac4de 100644
--- a/gcr/gcr-trust.c
+++ b/gcr/gcr-trust.c
@@ -93,7 +93,7 @@ prepare_is_certificate_pinned (GcrCertificate *certificate, const gchar *purpose
gck_builder_add_string (&builder, CKA_X_PURPOSE, purpose);
gck_builder_add_string (&builder, CKA_X_PEER, peer);
- return gck_attributes_ref_sink (gck_builder_end (&builder));
+ return gck_builder_end (&builder);
}
static gboolean
@@ -255,7 +255,7 @@ prepare_add_pinned_certificate (GcrCertificate *certificate, const gchar *purpos
gck_builder_add_string (&builder, CKA_X_PEER, peer);
gck_builder_add_boolean (&builder, CKA_TOKEN, TRUE);
- return gck_attributes_ref_sink (gck_builder_end (&builder));
+ return gck_builder_end (&builder);
}
static gboolean
@@ -307,9 +307,10 @@ perform_add_pinned_certificate (GckAttributes *search,
_("Couldn’t find a place to store the pinned certificate"));
ret = FALSE;
} else {
- session = gck_slot_open_session (slot, CKF_RW_SESSION, NULL, &lerr);
+ session = gck_slot_open_session (slot, CKF_RW_SESSION, NULL, NULL, &lerr);
if (session != NULL) {
- object = gck_session_create_object (session, gck_builder_end (&builder),
+ GckAttributes *attrs = gck_builder_end (&builder);
+ object = gck_session_create_object (session, attrs,
cancellable, &lerr);
if (object != NULL) {
g_object_unref (object);
@@ -317,6 +318,7 @@ perform_add_pinned_certificate (GckAttributes *search,
}
g_object_unref (session);
+ gck_attributes_unref (attrs);
}
g_object_unref (slot);
@@ -461,7 +463,7 @@ prepare_remove_pinned_certificate (GcrCertificate *certificate, const gchar *pur
gck_builder_add_string (&builder, CKA_X_PURPOSE, purpose);
gck_builder_add_string (&builder, CKA_X_PEER, peer);
- return gck_attributes_ref_sink (gck_builder_end (&builder));
+ return gck_builder_end (&builder);
}
static gboolean
@@ -638,7 +640,7 @@ prepare_is_certificate_anchored (GcrCertificate *certificate, const gchar *purpo
prepare_trust_attrs (certificate, CKT_X_ANCHORED_CERTIFICATE, &builder);
gck_builder_add_string (&builder, CKA_X_PURPOSE, purpose);
- return gck_attributes_ref_sink (gck_builder_end (&builder));
+ return gck_builder_end (&builder);
}
static gboolean
diff --git a/gcr/gcr-trust.h b/gcr/gcr-trust.h
index 379f363..88b407c 100644
--- a/gcr/gcr-trust.h
+++ b/gcr/gcr-trust.h
@@ -17,13 +17,13 @@
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef __GCR_TRUST_H__
#define __GCR_TRUST_H__
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include "gcr-certificate.h"
#include "gcr-types.h"
diff --git a/gcr/gcr-types.h b/gcr/gcr-types.h
index 095615a..d049cb4 100644
--- a/gcr/gcr-types.h
+++ b/gcr/gcr-types.h
@@ -19,13 +19,13 @@
* Author: Stef Walter <stefw@collabora.co.uk>
*/
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
#ifndef GCRTYPES_H_
#define GCRTYPES_H_
+#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
+#error "Only <gcr/gcr.h> can be included directly."
+#endif
+
#include <glib.h>
#ifndef GCK_API_SUBJECT_TO_CHANGE
diff --git a/gcr/gcr-union-collection.c b/gcr/gcr-union-collection.c
deleted file mode 100644
index 846b226..0000000
--- a/gcr/gcr-union-collection.c
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr-collection.h"
-#include "gcr-internal.h"
-#include "gcr-union-collection.h"
-
-#include <string.h>
-
-/**
- * GcrUnionCollection:
- *
- * An implementation of #GcrCollection, which combines the objects in
- * other [iface@Collection]s. Use [method@UnionCollection.add] to add and
- * [method@UnionCollection.remove] to remove them.
- */
-
-struct _GcrUnionCollectionPrivate {
- GHashTable *items;
- GHashTable *collections;
-};
-
-static void gcr_collection_iface (GcrCollectionIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GcrUnionCollection, gcr_union_collection, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrUnionCollection);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_COLLECTION, gcr_collection_iface));
-
-static void
-on_collection_added (GcrCollection *collection,
- GObject *object,
- gpointer user_data)
-{
- GcrUnionCollection *self = GCR_UNION_COLLECTION (user_data);
- gint *count;
-
- g_object_ref (object);
-
- count = g_hash_table_lookup (self->pv->items, object);
- if (count == NULL) {
- count = g_new0 (gint, 1);
- *count = 1;
- g_hash_table_insert (self->pv->items, object, count);
- gcr_collection_emit_added (GCR_COLLECTION (self), object);
- } else {
- g_assert (*count > 0);
- (*count)++;
- }
-
- g_object_unref (object);
-}
-
-static void
-on_collection_removed (GcrCollection *collection,
- GObject *object,
- gpointer user_data)
-{
- GcrUnionCollection *self = GCR_UNION_COLLECTION (user_data);
- gint *count;
-
- g_object_ref (object);
-
- count = g_hash_table_lookup (self->pv->items, object);
- if (count != NULL) {
- g_assert (*count > 0);
- (*count)--;
-
- if (*count == 0) {
- g_hash_table_remove (self->pv->items, object);
- gcr_collection_emit_removed (GCR_COLLECTION (self), object);
- }
- } else {
- g_warning ("Object of type %s that exists in an underlying "
- "collection of a GcrUnionCollection appeared without "
- "emitting 'added' signal.", G_OBJECT_TYPE_NAME (object));
- }
-
- g_object_unref (object);
-
-}
-
-static void
-connect_to_collection (GcrUnionCollection *self,
- GcrCollection *collection)
-{
- g_signal_connect (collection, "added", G_CALLBACK (on_collection_added), self);
- g_signal_connect (collection, "removed", G_CALLBACK (on_collection_removed), self);
-}
-
-static void
-disconnect_from_collection (GcrUnionCollection *self,
- GcrCollection *collection)
-{
- g_signal_handlers_disconnect_by_func (collection, on_collection_added, self);
- g_signal_handlers_disconnect_by_func (collection, on_collection_removed, self);
-}
-
-static void
-gcr_union_collection_init (GcrUnionCollection *self)
-{
- self->pv = gcr_union_collection_get_instance_private (self);
- self->pv->items = g_hash_table_new_full (g_direct_hash, g_direct_equal,
- NULL, g_free);
- self->pv->collections = g_hash_table_new_full (g_direct_hash, g_direct_equal,
- g_object_unref, NULL);
-}
-
-static void
-gcr_union_collection_dispose (GObject *obj)
-{
- GcrUnionCollection *self = GCR_UNION_COLLECTION (obj);
- GHashTableIter iter;
- GcrCollection *collection;
-
- g_hash_table_iter_init (&iter, self->pv->collections);
- while (g_hash_table_iter_next (&iter, (gpointer *)&collection, NULL))
- disconnect_from_collection (self, collection);
- g_hash_table_remove_all (self->pv->collections);
- g_hash_table_remove_all (self->pv->items);
-
- G_OBJECT_CLASS (gcr_union_collection_parent_class)->dispose (obj);
-}
-
-static void
-gcr_union_collection_finalize (GObject *obj)
-{
- GcrUnionCollection *self = GCR_UNION_COLLECTION (obj);
-
- g_assert (g_hash_table_size (self->pv->items) == 0);
- g_hash_table_destroy (self->pv->items);
-
- g_assert (g_hash_table_size (self->pv->collections) == 0);
- g_hash_table_destroy (self->pv->collections);
-
- G_OBJECT_CLASS (gcr_union_collection_parent_class)->finalize (obj);
-}
-
-static void
-gcr_union_collection_class_init (GcrUnionCollectionClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->dispose = gcr_union_collection_dispose;
- gobject_class->finalize = gcr_union_collection_finalize;
-}
-
-static guint
-gcr_union_collection_real_get_length (GcrCollection *coll)
-{
- GcrUnionCollection *self = GCR_UNION_COLLECTION (coll);
- return g_hash_table_size (self->pv->items);
-}
-
-static GList*
-gcr_union_collection_real_get_objects (GcrCollection *coll)
-{
- GcrUnionCollection *self = GCR_UNION_COLLECTION (coll);
- return g_hash_table_get_keys (self->pv->items);
-}
-
-static gboolean
-gcr_union_collection_real_contains (GcrCollection *collection,
- GObject *object)
-{
- GcrUnionCollection *self = GCR_UNION_COLLECTION (collection);
- return g_hash_table_lookup (self->pv->items, object) ? TRUE : FALSE;
-}
-
-static void
-gcr_collection_iface (GcrCollectionIface *iface)
-{
- iface->get_length = gcr_union_collection_real_get_length;
- iface->get_objects = gcr_union_collection_real_get_objects;
- iface->contains = gcr_union_collection_real_contains;
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_union_collection_new:
- *
- * Create a new #GcrUnionCollection.
- *
- * Returns: (transfer full) (type Gcr.UnionCollection): a newly allocated
- * collection, which should be freed with g_object_unref()
- */
-GcrCollection *
-gcr_union_collection_new (void)
-{
- return g_object_new (GCR_TYPE_UNION_COLLECTION, NULL);
-}
-
-/**
- * gcr_union_collection_add:
- * @self: The union collection
- * @collection: The collection whose objects to add
- *
- * Add objects from this collection to the union
- */
-void
-gcr_union_collection_add (GcrUnionCollection *self,
- GcrCollection *collection)
-{
- g_return_if_fail (GCR_IS_UNION_COLLECTION (self));
- g_return_if_fail (GCR_IS_COLLECTION (collection));
- gcr_union_collection_take (self, g_object_ref (collection));
-}
-
-/**
- * gcr_union_collection_take:
- * @self: The union collection
- * @collection: The collection whose objects to add
- *
- * Add objects from this collection to the union. Do not add an additional
- * reference to the collection.
- */
-void
-gcr_union_collection_take (GcrUnionCollection *self,
- GcrCollection *collection)
-{
- GList *objects, *l;
-
- g_return_if_fail (GCR_IS_UNION_COLLECTION (self));
- g_return_if_fail (GCR_IS_COLLECTION (collection));
- g_return_if_fail (!g_hash_table_lookup (self->pv->collections, collection));
-
- g_object_ref (collection);
-
- g_hash_table_insert (self->pv->collections, collection, collection);
- connect_to_collection (self, collection);
-
- objects = gcr_collection_get_objects (collection);
- for (l = objects; l != NULL; l = g_list_next (l))
- on_collection_added (collection, l->data, self);
- g_list_free (objects);
-
- g_object_unref (collection);
-}
-
-/**
- * gcr_union_collection_remove:
- * @self: The collection
- * @collection: The collection whose objects to remove
- *
- * Remove an object from the collection.
- */
-void
-gcr_union_collection_remove (GcrUnionCollection *self,
- GcrCollection *collection)
-{
- GList *objects, *l;
-
- g_return_if_fail (GCR_IS_UNION_COLLECTION (self));
- g_return_if_fail (GCR_IS_COLLECTION (collection));
- g_return_if_fail (g_hash_table_lookup (self->pv->collections, collection));
-
- g_object_ref (collection);
-
- g_hash_table_remove (self->pv->collections, collection);
- disconnect_from_collection (self, collection);
-
- objects = gcr_collection_get_objects (collection);
- for (l = objects; l != NULL; l = g_list_next (l))
- on_collection_removed (collection, l->data, self);
- g_list_free (objects);
-
- g_object_unref (collection);
-}
-
-/**
- * gcr_union_collection_have:
- * @self: the union collection
- * @collection: the collection to check
- *
- * Check whether the collection is present in the union.
- *
- * Returns: whether present or not
- */
-gboolean
-gcr_union_collection_have (GcrUnionCollection *self,
- GcrCollection *collection)
-{
- g_return_val_if_fail (GCR_IS_UNION_COLLECTION (self), FALSE);
- g_return_val_if_fail (GCR_IS_COLLECTION (collection), FALSE);
- return g_hash_table_lookup (self->pv->collections, collection) != NULL;
-}
-
-/**
- * gcr_union_collection_size:
- * @self: the union collection
- *
- * Return the number of collections in this union. This does not reflect
- * the number of objects in the combined collection.
- *
- * Returns: number of collections inlcuded
- */
-guint
-gcr_union_collection_size (GcrUnionCollection *self)
-{
- g_return_val_if_fail (GCR_IS_UNION_COLLECTION (self), FALSE);
- return g_hash_table_size (self->pv->collections);
-}
-
-/**
- * gcr_union_collection_elements:
- * @self: the union collection
- *
- * Get the collections that have been added to this union.
- *
- * Returns: (element-type Gcr.Collection) (transfer container): collections
- * added to the union
- */
-GList *
-gcr_union_collection_elements (GcrUnionCollection *self)
-{
- g_return_val_if_fail (GCR_IS_UNION_COLLECTION (self), NULL);
- return g_hash_table_get_values (self->pv->collections);
-}
diff --git a/gcr/gcr-union-collection.h b/gcr/gcr-union-collection.h
deleted file mode 100644
index 2ca740c..0000000
--- a/gcr/gcr-union-collection.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_UNION_COLLECTION_H__
-#define __GCR_UNION_COLLECTION_H__
-
-#include "gcr-collection.h"
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_UNION_COLLECTION (gcr_union_collection_get_type ())
-#define GCR_UNION_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COLLECTION, GcrUnionCollection))
-#define GCR_UNION_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_COLLECTION, GcrUnionCollectionClass))
-#define GCR_IS_UNION_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COLLECTION))
-#define GCR_IS_UNION_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_COLLECTION))
-#define GCR_UNION_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_COLLECTION, GcrUnionCollectionClass))
-
-typedef struct _GcrUnionCollection GcrUnionCollection;
-typedef struct _GcrUnionCollectionClass GcrUnionCollectionClass;
-typedef struct _GcrUnionCollectionPrivate GcrUnionCollectionPrivate;
-
-struct _GcrUnionCollection {
- GObject parent;
-
- /*< private >*/
- GcrUnionCollectionPrivate *pv;
-};
-
-struct _GcrUnionCollectionClass {
- GObjectClass parent_class;
-};
-
-GType gcr_union_collection_get_type (void);
-
-GcrCollection* gcr_union_collection_new (void);
-
-void gcr_union_collection_add (GcrUnionCollection *self,
- GcrCollection *collection);
-
-void gcr_union_collection_take (GcrUnionCollection *self,
- GcrCollection *collection);
-
-void gcr_union_collection_remove (GcrUnionCollection *self,
- GcrCollection *collection);
-
-gboolean gcr_union_collection_have (GcrUnionCollection *self,
- GcrCollection *collection);
-
-guint gcr_union_collection_size (GcrUnionCollection *self);
-
-GList * gcr_union_collection_elements (GcrUnionCollection *self);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrUnionCollection, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_UNION_COLLECTION_H__ */
diff --git a/gcr/gcr-version.h.in b/gcr/gcr-version.h.in
index 81a5b4a..5f991d7 100644
--- a/gcr/gcr-version.h.in
+++ b/gcr/gcr-version.h.in
@@ -23,7 +23,7 @@
#define __GCR_VERSION_H__
#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
+#error "Only <gcr/gcr.h> can be included directly."
#endif
/* compile time version
diff --git a/gcr/gcr.h b/gcr/gcr.h
index 966163a..aaa2982 100644
--- a/gcr/gcr.h
+++ b/gcr/gcr.h
@@ -28,8 +28,32 @@
#include <glib.h>
-#include "gcr/gcr-base.h"
-#include "ui/gcr-ui.h"
+#define __GCR_INSIDE_HEADER__
+
+#include <gcr/gcr-types.h>
+
+#include <gcr/gcr-certificate.h>
+#include <gcr/gcr-certificate-chain.h>
+#include <gcr/gcr-certificate-request.h>
+#include <gcr/gcr-column.h>
+#include <gcr/gcr-enum-types.h>
+#include <gcr/gcr-fingerprint.h>
+#include <gcr/gcr-icons.h>
+#include <gcr/gcr-importer.h>
+#include <gcr/gcr-library.h>
+#include <gcr/gcr-mock-prompter.h>
+#include <gcr/gcr-parser.h>
+#include <gcr/gcr-pkcs11-certificate.h>
+#include <gcr/gcr-prompt.h>
+#include <gcr/gcr-secret-exchange.h>
+#include <gcr/gcr-secure-memory.h>
+#include <gcr/gcr-simple-certificate.h>
+#include <gcr/gcr-ssh-askpass.h>
+#include <gcr/gcr-system-prompt.h>
+#include <gcr/gcr-system-prompter.h>
+#include <gcr/gcr-trust.h>
+#include <gcr/gcr-unlock-options.h>
+#include <gcr/gcr-version.h>
#undef __GCR_INSIDE_HEADER__
diff --git a/gcr/gcr-base.symbols b/gcr/gcr.symbols
index 7a97e9a..7a97e9a 100644
--- a/gcr/gcr-base.symbols
+++ b/gcr/gcr.symbols
diff --git a/gcr/libgcr.map b/gcr/libgcr.map
new file mode 100644
index 0000000..4a16138
--- /dev/null
+++ b/gcr/libgcr.map
@@ -0,0 +1,8 @@
+{
+global:
+ gcr_*;
+ _gcr_*;
+ SECMEM_*;
+local:
+ *;
+};
diff --git a/gcr/meson.build b/gcr/meson.build
index d2f548d..59ec0fa 100644
--- a/gcr/meson.build
+++ b/gcr/meson.build
@@ -1,13 +1,11 @@
-gcr_base_headers_subdir = 'gcr-@0@'.format(gcr_api_version)
-gcr_base_headers_install_dir = gcr_base_headers_subdir / 'gcr'
+gcr_headers_subdir = 'gcr-@0@'.format(gcr_api_version)
+gcr_headers_install_dir = gcr_headers_subdir / 'gcr'
-gcr_base_public_sources = files(
+gcr_public_sources = files(
'gcr-certificate.c',
'gcr-certificate-chain.c',
'gcr-certificate-request.c',
- 'gcr-collection.c',
'gcr-comparable.c',
- 'gcr-filter-collection.c',
'gcr-fingerprint.c',
'gcr-icons.c',
'gcr-importer.c',
@@ -20,19 +18,16 @@ gcr_base_public_sources = files(
'gcr-secret-exchange.c',
'gcr-secure-memory.c',
'gcr-simple-certificate.c',
- 'gcr-simple-collection.c',
'gcr-ssh-askpass.c',
'gcr-system-prompt.c',
'gcr-system-prompter.c',
'gcr-trust.c',
- 'gcr-union-collection.c',
)
-gcr_base_private_sources = files(
+gcr_private_sources = files(
'gcr-callback-output-stream.c',
'gcr-certificate-extensions.c',
'gcr-column.c',
- 'gcr-gnupg-collection.c',
'gcr-gnupg-importer.c',
'gcr-gnupg-key.c',
'gcr-gnupg-process.c',
@@ -44,22 +39,18 @@ gcr_base_private_sources = files(
'gcr-openssh.c',
'gcr-pkcs11-importer.c',
'gcr-record.c',
- 'gcr-single-collection.c',
'gcr-subject-public-key.c',
'gcr-util.c',
)
-gcr_base_headers = files(
- 'gcr-base.h',
+gcr_headers = files(
+ 'gcr.h',
'gcr-certificate.h',
'gcr-certificate-chain.h',
'gcr-certificate-request.h',
- 'gcr-collection.h',
'gcr-column.h',
'gcr-comparable.h',
- 'gcr-deprecated-base.h',
'gcr-fingerprint.h',
- 'gcr-filter-collection.h',
'gcr-icons.h',
'gcr-importer.h',
'gcr-import-interaction.h',
@@ -71,13 +62,11 @@ gcr_base_headers = files(
'gcr-secret-exchange.h',
'gcr-secure-memory.h',
'gcr-simple-certificate.h',
- 'gcr-simple-collection.h',
'gcr-ssh-askpass.h',
'gcr-system-prompt.h',
'gcr-system-prompter.h',
'gcr-trust.h',
'gcr-types.h',
- 'gcr-union-collection.h',
'gcr-unlock-options.h',
)
@@ -92,12 +81,12 @@ gcr_version_h = configure_file(input: 'gcr-version.h.in',
configuration: gcr_version_conf,
)
-gcr_base_headers += gcr_version_h
+gcr_headers += gcr_version_h
-gcr_enums_gen = gnome.mkenums_simple('gcr-enum-types-base',
- sources: gcr_base_headers,
+gcr_enums_gen = gnome.mkenums_simple('gcr-enum-types',
+ sources: gcr_headers,
install_header: true,
- install_dir: get_option('includedir') / gcr_base_headers_install_dir,
+ install_dir: get_option('includedir') / gcr_headers_install_dir,
)
gcr_marshal_gen = gnome.genmarshal('gcr-marshal',
@@ -125,23 +114,23 @@ gcr_oids = custom_target('gcr-oids',
]
)
-gcr_base_sources = [
- gcr_base_private_sources,
- gcr_base_public_sources,
+gcr_sources = [
+ gcr_private_sources,
+ gcr_public_sources,
gcr_enums_gen,
gcr_marshal_gen,
gcr_dbus_gen,
gcr_oids,
]
-gcr_base_deps = [
+gcr_deps = [
glib_deps,
p11kit_dep,
libegg_dep,
gck_dep,
]
-gcr_base_cflags = [
+gcr_cflags = [
'-DG_LOG_DOMAIN="Gcr"',
'-DGCR_COMPILATION',
'-DGCR_API_SUBJECT_TO_CHANGE',
@@ -150,34 +139,29 @@ gcr_base_cflags = [
'-D_XOPEN_SOURCE', # Needed for strptime()
]
-gcr_base_symbolmap = meson.current_source_dir() / 'libgcr-base.map'
-gcr_base_linkflags = cc.get_supported_link_arguments(
- '-Wl,--version-script,@0@'.format(gcr_base_symbolmap),
+gcr_symbolmap = meson.current_source_dir() / 'libgcr.map'
+gcr_linkflags = cc.get_supported_link_arguments(
+ '-Wl,--version-script,@0@'.format(gcr_symbolmap),
)
-gcr_base_lib = shared_library(gcr_base_basename,
- gcr_base_sources,
- dependencies: gcr_base_deps,
- c_args: gcr_base_cflags,
- link_args: gcr_base_linkflags,
- link_depends: gcr_base_symbolmap,
+gcr_lib = shared_library(gcr_basename,
+ gcr_sources,
+ dependencies: gcr_deps,
+ c_args: gcr_cflags,
+ link_args: gcr_linkflags,
+ link_depends: gcr_symbolmap,
include_directories: config_h_dir,
- version: gcr_soversion,
+ version: gcr_version,
+ soversion: gcr_soversion,
install: true,
)
-install_headers(gcr_base_headers,
- subdir: gcr_base_headers_install_dir,
+install_headers(gcr_headers,
+ subdir: gcr_headers_install_dir,
)
-if get_option('gtk')
- install_headers('gcr.h',
- subdir: gcr_base_headers_install_dir,
- )
-endif
-
-gcr_base_dep = declare_dependency(
- link_with: gcr_base_lib,
+gcr_dep = declare_dependency(
+ link_with: gcr_lib,
include_directories: include_directories('..'),
sources: [
gcr_enums_gen[1],
@@ -187,17 +171,17 @@ gcr_base_dep = declare_dependency(
)
if get_option('introspection')
- gcr_gir = gnome.generate_gir(gcr_base_lib,
- sources: [ gcr_base_public_sources, gcr_base_headers ],
+ gcr_gir = gnome.generate_gir(gcr_lib,
+ sources: [ gcr_public_sources, gcr_headers ],
namespace: 'Gcr',
nsversion: gcr_api_version,
- export_packages: gcr_base_basename,
+ export_packages: gcr_basename,
includes: [
'GObject-2.0',
'Gio-2.0',
gck_gir[0],
],
- header: 'gcr/gcr-base.h',
+ header: 'gcr/gcr.h',
extra_args: [
'-DGCR_COMPILATION',
'-DGCR_API_SUBJECT_TO_CHANGE',
@@ -220,8 +204,8 @@ if get_option('introspection')
endif
# pkg-config file
-pkgconfig.generate(gcr_base_lib,
- subdirs: gcr_base_headers_subdir,
+pkgconfig.generate(gcr_lib,
+ subdirs: gcr_headers_subdir,
requires: [ glib_dep, gio_dep, gobject_dep, p11kit_dep, gck_lib ],
description: 'GObject and GUI library for high level crypto parsing and display',
)
@@ -251,7 +235,7 @@ if get_option('ssh_agent')
gcr_ssh_agent = executable('gcr-ssh-agent',
gcr_ssh_agent_lib_sources + [ 'gcr-ssh-agent.c' ],
- dependencies: [ gcr_base_deps, gcr_base_dep, libsecret_dep, libsystemd_deps ],
+ dependencies: [ gcr_deps, gcr_dep, libsecret_dep, libsystemd_deps ],
c_args: [
'-DGCR_COMPILATION',
'-DGCR_API_SUBJECT_TO_CHANGE',
@@ -281,7 +265,7 @@ if get_option('ssh_agent')
gcr_ssh_agent_test_lib = static_library('gcr-ssh-agent-test',
sources: gcr_ssh_agent_lib_sources + [ 'gcr-ssh-agent-test.c' ],
- dependencies: [ gcr_base_deps, gcr_base_dep, libsecret_dep, libsystemd_deps ],
+ dependencies: [ gcr_deps, gcr_dep, libsecret_dep, libsystemd_deps ],
c_args: [
'-DGCR_COMPILATION',
'-DGCR_API_SUBJECT_TO_CHANGE',
@@ -299,9 +283,9 @@ if get_option('ssh_agent')
foreach _test : gcr_ssh_agent_test_names
test_bin = executable('test-ssh-agent-'+_test,
'test-ssh-agent-@0@.c'.format(_test),
- dependencies: [ gcr_base_deps, gcr_base_dep ],
+ dependencies: [ gcr_deps, gcr_dep ],
link_with: [ gcr_ssh_agent_test_lib, egg_test_lib ],
- c_args: [ gcr_base_cflags, gcr_ssh_agent_test_cflags ],
+ c_args: [ gcr_cflags, gcr_ssh_agent_test_cflags ],
include_directories: config_h_dir,
)
@@ -332,7 +316,6 @@ endforeach
# Tests
gcr_test_names = [
'util',
- 'filter-collection',
'secret-exchange',
'simple-certificate',
'certificate',
@@ -348,7 +331,6 @@ gcr_test_names = [
'record',
'memory-icon',
'gnupg-key',
- 'gnupg-collection',
'gnupg-process',
'system-prompt',
'ssh-askpass',
@@ -362,14 +344,14 @@ gcr_test_cflags = [
foreach _test : gcr_test_names
test_bin = executable('test-'+_test,
'test-@0@.c'.format(_test),
- dependencies: [ gcr_base_deps, gcr_base_dep ],
+ dependencies: [ gcr_deps, gcr_dep ],
link_with: [ gck_test_lib, egg_test_lib ],
- c_args: [ gcr_base_cflags, gcr_test_cflags ],
+ c_args: [ gcr_cflags, gcr_test_cflags ],
include_directories: config_h_dir,
)
test(_test, test_bin,
- suite: 'gcr-base',
+ suite: 'gcr',
depends: gcr_ssh_askpass,
)
endforeach
@@ -377,18 +359,18 @@ endforeach
# Example frob programs
frob_certificate_request = executable('frob-certificate-request',
files('frob-certificate-request.c', 'console-interaction.c'),
- dependencies: [ gcr_base_dep, gcr_base_deps ],
- c_args: gcr_base_cflags,
+ dependencies: [ gcr_dep, gcr_deps ],
+ c_args: gcr_cflags,
)
frob_openpgp = executable('frob-openpgp',
files('frob-openpgp.c'),
- dependencies: [ gcr_base_dep, gcr_base_deps ],
- c_args: gcr_base_cflags,
+ dependencies: [ gcr_dep, gcr_deps ],
+ c_args: gcr_cflags,
)
frob_parser = executable('frob-parser',
files('frob-parser.c'),
- dependencies: [ gcr_base_dep, gcr_base_deps ],
- c_args: gcr_base_cflags,
+ dependencies: [ gcr_dep, gcr_deps ],
+ c_args: gcr_cflags,
)
diff --git a/gcr/test-certificate-chain.c b/gcr/test-certificate-chain.c
index a0bc45f..6cb8ee4 100644
--- a/gcr/test-certificate-chain.c
+++ b/gcr/test-certificate-chain.c
@@ -21,7 +21,7 @@
#include "config.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "gcr/gcr-internal.h"
#include "egg/egg-asn1x.h"
diff --git a/gcr/test-certificate.c b/gcr/test-certificate.c
index 6603ad4..2fed913 100644
--- a/gcr/test-certificate.c
+++ b/gcr/test-certificate.c
@@ -21,7 +21,7 @@
#include "config.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "gcr/gcr-internal.h"
#include "gcr/gcr-certificate-extensions.h"
diff --git a/gcr/test-filter-collection.c b/gcr/test-filter-collection.c
deleted file mode 100644
index 952dbd3..0000000
--- a/gcr/test-filter-collection.c
+++ /dev/null
@@ -1,272 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/*
- Copyright (C) 2011 Collabora Ltd.
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#include "config.h"
-
-#include "gcr/gcr-simple-collection.h"
-#include "gcr/gcr-filter-collection.h"
-
-#include "egg/egg-testing.h"
-
-#include <glib.h>
-
-#define NUM_OBJECTS 10
-
-typedef struct {
- GcrCollection *underlying;
- GObject *objects[NUM_OBJECTS];
-} Test;
-
-static guint
-mock_object_value (GObject *object)
-{
- return GPOINTER_TO_UINT (g_object_get_data (object, "value"));
-}
-
-static void
-setup (Test *test,
- gconstpointer unused)
-{
- GcrSimpleCollection *collection;
- guint i;
-
- test->underlying = gcr_simple_collection_new ();
- collection = GCR_SIMPLE_COLLECTION (test->underlying);
-
- for (i = 0; i < NUM_OBJECTS; i++) {
- test->objects[i] = g_object_new (G_TYPE_OBJECT, NULL);
- g_object_set_data (test->objects[i], "value", GUINT_TO_POINTER (i));
- gcr_simple_collection_add (GCR_SIMPLE_COLLECTION (collection), test->objects[i]);
- }
-}
-
-static void
-teardown (Test *test,
- gconstpointer unused)
-{
- guint i;
-
- for (i = 0; i < NUM_OBJECTS; i++)
- g_object_unref (test->objects[i]);
-
- g_object_unref (test->underlying);
-}
-
-static void
-test_create (Test *test,
- gconstpointer unused)
-{
- GcrFilterCollection *filter;
- GcrCollection *collection;
- GcrCollection *underlying;
- GList *objects;
- guint i;
-
- collection = gcr_filter_collection_new_with_callback (test->underlying,
- NULL, NULL, NULL);
- filter = GCR_FILTER_COLLECTION (collection);
-
- g_assert (test->underlying == gcr_filter_collection_get_underlying (filter));
- g_object_get (collection, "underlying", &underlying, NULL);
- g_assert (test->underlying == underlying);
- g_object_unref (underlying);
-
- g_assert_cmpuint (gcr_collection_get_length (collection), ==, NUM_OBJECTS);
- for (i = 0; i < NUM_OBJECTS; i++)
- gcr_collection_contains (collection, test->objects[i]);
- objects = gcr_collection_get_objects (collection);
- g_assert_cmpuint (g_list_length (objects), ==, NUM_OBJECTS);
- for (i = 0; i < NUM_OBJECTS; i++)
- g_assert (g_list_find (objects, test->objects[i]) != NULL);
- g_list_free (objects);
-
- g_object_unref (collection);
-}
-
-static gboolean
-on_filter_increment_value (GObject *object,
- gpointer user_data)
-{
- guint *value = user_data;
-
- g_assert_cmpuint (*value, >=, 0);
- g_assert_cmpuint (*value, <=, 20);
- (*value)++;
-
- return TRUE;
-}
-
-static void
-destroy_change_value (gpointer data)
-{
- guint *value = data;
- g_assert (value != NULL);
- *value = 0;
-}
-
-static void
-test_callbacks (Test *test,
- gconstpointer unused)
-{
- GcrCollection *collection;
- GcrFilterCollection *filter;
- guint value = 4;
-
- collection = gcr_filter_collection_new_with_callback (test->underlying,
- on_filter_increment_value,
- &value, destroy_change_value);
- g_assert_cmpuint (value, ==, 4 + NUM_OBJECTS);
-
- filter = GCR_FILTER_COLLECTION (collection);
-
- /* This should call destroy (value -> 0), and then refilter all values (value -> 10) */
- gcr_filter_collection_set_callback (filter, on_filter_increment_value,
- &value, destroy_change_value);
- g_assert_cmpuint (value, ==, NUM_OBJECTS);
-
- g_object_unref (collection);
- g_assert_cmpuint (value, ==, 0);
-}
-
-static gboolean
-on_filter_modulo (GObject *object,
- gpointer user_data)
-{
- guint value = mock_object_value (object);
- guint *modulo = user_data;
-
- g_assert (modulo != NULL);
- g_assert_cmpuint (value, >=, 0);
- g_assert_cmpuint (value, <, NUM_OBJECTS);
-
- return (value % *modulo) == 0;
-}
-
-static void
-test_filtering (Test *test,
- gconstpointer unused)
-{
- GcrFilterCollection *filter;
- GcrCollection *collection;
- GList *objects;
- guint modulo;
- guint i;
-
- modulo = 2;
- collection = gcr_filter_collection_new_with_callback (test->underlying,
- on_filter_modulo, &modulo, NULL);
- filter = GCR_FILTER_COLLECTION (collection);
-
- g_assert_cmpuint (gcr_collection_get_length (collection), ==, NUM_OBJECTS / modulo);
- for (i = 0; i < NUM_OBJECTS; i += modulo)
- gcr_collection_contains (collection, test->objects[i]);
- objects = gcr_collection_get_objects (collection);
- g_assert_cmpuint (g_list_length (objects), ==, NUM_OBJECTS / modulo);
- for (i = 0; i < NUM_OBJECTS; i += modulo)
- g_assert (g_list_find (objects, test->objects[i]) != NULL);
- g_list_free (objects);
-
- modulo = 5;
- gcr_filter_collection_refilter (filter);
-
- g_assert_cmpuint (gcr_collection_get_length (collection), ==, NUM_OBJECTS / modulo);
- for (i = 0; i < NUM_OBJECTS; i += modulo)
- gcr_collection_contains (collection, test->objects[i]);
- objects = gcr_collection_get_objects (collection);
- g_assert_cmpuint (g_list_length (objects), ==, NUM_OBJECTS / modulo);
- for (i = 0; i < NUM_OBJECTS; i += modulo)
- g_assert (g_list_find (objects, test->objects[i]) != NULL);
- g_list_free (objects);
-
- g_object_unref (collection);
-}
-
-static void
-on_filter_added (GcrCollection *collection,
- GObject *object,
- gpointer user_data)
-{
- guint *added = user_data;
- g_assert (added != NULL);
- (*added)++;
-}
-
-static void
-on_filter_removed (GcrCollection *collection,
- GObject *object,
- gpointer user_data)
-{
- guint *removed = user_data;
- g_assert (removed != NULL);
- (*removed)++;
-}
-
-static void
-test_add_remove (Test *test,
- gconstpointer unused)
-{
- GcrCollection *collection;
- guint modulo;
- guint added = 0;
- guint removed = 0;
- guint i;
-
- modulo = 2;
- collection = gcr_filter_collection_new_with_callback (test->underlying,
- on_filter_modulo, &modulo, NULL);
-
- g_assert_cmpuint (gcr_collection_get_length (collection), ==, NUM_OBJECTS / modulo);
-
- g_signal_connect (collection, "added", G_CALLBACK (on_filter_added), &added);
- g_signal_connect (collection, "removed", G_CALLBACK (on_filter_removed), &removed);
-
- for (i = 0; i < NUM_OBJECTS; i++)
- gcr_simple_collection_remove (GCR_SIMPLE_COLLECTION (test->underlying),
- test->objects[i]);
-
- g_assert_cmpuint (gcr_collection_get_length (collection), ==, 0);
- g_assert_cmpuint (added, ==, 0);
- g_assert_cmpuint (removed, ==, NUM_OBJECTS / modulo);
-
- for (i = 0; i < NUM_OBJECTS; i++)
- gcr_simple_collection_add (GCR_SIMPLE_COLLECTION (test->underlying),
- test->objects[i]);
-
- g_assert_cmpuint (gcr_collection_get_length (collection), ==, NUM_OBJECTS / modulo);
- g_assert_cmpuint (added, ==, NUM_OBJECTS / modulo);
- g_assert_cmpuint (removed, ==, NUM_OBJECTS / modulo);
-
- g_object_unref (collection);
-}
-
-int
-main (int argc, char **argv)
-{
- g_test_init (&argc, &argv, NULL);
- g_set_prgname ("test-filter-collection");
-
- g_test_add ("/gcr/filter-collection/create", Test, NULL, setup, test_create, teardown);
- g_test_add ("/gcr/filter-collection/callbacks", Test, NULL, setup, test_callbacks, teardown);
- g_test_add ("/gcr/filter-collection/filtering", Test, NULL, setup, test_filtering, teardown);
- g_test_add ("/gcr/filter-collection/add-remove", Test, NULL, setup, test_add_remove, teardown);
-
- return g_test_run ();
-}
diff --git a/gcr/test-fingerprint.c b/gcr/test-fingerprint.c
index 417d338..002e082 100644
--- a/gcr/test-fingerprint.c
+++ b/gcr/test-fingerprint.c
@@ -22,7 +22,7 @@
#include "config.h"
#define GCR_COMPILATION 1
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "gcr/gcr-internal.h"
#include "gcr/gcr-fingerprint.h"
@@ -115,7 +115,7 @@ build_attributes_for_cert (GBytes *data)
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE);
gck_builder_add_ulong (&builder, CKA_CERTIFICATE_TYPE, CKC_X_509);
- return gck_attributes_ref_sink (gck_builder_end (&builder));
+ return gck_builder_end (&builder);
}
static GBytes *
diff --git a/gcr/test-gnupg-collection.c b/gcr/test-gnupg-collection.c
deleted file mode 100644
index e65900a..0000000
--- a/gcr/test-gnupg-collection.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/*
- Copyright (C) 2010 Collabora Ltd
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#include "config.h"
-
-#include "gcr/gcr-base.h"
-#include "gcr/gcr-gnupg-collection.h"
-#include "gcr/gcr-gnupg-key.h"
-#include "gcr/gcr-record.h"
-
-#include "egg/egg-testing.h"
-
-#include <glib.h>
-#include <glib/gstdio.h>
-
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-
-typedef struct {
- GcrGnupgCollection *collection;
- gchar *directory;
- GHashTable *keys;
- GAsyncResult *result;
-} Test;
-
-static void
-on_collection_added (GcrCollection *collection, GObject *object, gpointer user_data)
-{
- Test *test = user_data;
- GcrGnupgKey *key;
- const gchar *keyid;
-
- g_assert (GCR_COLLECTION (test->collection) == collection);
-
- g_assert (GCR_IS_GNUPG_KEY (object));
- key = GCR_GNUPG_KEY (object);
-
- keyid = _gcr_gnupg_key_get_keyid (key);
- g_assert (keyid);
- g_assert (!g_hash_table_lookup (test->keys, keyid));
-
- g_hash_table_insert (test->keys, g_strdup (keyid), key);
-}
-
-static void
-on_collection_removed (GcrCollection *collection, GObject *object, gpointer user_data)
-{
- Test *test = user_data;
- GcrGnupgKey *key;
- const gchar *keyid;
-
- g_assert (GCR_COLLECTION (test->collection) == collection);
- g_assert (GCR_IS_GNUPG_KEY (object));
-
- keyid = _gcr_gnupg_key_get_keyid (GCR_GNUPG_KEY (object));
- key = g_hash_table_lookup (test->keys, keyid);
- g_assert (key == GCR_GNUPG_KEY (object));
-
- if (!g_hash_table_remove (test->keys, keyid))
- g_assert_not_reached ();
-}
-
-static void
-setup (Test *test, gconstpointer unused)
-{
- GcrCollection *collection;
- GError *error = NULL;
- gchar *cmd;
-
- test->directory = g_build_filename ("/tmp/gcr-tests.XXXXXX", NULL);
- g_assert (g_mkdtemp_full (test->directory, 0700) != NULL);
-
- cmd = g_strdup_printf ("cp -p " SRCDIR "/gcr/fixtures/gnupg-homedir/* %s", test->directory);
- g_spawn_check_exit_status (system (cmd), &error);
- g_assert_no_error (error);
- g_free (cmd);
-
- collection = _gcr_gnupg_collection_new (test->directory);
- test->collection = GCR_GNUPG_COLLECTION (collection);
-
- test->keys = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
- g_signal_connect (collection, "added", G_CALLBACK (on_collection_added), test);
- g_signal_connect (collection, "removed", G_CALLBACK (on_collection_removed), test);
-}
-
-static void
-teardown (Test *test, gconstpointer unused)
-{
- GError *error = NULL;
- gchar *cmd;
-
- g_hash_table_destroy (test->keys);
-
- if (test->result)
- g_object_unref (test->result);
-
- g_object_unref (test->collection);
-
- /* remove potential gpg 2.1 extras, ignore any errors. */
- cmd = g_strdup_printf ("rm -rf %s/*.d", test->directory);
- system (cmd);
- g_free (cmd);
- cmd = g_strdup_printf ("rm -f %s/.gpg-v21-migrated", test->directory);
- system (cmd);
- g_free (cmd);
-
- cmd = g_strdup_printf ("rm -f %s/*", test->directory);
- g_spawn_check_exit_status (system (cmd), &error);
- g_assert_no_error (error);
- g_free (cmd);
-
- if (g_rmdir (test->directory) < 0)
- g_critical ("couldn't remove %s: %s", test->directory, g_strerror (errno));
- g_free (test->directory);
-}
-
-static void
-on_async_ready (GObject *source, GAsyncResult *res, gpointer user_data)
-{
- Test *test = user_data;
- g_assert (G_OBJECT (test->collection) == source);
- g_assert (test->result == NULL);
- test->result = g_object_ref (res);
- egg_test_wait_stop ();
-}
-
-static void
-test_properties (Test *test, gconstpointer unused)
-{
- gchar *directory;
- g_object_get (test->collection, "directory", &directory, NULL);
- g_assert_cmpstr (directory, ==, test->directory);
- g_free (directory);
-}
-
-static void
-test_load (Test *test, gconstpointer unused)
-{
- GError *error = NULL;
- GcrGnupgKey *key;
- GList *l, *objects;
- GcrRecord *record;
- GHashTable *check;
-
- _gcr_gnupg_collection_load_async (test->collection, NULL, on_async_ready, test);
- egg_test_wait_until (500000);
-
- g_assert (test->result);
- _gcr_gnupg_collection_load_finish (test->collection, test->result, &error);
- g_assert_no_error (error);
-
- /* Werner Koch (a public key) */
- key = g_hash_table_lookup (test->keys, "5DE249965B0358A2");
- g_assert (GCR_IS_GNUPG_KEY (key));
- g_assert (_gcr_gnupg_key_get_secret_records (key) == NULL);
-
- /* Test Number 2 (a secret key)*/
- key = g_hash_table_lookup (test->keys, "268FEE686262C395");
- g_assert (GCR_IS_GNUPG_KEY (key));
- g_assert (_gcr_gnupg_key_get_secret_records (key));
-
- /* The length of collection should be correct */
- g_assert_cmpuint (g_hash_table_size (test->keys), ==,
- gcr_collection_get_length (GCR_COLLECTION (test->collection)));
-
- /* The list of objects should be correct */
- objects = gcr_collection_get_objects (GCR_COLLECTION (test->collection));
- g_assert_cmpuint (g_hash_table_size (test->keys), ==, g_list_length (objects));
- check = g_hash_table_new (g_str_hash, g_str_equal);
- for (l = objects; l != NULL; l = g_list_next (l)) {
- g_assert (GCR_IS_GNUPG_KEY (l->data));
- key = g_hash_table_lookup (test->keys, _gcr_gnupg_key_get_keyid (l->data));
- g_assert (key == l->data);
- g_hash_table_replace (check, (gchar*)_gcr_gnupg_key_get_keyid (l->data), "");
- }
- g_assert_cmpuint (g_hash_table_size (check), ==, g_hash_table_size (test->keys));
- g_hash_table_destroy (check);
- g_list_free (objects);
-
- /* Phillip R. Zimmerman's key should have a photo */
- key = g_hash_table_lookup (test->keys, "C7463639B2D7795E");
- g_assert (GCR_IS_GNUPG_KEY (key));
- record = _gcr_records_find (_gcr_gnupg_key_get_public_records (key), GCR_RECORD_SCHEMA_XA1);
- g_assert (record);
-}
-
-static void
-test_reload (Test *test, gconstpointer unused)
-{
- GError *error = NULL;
- GcrGnupgKey *key;
-
- _gcr_gnupg_collection_load_async (test->collection, NULL, on_async_ready, test);
- egg_test_wait_until (500000);
- g_assert (test->result);
- _gcr_gnupg_collection_load_finish (test->collection, test->result, &error);
- g_assert_no_error (error);
-
- g_object_unref (test->result);
- test->result = NULL;
-
- _gcr_gnupg_collection_load_async (test->collection, NULL, on_async_ready, test);
- egg_test_wait_until (500000);
- g_assert (test->result);
- _gcr_gnupg_collection_load_finish (test->collection, test->result, &error);
- g_assert_no_error (error);
-
- /* Werner Koch (a public key) */
- key = g_hash_table_lookup (test->keys, "5DE249965B0358A2");
- g_assert (GCR_IS_GNUPG_KEY (key));
- g_assert (_gcr_gnupg_key_get_secret_records (key) == NULL);
-
- /* Test Number 2 (a secret key)*/
- key = g_hash_table_lookup (test->keys, "268FEE686262C395");
- g_assert (GCR_IS_GNUPG_KEY (key));
- g_assert (_gcr_gnupg_key_get_secret_records (key));
-}
-
-int
-main (int argc, char **argv)
-{
- g_test_init (&argc, &argv, NULL);
- g_set_prgname ("test-gnupg-collection");
-
- g_test_add ("/gcr/gnupg-collection/properties", Test, NULL, setup, test_properties, teardown);
- g_test_add ("/gcr/gnupg-collection/load", Test, NULL, setup, test_load, teardown);
- g_test_add ("/gcr/gnupg-collection/reload", Test, NULL, setup, test_reload, teardown);
-
- return egg_tests_run_with_loop ();
-}
diff --git a/gcr/test-gnupg-process.c b/gcr/test-gnupg-process.c
index d6cedd0..827cfe0 100644
--- a/gcr/test-gnupg-process.c
+++ b/gcr/test-gnupg-process.c
@@ -21,7 +21,7 @@
#include "config.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "gcr/gcr-callback-output-stream.h"
#include "gcr/gcr-gnupg-process.h"
diff --git a/gcr/test-openpgp.c b/gcr/test-openpgp.c
index afba139..897be02 100644
--- a/gcr/test-openpgp.c
+++ b/gcr/test-openpgp.c
@@ -21,7 +21,7 @@
#include "config.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "gcr/gcr-openpgp.h"
#include "gcr/gcr-record.h"
diff --git a/gcr/test-openssh.c b/gcr/test-openssh.c
index 3161736..e3ad367 100644
--- a/gcr/test-openssh.c
+++ b/gcr/test-openssh.c
@@ -21,7 +21,7 @@
#include "config.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "gcr/gcr-openssh.h"
#include "egg/egg-testing.h"
diff --git a/gcr/test-parser.c b/gcr/test-parser.c
index 13cbc2b..76960b5 100644
--- a/gcr/test-parser.c
+++ b/gcr/test-parser.c
@@ -26,7 +26,7 @@
#include "egg/egg-secure-memory.h"
#include "egg/egg-testing.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "gcr/gcr-internal.h"
#include "gck/gck.h"
diff --git a/gcr/test-pkcs11-certificate.c b/gcr/test-pkcs11-certificate.c
index e1858ce..1b11b7a 100644
--- a/gcr/test-pkcs11-certificate.c
+++ b/gcr/test-pkcs11-certificate.c
@@ -24,7 +24,7 @@
#include "egg/egg-asn1x.h"
#include "egg/egg-asn1-defs.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "gcr/gcr-internal.h"
#include "egg/egg-testing.h"
diff --git a/gcr/test-secret-exchange.c b/gcr/test-secret-exchange.c
index 27d7775..b533670 100644
--- a/gcr/test-secret-exchange.c
+++ b/gcr/test-secret-exchange.c
@@ -21,7 +21,7 @@
#include "config.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "egg/egg-testing.h"
diff --git a/gcr/test-simple-certificate.c b/gcr/test-simple-certificate.c
index 9353c5e..945768e 100644
--- a/gcr/test-simple-certificate.c
+++ b/gcr/test-simple-certificate.c
@@ -21,7 +21,7 @@
#include "config.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "gcr/gcr-internal.h"
#include "gck/gck-test.h"
diff --git a/gcr/test-ssh-askpass.c b/gcr/test-ssh-askpass.c
index cd58fce..936f48d 100644
--- a/gcr/test-ssh-askpass.c
+++ b/gcr/test-ssh-askpass.c
@@ -21,7 +21,7 @@
#include "config.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "egg/egg-testing.h"
#include "egg/mock-interaction.h"
diff --git a/gcr/test-subject-public-key.c b/gcr/test-subject-public-key.c
index 4d16a7b..e213d99 100644
--- a/gcr/test-subject-public-key.c
+++ b/gcr/test-subject-public-key.c
@@ -21,7 +21,7 @@
#include "config.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "gcr/gcr-subject-public-key.h"
#include "gck/gck-mock.h"
@@ -429,7 +429,7 @@ typedef struct { GckObject parent; GckAttributes *attrs; } MockObject;
typedef struct { GckObjectClass parent; } MockObjectClass;
GType mock_object_get_type (void) G_GNUC_CONST;
-static void mock_object_cache_init (GckObjectCacheIface *iface);
+static void mock_object_cache_init (GckObjectCacheInterface *iface);
G_DEFINE_TYPE_WITH_CODE (MockObject, mock_object, GCK_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (GCK_TYPE_OBJECT_CACHE, mock_object_cache_init)
);
@@ -491,11 +491,11 @@ mock_object_fill (GckObjectCache *object,
gck_builder_set_all (&builder, attrs);
gck_attributes_unref (self->attrs);
- self->attrs = gck_attributes_ref_sink (gck_builder_end (&builder));
+ self->attrs = gck_builder_end (&builder);
}
static void
-mock_object_cache_init (GckObjectCacheIface *iface)
+mock_object_cache_init (GckObjectCacheInterface *iface)
{
iface->default_types = NULL;
iface->n_default_types = 0;
@@ -568,7 +568,7 @@ perform_load_partial (TestLoading *test,
for (i = 0; i < gck_attributes_count (attributes); i += 2)
gck_builder_add_attribute (&builder, gck_attributes_at (attributes, i));
- partial = gck_attributes_ref_sink (gck_builder_end (&builder));
+ partial = gck_builder_end (&builder);
object = g_object_new (mock_object_get_type (),
"module", test->mo.module,
@@ -649,7 +649,7 @@ test_load_failure_build (TestModule *test,
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE);
gck_builder_add_ulong (&builder, CKA_CERTIFICATE_TYPE, CKC_X_509);
gck_builder_add_string (&builder, CKA_VALUE, "invalid value");
- attributes = gck_attributes_ref_sink (gck_builder_end (&builder));
+ attributes = gck_builder_end (&builder);
object = g_object_new (mock_object_get_type (),
"module", test->module,
diff --git a/gcr/test-system-prompt.c b/gcr/test-system-prompt.c
index 7b3b2e7..e1d472e 100644
--- a/gcr/test-system-prompt.c
+++ b/gcr/test-system-prompt.c
@@ -21,7 +21,7 @@
#include "config.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "gcr/gcr-mock-prompter.h"
#include "egg/egg-testing.h"
diff --git a/gcr/test-trust.c b/gcr/test-trust.c
index fb3dca9..08e4a35 100644
--- a/gcr/test-trust.c
+++ b/gcr/test-trust.c
@@ -21,7 +21,7 @@
#include "config.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "gcr/gcr-internal.h"
#include "gck/gck-mock.h"
diff --git a/gcr/test-util.c b/gcr/test-util.c
index 6e7610f..8532c3e 100644
--- a/gcr/test-util.c
+++ b/gcr/test-util.c
@@ -21,7 +21,7 @@
#include "config.h"
-#include "gcr/gcr-base.h"
+#include "gcr/gcr.h"
#include "gcr/gcr-util.h"
#include <errno.h>
diff --git a/meson.build b/meson.build
index e2ec57c..dd70d01 100644
--- a/meson.build
+++ b/meson.build
@@ -1,5 +1,5 @@
project('gcr', 'c',
- version: '3.41.0',
+ version: '3.90.0',
meson_version: '>= 0.52',
license: 'GPL2+',
)
@@ -9,16 +9,16 @@ i18n = import('i18n')
pkgconfig = import('pkgconfig')
# Versioning
-gcr_api_version = '3'
+gcr_api_version = '4'
gcr_version = meson.project_version()
-gcr_soversion = '1.0.0'
+gcr_soversion = '0.0.0'
gcr_version_array = gcr_version.split('.')
gcr_major_version = gcr_version_array[0].to_int()
gcr_minor_version = gcr_version_array[1].to_int()
gcr_micro_version = gcr_version_array[2].to_int()
-gck_api_version = '1'
-gck_version = '1.0.0'
+gck_api_version = '2'
+gck_version = '1.90.0'
gck_soversion = '0.0.0'
gck_version_array = gck_version.split('.')
gck_major_version = gck_version_array[0].to_int()
@@ -37,7 +37,8 @@ podir = source_root / 'po'
gck_basename = 'gck-@0@'.format(gck_api_version)
gcr_base_basename = 'gcr-base-@0@'.format(gcr_api_version)
gcr_basename = 'gcr-@0@'.format(gcr_api_version)
-gcr_ui_basename = 'gcr-ui-@0@'.format(gcr_api_version)
+gcr_gtk3_basename = 'gcr-@0@-gtk3'.format(gcr_api_version)
+gcr_gtk4_basename = 'gcr-@0@-gtk4'.format(gcr_api_version)
# Dependencies
min_glib_version = '2.44'
@@ -72,9 +73,13 @@ if libsystemd.found() and systemd.found()
with_systemd = true
endif
-if get_option('gtk')
- gtk_min_version = '3.22'
- gtk_dep = dependency('gtk+-3.0', version: '>=' + gtk_min_version)
+if get_option('gtk3')
+ gtk3_min_version = '3.22'
+ gtk3_dep = dependency('gtk+-3.0', version: '>=' + gtk3_min_version)
+endif
+
+if get_option('gtk4')
+ gtk4_dep = dependency('gtk4')
endif
# configuration
@@ -104,9 +109,13 @@ subdir('egg')
subdir('gck')
subdir('gcr')
subdir('schema')
-if get_option('gtk')
- subdir('ui')
+if get_option('gtk3')
+ subdir('gcr-gtk3')
+endif
+if get_option('gtk4')
+ subdir('gcr-gtk4')
endif
+subdir('tools')
if get_option('gtk_doc')
if not get_option('introspection')
error('Can\'t generate docs without introspection enabled!')
@@ -118,7 +127,4 @@ endif
# Post-install scripts
meson.add_install_script('meson_post_install.py',
get_option('datadir'),
- get_option('libdir'),
- gcr_major_version.to_string(),
- gcr_soversion,
)
diff --git a/meson_options.txt b/meson_options.txt
index f96a47c..6f4bc52 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -3,15 +3,20 @@ option('introspection',
value: true,
description: 'Build GObject Introspection (GIR) files',
)
-option('gtk',
+option('gtk3',
type: 'boolean',
value: true,
- description: 'Build code that uses GTK+',
+ description: 'Enable the GTK3 library and utilities',
+)
+option('gtk4',
+ type: 'boolean',
+ value: true,
+ description: 'Enable the GTK4 library and utilities',
)
option('gtk_doc',
type: 'boolean',
value: true,
- description: 'Build the reference documentation (requires gtk-doc)',
+ description: 'Build the reference documentation (requires gi-docgen)',
)
option('gpg_path',
type: 'string',
diff --git a/meson_post_install.py b/meson_post_install.py
index 0166814..9e5cbdf 100755
--- a/meson_post_install.py
+++ b/meson_post_install.py
@@ -9,9 +9,6 @@ install_prefix = os.environ['MESON_INSTALL_DESTDIR_PREFIX']
# Args
datadir = sys.argv[1]
-libdir = sys.argv[2]
-gcr_major_version = sys.argv[3]
-gcr_soversion = sys.argv[4]
icondir = os.path.join(install_prefix, datadir, 'icons', 'hicolor')
schemadir = os.path.join(install_prefix, datadir, 'glib-2.0', 'schemas')
@@ -29,23 +26,3 @@ subprocess.call(['glib-compile-schemas', schemadir])
print('Updating MIME database...')
subprocess.call(['update-mime-database', mimedatabasedir])
-
-# FIXME: after a major version bump, just drop this
-print('Creating symlink for libgcr-{}.so'.format(gcr_major_version))
-
-def _get_path_for_lib(basename):
- return os.path.join(install_prefix, libdir, basename)
-
-libgcr_ui_basename = 'libgcr-ui-{}.so'.format(gcr_major_version)
-libgcr_basename = 'libgcr-{}.so'.format(gcr_major_version)
-
-subprocess.call(['ln', '-f', '-s', libgcr_ui_basename, _get_path_for_lib(libgcr_basename)])
-
-for v in gcr_soversion.split('.'):
- libgcr_ui_basename += '.{}'.format(v)
- libgcr_basename += '.{}'.format(v)
-
- if not os.path.exists(_get_path_for_lib(libgcr_ui_basename)):
- continue
-
- subprocess.call(['ln', '-f', '-s', libgcr_ui_basename, _get_path_for_lib(libgcr_basename)])
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 1062ddb..6e8a8e6 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -22,23 +22,23 @@ gcr/gcr-ssh-askpass.c
gcr/gcr-subject-public-key.c
gcr/gcr-system-prompt.c
gcr/gcr-trust.c
-ui/gcr-certificate-renderer.c
-ui/gcr-certificate-request-renderer.c
-ui/gcr-certificate-widget.c
-ui/gcr-display-view.c
-ui/gcr-failure-renderer.c
-ui/gcr-gnupg-renderer.c
-ui/gcr-import-button.c
-ui/gcr-key-renderer.c
-ui/gcr-pkcs11-import-dialog.c
-ui/gcr-pkcs11-import-dialog.ui
-ui/gcr-pkcs11-import-interaction.c
-ui/gcr-prompt-dialog.c
-ui/gcr-prompter.desktop.in.in
-ui/gcr-certificate-exporter.c
-ui/gcr-unlock-options-widget.ui
-ui/gcr-unlock-renderer.c
-ui/gcr-viewer.desktop.in.in
-ui/gcr-viewer-tool.c
-ui/gcr-viewer-widget.c
-ui/gcr-viewer-window.c
+gcr-gtk3/gcr-certificate-renderer.c
+gcr-gtk3/gcr-certificate-request-renderer.c
+gcr-gtk3/gcr-certificate-widget.c
+gcr-gtk3/gcr-display-view.c
+gcr-gtk3/gcr-failure-renderer.c
+gcr-gtk3/gcr-gnupg-renderer.c
+gcr-gtk3/gcr-import-button.c
+gcr-gtk3/gcr-key-renderer.c
+gcr-gtk3/gcr-pkcs11-import-dialog.c
+gcr-gtk3/gcr-pkcs11-import-dialog.ui
+gcr-gtk3/gcr-pkcs11-import-interaction.c
+gcr-gtk3/gcr-prompt-dialog.c
+gcr-gtk3/gcr-prompter.desktop.in.in
+gcr-gtk3/gcr-certificate-exporter.c
+gcr-gtk3/gcr-unlock-options-widget.ui
+gcr-gtk3/gcr-unlock-renderer.c
+gcr-gtk3/gcr-viewer.desktop.in.in
+gcr-gtk3/gcr-viewer-tool.c
+gcr-gtk3/gcr-viewer-widget.c
+gcr-gtk3/gcr-viewer-window.c
diff --git a/tools/gtk3/meson.build b/tools/gtk3/meson.build
new file mode 100644
index 0000000..e2da60f
--- /dev/null
+++ b/tools/gtk3/meson.build
@@ -0,0 +1,7 @@
+gcr_viewer_gtk3 = executable('gcr-viewer-gtk3',
+ 'viewer.c',
+ dependencies: [ gcr_gtk3_dep, gcr_gtk3_deps ],
+ c_args: gcr_gtk3_cflags,
+ include_directories: config_h_dir,
+ install: true,
+)
diff --git a/tools/gtk3/viewer.c b/tools/gtk3/viewer.c
new file mode 100644
index 0000000..e8e6e7c
--- /dev/null
+++ b/tools/gtk3/viewer.c
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2011,2021 Collabora Ltd.
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * Copyright Stef Walter <stefw@collabora.co.uk>
+ * SPDX-License-Identifier: LGPL-2.0-or-later
+ */
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <gcr-gtk3/gcr-gtk3.h>
+
+#include "config.h"
+
+static gchar **remaining_args = NULL;
+
+static gboolean
+print_version_and_exit (const gchar *option_name,
+ const gchar *value,
+ gpointer data,
+ GError **error)
+{
+ g_print("%s -- %s\n", _("GCR Certificate Viewer"), VERSION);
+ exit (0);
+ return TRUE;
+}
+
+static const GOptionEntry options[] = {
+ { "version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
+ print_version_and_exit, N_("Show the application's version"), NULL},
+ { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY,
+ &remaining_args, NULL, N_("[file...]") },
+ { NULL }
+};
+
+static void
+on_parser_parsed (GcrParser *parser,
+ gpointer user_data)
+{
+ GcrCertificate **cert = user_data;
+ GckAttributes *attributes;
+ const GckAttribute *attr;
+
+ attributes = gcr_parser_get_parsed_attributes (parser);
+ attr = gck_attributes_find (attributes, CKA_VALUE);
+ *cert = gcr_simple_certificate_new (attr->value, attr->length);
+}
+
+GcrCertificate *
+simple_certificate_new_from_file (GFile *file,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GcrCertificate *cert = NULL;
+ GcrParser *parser;
+ GBytes *bytes;
+
+ g_return_val_if_fail (G_IS_FILE (file), NULL);
+ g_return_val_if_fail (!error || !*error, NULL);
+
+
+ bytes = g_file_load_bytes (file, cancellable, NULL, error);
+ if (!bytes) {
+ return NULL;
+ }
+
+ parser = gcr_parser_new ();
+ g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), &cert);
+ if (!gcr_parser_parse_bytes (parser, bytes, error)) {
+ g_bytes_unref (bytes);
+ g_object_unref (parser);
+ g_object_unref (cert);
+ return NULL;
+ }
+
+ g_bytes_unref (bytes);
+ g_object_unref (parser);
+ return cert;
+}
+
+
+static void
+activate (GtkApplication* app,
+ gpointer user_data)
+{
+ GtkWidget *window;
+ GtkWidget *box;
+ GtkWidget *scrolled;
+ GCancellable *cancellable = NULL;
+
+ window = gtk_application_window_new (app);
+ gtk_window_set_title (GTK_WINDOW (window), "Window");
+ gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
+ scrolled = gtk_scrolled_window_new (NULL, NULL);
+ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ g_object_set (G_OBJECT (scrolled),
+ "child", box,
+ "hscrollbar-policy", GTK_POLICY_NEVER,
+ NULL);
+
+ if (remaining_args) {
+ for (int i = 0; remaining_args[i] != NULL; ++i) {
+ GFile *file;
+ GError *error = NULL;
+ GcrCertificate *certificate;
+ GtkWidget *widget;
+
+ file = g_file_new_for_commandline_arg (remaining_args[i]);
+ certificate = simple_certificate_new_from_file (file, cancellable, &error);
+ g_object_unref (file);
+ widget = gcr_certificate_widget_new (GCR_CERTIFICATE (certificate));
+ g_object_unref (certificate);
+ gtk_widget_set_halign (widget, GTK_ALIGN_CENTER);
+ gtk_container_add (GTK_CONTAINER (box), widget);
+ }
+
+ g_clear_pointer (&remaining_args, g_strfreev);
+ remaining_args = NULL;
+ }
+
+ gtk_container_add (GTK_CONTAINER (window), scrolled);
+ gtk_widget_show_all (window);
+}
+
+int
+main (int argc,
+ char **argv)
+{
+ GtkApplication *app;
+ int status;
+
+ app = gtk_application_new ("org.gnome.GcrViewerGtk4", G_APPLICATION_FLAGS_NONE);
+ g_application_add_main_option_entries (G_APPLICATION (app), options);
+ g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
+ status = g_application_run (G_APPLICATION (app), argc, argv);
+ g_object_unref (app);
+
+ return status;
+}
diff --git a/tools/gtk4/meson.build b/tools/gtk4/meson.build
new file mode 100644
index 0000000..f15e00b
--- /dev/null
+++ b/tools/gtk4/meson.build
@@ -0,0 +1,7 @@
+gcr_viewer_gtk4 = executable('gcr-viewer-gtk4',
+ 'viewer.c',
+ dependencies: [ gcr_gtk4_dep, gcr_gtk4_deps ],
+ c_args: gcr_gtk4_cflags,
+ include_directories: config_h_dir,
+ install: true,
+)
diff --git a/tools/gtk4/viewer.c b/tools/gtk4/viewer.c
new file mode 100644
index 0000000..9440b28
--- /dev/null
+++ b/tools/gtk4/viewer.c
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2011,2021 Collabora Ltd.
+ * Copyright Corentin Noël <corentin.noel@collabora.com>
+ * Copyright Stef Walter <stefw@collabora.co.uk>
+ * SPDX-License-Identifier: LGPL-2.0-or-later
+ */
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <gcr-gtk4/gcr-gtk4.h>
+
+#include "config.h"
+
+static gchar **remaining_args = NULL;
+
+static gboolean
+print_version_and_exit (const gchar *option_name,
+ const gchar *value,
+ gpointer data,
+ GError **error)
+{
+ g_print("%s -- %s\n", _("GCR Certificate Viewer"), VERSION);
+ exit (0);
+ return TRUE;
+}
+
+static const GOptionEntry options[] = {
+ { "version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
+ print_version_and_exit, N_("Show the application's version"), NULL},
+ { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY,
+ &remaining_args, NULL, N_("[file...]") },
+ { NULL }
+};
+
+static void
+on_parser_parsed (GcrParser *parser,
+ gpointer user_data)
+{
+ GcrCertificate **cert = user_data;
+ GckAttributes *attributes;
+ const GckAttribute *attr;
+
+ attributes = gcr_parser_get_parsed_attributes (parser);
+ attr = gck_attributes_find (attributes, CKA_VALUE);
+ *cert = gcr_simple_certificate_new (attr->value, attr->length);
+}
+
+GcrCertificate *
+simple_certificate_new_from_file (GFile *file,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GcrCertificate *cert = NULL;
+ GcrParser *parser;
+ GBytes *bytes;
+
+ g_return_val_if_fail (G_IS_FILE (file), NULL);
+ g_return_val_if_fail (!error || !*error, NULL);
+
+
+ bytes = g_file_load_bytes (file, cancellable, NULL, error);
+ if (!bytes) {
+ return NULL;
+ }
+
+ parser = gcr_parser_new ();
+ g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), &cert);
+ if (!gcr_parser_parse_bytes (parser, bytes, error)) {
+ g_bytes_unref (bytes);
+ g_object_unref (parser);
+ g_object_unref (cert);
+ return NULL;
+ }
+
+ g_bytes_unref (bytes);
+ g_object_unref (parser);
+ return cert;
+}
+
+
+static void
+activate (GtkApplication* app,
+ gpointer user_data)
+{
+ GtkWidget *window;
+ GtkWidget *box;
+ GtkWidget *scrolled;
+ GCancellable *cancellable = NULL;
+
+ window = gtk_application_window_new (app);
+ gtk_window_set_title (GTK_WINDOW (window), "Window");
+ gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
+ scrolled = gtk_scrolled_window_new ();
+ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ g_object_set (G_OBJECT (scrolled),
+ "child", box,
+ "hscrollbar-policy", GTK_POLICY_NEVER,
+ NULL);
+
+ if (remaining_args) {
+ for (int i = 0; remaining_args[i] != NULL; ++i) {
+ GFile *file;
+ GError *error = NULL;
+ GcrCertificate *certificate;
+ GtkWidget *widget;
+
+ file = g_file_new_for_commandline_arg (remaining_args[i]);
+ certificate = simple_certificate_new_from_file (file, cancellable, &error);
+ g_object_unref (file);
+ widget = gcr_certificate_widget_new (GCR_CERTIFICATE (certificate));
+ g_object_unref (certificate);
+ gtk_widget_set_halign (widget, GTK_ALIGN_CENTER);
+ gtk_box_append (GTK_BOX (box), widget);
+ }
+
+ g_clear_pointer (&remaining_args, g_strfreev);
+ remaining_args = NULL;
+ }
+
+ gtk_window_set_child (GTK_WINDOW (window), scrolled);
+ gtk_widget_show (window);
+}
+
+int
+main (int argc,
+ char **argv)
+{
+ GtkApplication *app;
+ int status;
+
+ app = gtk_application_new ("org.gnome.GcrViewerGtk4", G_APPLICATION_FLAGS_NONE);
+ g_application_add_main_option_entries (G_APPLICATION (app), options);
+ g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
+ status = g_application_run (G_APPLICATION (app), argc, argv);
+ g_object_unref (app);
+
+ return status;
+}
diff --git a/tools/meson.build b/tools/meson.build
new file mode 100644
index 0000000..4db190e
--- /dev/null
+++ b/tools/meson.build
@@ -0,0 +1,7 @@
+if get_option('gtk3')
+ subdir('gtk3')
+endif
+
+if get_option('gtk4')
+ subdir('gtk4')
+endif
diff --git a/ui/GcrUi-3.metadata b/ui/GcrUi-3.metadata
deleted file mode 100644
index 85cb51a..0000000
--- a/ui/GcrUi-3.metadata
+++ /dev/null
@@ -1,5 +0,0 @@
-// Metadata file for Vala API generation.
-// See https://live.gnome.org/Vala/UpstreamGuide for more information
-
-CertificateRenderer
- .label skip=true \ No newline at end of file
diff --git a/ui/eggimagemenuitem.c b/ui/eggimagemenuitem.c
deleted file mode 100644
index 47d2d9e..0000000
--- a/ui/eggimagemenuitem.c
+++ /dev/null
@@ -1,734 +0,0 @@
-/* GTK - The GIMP Toolkit
- * Copyright (C) 2001 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 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/>.
- */
-
-/*
- * GtkImageMenuItem was was deprecated from GTK+ and reasoning explained
- * here: https://docs.google.com/document/d/1KCVPoYQBqMbDP11tHPpjW6uaEHrvLUmcDPqKAppCY8o/pub
- * Gcr wants to use image menu items in button drop downs using the device icons
- * (for the import button). So just copy it here with the stock and activatable
- * sutff removed
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-#include "config.h"
-
-#include "eggimagemenuitem.h"
-
-struct _EggImageMenuItemPrivate
-{
- GtkWidget *image;
-
- gchar *label;
- guint always_show_image : 1;
- guint16 toggle_size;
-};
-
-enum {
- PROP_0,
- PROP_IMAGE,
- PROP_ALWAYS_SHOW_IMAGE
-};
-
-static void egg_image_menu_item_destroy (GtkWidget *widget);
-static void egg_image_menu_item_get_preferred_width (GtkWidget *widget,
- gint *minimum,
- gint *natural);
-static void egg_image_menu_item_get_preferred_height (GtkWidget *widget,
- gint *minimum,
- gint *natural);
-static void egg_image_menu_item_get_preferred_height_for_width (GtkWidget *widget,
- gint width,
- gint *minimum,
- gint *natural);
-static void egg_image_menu_item_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static void egg_image_menu_item_map (GtkWidget *widget);
-static void egg_image_menu_item_remove (GtkContainer *container,
- GtkWidget *child);
-static void egg_image_menu_item_toggle_size_request (GtkMenuItem *menu_item,
- gint *requisition);
-static void egg_image_menu_item_toggle_size_allocate (GtkMenuItem *menu_item,
- gint allocation);
-static void egg_image_menu_item_set_label (GtkMenuItem *menu_item,
- const gchar *label);
-static const gchar * egg_image_menu_item_get_label (GtkMenuItem *menu_item);
-
-static void egg_image_menu_item_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data);
-
-static void egg_image_menu_item_finalize (GObject *object);
-static void egg_image_menu_item_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec);
-static void egg_image_menu_item_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec);
-static void egg_image_menu_item_screen_changed (GtkWidget *widget,
- GdkScreen *previous_screen);
-
-static void egg_image_menu_item_recalculate (EggImageMenuItem *image_menu_item);
-
-G_DEFINE_TYPE_WITH_PRIVATE (EggImageMenuItem, egg_image_menu_item, GTK_TYPE_MENU_ITEM);
-
-static void
-egg_image_menu_item_class_init (EggImageMenuItemClass *klass)
-{
- GObjectClass *gobject_class = (GObjectClass*) klass;
- GtkWidgetClass *widget_class = (GtkWidgetClass*) klass;
- GtkMenuItemClass *menu_item_class = (GtkMenuItemClass*) klass;
- GtkContainerClass *container_class = (GtkContainerClass*) klass;
-
- widget_class->destroy = egg_image_menu_item_destroy;
- widget_class->screen_changed = egg_image_menu_item_screen_changed;
- widget_class->get_preferred_width = egg_image_menu_item_get_preferred_width;
- widget_class->get_preferred_height = egg_image_menu_item_get_preferred_height;
- widget_class->get_preferred_height_for_width = egg_image_menu_item_get_preferred_height_for_width;
- widget_class->size_allocate = egg_image_menu_item_size_allocate;
- widget_class->map = egg_image_menu_item_map;
-
- container_class->forall = egg_image_menu_item_forall;
- container_class->remove = egg_image_menu_item_remove;
-
- menu_item_class->toggle_size_request = egg_image_menu_item_toggle_size_request;
- menu_item_class->toggle_size_allocate = egg_image_menu_item_toggle_size_allocate;
- menu_item_class->set_label = egg_image_menu_item_set_label;
- menu_item_class->get_label = egg_image_menu_item_get_label;
-
- gobject_class->finalize = egg_image_menu_item_finalize;
- gobject_class->set_property = egg_image_menu_item_set_property;
- gobject_class->get_property = egg_image_menu_item_get_property;
-
- g_object_class_install_property (gobject_class,
- PROP_IMAGE,
- g_param_spec_object ("image",
- "Image widget",
- "Child widget to appear next to the menu text",
- GTK_TYPE_WIDGET,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class,
- PROP_ALWAYS_SHOW_IMAGE,
- g_param_spec_boolean ("always-show-image",
- "Always show image",
- "Whether the image will always be shown",
- FALSE,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
-}
-
-static void
-egg_image_menu_item_init (EggImageMenuItem *image_menu_item)
-{
- EggImageMenuItemPrivate *priv;
-
- image_menu_item->priv = egg_image_menu_item_get_instance_private (image_menu_item);
- priv = image_menu_item->priv;
-
- priv->image = NULL;
- priv->label = NULL;
-}
-
-static void
-egg_image_menu_item_finalize (GObject *object)
-{
- EggImageMenuItemPrivate *priv = EGG_IMAGE_MENU_ITEM (object)->priv;
-
- g_free (priv->label);
- priv->label = NULL;
-
- G_OBJECT_CLASS (egg_image_menu_item_parent_class)->finalize (object);
-}
-
-static void
-egg_image_menu_item_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (object);
-
- switch (prop_id)
- {
- case PROP_IMAGE:
- egg_image_menu_item_set_image (image_menu_item, (GtkWidget *) g_value_get_object (value));
- break;
- case PROP_ALWAYS_SHOW_IMAGE:
- egg_image_menu_item_set_always_show_image (image_menu_item, g_value_get_boolean (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-egg_image_menu_item_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (object);
-
- switch (prop_id)
- {
- case PROP_IMAGE:
- g_value_set_object (value, egg_image_menu_item_get_image (image_menu_item));
- break;
- case PROP_ALWAYS_SHOW_IMAGE:
- g_value_set_boolean (value, egg_image_menu_item_get_always_show_image (image_menu_item));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static gboolean
-show_image (EggImageMenuItem *image_menu_item)
-{
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
- GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (image_menu_item));
- gboolean show;
-
- if (priv->always_show_image)
- show = TRUE;
- else
- g_object_get (settings, "gtk-menu-images", &show, NULL);
-
- return show;
-}
-
-static void
-egg_image_menu_item_map (GtkWidget *widget)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
-
- GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->map (widget);
-
- if (priv->image)
- g_object_set (priv->image,
- "visible", show_image (image_menu_item),
- NULL);
-}
-
-static void
-egg_image_menu_item_destroy (GtkWidget *widget)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
-
- if (priv->image)
- gtk_container_remove (GTK_CONTAINER (image_menu_item),
- priv->image);
-
- GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->destroy (widget);
-}
-
-static void
-egg_image_menu_item_toggle_size_request (GtkMenuItem *menu_item,
- gint *requisition)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (menu_item);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
- GtkPackDirection pack_dir;
- GtkWidget *parent;
- GtkWidget *widget = GTK_WIDGET (menu_item);
-
- parent = gtk_widget_get_parent (widget);
-
- if (GTK_IS_MENU_BAR (parent))
- pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
- else
- pack_dir = GTK_PACK_DIRECTION_LTR;
-
- *requisition = 0;
-
- if (priv->image && gtk_widget_get_visible (priv->image))
- {
- GtkRequisition image_requisition;
- guint toggle_spacing;
-
- gtk_widget_get_preferred_size (priv->image, &image_requisition, NULL);
-
- gtk_widget_style_get (GTK_WIDGET (menu_item),
- "toggle-spacing", &toggle_spacing,
- NULL);
-
- if (pack_dir == GTK_PACK_DIRECTION_LTR || pack_dir == GTK_PACK_DIRECTION_RTL)
- {
- if (image_requisition.width > 0)
- *requisition = image_requisition.width + toggle_spacing;
- }
- else
- {
- if (image_requisition.height > 0)
- *requisition = image_requisition.height + toggle_spacing;
- }
- }
-}
-
-static void
-egg_image_menu_item_toggle_size_allocate (GtkMenuItem *menu_item,
- gint allocation)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (menu_item);
- image_menu_item->priv->toggle_size = allocation;
- GTK_MENU_ITEM_CLASS (egg_image_menu_item_parent_class)->toggle_size_allocate (menu_item, allocation);
-}
-
-static void
-egg_image_menu_item_recalculate (EggImageMenuItem *image_menu_item)
-{
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
-
- GTK_MENU_ITEM_CLASS
- (egg_image_menu_item_parent_class)->set_label (GTK_MENU_ITEM (image_menu_item), priv->label);
-}
-
-static void
-egg_image_menu_item_set_label (GtkMenuItem *menu_item,
- const gchar *label)
-{
- EggImageMenuItemPrivate *priv = EGG_IMAGE_MENU_ITEM (menu_item)->priv;
-
- if (priv->label != label)
- {
- g_free (priv->label);
- priv->label = g_strdup (label);
-
- egg_image_menu_item_recalculate (EGG_IMAGE_MENU_ITEM (menu_item));
-
- g_object_notify (G_OBJECT (menu_item), "label");
-
- }
-}
-
-static const gchar *
-egg_image_menu_item_get_label (GtkMenuItem *menu_item)
-{
- EggImageMenuItemPrivate *priv = EGG_IMAGE_MENU_ITEM (menu_item)->priv;
-
- return priv->label;
-}
-
-static void
-egg_image_menu_item_get_preferred_width (GtkWidget *widget,
- gint *minimum,
- gint *natural)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
- GtkPackDirection pack_dir;
- GtkWidget *parent;
-
- parent = gtk_widget_get_parent (widget);
-
- if (GTK_IS_MENU_BAR (parent))
- pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
- else
- pack_dir = GTK_PACK_DIRECTION_LTR;
-
- GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->get_preferred_width (widget, minimum, natural);
-
- if ((pack_dir == GTK_PACK_DIRECTION_TTB || pack_dir == GTK_PACK_DIRECTION_BTT) &&
- priv->image &&
- gtk_widget_get_visible (priv->image))
- {
- gint child_minimum, child_natural;
-
- gtk_widget_get_preferred_width (priv->image, &child_minimum, &child_natural);
-
- *minimum = MAX (*minimum, child_minimum);
- *natural = MAX (*natural, child_natural);
- }
-}
-
-static void
-egg_image_menu_item_get_preferred_height (GtkWidget *widget,
- gint *minimum,
- gint *natural)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
- gint child_height = 0;
- GtkPackDirection pack_dir;
- GtkWidget *parent;
-
- parent = gtk_widget_get_parent (widget);
-
- if (GTK_IS_MENU_BAR (parent))
- pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
- else
- pack_dir = GTK_PACK_DIRECTION_LTR;
-
- if (priv->image && gtk_widget_get_visible (priv->image))
- {
- GtkRequisition child_requisition;
-
- gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL);
-
- child_height = child_requisition.height;
- }
-
- GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->get_preferred_height (widget, minimum, natural);
-
- if (pack_dir == GTK_PACK_DIRECTION_RTL || pack_dir == GTK_PACK_DIRECTION_LTR)
- {
- *minimum = MAX (*minimum, child_height);
- *natural = MAX (*natural, child_height);
- }
-}
-
-static void
-egg_image_menu_item_get_preferred_height_for_width (GtkWidget *widget,
- gint width,
- gint *minimum,
- gint *natural)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
- gint child_height = 0;
- GtkPackDirection pack_dir;
- GtkWidget *parent;
-
- parent = gtk_widget_get_parent (widget);
-
- if (GTK_IS_MENU_BAR (parent))
- pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
- else
- pack_dir = GTK_PACK_DIRECTION_LTR;
-
- if (priv->image && gtk_widget_get_visible (priv->image))
- {
- GtkRequisition child_requisition;
-
- gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL);
-
- child_height = child_requisition.height;
- }
-
- GTK_WIDGET_CLASS
- (egg_image_menu_item_parent_class)->get_preferred_height_for_width (widget, width, minimum, natural);
-
- if (pack_dir == GTK_PACK_DIRECTION_RTL || pack_dir == GTK_PACK_DIRECTION_LTR)
- {
- *minimum = MAX (*minimum, child_height);
- *natural = MAX (*natural, child_height);
- }
-}
-
-
-static void
-egg_image_menu_item_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
- GtkAllocation widget_allocation;
- GtkPackDirection pack_dir;
- GtkWidget *parent;
-
- parent = gtk_widget_get_parent (widget);
-
- if (GTK_IS_MENU_BAR (parent))
- pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent));
- else
- pack_dir = GTK_PACK_DIRECTION_LTR;
-
- GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->size_allocate (widget, allocation);
-
- if (priv->image && gtk_widget_get_visible (priv->image))
- {
- gint x, y, offset;
- GtkStyleContext *context;
- GtkStateFlags state;
- GtkBorder padding;
- GtkRequisition child_requisition;
- GtkAllocation child_allocation;
- guint horizontal_padding, toggle_spacing;
- gint toggle_size;
-
- toggle_size = priv->toggle_size;
- gtk_widget_style_get (widget,
- "horizontal-padding", &horizontal_padding,
- "toggle-spacing", &toggle_spacing,
- NULL);
-
- /* Man this is lame hardcoding action, but I can't
- * come up with a solution that's really better.
- */
-
- gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL);
-
- gtk_widget_get_allocation (widget, &widget_allocation);
-
- context = gtk_widget_get_style_context (widget);
- state = gtk_widget_get_state_flags (widget);
- gtk_style_context_get_padding (context, state, &padding);
- offset = gtk_container_get_border_width (GTK_CONTAINER (image_menu_item));
-
- if (pack_dir == GTK_PACK_DIRECTION_LTR ||
- pack_dir == GTK_PACK_DIRECTION_RTL)
- {
- if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) ==
- (pack_dir == GTK_PACK_DIRECTION_LTR))
- x = offset + horizontal_padding + padding.left +
- (toggle_size - toggle_spacing - child_requisition.width) / 2;
- else
- x = widget_allocation.width - offset - horizontal_padding - padding.right -
- toggle_size + toggle_spacing +
- (toggle_size - toggle_spacing - child_requisition.width) / 2;
-
- y = (widget_allocation.height - child_requisition.height) / 2;
- }
- else
- {
- if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) ==
- (pack_dir == GTK_PACK_DIRECTION_TTB))
- y = offset + horizontal_padding + padding.top +
- (toggle_size - toggle_spacing - child_requisition.height) / 2;
- else
- y = widget_allocation.height - offset - horizontal_padding - padding.bottom -
- toggle_size + toggle_spacing +
- (toggle_size - toggle_spacing - child_requisition.height) / 2;
-
- x = (widget_allocation.width - child_requisition.width) / 2;
- }
-
- child_allocation.width = child_requisition.width;
- child_allocation.height = child_requisition.height;
- child_allocation.x = widget_allocation.x + MAX (x, 0);
- child_allocation.y = widget_allocation.y + MAX (y, 0);
-
- gtk_widget_size_allocate (priv->image, &child_allocation);
- }
-}
-
-static void
-egg_image_menu_item_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer callback_data)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (container);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
-
- GTK_CONTAINER_CLASS (egg_image_menu_item_parent_class)->forall (container,
- include_internals,
- callback,
- callback_data);
-
- if (include_internals && priv->image)
- (* callback) (priv->image, callback_data);
-}
-
-GtkWidget*
-egg_image_menu_item_new (void)
-{
- return g_object_new (EGG_TYPE_IMAGE_MENU_ITEM, NULL);
-}
-
-GtkWidget*
-egg_image_menu_item_new_with_label (const gchar *label)
-{
- return g_object_new (EGG_TYPE_IMAGE_MENU_ITEM,
- "label", label,
- NULL);
-}
-
-GtkWidget*
-egg_image_menu_item_new_with_mnemonic (const gchar *label)
-{
- return g_object_new (EGG_TYPE_IMAGE_MENU_ITEM,
- "use-underline", TRUE,
- "label", label,
- NULL);
-}
-
-void
-egg_image_menu_item_set_always_show_image (EggImageMenuItem *image_menu_item,
- gboolean always_show)
-{
- EggImageMenuItemPrivate *priv;
-
- g_return_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item));
-
- priv = image_menu_item->priv;
-
- if (priv->always_show_image != always_show)
- {
- priv->always_show_image = always_show;
-
- if (priv->image)
- {
- if (show_image (image_menu_item))
- gtk_widget_show (priv->image);
- else
- gtk_widget_hide (priv->image);
- }
-
- g_object_notify (G_OBJECT (image_menu_item), "always-show-image");
- }
-}
-
-gboolean
-egg_image_menu_item_get_always_show_image (EggImageMenuItem *image_menu_item)
-{
- g_return_val_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item), FALSE);
-
- return image_menu_item->priv->always_show_image;
-}
-
-void
-egg_image_menu_item_set_image (EggImageMenuItem *image_menu_item,
- GtkWidget *image)
-{
- EggImageMenuItemPrivate *priv;
-
- g_return_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item));
-
- priv = image_menu_item->priv;
-
- if (image == priv->image)
- return;
-
- if (priv->image)
- gtk_container_remove (GTK_CONTAINER (image_menu_item),
- priv->image);
-
- priv->image = image;
-
- if (image == NULL)
- return;
-
- gtk_widget_set_parent (image, GTK_WIDGET (image_menu_item));
- g_object_set (image,
- "visible", show_image (image_menu_item),
- "no-show-all", TRUE,
- NULL);
-
- g_object_notify (G_OBJECT (image_menu_item), "image");
-}
-
-GtkWidget*
-egg_image_menu_item_get_image (EggImageMenuItem *image_menu_item)
-{
- g_return_val_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item), NULL);
-
- return image_menu_item->priv->image;
-}
-
-static void
-egg_image_menu_item_remove (GtkContainer *container,
- GtkWidget *child)
-{
- EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (container);
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
-
- if (child == priv->image)
- {
- gboolean widget_was_visible;
-
- widget_was_visible = gtk_widget_get_visible (child);
-
- gtk_widget_unparent (child);
- priv->image = NULL;
-
- if (widget_was_visible &&
- gtk_widget_get_visible (GTK_WIDGET (container)))
- gtk_widget_queue_resize (GTK_WIDGET (container));
-
- g_object_notify (G_OBJECT (image_menu_item), "image");
- }
- else
- {
- GTK_CONTAINER_CLASS (egg_image_menu_item_parent_class)->remove (container, child);
- }
-}
-
-static void
-show_image_change_notify (EggImageMenuItem *image_menu_item)
-{
- EggImageMenuItemPrivate *priv = image_menu_item->priv;
-
- if (priv->image)
- {
- if (show_image (image_menu_item))
- gtk_widget_show (priv->image);
- else
- gtk_widget_hide (priv->image);
- }
-}
-
-static void
-traverse_container (GtkWidget *widget,
- gpointer data)
-{
- if (EGG_IS_IMAGE_MENU_ITEM (widget))
- show_image_change_notify (EGG_IMAGE_MENU_ITEM (widget));
- else if (GTK_IS_CONTAINER (widget))
- gtk_container_forall (GTK_CONTAINER (widget), traverse_container, NULL);
-}
-
-static void
-egg_image_menu_item_setting_changed (GtkSettings *settings)
-{
- GList *list, *l;
-
- list = gtk_window_list_toplevels ();
-
- for (l = list; l; l = l->next)
- gtk_container_forall (GTK_CONTAINER (l->data),
- traverse_container, NULL);
-
- g_list_free (list);
-}
-
-static void
-egg_image_menu_item_screen_changed (GtkWidget *widget,
- GdkScreen *previous_screen)
-{
- GtkSettings *settings;
- gulong show_image_connection;
-
- if (!gtk_widget_has_screen (widget))
- return;
-
- settings = gtk_widget_get_settings (widget);
-
- show_image_connection =
- g_signal_handler_find (settings, G_SIGNAL_MATCH_FUNC, 0, 0,
- NULL, egg_image_menu_item_setting_changed, NULL);
-
- if (show_image_connection)
- return;
-
- g_signal_connect (settings, "notify::gtk-menu-images",
- G_CALLBACK (egg_image_menu_item_setting_changed), NULL);
-
- show_image_change_notify (EGG_IMAGE_MENU_ITEM (widget));
-}
diff --git a/ui/eggimagemenuitem.h b/ui/eggimagemenuitem.h
deleted file mode 100644
index 6576a1d..0000000
--- a/ui/eggimagemenuitem.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* GTK - The GIMP Toolkit
- * Copyright (C) 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 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/>.
- */
-
-/*
- * GtkImageMenuItem was was deprecated from GTK+ and reasoning explained
- * here: https://docs.google.com/document/d/1KCVPoYQBqMbDP11tHPpjW6uaEHrvLUmcDPqKAppCY8o/pub
- * Gcr wants to use image menu items in button drop downs using the device icons
- * (for the import button). So just copy it here with the stock and activatable
- * sutff removed
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-#ifndef __EGG_IMAGE_MENUITEM_H__
-#define __EGG_IMAGE_MENUITEM_H__
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define EGG_TYPE_IMAGE_MENU_ITEM (egg_image_menu_item_get_type ())
-#define EGG_IMAGE_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_IMAGE_MENU_ITEM, EggImageMenuItem))
-#define EGG_IMAGE_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_IMAGE_MENU_ITEM, EggImageMenuItemClass))
-#define EGG_IS_IMAGE_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_IMAGE_MENU_ITEM))
-#define EGG_IS_IMAGE_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_IMAGE_MENU_ITEM))
-#define EGG_IMAGE_MENU_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_IMAGE_MENU_ITEM, EggImageMenuItemClass))
-
-
-typedef struct _EggImageMenuItem EggImageMenuItem;
-typedef struct _EggImageMenuItemPrivate EggImageMenuItemPrivate;
-typedef struct _EggImageMenuItemClass EggImageMenuItemClass;
-
-struct _EggImageMenuItem
-{
- GtkMenuItem menu_item;
-
- /*< private >*/
- EggImageMenuItemPrivate *priv;
-};
-
-struct _EggImageMenuItemClass
-{
- GtkMenuItemClass parent_class;
-};
-
-GType egg_image_menu_item_get_type (void) G_GNUC_CONST;
-GtkWidget* egg_image_menu_item_new (void);
-GtkWidget* egg_image_menu_item_new_with_label (const gchar *label);
-GtkWidget* egg_image_menu_item_new_with_mnemonic (const gchar *label);
-void egg_image_menu_item_set_always_show_image (EggImageMenuItem *image_menu_item,
- gboolean always_show);
-gboolean egg_image_menu_item_get_always_show_image (EggImageMenuItem *image_menu_item);
-void egg_image_menu_item_set_image (EggImageMenuItem *image_menu_item,
- GtkWidget *image);
-GtkWidget* egg_image_menu_item_get_image (EggImageMenuItem *image_menu_item);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (EggImageMenuItem, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __EGG_IMAGE_MENUITEM_H__ */
diff --git a/ui/frob-combo-selector.c b/ui/frob-combo-selector.c
deleted file mode 100644
index 8263b94..0000000
--- a/ui/frob-combo-selector.c
+++ /dev/null
@@ -1,97 +0,0 @@
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-static void
-on_parser_parsed (GcrParser *parser, gpointer user_data)
-{
- GcrSimpleCollection *collection = user_data;
- GcrRenderer *renderer;
-
- renderer = gcr_renderer_create (gcr_parser_get_parsed_label (parser),
- gcr_parser_get_parsed_attributes (parser));
-
- if (renderer) {
- gcr_simple_collection_add (collection, G_OBJECT (renderer));
- g_object_unref (renderer);
- }
-}
-
-static void
-add_to_selector (GcrParser *parser, const gchar *path)
-{
- GError *err = NULL;
- guchar *data;
- gsize n_data;
- GBytes *bytes;
-
- if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL))
- g_error ("couldn't read file: %s", path);
-
- bytes = g_bytes_new_take (data, n_data);
- if (!gcr_parser_parse_bytes (parser, bytes, &err))
- g_error ("couldn't parse data: %s", err->message);
-
- g_bytes_unref (bytes);
-}
-
-int
-main (int argc, char *argv[])
-{
- GcrCollection *collection;
- GcrComboSelector *selector;
- GtkDialog *dialog;
- GcrParser *parser;
- GObject *selected;
- int i;
-
- gtk_init (&argc, &argv);
-
- dialog = GTK_DIALOG (gtk_dialog_new ());
- g_object_ref_sink (dialog);
-
- collection = gcr_simple_collection_new ();
- selector = gcr_combo_selector_new (collection);
-
- gtk_widget_show (GTK_WIDGET (selector));
- gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (selector));
-
- gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400);
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 20);
-
- parser = gcr_parser_new ();
- g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), collection);
-
- if (argc == 1) {
- add_to_selector (parser, SRCDIR "/ui/fixtures/ca-certificates.crt");
- } else {
- for (i = 1; i < argc; ++i)
- add_to_selector (parser, argv[i]);
- }
-
- g_object_unref (parser);
- g_object_unref (collection);
-
- gtk_dialog_run (dialog);
-
- selected = gcr_combo_selector_get_selected (selector);
- if (selected == NULL) {
- g_print ("nothing selected\n");
- } else {
- gchar *label;
- g_object_get (selected, "label", &label, NULL);
- g_print ("selected: %s\n", label);
- }
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
- g_object_unref (dialog);
-
- return 0;
-}
diff --git a/ui/frob-gnupg-selector.c b/ui/frob-gnupg-selector.c
deleted file mode 100644
index 41b1977..0000000
--- a/ui/frob-gnupg-selector.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-#include "gcr/gcr-gnupg-collection.h"
-#include "gcr/gcr-gnupg-key.h"
-
-#include "ui/gcr-live-search.h"
-#include "ui/gcr-list-selector-private.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-static void
-on_collection_loaded (GObject *source, GAsyncResult *result, gpointer unused)
-{
- GError *error = NULL;
-
- _gcr_gnupg_collection_load_finish (GCR_GNUPG_COLLECTION (source), result, &error);
- if (error) {
- g_warning ("collection load failed: %s", error->message);
- g_clear_error (&error);
- }
-}
-
-int
-main (int argc, char *argv[])
-{
- GcrCollection *collection;
- GcrListSelector *selector;
- GtkWidget *scroll;
- GtkDialog *dialog;
- GtkWidget *search;
- GtkBox *box;
-
- gtk_init (&argc, &argv);
-
- dialog = GTK_DIALOG (gtk_dialog_new ());
- g_object_ref_sink (dialog);
-
- collection = _gcr_gnupg_collection_new (NULL);
- selector = gcr_list_selector_new (collection);
- search = _gcr_live_search_new (GTK_WIDGET (selector));
- _gcr_list_selector_set_live_search (selector, GCR_LIVE_SEARCH (search));
-
- scroll = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_ETCHED_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET (selector));
-
- box = GTK_BOX (gtk_dialog_get_content_area (dialog));
- gtk_box_pack_start (box, GTK_WIDGET (scroll), TRUE, TRUE, 0);
- gtk_box_pack_end (box, search, FALSE, TRUE, 0);
-
- gtk_widget_show (GTK_WIDGET (selector));
- gtk_widget_show (scroll);
-
- _gcr_gnupg_collection_load_async (GCR_GNUPG_COLLECTION (collection), NULL,
- on_collection_loaded, NULL);
-
- gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400);
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 20);
-
- g_object_unref (collection);
-
- gtk_dialog_run (dialog);
- gtk_widget_destroy (GTK_WIDGET (dialog));
- g_object_unref (dialog);
-
- return 0;
-}
diff --git a/ui/frob-import-button.c b/ui/frob-import-button.c
deleted file mode 100644
index d876d81..0000000
--- a/ui/frob-import-button.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright (C) 2014 Stef Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@redhat.com>
- */
-
-#include "config.h"
-
-#include "ui/gcr-ui.h"
-
-#include "gcr/gcr-importer.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-typedef GObject MockImporter;
-typedef GObjectClass MockImporterClass;
-
-enum {
- PROP_0,
- PROP_LABEL,
- PROP_ICON,
- PROP_URI,
- PROP_INTERACTION
-};
-
-GType mock_importer_get_type (void) G_GNUC_CONST;
-
-static GList *
-mock_importer_create_for_parsed (GcrParsed *parsed)
-{
- GcrImporter *self;
- GIcon *icon;
-
- icon = g_themed_icon_new ("dialog-warning");
- self = g_object_new (mock_importer_get_type (),
- "label", gcr_parsed_get_label (parsed),
- "icon", icon,
- NULL);
- g_object_unref (icon);
- return g_list_append (NULL, self);
-}
-
-static gboolean
-mock_importer_queue_for_parsed (GcrImporter *importer,
- GcrParsed *parsed)
-{
- return TRUE;
-}
-
-static void
-mock_importer_import_async (GcrImporter *importer,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GTask *task;
-
- task = g_task_new (importer, cancellable, callback, user_data);
- g_task_set_source_tag (task, mock_importer_import_async);
-
- g_printerr ("Import %p\n", importer);
- g_task_return_boolean (task, TRUE);
- g_clear_object (&task);
-}
-
-
-static gboolean
-mock_importer_import_finish (GcrImporter *importer,
- GAsyncResult *result,
- GError **error)
-{
- return g_task_propagate_boolean (G_TASK (result), error);
-}
-
-
-static void
-mock_importer_iface (GcrImporterIface *iface)
-{
- iface->create_for_parsed = mock_importer_create_for_parsed;
- iface->queue_for_parsed = mock_importer_queue_for_parsed;
- iface->import_async = mock_importer_import_async;
- iface->import_finish = mock_importer_import_finish;
-}
-
-G_DEFINE_TYPE_WITH_CODE (MockImporter, mock_importer, G_TYPE_OBJECT,
- G_IMPLEMENT_INTERFACE (GCR_TYPE_IMPORTER, mock_importer_iface);
-);
-
-static void
-value_free (gpointer value)
-{
- g_boxed_free (G_TYPE_VALUE, value);
-}
-
-static void
-mock_importer_init (MockImporter *self)
-{
-
-}
-
-static void
-mock_importer_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- g_object_set_data_full (obj, pspec->name, g_boxed_copy (G_TYPE_VALUE, value), value_free);
-}
-
-static void
-mock_importer_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GValue *val = g_object_get_data (obj, pspec->name);
- g_return_if_fail (val != NULL);
- g_value_copy (val, value);
-}
-
-static void
-mock_importer_class_init (MockImporterClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->set_property = mock_importer_set_property;
- gobject_class->get_property = mock_importer_get_property;
-
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "", "",
- NULL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_ICON,
- g_param_spec_object ("icon", "", "",
- G_TYPE_ICON,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
- g_object_class_override_property (gobject_class, PROP_URI, "uri");
- g_object_class_override_property (gobject_class, PROP_INTERACTION, "interaction");
-}
-
-typedef MockImporter MockImporterTwo;
-typedef MockImporterClass MockImporterTwoClass;
-
-GType mock_importer_two_get_type (void) G_GNUC_CONST;
-
-G_DEFINE_TYPE (MockImporterTwo, mock_importer_two, mock_importer_get_type ());
-
-static void
-mock_importer_two_init (MockImporterTwo *self)
-{
-
-}
-
-static void
-mock_importer_two_class_init (MockImporterTwoClass *klass)
-{
-
-}
-
-
-static void
-on_parser_parsed (GcrParser *parser,
- gpointer user_data)
-{
- gcr_import_button_add_parsed (user_data,
- gcr_parser_get_parsed (parser));
-}
-
-static void
-parse_file (GcrParser *parser,
- const gchar *path)
-{
- GError *err = NULL;
- guchar *data;
- gsize n_data;
- GBytes *bytes;
-
- if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL))
- g_error ("couldn't read file: %s", path);
-
- bytes = g_bytes_new_take (data, n_data);
- if (!gcr_parser_parse_bytes (parser, bytes, &err))
- g_error ("couldn't parse data: %s", err->message);
-
- g_bytes_unref (bytes);
-}
-
-int
-main (int argc, char *argv[])
-{
- GtkDialog *dialog;
- GcrParser *parser;
- GtkWidget *button;
- int i;
-
- gtk_init (&argc, &argv);
-
- gcr_importer_register (mock_importer_get_type (), gck_attributes_new (0));
- gcr_importer_register (mock_importer_two_get_type (), gck_attributes_new (0));
-
- dialog = GTK_DIALOG (gtk_dialog_new ());
- g_object_ref_sink (dialog);
-
- button = GTK_WIDGET (gcr_import_button_new ("Import Button"));
- gtk_widget_show (button);
-
- gtk_widget_set_halign (button, 0.5);
- gtk_widget_set_valign (button, 0.5);
-
- gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), button);
-
- gtk_window_set_default_size (GTK_WINDOW (dialog), 200, 300);
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 20);
-
- parser = gcr_parser_new ();
- g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), button);
-
- if (argc == 1) {
- parse_file (parser, SRCDIR "/ui/fixtures/ca-certificates.crt");
- } else {
- for (i = 1; i < argc; ++i)
- parse_file (parser, argv[i]);
- }
-
- g_object_unref (parser);
-
- gtk_dialog_run (dialog);
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
- g_object_unref (dialog);
-
- return 0;
-}
diff --git a/ui/frob-key.c b/ui/frob-key.c
deleted file mode 100644
index 97d216b..0000000
--- a/ui/frob-key.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-static void
-on_parser_parsed (GcrParser *parser, gpointer unused)
-{
- GcrKeyWidget *details;
- GtkDialog *dialog;
-
- dialog = GTK_DIALOG (gtk_dialog_new ());
- g_object_ref_sink (dialog);
-
- details = gcr_key_widget_new (gcr_parser_get_parsed_attributes (parser));
- gtk_widget_show (GTK_WIDGET (details));
- gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (details));
-
- gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400);
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 20);
- gtk_dialog_run (dialog);
-
- g_object_unref (dialog);
- g_object_unref (details);
-}
-
-static void
-test_key (const gchar *path)
-{
- GcrParser *parser;
- GError *err = NULL;
- GBytes *bytes;
- guchar *data;
- gsize n_data;
-
- if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL))
- g_error ("couldn't read file: %s", path);
-
- parser = gcr_parser_new ();
- g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), NULL);
- bytes = g_bytes_new_take (data, n_data);
- if (!gcr_parser_parse_bytes (parser, bytes, &err))
- g_error ("couldn't parse data: %s", err->message);
-
- g_object_unref (parser);
- g_bytes_unref (bytes);
-}
-
-int
-main(int argc, char *argv[])
-{
- gtk_init (&argc, &argv);
- g_set_prgname ("frob-key");
-
- if (argc > 1)
- test_key (argv[1]);
- else
- test_key (SRCDIR "/ui/fixtures/pem-dsa-1024.key");
-
- return 0;
-}
diff --git a/ui/frob-prompt.c b/ui/frob-prompt.c
deleted file mode 100644
index 20f5482..0000000
--- a/ui/frob-prompt.c
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-#include "gcr/gcr-base.h"
-
-#include <gtk/gtk.h>
-#ifdef GDK_WINDOWING_X11
-#include <gdk/gdkx.h>
-#endif
-#ifdef GDK_WINDOWING_WAYLAND
-#include <gdk/gdkwayland.h>
-#endif
-
-static const gchar *file_name = NULL;
-static gchar *prompt_type = NULL;
-static gint prompt_delay = 0;
-static gboolean prompt_window = FALSE;
-
-static gboolean
-on_delay_timeout (gpointer data)
-{
- GMainLoop *loop = data;
- g_main_loop_quit (loop);
- return FALSE;
-}
-
-#ifdef GDK_WINDOWING_X11
-static void
-set_caller_window_x11 (GcrPrompt *prompt, GdkWindow *window)
-{
- gchar *caller_id = NULL;
-
- if (!GDK_IS_X11_WINDOW (window))
- return;
-
- caller_id = g_strdup_printf ("%lu", (gulong)GDK_WINDOW_XID (window));
- gcr_prompt_set_caller_window (prompt, caller_id);
- g_free (caller_id);
-}
-#endif
-
-#ifdef GDK_WINDOWING_WAYLAND
-static void
-on_window_wl_export_handle (GdkWindow *window,
- const char *handle,
- gpointer user_data)
-{
- GcrPrompt *prompt = GCR_PROMPT (user_data);
-
- g_return_if_fail (handle);
-
- gcr_prompt_set_caller_window (prompt, handle);
-}
-
-static void
-set_caller_window_wl (GcrPrompt *prompt, GdkWindow *window)
-{
- if (!GDK_IS_WAYLAND_WINDOW (window))
- return;
-
- if (!gdk_wayland_window_export_handle (window, on_window_wl_export_handle, prompt, NULL))
- g_warning ("Couldn't export Wayland window handle");
-}
-#endif
-
-static void
-prompt_perform (GtkWidget *parent)
-{
- GKeyFile *file;
- GError *error = NULL;
- gchar **groups, **keys;
- GValue value = { 0, };
- GParamSpec *spec;
- GcrPrompt *prompt;
- const gchar *key;
- const gchar *password;
- GcrPromptReply reply;
- gboolean cont = TRUE;
- GMainLoop *loop;
- gchar *type;
- gchar *choice;
- guint i, j;
-
- file = g_key_file_new ();
- if (!g_key_file_load_from_file (file, file_name, G_KEY_FILE_NONE, &error))
- g_error ("couldn't load prompt info: %s", error->message);
-
- if (!prompt_type || g_str_equal (prompt_type, "dialog"))
- prompt = g_object_new (GCR_TYPE_PROMPT_DIALOG, NULL);
- else if (g_str_equal (prompt_type, "system"))
- prompt = gcr_system_prompt_open_for_prompter ("org.gnome.keyring.SystemPrompter", 5, NULL, &error);
- else if (g_str_equal (prompt_type, "private"))
- prompt = gcr_system_prompt_open_for_prompter ("org.gnome.keyring.PrivatePrompter", 5, NULL, &error);
- else
- g_error ("invalid type: %s", prompt_type);
-
- if (error != NULL)
- g_error ("couldn't create prompt: %s", error->message);
-
- if (parent) {
- GdkWindow *window;
-
- window = gtk_widget_get_window (parent);
-#ifdef GDK_WINDOWING_X11
- set_caller_window_x11 (prompt, window);
-#endif
-#ifdef GDK_WINDOWING_WAYLAND
- set_caller_window_wl (prompt, window);
-#endif
- }
-
- loop = g_main_loop_new (NULL, FALSE);
- groups = g_key_file_get_groups (file, NULL);
- for (i = 0; cont && groups[i] != NULL; i++) {
-
- if (i != 0) {
- g_timeout_add_seconds (prompt_delay, on_delay_timeout, loop);
- g_main_loop_run (loop);
- }
-
- keys = g_key_file_get_keys (file, groups[i], NULL, NULL);
- for (j = 0; keys[j] != NULL; j++) {
- key = keys[j];
- if (g_str_equal (key, "type"))
- continue;
- spec = g_object_class_find_property (G_OBJECT_GET_CLASS (prompt), key);
- if (spec == NULL)
- g_error ("couldn't find property %s on prompt %s",
- key, G_OBJECT_TYPE_NAME (prompt));
- g_value_init (&value, spec->value_type);
- switch (spec->value_type) {
- case G_TYPE_STRING:
- g_value_take_string (&value, g_key_file_get_string (file, groups[i], key, NULL));
- break;
- case G_TYPE_INT:
- g_value_set_int (&value, g_key_file_get_integer (file, groups[i], key, NULL));
- break;
- case G_TYPE_BOOLEAN:
- g_value_set_boolean (&value, g_key_file_get_boolean (file, groups[i], key, NULL));
- break;
- default:
- g_error ("unsupported type %s for property %s",
- g_type_name (spec->value_type), key);
- break;
- }
-
- g_object_set_property (G_OBJECT (prompt), key, &value);
- g_value_unset (&value);
- }
-
- g_strfreev (keys);
-
- type = g_key_file_get_value (file, groups[i], "type", NULL);
- if (g_strcmp0 (type, "password") == 0) {
- password = gcr_prompt_password_run (prompt, NULL, &error);
- if (error != NULL)
- g_error ("couldn't prompt for password: %s", error->message);
- g_print ("prompt password: %s\n", password);
- g_print ("password strength: %d\n", gcr_prompt_get_password_strength (prompt));
- cont = (password != NULL);
- } else if (g_strcmp0 (type, "confirm") == 0) {
- reply = gcr_prompt_confirm_run (prompt, NULL, &error);
- if (error != NULL)
- g_error ("couldn't prompt for confirm: %s", error->message);
- g_print ("prompt confirm: %d\n", reply);
- cont = (reply != GCR_PROMPT_REPLY_CANCEL);
- } else {
- g_error ("unsupported prompt type: %s", type);
- }
- g_free (type);
-
- choice = gcr_prompt_get_choice_label (prompt);
- if (choice)
- g_print ("choice chosen: %s", gcr_prompt_get_choice_chosen (prompt) ? "true" : "false");
- g_free (choice);
- g_print ("\n");
- }
-
- g_main_loop_unref (loop);
- g_object_unref (prompt);
- g_strfreev (groups);
- g_key_file_free (file);
-
-}
-
-static void
-on_prompt_clicked (GtkToolButton *button,
- gpointer user_data)
-{
- prompt_perform (user_data);
-}
-
-static gboolean
-on_window_delete (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- gtk_main_quit ();
- return FALSE;
-}
-
-static GOptionEntry option_entries[] = {
- { "type", 'c', 0, G_OPTION_ARG_STRING, &prompt_type,
- "'system', 'private' or 'dialog'", "type" },
- { "delay", 'd', 0, G_OPTION_ARG_INT, &prompt_delay,
- "delay in seconds between prompts", "delay" },
- { "window", 'w', 0, G_OPTION_ARG_NONE, &prompt_window,
- "prompt with a parent window", NULL },
- { NULL }
-};
-
-int
-main (int argc, char *argv[])
-{
- GOptionContext *context;
- GtkWidget *window;
- GtkToolbar *toolbar;
- GtkToolItem *item;
- GError *error = NULL;
-
- g_set_prgname ("frob-prompt");
-
- context = g_option_context_new ("");
- g_option_context_add_main_entries (context, option_entries, GETTEXT_PACKAGE);
- g_option_context_add_group (context, gtk_get_option_group (TRUE));
-
- if (!g_option_context_parse (context, &argc, &argv, &error))
- g_error ("%s", error->message);
-
- g_option_context_free (context);
-
- if (argc < 2)
- g_error ("specify file");
- file_name = argv[1];
-
- if (prompt_window) {
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- g_signal_connect (window, "delete-event", G_CALLBACK (on_window_delete), NULL);
-
- toolbar = GTK_TOOLBAR (gtk_toolbar_new ());
- gtk_toolbar_set_style (toolbar, GTK_TOOLBAR_TEXT);
- item = gtk_tool_button_new (NULL, "Prompt");
- g_signal_connect (item, "clicked", G_CALLBACK (on_prompt_clicked), window);
- gtk_toolbar_insert (toolbar, item, 0);
- gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (toolbar));
-
- gtk_window_set_default_size (GTK_WINDOW (window), 400, 80);
- gtk_widget_show_all (window);
-
- gtk_main ();
-
- } else {
- prompt_perform (NULL);
- }
-
- g_free (prompt_type);
- return 0;
-}
diff --git a/ui/frob-request.c b/ui/frob-request.c
deleted file mode 100644
index 1d2f946..0000000
--- a/ui/frob-request.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-
-#include "ui/gcr-certificate-request-renderer.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-static void
-on_parser_parsed (GcrParser *parser,
- gpointer user_data)
-{
- GcrViewer *viewer;
- GcrRenderer *renderer;
- GtkDialog *dialog = GTK_DIALOG (user_data);
-
- viewer = gcr_viewer_new_scrolled ();
- renderer = _gcr_certificate_request_renderer_new_for_attributes (gcr_parser_get_parsed_label (parser),
- gcr_parser_get_parsed_attributes (parser));
- gcr_viewer_add_renderer (viewer, renderer);
- g_object_unref (renderer);
- gtk_widget_show (GTK_WIDGET (viewer));
- gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (viewer));
-
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 20);
-}
-
-static void
-test_request (const gchar *path)
-{
- GcrParser *parser;
- GError *err = NULL;
- guchar *data;
- gsize n_data;
- GtkWidget *dialog;
- GBytes *bytes;
-
- if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL))
- g_error ("couldn't read file: %s", path);
-
- dialog = gtk_dialog_new ();
- g_object_ref_sink (dialog);
-
- parser = gcr_parser_new ();
- g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), dialog);
- bytes = g_bytes_new_take (data, n_data);
- if (!gcr_parser_parse_data (parser, data, n_data, &err))
- g_error ("couldn't parse data: %s", err->message);
-
- g_object_unref (parser);
- g_bytes_unref (bytes);
-
- gtk_widget_show (dialog);
- g_signal_connect (dialog, "delete-event", G_CALLBACK (gtk_main_quit), NULL);
- gtk_main ();
-
- g_object_unref (dialog);
-}
-
-int
-main(int argc, char *argv[])
-{
- gtk_init (&argc, &argv);
- g_set_prgname ("frob-request");
-
- if (argc > 1)
- test_request (argv[1]);
- else
- test_request (SRCDIR "/ui/fixtures/der-rsa-2048.p10");
-
- return 0;
-}
diff --git a/ui/frob-system-prompt.c b/ui/frob-system-prompt.c
deleted file mode 100644
index 330f8bd..0000000
--- a/ui/frob-system-prompt.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-
-#include <gtk/gtk.h>
-#ifdef GDK_WINDOWING_X11
-#include <gdk/gdkx.h>
-#endif
-#ifdef GDK_WINDOWING_WAYLAND
-#include <gdk/gdkwayland.h>
-#endif
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-static void
-run_prompt (GcrPrompt *prompt)
-{
- const char *password;
- GError *error = NULL;
-
- password = gcr_prompt_password_run (GCR_PROMPT (prompt), NULL, &error);
- if (error != NULL) {
- g_warning ("couldn't prompt for password: %s", error->message);
- g_error_free (error);
- g_object_unref (prompt);
- return;
- }
-
- g_print ("password: %s\n", password);
- g_object_unref (prompt);
-}
-
-static void
-on_gdk_wl_window_exported (GdkWindow *window,
- const char *handle,
- gpointer user_data)
-{
- GcrPrompt *prompt = GCR_PROMPT (user_data);
-
- g_return_if_fail (handle);
-
- gcr_prompt_set_caller_window (prompt, handle);
- run_prompt (prompt);
-}
-
-static void
-on_prompt_clicked (GtkToolButton *button,
- gpointer user_data)
-{
- GcrPrompt *prompt;
- GError *error = NULL;
- GtkWidget *parent = user_data;
- GdkWindow *window;
- gchar *caller_id;
-
- prompt = gcr_system_prompt_open (-1, NULL, &error);
- if (error != NULL) {
- g_warning ("couldn't open prompt: %s", error->message);
- g_error_free (error);
- return;
- }
-
- gcr_prompt_set_title (GCR_PROMPT (prompt), "This is the title");
- gcr_prompt_set_message (GCR_PROMPT (prompt), "This is the message");
- gcr_prompt_set_description (GCR_PROMPT (prompt), "This is the description");
-
- window = gtk_widget_get_window (parent);
-#ifdef GDK_WINDOWING_X11
- if (GDK_IS_X11_WINDOW (window)) {
- caller_id = g_strdup_printf ("%lu", (gulong)GDK_WINDOW_XID (window));
- gcr_prompt_set_caller_window (prompt, caller_id);
- g_free (caller_id);
- }
-#endif
-#ifdef GDK_WINDOWING_WAYLAND
- if (GDK_IS_WAYLAND_WINDOW (window)) {
- if (!gdk_wayland_window_export_handle (window, on_gdk_wl_window_exported, prompt, NULL)) {
- g_warning ("Couldn't export Wayland window handle");
- } else {
- return; /* Don't run the prompt before the async method finished */
- }
- }
-#endif
-
- run_prompt (prompt);
-}
-
-static gboolean
-on_window_delete (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- gtk_main_quit ();
- return FALSE;
-}
-
-int
-main (int argc, char *argv[])
-{
- GtkWidget *window;
- GtkToolbar *toolbar;
- GtkToolItem *item;
-
- gtk_init (&argc, &argv);
-
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- g_signal_connect (window, "delete-event", G_CALLBACK (on_window_delete), NULL);
-
- toolbar = GTK_TOOLBAR (gtk_toolbar_new ());
- gtk_toolbar_set_style (toolbar, GTK_TOOLBAR_TEXT);
- item = gtk_tool_button_new (NULL, "Prompt");
- g_signal_connect (item, "clicked", G_CALLBACK (on_prompt_clicked), window);
- gtk_toolbar_insert (toolbar, item, 0);
- gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (toolbar));
-
- gtk_window_set_default_size (GTK_WINDOW (window), 400, 80);
- gtk_widget_show_all (window);
-
- gtk_main ();
-
- return 0;
-}
diff --git a/ui/frob-tree-selector.c b/ui/frob-tree-selector.c
deleted file mode 100644
index f2a7ef8..0000000
--- a/ui/frob-tree-selector.c
+++ /dev/null
@@ -1,211 +0,0 @@
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-#define TEST_TYPE_COLLECTION (test_collection_get_type ())
-#define TEST_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_COLLECTION, TestCollection))
-#define TEST_IS_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_COLLECTION))
-
-typedef struct _TestCollection TestCollection;
-typedef struct _TestCollectionClass TestCollectionClass;
-typedef struct _TestCollectionPrivate TestCollectionPrivate;
-
-struct _TestCollection {
- GcrSimpleCollection parent;
- gchar *label;
-};
-
-struct _TestCollectionClass {
- GcrSimpleCollectionClass parent_class;
-};
-
-GType test_collection_get_type (void) G_GNUC_CONST;
-
-enum {
- PROP_0,
- PROP_LABEL,
-};
-
-G_DEFINE_TYPE (TestCollection, test_collection, GCR_TYPE_SIMPLE_COLLECTION);
-
-static GHashTable *all_collections = NULL;
-
-static void
-test_collection_init (TestCollection *self)
-{
-
-}
-
-static void
-test_collection_finalize (GObject *obj)
-{
- TestCollection *self = TEST_COLLECTION (obj);
- g_free (self->label);
- g_hash_table_remove (all_collections, self);
- G_OBJECT_CLASS (test_collection_parent_class)->finalize (obj);
-}
-
-static void
-test_collection_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- TestCollection *self = TEST_COLLECTION (obj);
- switch (prop_id) {
- case PROP_LABEL:
- g_value_set_string (value, self->label);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-test_collection_class_init (TestCollectionClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- gobject_class->get_property = test_collection_get_property;
- gobject_class->finalize = test_collection_finalize;
-
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "label", "label", NULL,
- G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-}
-
-static GcrSimpleCollection *
-test_collection_instance (const gchar *label)
-{
- TestCollection *collection = NULL;
-
- g_assert (label);
-
- if (!all_collections) {
- all_collections = g_hash_table_new (g_str_hash, g_str_equal);
- } else {
- collection = g_hash_table_lookup (all_collections, label);
- if (collection != NULL)
- return GCR_SIMPLE_COLLECTION (g_object_ref (collection));
- }
-
- collection = g_object_new (TEST_TYPE_COLLECTION, NULL);
- collection->label = g_strdup (label);
- g_hash_table_insert (all_collections, collection->label, collection);
- return GCR_SIMPLE_COLLECTION (collection);
-}
-
-static void
-on_parser_parsed (GcrParser *parser, gpointer user_data)
-{
- GcrSimpleCollection *collection = user_data;
- GcrSimpleCollection *testcol;
- GcrRenderer *renderer;
- gchar *group;
-
- renderer = gcr_renderer_create (gcr_parser_get_parsed_label (parser),
- gcr_parser_get_parsed_attributes (parser));
- if (renderer == NULL)
- return;
-
- if (GCR_IS_CERTIFICATE (renderer))
- group = gcr_certificate_get_subject_part (GCR_CERTIFICATE (renderer), "O");
- else
- group = g_strdup (G_OBJECT_TYPE_NAME (renderer));
-
-
- testcol = test_collection_instance (group);
- if (!gcr_collection_contains (GCR_COLLECTION (collection), G_OBJECT (testcol)))
- gcr_simple_collection_add (collection, G_OBJECT (testcol));
-
- gcr_simple_collection_add (GCR_SIMPLE_COLLECTION (testcol), G_OBJECT (renderer));
- g_object_unref (renderer);
- g_object_unref (testcol);
- g_free (group);
-}
-
-static void
-add_to_selector (GcrParser *parser, const gchar *path)
-{
- GError *err = NULL;
- guchar *data;
- gsize n_data;
- GBytes *bytes;
-
- if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL))
- g_error ("couldn't read file: %s", path);
-
- bytes = g_bytes_new_take (data, n_data);
- if (!gcr_parser_parse_bytes (parser, bytes, &err))
- g_error ("couldn't parse data: %s", err->message);
-
- g_bytes_unref (bytes);
-}
-
-int
-main (int argc, char *argv[])
-{
- GcrCollection *collection;
- GcrTreeSelector *selector;
- GtkDialog *dialog;
- GcrParser *parser;
- GtkWidget *scroll;
- GList *selected, *l;
- int i;
-
- gtk_init (&argc, &argv);
-
- dialog = GTK_DIALOG (gtk_dialog_new ());
- g_object_ref_sink (dialog);
-
- collection = gcr_simple_collection_new ();
- selector = gcr_tree_selector_new (collection, GCR_CERTIFICATE_COLUMNS);
-
- scroll = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_ETCHED_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET (selector));
- gtk_widget_show_all (scroll);
-
- gtk_widget_show (GTK_WIDGET (selector));
- gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (scroll), TRUE, TRUE, 0);
-
- gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400);
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 20);
-
- parser = gcr_parser_new ();
- g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), collection);
-
- if (argc == 1) {
- add_to_selector (parser, SRCDIR "/ui/fixtures/ca-certificates.crt");
- } else {
- for (i = 1; i < argc; ++i)
- add_to_selector (parser, argv[i]);
- }
-
- g_object_unref (parser);
- g_object_unref (collection);
-
- gtk_dialog_run (dialog);
-
- selected = gcr_tree_selector_get_selected (selector);
- for (l = selected; l; l = g_list_next (l)) {
- gchar *label;
- g_object_get (l->data, "label", &label, NULL);
- g_print ("selected: %s\n", label);
- g_free (label);
- }
- g_list_free (selected);
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
- g_object_unref (dialog);
-
- return 0;
-}
diff --git a/ui/frob-unlock-options.c b/ui/frob-unlock-options.c
deleted file mode 100644
index b9e5b09..0000000
--- a/ui/frob-unlock-options.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-static void
-test_unlock_options (void)
-{
- GcrUnlockOptionsWidget *unlock;
- GtkDialog *dialog;
-
- dialog = GTK_DIALOG (gtk_dialog_new ());
- g_object_ref_sink (dialog);
-
- unlock = GCR_UNLOCK_OPTIONS_WIDGET (gcr_unlock_options_widget_new ());
- gtk_widget_show (GTK_WIDGET (unlock));
- gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (unlock));
-
- gcr_unlock_options_widget_set_sensitive (unlock, GCR_UNLOCK_OPTION_IDLE, FALSE,
- "This is a test of the tooltip.");
- gcr_unlock_options_widget_set_sensitive (unlock, GCR_UNLOCK_OPTION_ALWAYS, TRUE, NULL);
- gcr_unlock_options_widget_set_label (unlock, GCR_UNLOCK_OPTION_IDLE, "Disabled label test");
- gcr_unlock_options_widget_set_ttl (unlock, 80);
- gcr_unlock_options_widget_set_choice (unlock, GCR_UNLOCK_OPTION_ALWAYS);
-
- gtk_window_set_default_size (GTK_WINDOW (dialog), 400, 400);
- gtk_dialog_run (dialog);
-
- g_printerr ("choice: %s\n",
- gcr_unlock_options_widget_get_choice (unlock));
-
- g_printerr ("ttl: %u\n",
- gcr_unlock_options_widget_get_ttl (unlock));
-
- g_printerr ("idle sensitive: %s\n",
- gcr_unlock_options_widget_get_sensitive (unlock, GCR_UNLOCK_OPTION_IDLE) ? "T" : "F");
-
- g_printerr ("always sensitive: %s\n",
- gcr_unlock_options_widget_get_sensitive (unlock, GCR_UNLOCK_OPTION_ALWAYS) ? "T" : "F");
-
- g_printerr ("label: %s\n",
- gcr_unlock_options_widget_get_label (unlock, GCR_UNLOCK_OPTION_ALWAYS));
-
- g_object_unref (dialog);
-}
-
-int
-main(int argc, char *argv[])
-{
- gtk_init (&argc, &argv);
- g_set_prgname ("frob-unlock-options");
-
- test_unlock_options ();
-
- return 0;
-}
diff --git a/ui/frob-unlock.c b/ui/frob-unlock.c
deleted file mode 100644
index 4919765..0000000
--- a/ui/frob-unlock.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-
-#include "ui/gcr-unlock-renderer.h"
-#include "ui/gcr-viewer-window.h"
-
-#include <gtk/gtk.h>
-
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-static gboolean
-delete_event(GtkWidget *widget,
- GdkEvent *event,
- gpointer data)
-{
- gtk_main_quit ();
- return FALSE;
-}
-
-static void
-on_parser_parsed (GcrParser *parser, gpointer unused)
-{
-
-}
-
-static void
-on_unlock_clicked (GcrUnlockRenderer *renderer,
- GcrParser *parser)
-{
- const gchar *password;
- password = _gcr_unlock_renderer_get_password (renderer);
- gcr_parser_add_password (parser, password);
- gtk_main_quit ();
-}
-
-static void
-on_parser_authenticate (GcrParser *parser,
- gint count,
- gpointer user_data)
-{
- GcrUnlockRenderer *renderer;
- GtkWindow *window;
-
- window = GTK_WINDOW (gcr_viewer_window_new ());
- g_object_ref_sink (window);
-
- renderer = _gcr_unlock_renderer_new_for_parsed (parser);
- g_signal_connect (renderer, "unlock-clicked", G_CALLBACK (on_unlock_clicked), parser);
- gcr_viewer_add_renderer (gcr_viewer_window_get_viewer (GCR_VIEWER_WINDOW (window)), GCR_RENDERER (renderer));
- g_object_unref (renderer);
-
- gtk_window_set_default_size (window, 550, 400);
- gtk_container_set_border_width (GTK_CONTAINER (window), 20);
-
- g_signal_connect (window, "delete-event", G_CALLBACK (delete_event), NULL);
- gtk_widget_show (GTK_WIDGET (window));
-
- gtk_main ();
-
- g_object_unref (window);
-}
-
-static void
-test_key (const gchar *path)
-{
- GcrParser *parser;
- GError *err = NULL;
- guchar *data;
- gsize n_data;
- GBytes *bytes;
-
- if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL))
- g_error ("couldn't read file: %s", path);
-
- parser = gcr_parser_new ();
- g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), NULL);
- g_signal_connect (parser, "authenticate", G_CALLBACK (on_parser_authenticate), NULL);
- bytes = g_bytes_new_take (data, n_data);
- if (!gcr_parser_parse_bytes (parser, bytes, &err))
- g_error ("couldn't parse data: %s", err->message);
-
- g_object_unref (parser);
- g_bytes_unref (bytes);
-}
-
-int
-main(int argc, char *argv[])
-{
- gtk_init (&argc, &argv);
- g_set_prgname ("frob-unlock");
-
- if (argc > 1) {
- test_key (argv[1]);
- } else {
- test_key (SRCDIR "/ui/fixtures/email.p12");
- }
-
- return 0;
-}
diff --git a/ui/gcr-certificate-basics-widget.c b/ui/gcr-certificate-basics-widget.c
deleted file mode 100644
index 6646134..0000000
--- a/ui/gcr-certificate-basics-widget.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-#include "gcr-certificate-basics-widget.h"
-
-#ifndef GCR_DISABLE_DEPRECATED
-
-/* These are all stubs for GcrCertificateWidget */
-
-GType
-gcr_certificate_basics_widget_get_type (void)
-{
- return gcr_certificate_widget_get_type ();
-}
-
-/**
- * gcr_certificate_basics_widget_new: (skip)
- *
- * Create new certificate viewer.
- *
- * Deprecated: Since 2.30
- *
- * Returns: (transfer full) (type GcrUi.CertificateWidget): a new certificate widget
- */
-GcrCertificateBasicsWidget *
-gcr_certificate_basics_widget_new (GcrCertificate *cert)
-{
- return gcr_certificate_widget_new (cert);
-}
-
-/**
- * gcr_certificate_basics_widget_get_certificate: (skip)
- *
- * Get certificate on viewer.
- *
- * Deprecated: Since 2.30
- *
- * Returns: (transfer none): the certificate
- */
-GcrCertificate *
-gcr_certificate_basics_widget_get_certificate (GcrCertificateBasicsWidget *basics)
-{
- return gcr_certificate_widget_get_certificate (basics);
-}
-
-/**
- * gcr_certificate_basics_widget_set_certificate: (skip)
- * @basics: the certificate widget
- * @cert: the certificate
- *
- * Set certificate on viewer.
- *
- * Deprecated: Since 2.30
- */
-void
-gcr_certificate_basics_widget_set_certificate (GcrCertificateBasicsWidget *basics,
- GcrCertificate *cert)
-{
- return gcr_certificate_widget_set_certificate (basics, cert);
-}
-
-#endif /* GCR_DISABLE_DEPRECATED */
diff --git a/ui/gcr-certificate-basics-widget.h b/ui/gcr-certificate-basics-widget.h
deleted file mode 100644
index 9715ee9..0000000
--- a/ui/gcr-certificate-basics-widget.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2008 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __GCR_CERTIFICATE_BASICS_WIDGET_H__
-#define __GCR_CERTIFICATE_BASICS_WIDGET_H__
-
-/*
- * GcrCertificateBasicsWidget has been replaced with GcrCertificateWidget.
- * These functions are stubs for GcrCertificateWidget.
- */
-
-#ifndef GCR_DISABLE_DEPRECATED
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-certificate.h"
-#include "gcr/gcr-types.h"
-
-#include "gcr-certificate-widget.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_CERTIFICATE_BASICS_WIDGET (gcr_certificate_basics_widget_get_type ())
-#define GCR_CERTIFICATE_BASICS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_BASICS_WIDGET, GcrCertificateBasicsWidget))
-#define GCR_CERTIFICATE_BASICS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_BASICS_WIDGET, GcrCertificateBasicsWidgetClass))
-#define GCR_IS_CERTIFICATE_BASICS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_BASICS_WIDGET))
-#define GCR_IS_CERTIFICATE_BASICS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_BASICS_WIDGET))
-#define GCR_CERTIFICATE_BASICS_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_BASICS_WIDGET, GcrCertificateBasicsWidgetClass))
-
-typedef GcrCertificateWidget GcrCertificateBasicsWidget;
-typedef GcrCertificateWidgetClass GcrCertificateBasicsWidgetClass;
-
-G_DEPRECATED_FOR(gcr_certificate_widget_get_type)
-GType gcr_certificate_basics_widget_get_type (void);
-
-G_DEPRECATED_FOR(gcr_certificate_widget_new)
-GcrCertificateBasicsWidget* gcr_certificate_basics_widget_new (GcrCertificate *cert);
-
-G_DEPRECATED_FOR(gcr_certificate_widget_get_certificate)
-GcrCertificate* gcr_certificate_basics_widget_get_certificate (GcrCertificateBasicsWidget *basics);
-
-G_DEPRECATED_FOR(gcr_certificate_widget_set_certificate)
-void gcr_certificate_basics_widget_set_certificate (GcrCertificateBasicsWidget *basics,
- GcrCertificate *cert);
-
-G_END_DECLS
-
-#endif /* GCR_DISABLE_DEPRECATED */
-
-#endif /* __GCR_CERTIFICATE_BASICS_WIDGET_H__ */
diff --git a/ui/gcr-certificate-details-widget.c b/ui/gcr-certificate-details-widget.c
deleted file mode 100644
index 79e215c..0000000
--- a/ui/gcr-certificate-details-widget.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-#include "gcr-certificate-details-widget.h"
-
-#ifndef GCR_DISABLE_DEPRECATED
-
-/* These are all stubs for GcrCertificateWidget */
-
-GType
-gcr_certificate_details_widget_get_type (void)
-{
- return gcr_certificate_widget_get_type ();
-}
-
-/**
- * gcr_certificate_details_widget_new: (skip)
- *
- * Create a new certificate viewer.
- *
- * Deprecated: Since 2.30
- *
- * Returns: (transfer full) (type GcrUi.CertificateWidget): a new certificate widget
- */
-GcrCertificateDetailsWidget *
-gcr_certificate_details_widget_new (GcrCertificate *cert)
-{
- return gcr_certificate_widget_new (cert);
-}
-
-/**
- * gcr_certificate_details_widget_get_certificate: (skip)
- *
- * Get certificate displayed in viewer.
- *
- * Deprecated: Since 2.30
- *
- * Returns: (transfer none): the certificate
- */
-GcrCertificate*
-gcr_certificate_details_widget_get_certificate (GcrCertificateDetailsWidget *details)
-{
- return gcr_certificate_widget_get_certificate (details);
-}
-
-/**
- * gcr_certificate_details_widget_set_certificate: (skip)
- * @details: the certificate widget
- * @cert: the certificate
- *
- * Set certificate displayed in viewer.
- *
- * Deprecated: Since 2.30
- */
-void
-gcr_certificate_details_widget_set_certificate (GcrCertificateDetailsWidget *details,
- GcrCertificate *cert)
-{
- return gcr_certificate_widget_set_certificate (details, cert);
-}
-
-#endif /* GCR_DISABLE_DEPRECATED */
diff --git a/ui/gcr-certificate-details-widget.h b/ui/gcr-certificate-details-widget.h
deleted file mode 100644
index 2a1de50..0000000
--- a/ui/gcr-certificate-details-widget.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2008 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __GCR_CERTIFICATE_DETAILS_WIDGET_H__
-#define __GCR_CERTIFICATE_DETAILS_WIDGET_H__
-
-/*
- * GcrCertificateDetailsWidget has been replaced with GcrCertificateWidget.
- * These functions are stubs for GcrCertificateWidget.
- */
-
-#ifndef GCR_DISABLE_DEPRECATED
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-certificate.h"
-#include "gcr/gcr-types.h"
-
-#include "gcr-certificate-widget.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_CERTIFICATE_DETAILS_WIDGET (gcr_certificate_details_widget_get_type ())
-#define GCR_CERTIFICATE_DETAILS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_DETAILS_WIDGET, GcrCertificateDetailsWidget))
-#define GCR_CERTIFICATE_DETAILS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_DETAILS_WIDGET, GcrCertificateDetailsWidgetClass))
-#define GCR_IS_CERTIFICATE_DETAILS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_DETAILS_WIDGET))
-#define GCR_IS_CERTIFICATE_DETAILS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_DETAILS_WIDGET))
-#define GCR_CERTIFICATE_DETAILS_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_DETAILS_WIDGET, GcrCertificateDetailsWidgetClass))
-
-typedef GcrCertificateWidget GcrCertificateDetailsWidget;
-typedef GcrCertificateWidgetClass GcrCertificateDetailsWidgetClass;
-
-G_DEPRECATED_FOR(gcr_certificate_widget_get_type)
-GType gcr_certificate_details_widget_get_type (void);
-
-G_DEPRECATED_FOR(gcr_certificate_widget_new)
-GcrCertificateDetailsWidget* gcr_certificate_details_widget_new (GcrCertificate *cert);
-
-G_DEPRECATED_FOR(gcr_certificate_widget_get_certificate)
-GcrCertificate* gcr_certificate_details_widget_get_certificate (GcrCertificateDetailsWidget *details);
-
-G_DEPRECATED_FOR(gcr_certificate_widget_set_certificate)
-void gcr_certificate_details_widget_set_certificate (GcrCertificateDetailsWidget *details,
- GcrCertificate *cert);
-
-G_END_DECLS
-
-#endif /* GCR_DISABLE_DEPRECATED */
-
-#endif /* __GCR_CERTIFICATE_DETAILS_WIDGET_H__ */
diff --git a/ui/gcr-certificate-exporter.c b/ui/gcr-certificate-exporter.c
deleted file mode 100644
index 4b1817f..0000000
--- a/ui/gcr-certificate-exporter.c
+++ /dev/null
@@ -1,570 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr-certificate.h"
-
-#include "gcr-certificate-exporter.h"
-
-#include "egg/egg-armor.h"
-#include "egg/egg-openssl.h"
-
-#include <glib/gi18n-lib.h>
-
-enum {
- PROP_0,
- PROP_CERTIFICATE,
- PROP_LABEL,
- PROP_TRANSIENT_FOR
-};
-
-struct _GcrCertificateExporterPrivate {
-
- /* Setup stuff */
- GcrCertificate *certificate;
- gchar *label;
- GtkWindow *transient_for;
-
- /* Used during operation */
- GtkFileChooser *chooser_dialog;
- GFile *output_file;
- GByteArray *buffer;
- guint buffer_at;
-
- /* Async stuff */
- GAsyncReadyCallback callback;
- gpointer user_data;
- GCancellable *cancellable;
- GError *error;
- gboolean completed;
-};
-
-static const gchar *BAD_FILENAME_CHARS = "/\\<>|?*";
-
-/* Forward declarations */
-static void _gcr_certificate_exporter_async_result_init (GAsyncResultIface *iface);
-static void write_to_outputstream (GcrCertificateExporter *self, GOutputStream *os);
-
-G_DEFINE_TYPE_WITH_CODE (GcrCertificateExporter, _gcr_certificate_exporter, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrCertificateExporter);
- G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_RESULT, _gcr_certificate_exporter_async_result_init));
-
-typedef void (*PrepareDataFunc) (GcrCertificateExporter *self);
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-static void
-prepare_data_for_der (GcrCertificateExporter *self)
-{
- gconstpointer data;
- gsize n_data;
-
- data = gcr_certificate_get_der_data (self->pv->certificate, &n_data);
- g_return_if_fail (data);
-
- self->pv->buffer = g_byte_array_new ();
- g_byte_array_append (self->pv->buffer, data, n_data);
-}
-
-static void
-prepare_data_for_pem (GcrCertificateExporter *self)
-{
- gconstpointer data;
- gpointer encoded;
- gsize n_data, n_encoded;
-
- data = gcr_certificate_get_der_data (self->pv->certificate, &n_data);
- g_return_if_fail (data);
-
- self->pv->buffer = g_byte_array_new ();
-
- encoded = egg_armor_write (data, n_data,
- g_quark_from_static_string ("CERTIFICATE"),
- NULL, &n_encoded);
-
- g_byte_array_append (self->pv->buffer, encoded, n_encoded);
- g_free (encoded);
-}
-
-static void
-complete_async_result (GcrCertificateExporter *self)
-{
- g_assert (self->pv->callback);
- g_assert (!self->pv->completed);
-
- if (self->pv->chooser_dialog)
- gtk_widget_hide (GTK_WIDGET (self->pv->chooser_dialog));
-
- self->pv->completed = TRUE;
- (self->pv->callback) (G_OBJECT (self), G_ASYNC_RESULT (self),
- self->pv->user_data);
-}
-
-static void
-on_outputstream_write_ready (GObject *source, GAsyncResult *res, gpointer user_data)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data);
- GOutputStream *os = G_OUTPUT_STREAM (source);
- gssize written;
-
- written = g_output_stream_write_finish (os, res, &self->pv->error);
-
- if (self->pv->error) {
- complete_async_result (self);
- return;
- }
-
- g_return_if_fail (written >= 0);
- g_return_if_fail (written <= self->pv->buffer->len - self->pv->buffer_at);
- self->pv->buffer_at += written;
-
- /* Write next bit, or finished */
- write_to_outputstream (self, os);
-}
-
-static void
-on_outputstream_closed (GObject *source, GAsyncResult *res, gpointer user_data)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data);
- g_output_stream_close_finish (G_OUTPUT_STREAM (source), res, &self->pv->error);
- complete_async_result (self);
-}
-
-static void
-write_to_outputstream (GcrCertificateExporter *self, GOutputStream *os)
-{
- gtk_widget_hide (GTK_WIDGET (self->pv->chooser_dialog));
- g_assert (GTK_IS_WIDGET (self->pv->chooser_dialog));
-
- /* Are we all done? */
- g_assert (self->pv->buffer_at <= self->pv->buffer->len);
- if (self->pv->buffer_at == self->pv->buffer->len) {
- g_output_stream_close_async (os, G_PRIORITY_DEFAULT,
- self->pv->cancellable,
- on_outputstream_closed, self);
- return;
- }
-
- g_output_stream_write_async (os, self->pv->buffer->data + self->pv->buffer_at,
- self->pv->buffer->len - self->pv->buffer_at,
- G_PRIORITY_DEFAULT, self->pv->cancellable,
- on_outputstream_write_ready, self);
-}
-
-static void
-on_replace_file_ready (GObject *source, GAsyncResult *res, gpointer user_data)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data);
- GFile *file = G_FILE (source);
- GFileOutputStream *os;
-
- os = g_file_replace_finish (file, res, &self->pv->error);
-
- if (self->pv->error) {
- complete_async_result (self);
- return;
- }
-
- write_to_outputstream (self, G_OUTPUT_STREAM (os));
-}
-
-static void
-on_replace_dialog_response (GtkDialog *dialog, gint response_id, gpointer user_data)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data);
-
- if (response_id == GTK_RESPONSE_ACCEPT) {
- g_file_replace_async (self->pv->output_file, NULL, FALSE, G_FILE_CREATE_NONE,
- G_PRIORITY_DEFAULT, self->pv->cancellable,
- on_replace_file_ready, self);
- }
-
- gtk_widget_destroy (GTK_WIDGET (dialog));
-}
-
-static void
-on_cancel_replace_dialog (GCancellable *cancellable, gpointer user_data)
-{
- gtk_widget_destroy (user_data);
-}
-
-static void
-on_create_file_ready (GObject *source, GAsyncResult *res, gpointer user_data)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data);
- GFileOutputStream *os;
- GtkWidget *dialog;
-
- os = g_file_create_finish (self->pv->output_file, res, &self->pv->error);
-
- /* Try again this time replacing the file */
- if (g_error_matches (self->pv->error, G_IO_ERROR, G_IO_ERROR_EXISTS)) {
- g_clear_error (&self->pv->error);
-
- dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (self->pv->chooser_dialog),
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_NONE, "<b>%s</b>\n\n%s",
- _("A file already exists with this name."),
- _("Do you want to replace it with a new file?"));
- gtk_dialog_add_buttons (GTK_DIALOG (dialog),
- _("_Cancel"), GTK_RESPONSE_CANCEL,
- _("_Replace"), GTK_RESPONSE_ACCEPT, NULL);
-
- g_signal_connect (dialog, "response",
- G_CALLBACK (on_replace_dialog_response), self);
- if (self->pv->cancellable)
- g_cancellable_connect (self->pv->cancellable,
- G_CALLBACK (on_cancel_replace_dialog),
- g_object_ref (dialog), g_object_unref);
- gtk_widget_show (dialog);
-
- return;
- }
-
- if (self->pv->error) {
- complete_async_result (self);
- return;
- }
-
- write_to_outputstream (self, G_OUTPUT_STREAM (os));
-}
-
-static void
-on_chooser_dialog_response (GtkDialog *dialog, gint response_id, gpointer user_data)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data);
- GtkFileFilter *filter;
- PrepareDataFunc prepare_data;
-
- if (response_id != GTK_RESPONSE_ACCEPT) {
- g_set_error (&self->pv->error, G_IO_ERROR, G_IO_ERROR_CANCELLED,
- _("The operation was cancelled."));
- complete_async_result (self);
- return;
- }
-
- if (self->pv->output_file)
- g_object_unref (self->pv->output_file);
- self->pv->output_file = gtk_file_chooser_get_file (self->pv->chooser_dialog);
- g_return_if_fail (self->pv->output_file);
-
- filter = gtk_file_chooser_get_filter (self->pv->chooser_dialog);
- prepare_data = g_object_get_data (G_OBJECT (filter), "prepare-data-func");
- g_assert (prepare_data);
-
- if (self->pv->buffer)
- g_byte_array_free (self->pv->buffer, TRUE);
- self->pv->buffer = NULL;
- self->pv->buffer_at = 0;
-
- /* Prepare the for writing out */
- (prepare_data) (self);
-
- /* Try to open the file */
- g_file_create_async (self->pv->output_file, G_FILE_CREATE_NONE, G_PRIORITY_DEFAULT,
- self->pv->cancellable, on_create_file_ready,
- self);
-}
-
-static void
-on_cancel_chooser_dialog (GCancellable *cancellable, gpointer user_data)
-{
- GtkDialog *dialog = GTK_DIALOG (user_data);
- gtk_dialog_response (dialog, GTK_RESPONSE_CANCEL);
-}
-
-static void
-exporter_display_chooser (GcrCertificateExporter *self)
-{
- GtkFileFilter* filter;
- GtkWidget *dialog;
- gchar *filename;
-
- g_assert (!self->pv->chooser_dialog);
-
- dialog = gtk_file_chooser_dialog_new (_("Export certificate"),
- NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
- _("_Cancel"), GTK_RESPONSE_CANCEL,
- _("_Save"), GTK_RESPONSE_ACCEPT,
- NULL);
-
- self->pv->chooser_dialog = GTK_FILE_CHOOSER (g_object_ref_sink (dialog));
- gtk_dialog_set_default_response (GTK_DIALOG (dialog),
- GTK_RESPONSE_ACCEPT);
- gtk_file_chooser_set_local_only (self->pv->chooser_dialog, FALSE);
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("Certificate files"));
- gtk_file_filter_add_mime_type (filter, "application/x-x509-ca-cert");
- gtk_file_filter_add_mime_type (filter, "application/x-x509-user-cert");
- gtk_file_filter_add_mime_type (filter, "application/pkix-cert");
- gtk_file_filter_add_pattern (filter, "*.cer");
- gtk_file_filter_add_pattern (filter, "*.crt");
- g_object_set_data (G_OBJECT (filter), "prepare-data-func", prepare_data_for_der);
- gtk_file_chooser_add_filter (self->pv->chooser_dialog, filter);
- gtk_file_chooser_set_filter (self->pv->chooser_dialog, filter);
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (filter, _("PEM files"));
- gtk_file_filter_add_mime_type (filter, "text/plain");
- gtk_file_filter_add_pattern (filter, "*.pem");
- g_object_set_data (G_OBJECT (filter), "prepare-data-func", prepare_data_for_pem);
- gtk_file_chooser_add_filter (self->pv->chooser_dialog, filter);
-
- filename = g_strconcat (self->pv->label, ".crt", NULL);
- g_strdelimit (filename, BAD_FILENAME_CHARS, '_');
- gtk_file_chooser_set_current_name (self->pv->chooser_dialog, filename);
- g_free (filename);
-
- g_signal_connect (self->pv->chooser_dialog, "response",
- G_CALLBACK (on_chooser_dialog_response), self);
- if (self->pv->cancellable)
- g_cancellable_connect (self->pv->cancellable,
- G_CALLBACK (on_cancel_chooser_dialog), self, NULL);
-
- gtk_dialog_run (GTK_DIALOG (self->pv->chooser_dialog));
-}
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static void
-_gcr_certificate_exporter_init (GcrCertificateExporter *self)
-{
- self->pv = _gcr_certificate_exporter_get_instance_private (self);
-}
-
-static void
-_gcr_certificate_exporter_dispose (GObject *obj)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj);
-
- if (self->pv->certificate)
- g_object_unref (self->pv->certificate);
- self->pv->certificate = NULL;
-
- if (self->pv->cancellable)
- g_object_unref (self->pv->cancellable);
- self->pv->cancellable = NULL;
-
- G_OBJECT_CLASS (_gcr_certificate_exporter_parent_class)->dispose (obj);
-}
-
-static void
-_gcr_certificate_exporter_finalize (GObject *obj)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj);
-
- g_free (self->pv->label);
-
- /*
- * Should have been freed in _export_finish, which holds a ref to self
- * so this should never be reached without being finished.
- */
- g_assert (!self->pv->chooser_dialog);
- g_assert (!self->pv->output_file);
- g_assert (!self->pv->buffer);
-
- g_clear_error (&self->pv->error);
-
- G_OBJECT_CLASS (_gcr_certificate_exporter_parent_class)->finalize (obj);
-}
-
-static void
-_gcr_certificate_exporter_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj);
- GcrCertificate *cert;
-
- switch (prop_id) {
- case PROP_CERTIFICATE:
- cert = g_value_dup_object (value);
- if (self->pv->certificate)
- g_object_unref (self->pv->certificate);
- self->pv->certificate = cert;
- g_object_notify (G_OBJECT (self), "certificate");
- break;
- case PROP_LABEL:
- g_free (self->pv->label);
- self->pv->label = g_value_dup_string (value);
- g_object_notify (obj, "label");
- break;
- case PROP_TRANSIENT_FOR:
- self->pv->transient_for = g_value_get_object (value);
- g_object_notify (obj, "transient-for");
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_certificate_exporter_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj);
-
- switch (prop_id) {
- case PROP_CERTIFICATE:
- g_value_set_object (value, self->pv->certificate);
- break;
- case PROP_LABEL:
- g_value_take_string (value, self->pv->label);
- break;
- case PROP_TRANSIENT_FOR:
- g_value_set_object (value, self->pv->transient_for);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_certificate_exporter_class_init (GcrCertificateExporterClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- _gcr_certificate_exporter_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->dispose = _gcr_certificate_exporter_dispose;
- gobject_class->finalize = _gcr_certificate_exporter_finalize;
- gobject_class->set_property = _gcr_certificate_exporter_set_property;
- gobject_class->get_property = _gcr_certificate_exporter_get_property;
-
- g_object_class_install_property (gobject_class, PROP_CERTIFICATE,
- g_param_spec_object ("certificate", "Certificate", "Certificate to display.",
- GCR_TYPE_CERTIFICATE,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "Label", "Label of certificate.",
- _("Certificate"),
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_TRANSIENT_FOR,
- g_param_spec_object ("transient-for", "Transient For", "Transient for this Window",
- GTK_TYPE_WINDOW,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-static GObject*
-_gcr_certificate_exporter_get_source_object (GAsyncResult *result)
-{
- g_return_val_if_fail (GCR_IS_CERTIFICATE_EXPORTER (result), NULL);
- return G_OBJECT (result);
-}
-
-static gpointer
-_gcr_certificate_exporter_get_user_data (GAsyncResult *result)
-{
- g_return_val_if_fail (GCR_IS_CERTIFICATE_EXPORTER (result), NULL);
- return GCR_CERTIFICATE_EXPORTER (result)->pv->user_data;
-}
-
-static void
-_gcr_certificate_exporter_async_result_init (GAsyncResultIface *iface)
-{
- iface->get_source_object = _gcr_certificate_exporter_get_source_object;
- iface->get_user_data = _gcr_certificate_exporter_get_user_data;
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-GcrCertificateExporter*
-_gcr_certificate_exporter_new (GcrCertificate *certificate, const gchar *label,
- GtkWindow *transient_for)
-{
- return g_object_new (GCR_TYPE_CERTIFICATE_EXPORTER,
- "certificate", certificate,
- "label", label,
- "transient-for", transient_for,
- NULL);
-}
-
-void
-_gcr_certificate_exporter_export_async (GcrCertificateExporter *self,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- g_return_if_fail (GCR_IS_CERTIFICATE_EXPORTER (self));
- g_return_if_fail (callback);
-
- /* Must not have already started */
- g_return_if_fail (!self->pv->callback);
- g_return_if_fail (!self->pv->cancellable);
-
- self->pv->callback = callback;
- self->pv->user_data = user_data;
- if (cancellable)
- self->pv->cancellable = g_object_ref (cancellable);
-
- /* Matching in export_finish */
- g_object_ref (self);
-
- exporter_display_chooser (self);
-}
-
-gboolean
-_gcr_certificate_exporter_export_finish (GcrCertificateExporter *self,
- GAsyncResult *result,
- GError **error)
-{
- gboolean ret = TRUE;
-
- g_return_val_if_fail (G_ASYNC_RESULT (self) == result, FALSE);
- g_return_val_if_fail (!error || !*error, FALSE);
- g_return_val_if_fail (self->pv->completed, FALSE);
-
- /* Cleanup all the operation stuff */
- self->pv->callback = NULL;
-
- if (self->pv->chooser_dialog)
- g_object_unref (self->pv->chooser_dialog);
- self->pv->chooser_dialog = NULL;
-
- if (self->pv->output_file)
- g_object_unref (self->pv->output_file);
- self->pv->output_file = NULL;
-
- if (self->pv->buffer)
- g_byte_array_free (self->pv->buffer, TRUE);
- self->pv->buffer = NULL;
- self->pv->buffer_at = 0;
-
- self->pv->completed = FALSE;
-
- if (self->pv->error) {
- g_propagate_error (error, self->pv->error);
- ret = FALSE;
- }
-
- /* Matches in export_async */
- g_object_unref (self);
- return ret;
-}
diff --git a/ui/gcr-certificate-exporter.h b/ui/gcr-certificate-exporter.h
deleted file mode 100644
index d5dd9c2..0000000
--- a/ui/gcr-certificate-exporter.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_CERTIFICATE_EXPORTER_H__
-#define __GCR_CERTIFICATE_EXPORTER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-types.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_CERTIFICATE_EXPORTER (_gcr_certificate_exporter_get_type ())
-#define GCR_CERTIFICATE_EXPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_EXPORTER, GcrCertificateExporter))
-#define GCR_CERTIFICATE_EXPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_EXPORTER, GcrCertificateExporterClass))
-#define GCR_IS_CERTIFICATE_EXPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_EXPORTER))
-#define GCR_IS_CERTIFICATE_EXPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_EXPORTER))
-#define GCR_CERTIFICATE_EXPORTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_EXPORTER, GcrCertificateExporterClass))
-
-typedef struct _GcrCertificateExporter GcrCertificateExporter;
-typedef struct _GcrCertificateExporterClass GcrCertificateExporterClass;
-typedef struct _GcrCertificateExporterPrivate GcrCertificateExporterPrivate;
-
-struct _GcrCertificateExporter {
- /*< private >*/
- GObject parent;
- GcrCertificateExporterPrivate *pv;
-};
-
-struct _GcrCertificateExporterClass {
- GObjectClass parent_class;
-};
-
-GType _gcr_certificate_exporter_get_type (void);
-
-GcrCertificateExporter* _gcr_certificate_exporter_new (GcrCertificate *certificate,
- const gchar *label,
- GtkWindow *transient_for);
-
-void _gcr_certificate_exporter_export_async (GcrCertificateExporter *self,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
-
-gboolean _gcr_certificate_exporter_export_finish (GcrCertificateExporter *self,
- GAsyncResult *result,
- GError **error);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrCertificateExporter, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_CERTIFICATE_EXPORTER_H__ */
diff --git a/ui/gcr-certificate-renderer-private.h b/ui/gcr-certificate-renderer-private.h
deleted file mode 100644
index 53f3bda..0000000
--- a/ui/gcr-certificate-renderer-private.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_CERTIFICATE_RENDERER_PRIVATE_H__
-#define __GCR_CERTIFICATE_RENDERER_PRIVATE_H__
-
-#include "gcr-display-view.h"
-#include "gcr-renderer.h"
-
-G_BEGIN_DECLS
-
-void _gcr_certificate_renderer_append_distinguished_name (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *dn);
-
-void _gcr_certificate_renderer_append_subject_public_key (GcrRenderer *renderer,
- GcrDisplayView *view,
- guint key_size,
- GNode *subject_public_key);
-
-void _gcr_certificate_renderer_append_signature (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *asn);
-
-void _gcr_certificate_renderer_append_extension (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *asn);
-
-G_END_DECLS
-
-#endif /* __GCR_CERTIFICATE_RENDERER_PRIVATE_H__ */
diff --git a/ui/gcr-certificate-renderer.c b/ui/gcr-certificate-renderer.c
deleted file mode 100644
index 70bfb5d..0000000
--- a/ui/gcr-certificate-renderer.c
+++ /dev/null
@@ -1,960 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr/gcr-certificate.h"
-#include "gcr/gcr-certificate-extensions.h"
-#include "gcr/gcr-fingerprint.h"
-#include "gcr/gcr-icons.h"
-#include "gcr/gcr-oids.h"
-#include "gcr/gcr-simple-certificate.h"
-
-#include "gcr-certificate-exporter.h"
-#include "gcr-certificate-renderer.h"
-#include "gcr-certificate-renderer-private.h"
-#include "gcr-deprecated.h"
-#include "gcr-display-view.h"
-#include "gcr-renderer.h"
-
-#include "egg/egg-asn1x.h"
-#include "egg/egg-asn1-defs.h"
-#include "egg/egg-dn.h"
-#include "egg/egg-oid.h"
-#include "egg/egg-hex.h"
-
-#include "gck/gck.h"
-
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
-
-/**
- * GcrCertificateRenderer:
- *
- * An implementation of #GcrRenderer which renders certificates.
- */
-
-/**
- * GcrCertificateRendererClass:
- * @parent_class: The parent class.
- *
- * The class for #GcrCertificateRenderer.
- */
-
-enum {
- PROP_0,
- PROP_CERTIFICATE,
- PROP_LABEL,
- PROP_ATTRIBUTES
-};
-
-struct _GcrCertificateRendererPrivate {
- GcrCertificate *opt_cert;
- GckAttributes *opt_attrs;
- guint key_size;
- gchar *label;
-};
-
-static void gcr_renderer_iface_init (GcrRendererIface *iface);
-static void gcr_renderer_certificate_iface_init (GcrCertificateIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GcrCertificateRenderer, gcr_certificate_renderer, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrCertificateRenderer);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_renderer_iface_init);
- GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE ();
- G_IMPLEMENT_INTERFACE (GCR_TYPE_CERTIFICATE, gcr_renderer_certificate_iface_init);
-);
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-static gchar*
-calculate_label (GcrCertificateRenderer *self)
-{
- gchar *label;
-
- if (self->pv->label)
- return g_strdup (self->pv->label);
-
- if (self->pv->opt_attrs) {
- if (gck_attributes_find_string (self->pv->opt_attrs, CKA_LABEL, &label))
- return label;
- }
-
- label = gcr_certificate_get_subject_cn (GCR_CERTIFICATE (self));
- if (label != NULL)
- return label;
-
- return g_strdup (_("Certificate"));
-}
-
-static gboolean
-append_extension_basic_constraints (GcrRenderer *renderer,
- GcrDisplayView *view,
- GBytes *data)
-{
- gboolean is_ca = FALSE;
- gint path_len = -1;
- gchar *number;
-
- if (!_gcr_certificate_extension_basic_constraints (data, &is_ca, &path_len))
- return FALSE;
-
- _gcr_display_view_append_heading (view, renderer, _("Basic Constraints"));
-
- _gcr_display_view_append_value (view, renderer, _("Certificate Authority"),
- is_ca ? _("Yes") : _("No"), FALSE);
-
- number = g_strdup_printf ("%d", path_len);
- _gcr_display_view_append_value (view, renderer, _("Max Path Length"),
- path_len < 0 ? _("Unlimited") : number, FALSE);
- g_free (number);
-
- return TRUE;
-}
-
-static gboolean
-append_extension_extended_key_usage (GcrRenderer *renderer,
- GcrDisplayView *view,
- GBytes *data)
-{
- GQuark *oids;
- GString *text;
- guint i;
-
- oids = _gcr_certificate_extension_extended_key_usage (data);
- if (oids == NULL)
- return FALSE;
-
- _gcr_display_view_append_heading (view, renderer, _("Extended Key Usage"));
-
- text = g_string_new ("");
- for (i = 0; oids[i] != 0; i++) {
- if (i > 0)
- g_string_append_unichar (text, GCR_DISPLAY_VIEW_LINE_BREAK);
- g_string_append (text, egg_oid_get_description (oids[i]));
- }
-
- g_free (oids);
-
- _gcr_display_view_append_value (view, renderer, _("Allowed Purposes"),
- text->str, FALSE);
-
- g_string_free (text, TRUE);
-
- return TRUE;
-}
-
-static gboolean
-append_extension_subject_key_identifier (GcrRenderer *renderer,
- GcrDisplayView *view,
- GBytes *data)
-{
- gpointer keyid;
- gsize n_keyid;
-
- keyid = _gcr_certificate_extension_subject_key_identifier (data, &n_keyid);
- if (keyid == NULL)
- return FALSE;
-
- _gcr_display_view_append_heading (view, renderer, _("Subject Key Identifier"));
- _gcr_display_view_append_hex (view, renderer, _("Key Identifier"), keyid, n_keyid);
-
- g_free (keyid);
-
- return TRUE;
-}
-
-static const struct {
- guint usage;
- const gchar *description;
-} usage_descriptions[] = {
- { GCR_KEY_USAGE_DIGITAL_SIGNATURE, N_("Digital signature") },
- { GCR_KEY_USAGE_NON_REPUDIATION, N_("Non repudiation") },
- { GCR_KEY_USAGE_KEY_ENCIPHERMENT, N_("Key encipherment") },
- { GCR_KEY_USAGE_DATA_ENCIPHERMENT, N_("Data encipherment") },
- { GCR_KEY_USAGE_KEY_AGREEMENT, N_("Key agreement") },
- { GCR_KEY_USAGE_KEY_CERT_SIGN, N_("Certificate signature") },
- { GCR_KEY_USAGE_CRL_SIGN, N_("Revocation list signature") },
- { GCR_KEY_USAGE_ENCIPHER_ONLY, N_("Encipher only") },
- { GCR_KEY_USAGE_DECIPHER_ONLY, N_("Decipher only") }
-};
-
-static gboolean
-append_extension_key_usage (GcrRenderer *renderer,
- GcrDisplayView *view,
- GBytes *data)
-{
- gulong key_usage;
- GString *text;
- guint i;
-
- if (!_gcr_certificate_extension_key_usage (data, &key_usage))
- return FALSE;
-
- text = g_string_new ("");
-
- for (i = 0; i < G_N_ELEMENTS (usage_descriptions); i++) {
- if (key_usage & usage_descriptions[i].usage) {
- if (text->len > 0)
- g_string_append_unichar (text, GCR_DISPLAY_VIEW_LINE_BREAK);
- g_string_append (text, _(usage_descriptions[i].description));
- }
- }
-
- _gcr_display_view_append_heading (view, renderer, _("Key Usage"));
- _gcr_display_view_append_value (view, renderer, _("Usages"), text->str, FALSE);
-
- g_string_free (text, TRUE);
-
- return TRUE;
-}
-
-static gboolean
-append_extension_subject_alt_name (GcrRenderer *renderer,
- GcrDisplayView *view,
- GBytes *data)
-{
- GArray *general_names;
- GcrGeneralName *general;
- guint i;
-
- general_names = _gcr_certificate_extension_subject_alt_name (data);
- if (general_names == NULL)
- return FALSE;
-
- _gcr_display_view_append_heading (view, renderer, _("Subject Alternative Names"));
-
- for (i = 0; i < general_names->len; i++) {
- general = &g_array_index (general_names, GcrGeneralName, i);
- if (general->display == NULL)
- _gcr_display_view_append_hex (view, renderer, general->description,
- g_bytes_get_data (general->raw, NULL),
- g_bytes_get_size (general->raw));
- else
- _gcr_display_view_append_value (view, renderer, general->description,
- general->display, FALSE);
- }
-
- _gcr_general_names_free (general_names);
-
- return TRUE;
-}
-
-static gboolean
-append_extension_hex (GcrRenderer *renderer,
- GcrDisplayView *view,
- GQuark oid,
- gconstpointer data,
- gsize n_data)
-{
- const gchar *text;
-
- _gcr_display_view_append_heading (view, renderer, _("Extension"));
-
- /* Extension type */
- text = egg_oid_get_description (oid);
- _gcr_display_view_append_value (view, renderer, _("Identifier"), text, FALSE);
- _gcr_display_view_append_hex (view, renderer, _("Value"), data, n_data);
-
- return TRUE;
-}
-
-static void
-on_export_completed (GObject *source, GAsyncResult *result, gpointer user_data)
-{
- GtkWindow *parent = GTK_WINDOW (user_data);
- GcrCertificateExporter *exporter = GCR_CERTIFICATE_EXPORTER (source);
- GError *error = NULL;
- GtkWidget *dialog;
-
- if (!_gcr_certificate_exporter_export_finish (exporter, result, &error)) {
- if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
- dialog = gtk_message_dialog_new_with_markup (parent,
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK, "<big>%s</big>\n\n%s",
- _("Couldn’t export the certificate."),
- error->message);
- gtk_widget_show (dialog);
- g_signal_connect (dialog, "delete-event",
- G_CALLBACK (gtk_widget_destroy), dialog);
- g_signal_connect_swapped(dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog);
- }
- }
-
- /* Matches ref in on_certificate_export */
- if (parent)
- g_object_unref (parent);
-}
-
-static void
-on_certificate_export (GtkMenuItem *menuitem, gpointer user_data)
-{
- GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (user_data);
- GcrCertificateExporter *exporter;
- gchar *label;
- GtkWidget *parent;
-
- label = calculate_label (self);
-
- parent = gtk_widget_get_toplevel (GTK_WIDGET (menuitem));
- if (parent && !GTK_IS_WINDOW (parent))
- parent = NULL;
-
- exporter = _gcr_certificate_exporter_new (GCR_CERTIFICATE (self), label,
- GTK_WINDOW (parent));
-
- g_free (label);
-
- _gcr_certificate_exporter_export_async (exporter, NULL, on_export_completed,
- parent ? g_object_ref (parent) : NULL);
-}
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static void
-gcr_certificate_renderer_init (GcrCertificateRenderer *self)
-{
- self->pv = gcr_certificate_renderer_get_instance_private (self);
-}
-
-static void
-gcr_certificate_renderer_dispose (GObject *obj)
-{
- GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj);
-
- if (self->pv->opt_cert)
- g_object_unref (self->pv->opt_cert);
- self->pv->opt_cert = NULL;
-
- G_OBJECT_CLASS (gcr_certificate_renderer_parent_class)->dispose (obj);
-}
-
-static void
-gcr_certificate_renderer_finalize (GObject *obj)
-{
- GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj);
-
- g_assert (!self->pv->opt_cert);
-
- if (self->pv->opt_attrs)
- gck_attributes_unref (self->pv->opt_attrs);
- self->pv->opt_attrs = NULL;
-
- g_free (self->pv->label);
- self->pv->label = NULL;
-
- G_OBJECT_CLASS (gcr_certificate_renderer_parent_class)->finalize (obj);
-}
-
-static void
-gcr_certificate_renderer_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_CERTIFICATE:
- gcr_certificate_renderer_set_certificate (self, g_value_get_object (value));
- break;
- case PROP_LABEL:
- g_free (self->pv->label);
- self->pv->label = g_value_dup_string (value);
- g_object_notify (obj, "label");
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- break;
- case PROP_ATTRIBUTES:
- gck_attributes_unref (self->pv->opt_attrs);
- self->pv->opt_attrs = g_value_get_boxed (value);
- if (self->pv->opt_attrs)
- gck_attributes_ref (self->pv->opt_attrs);
- if (self->pv->opt_cert) {
- g_object_unref (self->pv->opt_cert);
- g_object_notify (G_OBJECT (self), "certificate");
- self->pv->opt_cert = NULL;
- }
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- g_object_notify (G_OBJECT (self), "attributes");
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_certificate_renderer_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_CERTIFICATE:
- g_value_set_object (value, self->pv->opt_cert);
- break;
- case PROP_LABEL:
- g_value_take_string (value, calculate_label (self));
- break;
- case PROP_ATTRIBUTES:
- g_value_set_boxed (value, self->pv->opt_attrs);
- break;
- default:
- gcr_certificate_mixin_get_property (obj, prop_id, value, pspec);
- break;
- }
-}
-
-static void
-gcr_certificate_renderer_class_init (GcrCertificateRendererClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GckBuilder builder = GCK_BUILDER_INIT;
-
- gcr_certificate_renderer_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->dispose = gcr_certificate_renderer_dispose;
- gobject_class->finalize = gcr_certificate_renderer_finalize;
- gobject_class->set_property = gcr_certificate_renderer_set_property;
- gobject_class->get_property = gcr_certificate_renderer_get_property;
-
- /**
- * GcrCertificateRenderer:certificate:
- *
- * The certificate to display. May be %NULL.
- */
- g_object_class_install_property (gobject_class, PROP_CERTIFICATE,
- g_param_spec_object ("certificate", "Certificate", "Certificate to display.",
- GCR_TYPE_CERTIFICATE,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrCertificateRenderer:attributes:
- *
- * The certificate attributes to display. One of the attributes must be
- * a CKA_VALUE type attribute which contains a DER encoded certificate.
- */
- g_object_class_install_property (gobject_class, PROP_ATTRIBUTES,
- g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrCertificateRenderer:label:
- *
- * The label to display.
- */
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "Label", "Certificate Label",
- "",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- gcr_certificate_mixin_class_init (gobject_class);
-
- /* Register this as a renderer which can be loaded */
- gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE);
- gcr_renderer_register (GCR_TYPE_CERTIFICATE_RENDERER, gck_builder_end (&builder));
-}
-
-static void
-gcr_certificate_renderer_render (GcrRenderer *renderer, GcrViewer *viewer)
-{
- GcrCertificateRenderer *self;
- GNode *extension;
- gconstpointer data;
- gsize n_data;
- GcrDisplayView *view;
- GcrCertificate *cert;
- GBytes *number;
- gulong version;
- guint bits, index;
- gchar *display;
- GBytes *bytes;
- GNode *asn;
- GDate date;
- GIcon *icon;
-
- self = GCR_CERTIFICATE_RENDERER (renderer);
-
- if (GCR_IS_DISPLAY_VIEW (viewer)) {
- view = GCR_DISPLAY_VIEW (viewer);
-
- } else {
- g_warning ("GcrCertificateRenderer only works with internal specific "
- "GcrViewer returned by gcr_viewer_new().");
- return;
- }
-
- _gcr_display_view_begin (view, renderer);
- cert = GCR_CERTIFICATE (self);
-
- data = gcr_certificate_get_der_data (cert, &n_data);
- if (!data) {
- _gcr_display_view_end (view, renderer);
- return;
- }
-
- icon = gcr_certificate_get_icon (cert);
- _gcr_display_view_set_icon (view, GCR_RENDERER (self), icon);
- g_object_unref (icon);
-
- bytes = g_bytes_new_static (data, n_data);
- asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", bytes);
- g_return_if_fail (asn != NULL);
- g_bytes_unref (bytes);
-
- display = calculate_label (self);
- _gcr_display_view_append_title (view, renderer, display);
- g_free (display);
-
- display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL), "CN");
- _gcr_display_view_append_content (view, renderer, _("Identity"), display);
- g_free (display);
-
- display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL), "CN");
- _gcr_display_view_append_content (view, renderer, _("Verified by"), display);
- g_free (display);
-
- if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) {
- display = g_malloc0 (128);
- if (!g_date_strftime (display, 128, "%x", &date))
- g_return_if_reached ();
- _gcr_display_view_append_content (view, renderer, _("Expires"), display);
- g_free (display);
- }
-
- _gcr_display_view_start_details (view, renderer);
-
- /* The subject */
- _gcr_display_view_append_heading (view, renderer, _("Subject Name"));
- _gcr_certificate_renderer_append_distinguished_name (renderer, view,
- egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL));
-
- /* The Issuer */
- _gcr_display_view_append_heading (view, renderer, _("Issuer Name"));
- _gcr_certificate_renderer_append_distinguished_name (renderer, view,
- egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL));
-
- /* The Issued Parameters */
- _gcr_display_view_append_heading (view, renderer, _("Issued Certificate"));
-
- if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "tbsCertificate", "version", NULL), &version))
- g_return_if_reached ();
- display = g_strdup_printf ("%lu", version + 1);
- _gcr_display_view_append_value (view, renderer, _("Version"), display, FALSE);
- g_free (display);
-
- number = egg_asn1x_get_integer_as_raw (egg_asn1x_node (asn, "tbsCertificate", "serialNumber", NULL));
- g_return_if_fail (number != NULL);
- _gcr_display_view_append_hex (view, renderer, _("Serial Number"),
- g_bytes_get_data (number, NULL),
- g_bytes_get_size (number));
- g_bytes_unref (number);
-
- display = g_malloc0 (128);
- if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notBefore", NULL), &date)) {
- if (!g_date_strftime (display, 128, "%Y-%m-%d", &date))
- g_return_if_reached ();
- _gcr_display_view_append_value (view, renderer, _("Not Valid Before"), display, FALSE);
- }
- if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) {
- if (!g_date_strftime (display, 128, "%Y-%m-%d", &date))
- g_return_if_reached ();
- _gcr_display_view_append_value (view, renderer, _("Not Valid After"), display, FALSE);
- }
- g_free (display);
-
- /* Fingerprints */
- _gcr_display_view_append_heading (view, renderer, _("Certificate Fingerprints"));
-
- _gcr_display_view_append_fingerprint (view, renderer, data, n_data, "SHA1", G_CHECKSUM_SHA1);
- _gcr_display_view_append_fingerprint (view, renderer, data, n_data, "MD5", G_CHECKSUM_MD5);
-
- /* Public Key Info */
- _gcr_display_view_append_heading (view, renderer, _("Public Key Info"));
- bits = gcr_certificate_get_key_size (cert);
- _gcr_certificate_renderer_append_subject_public_key (renderer, view, bits,
- egg_asn1x_node (asn, "tbsCertificate",
- "subjectPublicKeyInfo", NULL));
-
- /* Extensions */
- for (index = 1; TRUE; ++index) {
- extension = egg_asn1x_node (asn, "tbsCertificate", "extensions", index, NULL);
- if (extension == NULL)
- break;
- _gcr_certificate_renderer_append_extension (renderer, view, extension);
- }
-
- /* Signature */
- _gcr_display_view_append_heading (view, renderer, _("Signature"));
- _gcr_certificate_renderer_append_signature (renderer, view, asn);
-
- egg_asn1x_destroy (asn);
- _gcr_display_view_end (view, renderer);
-}
-
-static void
-gcr_certificate_renderer_populate_popup (GcrRenderer *self, GcrViewer *viewer,
- GtkMenu *menu)
-{
- GtkWidget *item;
-
- item = gtk_separator_menu_item_new ();
- gtk_widget_show (item);
- gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item);
-
- item = gtk_menu_item_new_with_label (_("Export Certificate\xE2\x80\xA6"));
- gtk_widget_show (item);
- g_signal_connect_data (item, "activate", G_CALLBACK (on_certificate_export),
- g_object_ref (self), (GClosureNotify)g_object_unref, 0);
- gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item);
-}
-
-static void
-gcr_renderer_iface_init (GcrRendererIface *iface)
-{
- iface->populate_popup = gcr_certificate_renderer_populate_popup;
- iface->render_view = gcr_certificate_renderer_render;
-}
-
-static const guchar *
-gcr_certificate_renderer_get_der_data (GcrCertificate *cert,
- gsize *n_data)
-{
- GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (cert);
- const GckAttribute *attr;
-
- g_assert (n_data);
-
- if (self->pv->opt_cert)
- return gcr_certificate_get_der_data (self->pv->opt_cert, n_data);
-
- if (self->pv->opt_attrs) {
- attr = gck_attributes_find (self->pv->opt_attrs, CKA_VALUE);
- g_return_val_if_fail (attr, NULL);
- *n_data = attr->length;
- return attr->value;
- }
-
- return NULL;
-}
-
-static void
-gcr_renderer_certificate_iface_init (GcrCertificateIface *iface)
-{
- iface->get_der_data = gcr_certificate_renderer_get_der_data;
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_certificate_renderer_new:
- * @certificate: The certificate to display
- *
- * Create a new certificate renderer to display the certificate.
- *
- * Returns: (transfer full): a newly allocated #GcrCertificateRenderer, which
- * should be released with g_object_unref()
- */
-GcrCertificateRenderer *
-gcr_certificate_renderer_new (GcrCertificate *certificate)
-{
- return g_object_new (GCR_TYPE_CERTIFICATE_RENDERER, "certificate", certificate, NULL);
-}
-
-/**
- * gcr_certificate_renderer_new_for_attributes:
- * @label: (nullable): the label to display
- * @attrs: The attributes to display
- *
- * Create a new certificate renderer to display the label and attributes. One
- * of the attributes should be a CKA_VALUE type attribute containing a DER
- * encoded certificate.
- *
- * Returns: (transfer full): a newly allocated #GcrCertificateRenderer, which
- * should be released with g_object_unref()
- */
-GcrCertificateRenderer *
-gcr_certificate_renderer_new_for_attributes (const gchar *label, struct _GckAttributes *attrs)
-{
- return g_object_new (GCR_TYPE_CERTIFICATE_RENDERER, "label", label, "attributes", attrs, NULL);
-}
-
-/**
- * gcr_certificate_renderer_get_certificate:
- * @self: The renderer
- *
- * Get the certificate displayed in the renderer. If no certificate was
- * explicitly set, then the renderer will return itself since it acts as
- * a valid certificate.
- *
- * Returns: (transfer none): The certificate, owned by the renderer.
- */
-GcrCertificate *
-gcr_certificate_renderer_get_certificate (GcrCertificateRenderer *self)
-{
- g_return_val_if_fail (GCR_IS_CERTIFICATE_RENDERER (self), NULL);
- if (self->pv->opt_cert)
- return self->pv->opt_cert;
- return GCR_CERTIFICATE (self);
-}
-
-/**
- * gcr_certificate_renderer_set_certificate:
- * @self: The renderer
- * @certificate: (nullable): the certificate to display
- *
- * Set a certificate to display in the renderer.
- */
-void
-gcr_certificate_renderer_set_certificate (GcrCertificateRenderer *self, GcrCertificate *certificate)
-{
- g_return_if_fail (GCR_IS_CERTIFICATE_RENDERER (self));
-
- if (self->pv->opt_cert)
- g_object_unref (self->pv->opt_cert);
- self->pv->opt_cert = certificate;
- if (self->pv->opt_cert)
- g_object_ref (self->pv->opt_cert);
-
- if (self->pv->opt_attrs) {
- gck_attributes_unref (self->pv->opt_attrs);
- self->pv->opt_attrs = NULL;
- }
-
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- g_object_notify (G_OBJECT (self), "certificate");
-}
-
-/**
- * gcr_certificate_renderer_get_attributes:
- * @self: The renderer
- *
- * Get the PKCS#11 attributes, if any, set for this renderer to display.
- *
- * Returns: (nullable) (transfer none): the attributes, owned by the renderer
- *
- * Deprecated: 3.6: Use gcr_renderer_get_attributes() instead
- */
-GckAttributes *
-gcr_certificate_renderer_get_attributes (GcrCertificateRenderer *self)
-{
- g_return_val_if_fail (GCR_IS_CERTIFICATE_RENDERER (self), NULL);
- return gcr_renderer_get_attributes (GCR_RENDERER (self));
-}
-
-/**
- * gcr_certificate_renderer_set_attributes:
- * @self: The renderer
- * @attrs: (nullable): attributes to set
- *
- * Set the PKCS#11 attributes for this renderer to display. One of the attributes
- * should be a `CKA_VALUE` type attribute containing a DER encoded certificate.
- *
- * Deprecated: 3.6: Use gcr_renderer_set_attributes() instead
- */
-void
-gcr_certificate_renderer_set_attributes (GcrCertificateRenderer *self, GckAttributes *attrs)
-{
- g_return_if_fail (GCR_IS_CERTIFICATE_RENDERER (self));
- gcr_renderer_set_attributes (GCR_RENDERER (self), attrs);
-}
-
-typedef struct {
- GcrRenderer *renderer;
- GcrDisplayView *view;
-} AppendDnClosure;
-
-static void
-on_parsed_dn_part (guint index,
- GQuark oid,
- GNode *value,
- gpointer user_data)
-{
- GcrRenderer *renderer = ((AppendDnClosure *)user_data)->renderer;
- GcrDisplayView *view = ((AppendDnClosure *)user_data)->view;
- const gchar *attr;
- const gchar *desc;
- gchar *field = NULL;
- gchar *display;
-
- attr = egg_oid_get_name (oid);
- desc = egg_oid_get_description (oid);
-
- /* Combine them into something sane */
- if (attr && desc) {
- if (strcmp (attr, desc) == 0)
- field = g_strdup (attr);
- else
- field = g_strdup_printf ("%s (%s)", attr, desc);
- } else if (!attr && !desc) {
- field = g_strdup ("");
- } else if (attr) {
- field = g_strdup (attr);
- } else if (desc) {
- field = g_strdup (desc);
- } else {
- g_assert_not_reached ();
- }
-
- display = egg_dn_print_value (oid, value);
- if (display == NULL)
- display = g_strdup ("");
-
- _gcr_display_view_append_value (view, renderer, field, display, FALSE);
- g_free (field);
- g_free (display);
-}
-
-
-void
-_gcr_certificate_renderer_append_distinguished_name (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *dn)
-{
- AppendDnClosure closure;
-
- g_return_if_fail (GCR_IS_RENDERER (renderer));
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (view));
- g_return_if_fail (dn != NULL);
-
- closure.renderer = renderer;
- closure.view = view;
- egg_dn_parse (dn, on_parsed_dn_part, &closure);
-}
-
-void
-_gcr_certificate_renderer_append_subject_public_key (GcrRenderer *renderer,
- GcrDisplayView *view,
- guint key_nbits,
- GNode *subject_public_key)
-{
- const gchar *text;
- gchar *display;
- GBytes *value;
- guchar *raw;
- gsize n_raw;
- GQuark oid;
- guint bits;
-
- oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (subject_public_key,
- "algorithm", "algorithm", NULL));
- text = egg_oid_get_description (oid);
- _gcr_display_view_append_value (view, renderer, _("Key Algorithm"), text, FALSE);
-
- value = egg_asn1x_get_element_raw (egg_asn1x_node (subject_public_key,
- "algorithm", "parameters", NULL));
- if (value) {
- _gcr_display_view_append_hex (view, renderer, _("Key Parameters"),
- g_bytes_get_data (value, NULL),
- g_bytes_get_size (value));
- g_bytes_unref (value);
- }
-
- if (key_nbits > 0) {
- display = g_strdup_printf ("%u", key_nbits);
- _gcr_display_view_append_value (view, renderer, _("Key Size"), display, FALSE);
- g_free (display);
- }
-
- value = egg_asn1x_get_element_raw (subject_public_key);
- raw = gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (value, NULL),
- g_bytes_get_size (value),
- G_CHECKSUM_SHA1, &n_raw);
- _gcr_display_view_append_hex (view, renderer, _("Key SHA1 Fingerprint"), raw, n_raw);
- g_bytes_unref (value);
- g_free (raw);
-
- value = egg_asn1x_get_bits_as_raw (egg_asn1x_node (subject_public_key, "subjectPublicKey", NULL), &bits);
- _gcr_display_view_append_hex (view, renderer, _("Public Key"),
- g_bytes_get_data (value, NULL), bits / 8);
- g_bytes_unref (value);
-}
-
-void
-_gcr_certificate_renderer_append_signature (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *asn)
-{
- const gchar *text;
- GBytes *value;
- GQuark oid;
- guint bits;
-
- oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "signatureAlgorithm", "algorithm", NULL));
- text = egg_oid_get_description (oid);
- _gcr_display_view_append_value (view, renderer, _("Signature Algorithm"), text, FALSE);
-
- value = egg_asn1x_get_element_raw (egg_asn1x_node (asn, "signatureAlgorithm", "parameters", NULL));
- if (value) {
- _gcr_display_view_append_hex (view, renderer, _("Signature Parameters"),
- g_bytes_get_data (value, NULL),
- g_bytes_get_size (value));
- g_bytes_unref (value);
- }
-
- value = egg_asn1x_get_bits_as_raw (egg_asn1x_node (asn, "signature", NULL), &bits);
- _gcr_display_view_append_hex (view, renderer, _("Signature"),
- g_bytes_get_data (value, NULL), bits / 8);
- g_bytes_unref (value);
-}
-
-void
-_gcr_certificate_renderer_append_extension (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *node)
-{
- GQuark oid;
- GBytes *value;
- gboolean critical;
- gboolean ret = FALSE;
-
- /* Dig out the OID */
- oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (node, "extnID", NULL));
- g_return_if_fail (oid);
-
- /* Extension value */
- value = egg_asn1x_get_string_as_bytes (egg_asn1x_node (node, "extnValue", NULL));
-
- /* The custom parsers */
- if (oid == GCR_OID_BASIC_CONSTRAINTS)
- ret = append_extension_basic_constraints (renderer, view, value);
- else if (oid == GCR_OID_EXTENDED_KEY_USAGE)
- ret = append_extension_extended_key_usage (renderer, view, value);
- else if (oid == GCR_OID_SUBJECT_KEY_IDENTIFIER)
- ret = append_extension_subject_key_identifier (renderer, view, value);
- else if (oid == GCR_OID_KEY_USAGE)
- ret = append_extension_key_usage (renderer, view, value);
- else if (oid == GCR_OID_SUBJECT_ALT_NAME)
- ret = append_extension_subject_alt_name (renderer, view, value);
-
- /* Otherwise the default raw display */
- if (ret == FALSE)
- ret = append_extension_hex (renderer, view, oid,
- g_bytes_get_data (value, NULL),
- g_bytes_get_size (value));
-
- /* Critical */
- if (ret == TRUE && egg_asn1x_get_boolean (egg_asn1x_node (node, "critical", NULL), &critical)) {
- _gcr_display_view_append_value (view, renderer, _("Critical"),
- critical ? _("Yes") : _("No"), FALSE);
- }
-}
diff --git a/ui/gcr-certificate-renderer.h b/ui/gcr-certificate-renderer.h
deleted file mode 100644
index c5a6c92..0000000
--- a/ui/gcr-certificate-renderer.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_CERTIFICATE_RENDERER_H__
-#define __GCR_CERTIFICATE_RENDERER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-certificate.h"
-#include "gcr/gcr-types.h"
-
-#include "gcr-renderer.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_CERTIFICATE_RENDERER (gcr_certificate_renderer_get_type ())
-#define GCR_CERTIFICATE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_RENDERER, GcrCertificateRenderer))
-#define GCR_CERTIFICATE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_RENDERER, GcrCertificateRendererClass))
-#define GCR_IS_CERTIFICATE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_RENDERER))
-#define GCR_IS_CERTIFICATE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_RENDERER))
-#define GCR_CERTIFICATE_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_RENDERER, GcrCertificateRendererClass))
-
-typedef struct _GcrCertificateRenderer GcrCertificateRenderer;
-typedef struct _GcrCertificateRendererClass GcrCertificateRendererClass;
-typedef struct _GcrCertificateRendererPrivate GcrCertificateRendererPrivate;
-
-struct _GcrCertificateRenderer {
- GObject parent;
-
- /*< private >*/
- GcrCertificateRendererPrivate *pv;
-};
-
-struct _GcrCertificateRendererClass {
- GObjectClass parent_class;
-};
-
-GType gcr_certificate_renderer_get_type (void);
-
-GcrCertificateRenderer* gcr_certificate_renderer_new (GcrCertificate *certificate);
-
-GcrCertificateRenderer* gcr_certificate_renderer_new_for_attributes (const gchar *label,
- struct _GckAttributes *attrs);
-
-GcrCertificate* gcr_certificate_renderer_get_certificate (GcrCertificateRenderer *self);
-
-void gcr_certificate_renderer_set_certificate (GcrCertificateRenderer *self,
- GcrCertificate *certificate);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrCertificateRenderer, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_CERTIFICATE_RENDERER_H__ */
diff --git a/ui/gcr-certificate-request-renderer.c b/ui/gcr-certificate-request-renderer.c
deleted file mode 100644
index f239a9b..0000000
--- a/ui/gcr-certificate-request-renderer.c
+++ /dev/null
@@ -1,531 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr/gcr-oids.h"
-#include "gcr/gcr-subject-public-key.h"
-
-#include "gcr-certificate-renderer-private.h"
-#include "gcr-certificate-request-renderer.h"
-#include "gcr-display-view.h"
-
-#include "egg/egg-asn1x.h"
-#include "egg/egg-asn1-defs.h"
-#include "egg/egg-dn.h"
-#include "egg/egg-oid.h"
-
-#include "gck/gck.h"
-
-#include <glib/gi18n-lib.h>
-
-/**
- * GcrCertificateRequestRenderer:
- *
- * An implementation of #GcrRenderer which renders certificate requests
- */
-
-/**
- * GcrCertificateRequestRendererClass:
- * @parent_class: The parent class
- *
- * The class for #GcrCertificateRequestRenderer
- */
-
-enum {
- PROP_0,
- PROP_LABEL,
- PROP_ATTRIBUTES
-};
-
-struct _GcrCertificateRequestRendererPrivate {
- GckAttributes *attrs;
- gchar *label;
-
- guint key_size;
- gulong type;
- GNode *asn;
-};
-
-static void _gcr_certificate_request_renderer_iface (GcrRendererIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GcrCertificateRequestRenderer, _gcr_certificate_request_renderer, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrCertificateRequestRenderer);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, _gcr_certificate_request_renderer_iface);
-);
-
-static gchar*
-calculate_label (GcrCertificateRequestRenderer *self)
-{
- gchar *label = NULL;
-
- if (self->pv->label)
- return g_strdup (self->pv->label);
-
- if (self->pv->attrs) {
- if (gck_attributes_find_string (self->pv->attrs, CKA_LABEL, &label))
- return label;
- }
-
- if (self->pv->asn && self->pv->type == CKQ_GCR_PKCS10) {
- label = egg_dn_read_part (egg_asn1x_node (self->pv->asn,
- "certificationRequestInfo",
- "subject",
- "rdnSequence",
- NULL), "CN");
- }
-
- if (label != NULL)
- return label;
-
- return g_strdup (_("Certificate request"));
-}
-
-static void
-_gcr_certificate_request_renderer_init (GcrCertificateRequestRenderer *self)
-{
- self->pv = _gcr_certificate_request_renderer_get_instance_private (self);
-}
-
-static void
-_gcr_certificate_request_renderer_finalize (GObject *obj)
-{
- GcrCertificateRequestRenderer *self = GCR_CERTIFICATE_REQUEST_RENDERER (obj);
-
- if (self->pv->attrs)
- gck_attributes_unref (self->pv->attrs);
- self->pv->attrs = NULL;
-
- g_free (self->pv->label);
- self->pv->label = NULL;
-
- egg_asn1x_destroy (self->pv->asn);
-
- G_OBJECT_CLASS (_gcr_certificate_request_renderer_parent_class)->finalize (obj);
-}
-
-static void
-_gcr_certificate_request_renderer_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrCertificateRequestRenderer *self = GCR_CERTIFICATE_REQUEST_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_free (self->pv->label);
- self->pv->label = g_value_dup_string (value);
- g_object_notify (obj, "label");
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- break;
- case PROP_ATTRIBUTES:
- _gcr_certificate_request_renderer_set_attributes (self, g_value_get_boxed (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_certificate_request_renderer_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrCertificateRequestRenderer *self = GCR_CERTIFICATE_REQUEST_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_value_take_string (value, calculate_label (self));
- break;
- case PROP_ATTRIBUTES:
- g_value_set_boxed (value, self->pv->attrs);
- break;
- default:
- gcr_certificate_mixin_get_property (obj, prop_id, value, pspec);
- break;
- }
-}
-
-static void
-_gcr_certificate_request_renderer_class_init (GcrCertificateRequestRendererClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GckBuilder builder = GCK_BUILDER_INIT;
-
- gobject_class->finalize = _gcr_certificate_request_renderer_finalize;
- gobject_class->set_property = _gcr_certificate_request_renderer_set_property;
- gobject_class->get_property = _gcr_certificate_request_renderer_get_property;
-
- /**
- * GcrCertificateRequestRenderer:attributes:
- *
- * The certificate attributes to display. One of the attributes must be
- * a CKA_VALUE type attribute which contains a DER encoded certificate.
- */
- g_object_class_install_property (gobject_class, PROP_ATTRIBUTES,
- g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrCertificateRequestRenderer:label:
- *
- * The label to display.
- */
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "Label", "Certificate Label",
- "",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /* Register this as a renderer which can be loaded */
- gck_builder_add_ulong (&builder, CKA_CLASS, CKO_GCR_CERTIFICATE_REQUEST);
- gck_builder_add_ulong (&builder, CKA_GCR_CERTIFICATE_REQUEST_TYPE, CKQ_GCR_PKCS10);
- gcr_renderer_register (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, gck_builder_end (&builder));
-
- gck_builder_add_ulong (&builder, CKA_CLASS, CKO_GCR_CERTIFICATE_REQUEST);
- gck_builder_add_ulong (&builder, CKA_GCR_CERTIFICATE_REQUEST_TYPE, CKQ_GCR_SPKAC);
- gcr_renderer_register (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, gck_builder_end (&builder));
-}
-
-static gboolean
-append_extension_request (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *attribute)
-{
- GBytes *value;
- GNode *node;
- GNode *asn;
- guint i;
-
- node = egg_asn1x_node (attribute, "values", 1, NULL);
- if (node == NULL)
- return FALSE;
-
- value = egg_asn1x_get_element_raw (node);
- asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "ExtensionRequest", value);
- if (asn == NULL)
- return FALSE;
-
- for (i = 1; TRUE; i++) {
- node = egg_asn1x_node (asn, i, NULL);
- if (node == NULL)
- break;
- _gcr_certificate_renderer_append_extension (renderer, view, node);
- }
-
- egg_asn1x_destroy (asn);
- return TRUE;
-}
-
-static void
-append_attribute (GcrRenderer *renderer,
- GcrDisplayView *view,
- GNode *attribute)
-{
- GQuark oid;
- GBytes *value;
- const gchar *text;
- GNode *node;
- gboolean ret = FALSE;
- gint i;
-
- /* Dig out the OID */
- oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (attribute, "type", NULL));
- g_return_if_fail (oid);
-
- if (oid == GCR_OID_PKCS9_ATTRIBUTE_EXTENSION_REQ)
- ret = append_extension_request (renderer, view, attribute);
-
- if (!ret) {
- _gcr_display_view_append_heading (view, renderer, _("Attribute"));
-
- /* Extension type */
- text = egg_oid_get_description (oid);
- _gcr_display_view_append_value (view, renderer, _("Type"), text, FALSE);
-
- for (i = 1; TRUE; i++) {
- node = egg_asn1x_node (attribute, "values", i, NULL);
- if (node == NULL)
- break;
- value = egg_asn1x_get_element_raw (node);
- _gcr_display_view_append_hex (view, renderer, _("Value"),
- g_bytes_get_data (value, NULL),
- g_bytes_get_size (value));
- g_bytes_unref (value);
- }
- }
-}
-
-static guint
-ensure_key_size (GcrCertificateRequestRenderer *self,
- GNode *public_key)
-{
- if (self->pv->key_size)
- return self->pv->key_size;
-
- self->pv->key_size = _gcr_subject_public_key_calculate_size (public_key);
- return self->pv->key_size;
-}
-
-static void
-render_pkcs10_certificate_req (GcrCertificateRequestRenderer *self,
- GcrDisplayView *view)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- GNode *public_key;
- GNode *attribute;
- GNode *subject;
- gchar *display;
- gulong version;
- guint bits;
- guint i;
-
- display = calculate_label (self);
- _gcr_display_view_append_title (view, renderer, display);
- g_free (display);
-
- _gcr_display_view_append_content (view, renderer, _("Certificate request"), NULL);
-
- subject = egg_asn1x_node (self->pv->asn, "certificationRequestInfo",
- "subject", "rdnSequence", NULL);
- display = egg_dn_read_part (subject, "CN");
- _gcr_display_view_append_content (view, renderer, _("Identity"), display);
- g_free (display);
-
- _gcr_display_view_start_details (view, renderer);
-
- /* The subject */
- _gcr_display_view_append_heading (view, renderer, _("Subject Name"));
- _gcr_certificate_renderer_append_distinguished_name (renderer, view, subject);
-
- /* The certificate request type */
- _gcr_display_view_append_heading (view, renderer, _("Certificate request"));
- _gcr_display_view_append_value (view, renderer, _("Type"), "PKCS#10", FALSE);
- if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (self->pv->asn,
- "certificationRequestInfo",
- "version", NULL), &version))
- g_return_if_reached ();
- display = g_strdup_printf ("%lu", version + 1);
- _gcr_display_view_append_value (view, renderer, _("Version"), display, FALSE);
- g_free (display);
-
- _gcr_display_view_append_heading (view, renderer, _("Public Key Info"));
- public_key = egg_asn1x_node (self->pv->asn, "certificationRequestInfo", "subjectPKInfo", NULL);
- bits = ensure_key_size (self, public_key);
- _gcr_certificate_renderer_append_subject_public_key (renderer, view,
- bits, public_key);
-
- /* Attributes */
- for (i = 1; TRUE; ++i) {
- /* Make sure it is present */
- attribute = egg_asn1x_node (self->pv->asn, "certificationRequestInfo", "attributes", i, NULL);
- if (attribute == NULL)
- break;
- append_attribute (renderer, view, attribute);
- }
-
- /* Signature */
- _gcr_display_view_append_heading (view, renderer, _("Signature"));
- _gcr_certificate_renderer_append_signature (renderer, view, self->pv->asn);
-}
-
-static void
-render_spkac_certificate_req (GcrCertificateRequestRenderer *self,
- GcrDisplayView *view)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- GNode *public_key;
- gchar *display;
- guint bits;
-
- display = calculate_label (self);
- _gcr_display_view_append_title (view, renderer, display);
- g_free (display);
-
- _gcr_display_view_append_content (view, renderer, _("Certificate request"), NULL);
-
- _gcr_display_view_start_details (view, renderer);
-
- /* The certificate request type */
- _gcr_display_view_append_heading (view, renderer, _("Certificate request"));
- _gcr_display_view_append_value (view, renderer, _("Type"), "SPKAC", FALSE);
-
- display = egg_asn1x_get_string_as_utf8 (egg_asn1x_node (self->pv->asn, "publicKeyAndChallenge",
- "challenge", NULL), NULL);
- _gcr_display_view_append_value (view, renderer, _("Challenge"), display, FALSE);
- g_free (display);
-
- _gcr_display_view_append_heading (view, renderer, _("Public Key Info"));
- public_key = egg_asn1x_node (self->pv->asn, "publicKeyAndChallenge", "spki", NULL);
- bits = ensure_key_size (self, public_key);
- _gcr_certificate_renderer_append_subject_public_key (renderer, view,
- bits, public_key);
-
- /* Signature */
- _gcr_display_view_append_heading (view, renderer, _("Signature"));
- _gcr_certificate_renderer_append_signature (renderer, view, self->pv->asn);
-}
-
-static void
-gcr_certificate_request_renderer_render (GcrRenderer *renderer,
- GcrViewer *viewer)
-{
- GcrCertificateRequestRenderer *self;
- GcrDisplayView *view;
- GIcon *icon;
-
- self = GCR_CERTIFICATE_REQUEST_RENDERER (renderer);
-
- if (GCR_IS_DISPLAY_VIEW (viewer)) {
- view = GCR_DISPLAY_VIEW (viewer);
-
- } else {
- g_warning ("GcrCertificateRequestRenderer only works with internal specific "
- "GcrViewer returned by gcr_viewer_new().");
- return;
- }
-
- _gcr_display_view_begin (view, renderer);
-
- icon = g_themed_icon_new ("dialog-question");
- _gcr_display_view_set_icon (view, GCR_RENDERER (self), icon);
- g_object_unref (icon);
-
- switch (self->pv->type) {
- case CKQ_GCR_PKCS10:
- render_pkcs10_certificate_req (self, view);
- break;
- case CKQ_GCR_SPKAC:
- render_spkac_certificate_req (self, view);
- break;
- default:
- g_warning ("unknown request type in GcrCertificateRequestRenderer");
- break;
- }
-
- _gcr_display_view_end (view, renderer);
-}
-
-static void
-_gcr_certificate_request_renderer_iface (GcrRendererIface *iface)
-{
- iface->render_view = gcr_certificate_request_renderer_render;
-}
-
-/**
- * gcr_certificate_request_renderer_new_for_attributes:
- * @label: (nullable): the label to display
- * @attrs: the attributes to display
- *
- * Create a new certificate request renderer to display the label and attributes.
- * One of the attributes should be a CKA_VALUE type attribute containing a DER
- * encoded PKCS#10 certificate request or an SPKAC request.
- *
- * Returns: (transfer full): a newly allocated #GcrCertificateRequestRenderer, which
- * should be released with g_object_unref()
- */
-GcrRenderer *
-_gcr_certificate_request_renderer_new_for_attributes (const gchar *label,
- GckAttributes *attrs)
-{
- return g_object_new (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER,
- "label", label,
- "attributes", attrs,
- NULL);
-}
-
-/**
- * gcr_certificate_request_renderer_get_attributes:
- * @self: the renderer
- *
- * Get the PKCS#11 attributes, if any, set for this renderer to display.
- *
- * Returns: (nullable) (transfer none): the attributes, owned by the renderer
- */
-GckAttributes *
-_gcr_certificate_request_renderer_get_attributes (GcrCertificateRequestRenderer *self)
-{
- g_return_val_if_fail (GCR_IS_CERTIFICATE_REQUEST_RENDERER (self), NULL);
- return self->pv->attrs;
-}
-
-/**
- * gcr_certificate_request_renderer_set_attributes:
- * @self: the renderer
- * @attrs: (nullable): attributes to set
- *
- * Set the PKCS#11 attributes for this renderer to display. One of the attributes
- * should be a `CKA_VALUE` type attribute containing a DER encoded PKCS#10
- * certificate request or an SPKAC request.
- */
-void
-_gcr_certificate_request_renderer_set_attributes (GcrCertificateRequestRenderer *self,
- GckAttributes *attrs)
-{
- const GckAttribute *value;
- GNode *asn = NULL;
- gulong type = 0;
- GBytes *bytes;
-
- g_return_if_fail (GCR_IS_CERTIFICATE_REQUEST_RENDERER (self));
-
- if (attrs) {
- value = gck_attributes_find (attrs, CKA_VALUE);
- if (value == NULL) {
- g_warning ("no CKA_VALUE found in attributes passed to "
- "GcrCertificateRequestRenderer attributes property");
- return;
- }
-
- bytes = g_bytes_new_with_free_func (value->value, value->length,
- gck_attributes_unref, gck_attributes_ref (attrs));
-
- asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "pkcs-10-CertificationRequest", bytes);
- if (asn != NULL) {
- type = CKQ_GCR_PKCS10;
- } else {
- asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "SignedPublicKeyAndChallenge", bytes);
- if (asn != NULL) {
- type = CKQ_GCR_SPKAC;
- } else {
- g_warning ("the data contained in the CKA_VALUE attribute passed to "
- "GcrCertificateRequestRenderer was not valid DER encoded PKCS#10 "
- "or SPKAC");
- }
- }
-
- g_bytes_unref (bytes);
-
- if (type == 0)
- return;
-
- gck_attributes_ref (attrs);
- }
-
- if (self->pv->attrs)
- gck_attributes_unref (self->pv->attrs);
- self->pv->attrs = attrs;
- self->pv->asn = asn;
- self->pv->type = type;
- self->pv->key_size = 0; /* calculated later */
-
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- g_object_notify (G_OBJECT (self), "attributes");
-}
diff --git a/ui/gcr-certificate-request-renderer.h b/ui/gcr-certificate-request-renderer.h
deleted file mode 100644
index d43d8fe..0000000
--- a/ui/gcr-certificate-request-renderer.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_CERTIFICATE_REQUEST_RENDERER_H__
-#define __GCR_CERTIFICATE_REQUEST_RENDERER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-certificate.h"
-#include "gcr/gcr-types.h"
-
-#include "gcr-renderer.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_CERTIFICATE_REQUEST_RENDERER (_gcr_certificate_request_renderer_get_type ())
-#define GCR_CERTIFICATE_REQUEST_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, GcrCertificateRequestRenderer))
-#define GCR_CERTIFICATE_REQUEST_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, GcrCertificateRequestRendererClass))
-#define GCR_IS_CERTIFICATE_REQUEST_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER))
-#define GCR_IS_CERTIFICATE_REQUEST_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER))
-#define GCR_CERTIFICATE_REQUEST_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, GcrCertificateRequestRendererClass))
-
-typedef struct _GcrCertificateRequestRenderer GcrCertificateRequestRenderer;
-typedef struct _GcrCertificateRequestRendererClass GcrCertificateRequestRendererClass;
-typedef struct _GcrCertificateRequestRendererPrivate GcrCertificateRequestRendererPrivate;
-
-struct _GcrCertificateRequestRenderer {
- GObject parent;
-
- /*< private >*/
- GcrCertificateRequestRendererPrivate *pv;
-};
-
-struct _GcrCertificateRequestRendererClass {
- GObjectClass parent_class;
-};
-
-GType _gcr_certificate_request_renderer_get_type (void);
-
-GcrRenderer * _gcr_certificate_request_renderer_new_for_attributes (const gchar *label,
- struct _GckAttributes *attrs);
-
-GckAttributes * _gcr_certificate_request_renderer_get_attributes (GcrCertificateRequestRenderer *self);
-
-void _gcr_certificate_request_renderer_set_attributes (GcrCertificateRequestRenderer *self,
- GckAttributes *attrs);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrCertificateRequestRenderer, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_CERTIFICATE_REQUEST_RENDERER_H__ */
diff --git a/ui/gcr-certificate-widget.c b/ui/gcr-certificate-widget.c
deleted file mode 100644
index 731ccee..0000000
--- a/ui/gcr-certificate-widget.c
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr/gcr-certificate.h"
-
-#include "gcr-certificate-renderer.h"
-#include "gcr-certificate-widget.h"
-#include "gcr-deprecated.h"
-#include "gcr-renderer.h"
-#include "gcr-viewer.h"
-
-#include "gck/gck.h"
-
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
-
-/**
- * GcrCertificateWidget:
- *
- * A widget that can be used to display a certificate.
- *
- * A certificate widget is normally in a collapsed state showing only
- * details, but can be expanded by the user.
- *
- * Use [ctor@CertificateWidget.new] to create a new certificate widget. Only
- * one certificate can be displayed. It contains a [iface@Viewer] internally
- * and [class@CertificateRenderer] is used to render the certificate to the
- * viewer.
- *
- * To show more than one certificate in a view, create the viewer and
- * add renderers to it.
- */
-
-enum {
- PROP_0,
- PROP_CERTIFICATE,
- PROP_ATTRIBUTES
-};
-
-struct _GcrCertificateWidgetPrivate {
- GcrViewer *viewer;
- GcrCertificateRenderer *renderer;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrCertificateWidget, gcr_certificate_widget, GTK_TYPE_BIN);
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static GObject*
-gcr_certificate_widget_constructor (GType type, guint n_props, GObjectConstructParam *props)
-{
- GObject *obj = G_OBJECT_CLASS (gcr_certificate_widget_parent_class)->constructor (type, n_props, props);
- GcrCertificateWidget *self = NULL;
-
- g_return_val_if_fail (obj, NULL);
-
- self = GCR_CERTIFICATE_WIDGET (obj);
-
- self->pv->viewer = gcr_viewer_new_scrolled ();
- gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->pv->viewer));
- gtk_widget_show (GTK_WIDGET (self->pv->viewer));
-
- gcr_viewer_add_renderer (self->pv->viewer, GCR_RENDERER (self->pv->renderer));
- return obj;
-}
-
-static void
-gcr_certificate_widget_init (GcrCertificateWidget *self)
-{
- self->pv = gcr_certificate_widget_get_instance_private (self);
- self->pv->renderer = gcr_certificate_renderer_new (NULL);
-}
-
-static void
-gcr_certificate_widget_finalize (GObject *obj)
-{
- GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (obj);
-
- g_assert (self->pv->renderer);
- g_object_unref (self->pv->renderer);
- self->pv->renderer = NULL;
-
- g_assert (self->pv->viewer);
- self->pv->viewer = NULL;
-
- G_OBJECT_CLASS (gcr_certificate_widget_parent_class)->finalize (obj);
-}
-
-static void
-gcr_certificate_widget_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (obj);
-
- switch (prop_id) {
- case PROP_CERTIFICATE:
- gcr_certificate_widget_set_certificate (self, g_value_get_object (value));
- break;
- case PROP_ATTRIBUTES:
- gcr_certificate_widget_set_attributes (self, g_value_get_boxed (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_certificate_widget_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (obj);
-
- switch (prop_id) {
- case PROP_CERTIFICATE:
- g_value_set_object (value, gcr_certificate_widget_get_certificate (self));
- break;
- case PROP_ATTRIBUTES:
- g_value_set_boxed (value, gcr_certificate_widget_get_attributes (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_certificate_widget_class_init (GcrCertificateWidgetClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gcr_certificate_widget_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->constructor = gcr_certificate_widget_constructor;
- gobject_class->finalize = gcr_certificate_widget_finalize;
- gobject_class->set_property = gcr_certificate_widget_set_property;
- gobject_class->get_property = gcr_certificate_widget_get_property;
-
- g_object_class_install_property (gobject_class, PROP_CERTIFICATE,
- g_param_spec_object("certificate", "Certificate", "Certificate to display.",
- GCR_TYPE_CERTIFICATE,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_ATTRIBUTES,
- g_param_spec_boxed ("attributes", "Attributes", "Attributes which contain the certificate",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_certificate_widget_new:
- * @certificate: (nullable): certificate to display, or %NULL
- *
- * Create a new certificate widget which displays a given certificate.
- *
- * Returns: (transfer full): a new certificate widget
- */
-GcrCertificateWidget *
-gcr_certificate_widget_new (GcrCertificate *certificate)
-{
- return g_object_new (GCR_TYPE_CERTIFICATE_WIDGET, "certificate", certificate, NULL);
-}
-
-/**
- * gcr_certificate_widget_get_certificate:
- * @self: The certificate widget
- *
- * Get the certificate displayed in the widget.
- *
- * Returns: (nullable) (transfer none): the certificate
- */
-GcrCertificate *
-gcr_certificate_widget_get_certificate (GcrCertificateWidget *self)
-{
- g_return_val_if_fail (GCR_IS_CERTIFICATE_WIDGET (self), NULL);
- return gcr_certificate_renderer_get_certificate (self->pv->renderer);
-}
-
-/**
- * gcr_certificate_widget_set_certificate:
- * @self: The certificate widget
- * @certificate: (nullable): the certificate to display
- *
- * Set the certificate displayed in the widget
- */
-void
-gcr_certificate_widget_set_certificate (GcrCertificateWidget *self, GcrCertificate *certificate)
-{
- g_return_if_fail (GCR_IS_CERTIFICATE_WIDGET (self));
- gcr_certificate_renderer_set_certificate (self->pv->renderer, certificate);
-}
-
-/**
- * gcr_certificate_widget_get_attributes:
- * @self: The certificate widget
- *
- * Get the attributes displayed in the widget. The attributes should contain
- * a certificate.
- *
- * Returns: (nullable) (transfer none): the attributes, owned by the widget
- */
-GckAttributes *
-gcr_certificate_widget_get_attributes (GcrCertificateWidget *self)
-{
- g_return_val_if_fail (GCR_IS_CERTIFICATE_WIDGET (self), NULL);
- return gcr_renderer_get_attributes (GCR_RENDERER (self->pv->renderer));
-}
-
-/**
- * gcr_certificate_widget_set_attributes:
- * @self: The certificate widget
- * @attrs: (nullable): the attributes to display
- *
- * Set the attributes displayed in the widget. The attributes should contain
- * a certificate.
- */
-void
-gcr_certificate_widget_set_attributes (GcrCertificateWidget *self,
- GckAttributes *attrs)
-{
- g_return_if_fail (GCR_IS_CERTIFICATE_WIDGET (self));
- gcr_renderer_set_attributes (GCR_RENDERER (self->pv->renderer), attrs);
-}
diff --git a/ui/gcr-certificate-widget.h b/ui/gcr-certificate-widget.h
deleted file mode 100644
index c6727a6..0000000
--- a/ui/gcr-certificate-widget.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_CERTIFICATE_WIDGET_H__
-#define __GCR_CERTIFICATE_WIDGET_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-certificate.h"
-#include "gcr/gcr-types.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_CERTIFICATE_WIDGET (gcr_certificate_widget_get_type ())
-#define GCR_CERTIFICATE_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_WIDGET, GcrCertificateWidget))
-#define GCR_CERTIFICATE_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_WIDGET, GcrCertificateWidgetClass))
-#define GCR_IS_CERTIFICATE_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_WIDGET))
-#define GCR_IS_CERTIFICATE_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_WIDGET))
-#define GCR_CERTIFICATE_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_WIDGET, GcrCertificateWidgetClass))
-
-typedef struct _GcrCertificateWidget GcrCertificateWidget;
-typedef struct _GcrCertificateWidgetClass GcrCertificateWidgetClass;
-typedef struct _GcrCertificateWidgetPrivate GcrCertificateWidgetPrivate;
-
-struct _GcrCertificateWidget {
- /*< private >*/
- GtkBin parent;
- GcrCertificateWidgetPrivate *pv;
-};
-
-struct _GcrCertificateWidgetClass {
- /*< private >*/
- GtkBinClass parent_class;
-};
-
-GType gcr_certificate_widget_get_type (void);
-
-GcrCertificateWidget* gcr_certificate_widget_new (GcrCertificate *certificate);
-
-GcrCertificate* gcr_certificate_widget_get_certificate (GcrCertificateWidget *self);
-
-void gcr_certificate_widget_set_certificate (GcrCertificateWidget *self,
- GcrCertificate *certificate);
-
-GckAttributes * gcr_certificate_widget_get_attributes (GcrCertificateWidget *self);
-
-void gcr_certificate_widget_set_attributes (GcrCertificateWidget *self,
- GckAttributes *attrs);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrCertificateWidget, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_CERTIFICATE_WIDGET_H__ */
diff --git a/ui/gcr-collection-model.c b/ui/gcr-collection-model.c
deleted file mode 100644
index f2d0736..0000000
--- a/ui/gcr-collection-model.c
+++ /dev/null
@@ -1,1654 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr-collection-model.h"
-
-#include "ui/gcr-enum-types.h"
-
-#include <gtk/gtk.h>
-
-#include <string.h>
-#include <unistd.h>
-
-/**
- * GcrCollectionModel:
- *
- * Ain implementation of a [iface@Gtk.TreeModel] which contains a row for each
- * object in a [iface@Gcr.Collection].
- *
- * As objects are added or removed from the collection, rows are added and
- * removed from this model.
- *
- * The row values come from the properties of the objects in the collection. Use
- * [ctor@CollectionModel.new] to create a new collection model. To have more
- * control over the values use a set of [struct@Gcr.Column] structures to
- * define the columns. This can be done with [ctor@CollectionModel.new_full] or
- * [method@CollectionModel.set_columns].
- *
- * Each row can have a selected state, which is represented by a boolean column.
- * The selected state can be toggled with gcr_collection_model_toggle_selected()
- * or set with gcr_collection_model_set_selected_objects() and retrieved with
- * [method@CollectionModel.get_selected_objects].
- *
- * To determine which object a row represents and vice versa, use the
- * [method@CollectionModel.iter_for_object] or
- * [method@CollectionModel.object_for_iter] functions.
- */
-
-/**
- * GcrCollectionModelClass:
- * @parent_class: The parent class
- *
- * The class for #GcrCollectionModel.
- */
-
-/**
- * GcrCollectionModelMode:
- * @GCR_COLLECTION_MODEL_LIST: only objects in the top collection, no child objects
- * @GCR_COLLECTION_MODEL_TREE: show objects in the collection, and child objects in a tree form
- *
- * If a [class@CollectionModel] is created with a mode of
- * %GCR_COLLECTION_MODEL_TREE, then any included objects that are themselves a
- * [iface@Gcr.Collection], will have all child
- * objects include as child rows in a tree form.
- */
-
-#define COLLECTION_MODEL_STAMP 0xAABBCCDD
-
-enum {
- PROP_0,
- PROP_COLLECTION,
- PROP_COLUMNS,
- PROP_MODE
-};
-
-typedef struct {
- GObject *object;
- GSequenceIter *parent;
- GSequence *children;
-} GcrCollectionRow;
-
-typedef struct {
- GtkTreeIterCompareFunc sort_func;
- gpointer user_data;
- GDestroyNotify destroy_func;
-} GcrCollectionSortClosure;
-
-typedef struct _GcrCollectionColumn {
- gchar *property;
- GType *type;
- GtkTreeIterCompareFunc sort_func;
- gpointer sort_data;
- GDestroyNotify sort_destroy;
-} GcrCollectionColumn;
-
-struct _GcrCollectionModelPrivate {
- GcrCollectionModelMode mode;
- GcrCollection *collection;
- GHashTable *selected;
- GSequence *root_sequence;
- GHashTable *object_to_seq;
-
- const GcrColumn *columns;
- guint n_columns;
-
- /* Sort information */
- gint sort_column_id;
- GtkSortType sort_order_type;
- GcrCollectionSortClosure *column_sort_closures;
- GcrCollectionSortClosure default_sort_closure;
-
- /* Sequence ordering information */
- GCompareDataFunc order_current;
- gpointer order_argument;
-};
-
-/* Forward declarations */
-static void gcr_collection_model_tree_model_init (GtkTreeModelIface *iface);
-static void gcr_collection_model_tree_sortable_init (GtkTreeSortableIface *iface);
-
-G_DEFINE_TYPE_EXTENDED (GcrCollectionModel, gcr_collection_model, G_TYPE_OBJECT, 0,
- G_ADD_PRIVATE (GcrCollectionModel);
- G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL, gcr_collection_model_tree_model_init)
- G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_SORTABLE, gcr_collection_model_tree_sortable_init)
-);
-
-typedef gint (*CompareValueFunc) (const GValue *va,
- const GValue *vb);
-
-static gint
-compare_int_value (const GValue *va,
- const GValue *vb)
-{
- gint a = g_value_get_int (va);
- gint b = g_value_get_int (vb);
- if (a > b) return 1;
- else if (a < b) return -1;
- return 0;
-}
-
-static gint
-compare_uint_value (const GValue *va,
- const GValue *vb)
-{
- guint a = g_value_get_uint (va);
- guint b = g_value_get_uint (vb);
- if (a > b) return 1;
- else if (a < b) return -1;
- return 0;
-}
-
-static gint
-compare_long_value (const GValue *va,
- const GValue *vb)
-{
- glong a = g_value_get_long (va);
- glong b = g_value_get_long (vb);
- if (a > b) return 1;
- else if (a < b) return -1;
- return 0;
-}
-
-static gint
-compare_ulong_value (const GValue *va,
- const GValue *vb)
-{
- gulong a = g_value_get_ulong (va);
- gulong b = g_value_get_ulong (vb);
- if (a > b) return 1;
- else if (a < b) return -1;
- return 0;
-}
-
-static gint
-compare_string_value (const GValue *va,
- const GValue *vb)
-{
- const gchar *a = g_value_get_string (va);
- const gchar *b = g_value_get_string (vb);
- gchar *case_a;
- gchar *case_b;
- gboolean ret;
-
- if (a == b)
- return 0;
- else if (!a)
- return -1;
- else if (!b)
- return 1;
-
- case_a = g_utf8_casefold (a, -1);
- case_b = g_utf8_casefold (b, -1);
- ret = g_utf8_collate (case_a, case_b);
- g_free (case_a);
- g_free (case_b);
-
- return ret;
-}
-
-static gint
-compare_date_value (const GValue *va,
- const GValue *vb)
-{
- GDate *a = g_value_get_boxed (va);
- GDate *b = g_value_get_boxed (vb);
-
- if (a == b)
- return 0;
- else if (!a)
- return -1;
- else if (!b)
- return 1;
- else
- return g_date_compare (a, b);
-}
-
-static CompareValueFunc
-lookup_compare_func (GType type)
-{
- switch (type) {
- case G_TYPE_INT:
- return compare_int_value;
- case G_TYPE_UINT:
- return compare_uint_value;
- case G_TYPE_LONG:
- return compare_long_value;
- case G_TYPE_ULONG:
- return compare_ulong_value;
- case G_TYPE_STRING:
- return compare_string_value;
- }
-
- if (type == G_TYPE_DATE)
- return compare_date_value;
-
- return NULL;
-}
-
-static gint
-order_sequence_by_closure (gconstpointer a,
- gconstpointer b,
- gpointer user_data)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data);
- GcrCollectionSortClosure *closure = self->pv->order_argument;
- const GcrCollectionRow *row_a = a;
- const GcrCollectionRow *row_b = b;
- GtkTreeIter iter_a;
- GtkTreeIter iter_b;
-
- g_assert (closure);
- g_assert (closure->sort_func);
-
- if (!gcr_collection_model_iter_for_object (self, row_a->object, &iter_a))
- g_return_val_if_reached (0);
- if (!gcr_collection_model_iter_for_object (self, row_b->object, &iter_b))
- g_return_val_if_reached (0);
-
- return (closure->sort_func) (GTK_TREE_MODEL (self),
- &iter_a, &iter_b, closure->user_data);
-}
-
-static gint
-order_sequence_by_closure_reverse (gconstpointer a,
- gconstpointer b,
- gpointer user_data)
-{
- return 0 - order_sequence_by_closure (a, b, user_data);
-}
-
-static gint
-order_sequence_as_unsorted (gconstpointer a,
- gconstpointer b,
- gpointer user_data)
-{
- const GcrCollectionRow *row_a = a;
- const GcrCollectionRow *row_b = b;
- return GPOINTER_TO_INT (row_a->object) - GPOINTER_TO_INT (row_b->object);
-}
-
-static gint
-order_sequence_as_unsorted_reverse (gconstpointer a,
- gconstpointer b,
- gpointer user_data)
-{
- const GcrCollectionRow *row_a = a;
- const GcrCollectionRow *row_b = b;
- return GPOINTER_TO_INT (row_b->object) - GPOINTER_TO_INT (row_a->object);
-}
-
-static void
-lookup_object_property (GObject *object,
- const gchar *property_name,
- GValue *value)
-{
- if (g_object_class_find_property (G_OBJECT_GET_CLASS (object), property_name))
- g_object_get_property (object, property_name, value);
-
- /* Other types have sane defaults */
- else if (G_VALUE_TYPE (value) == G_TYPE_STRING)
- g_value_set_string (value, "");
-}
-
-static gint
-order_sequence_by_property (gconstpointer a,
- gconstpointer b,
- gpointer user_data)
-{
- const GcrCollectionRow *row_a = a;
- const GcrCollectionRow *row_b = b;
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data);
- const GcrColumn *column = self->pv->order_argument;
- GValue value_a = { 0, };
- GValue value_b = { 0, };
- CompareValueFunc compare;
- gint ret;
-
- g_assert (column);
-
- /* Sort according to property values */
- column = &self->pv->columns[self->pv->sort_column_id];
- g_value_init (&value_a, column->property_type);
- lookup_object_property (row_a->object, column->property_name, &value_a);
- g_value_init (&value_b, column->property_type);
- lookup_object_property (row_b->object, column->property_name, &value_b);
-
- compare = lookup_compare_func (column->property_type);
- g_assert (compare != NULL);
-
- ret = (compare) (&value_a, &value_b);
-
- g_value_unset (&value_a);
- g_value_unset (&value_b);
-
- return ret;
-}
-
-static gint
-order_sequence_by_property_reverse (gconstpointer a,
- gconstpointer b,
- gpointer user_data)
-{
- return 0 - order_sequence_by_property (a, b, user_data);
-}
-
-static GHashTable*
-selected_hash_table_new (void)
-{
- return g_hash_table_new (g_direct_hash, g_direct_equal);
-}
-
-static gboolean
-sequence_iter_to_tree (GcrCollectionModel *self,
- GSequenceIter *seq,
- GtkTreeIter *iter)
-{
- GcrCollectionRow *row;
-
- g_return_val_if_fail (seq != NULL, FALSE);
-
- if (g_sequence_iter_is_end (seq))
- return FALSE;
-
- row = g_sequence_get (seq);
- g_return_val_if_fail (row != NULL && G_IS_OBJECT (row->object), FALSE);
-
- memset (iter, 0, sizeof (*iter));
- iter->stamp = COLLECTION_MODEL_STAMP;
- iter->user_data = row->object;
- iter->user_data2 = seq;
- return TRUE;
-}
-
-static GSequenceIter *
-sequence_iter_for_tree (GcrCollectionModel *self,
- GtkTreeIter *iter)
-{
- g_return_val_if_fail (iter != NULL, NULL);
- g_return_val_if_fail (iter->stamp == COLLECTION_MODEL_STAMP, NULL);
- return iter->user_data2;
-}
-
-static GtkTreePath *
-sequence_iter_to_path (GcrCollectionModel *self,
- GSequenceIter *seq)
-{
- GcrCollectionRow *row;
- GtkTreePath *path;
-
- path = gtk_tree_path_new ();
- while (seq) {
- gtk_tree_path_prepend_index (path, g_sequence_iter_get_position (seq));
- row = g_sequence_get (seq);
- seq = row->parent;
- }
- return path;
-}
-
-static GSequence *
-child_sequence_for_tree (GcrCollectionModel *self,
- GtkTreeIter *iter)
-{
- GcrCollectionRow *row;
- GSequenceIter *seq;
-
- if (iter == NULL) {
- return self->pv->root_sequence;
- } else {
- seq = sequence_iter_for_tree (self, iter);
- g_return_val_if_fail (seq != NULL, NULL);
- row = g_sequence_get (seq);
- return row->children;
- }
-}
-
-static void
-on_object_notify (GObject *object, GParamSpec *spec, GcrCollectionModel *self)
-{
- GtkTreeIter iter;
- GtkTreePath *path;
- gboolean found = FALSE;
- guint i;
-
- g_return_if_fail (spec->name);
-
- for (i = 0; i < self->pv->n_columns - 1; ++i) {
- g_assert (self->pv->columns[i].property_name);
- if (g_str_equal (self->pv->columns[i].property_name, spec->name)) {
- found = TRUE;
- break;
- }
- }
-
- /* Tell the tree view that this row changed */
- if (found) {
- if (!gcr_collection_model_iter_for_object (self, object, &iter))
- g_return_if_reached ();
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (self), &iter);
- g_return_if_fail (path);
- gtk_tree_model_row_changed (GTK_TREE_MODEL (self), path, &iter);
- gtk_tree_path_free (path);
- }
-}
-
-static void
-on_object_gone (gpointer unused, GObject *was_object)
-{
- g_warning ("object contained in GcrCollection and included in GcrCollectionModel "
- "was destroyed before it was removed from the collection");
-}
-
-static void on_collection_added (GcrCollection *collection,
- GObject *object,
- gpointer user_data);
-
-static void on_collection_removed (GcrCollection *collection,
- GObject *object,
- gpointer user_data);
-
-static void add_object_to_sequence (GcrCollectionModel *self,
- GSequence *sequence,
- GSequenceIter *parent,
- GObject *object,
- gboolean emit);
-
-static void remove_object_from_sequence (GcrCollectionModel *self,
- GSequence *sequence,
- GSequenceIter *seq,
- GObject *object,
- gboolean emit);
-
-static void
-add_children_to_sequence (GcrCollectionModel *self,
- GSequence *sequence,
- GSequenceIter *parent,
- GcrCollection *collection,
- GList *children,
- GHashTable *exclude,
- gboolean emit)
-{
- GList *l;
-
- for (l = children; l; l = g_list_next (l)) {
- if (!exclude || g_hash_table_lookup (exclude, l->data) == NULL)
- add_object_to_sequence (self, sequence, parent, l->data, emit);
- }
-
- /* Now listen in for any changes */
- g_signal_connect_after (collection, "added", G_CALLBACK (on_collection_added), self);
- g_signal_connect_after (collection, "removed", G_CALLBACK (on_collection_removed), self);
-}
-
-static void
-add_object_to_sequence (GcrCollectionModel *self,
- GSequence *sequence,
- GSequenceIter *parent,
- GObject *object,
- gboolean emit)
-{
- GcrCollectionRow *row;
- GcrCollection *collection;
- GSequenceIter *seq;
- GtkTreeIter iter;
- GtkTreePath *path;
- GList *children;
-
- g_assert (GCR_IS_COLLECTION_MODEL (self));
- g_assert (G_IS_OBJECT (object));
- g_assert (self->pv->order_current);
-
- if (g_hash_table_lookup (self->pv->object_to_seq, object)) {
- g_warning ("object was already added to the GcrCollectionModel. Perhaps "
- "a loop exists in a tree structure?");
- return;
- }
-
- row = g_slice_new0 (GcrCollectionRow);
- row->object = object;
- row->parent = parent;
- row->children = NULL;
-
- seq = g_sequence_insert_sorted (sequence, row, self->pv->order_current, self);
- g_hash_table_insert (self->pv->object_to_seq, object, seq);
- g_object_weak_ref (G_OBJECT (object), (GWeakNotify)on_object_gone, self);
- g_signal_connect (object, "notify", G_CALLBACK (on_object_notify), self);
-
- if (emit) {
- if (!sequence_iter_to_tree (self, seq, &iter))
- g_assert_not_reached ();
- path = sequence_iter_to_path (self, seq);
- g_assert (path != NULL);
- gtk_tree_model_row_inserted (GTK_TREE_MODEL (self), path, &iter);
- gtk_tree_path_free (path);
- }
-
- if (self->pv->mode == GCR_COLLECTION_MODEL_TREE &&
- GCR_IS_COLLECTION (object)) {
- row->children = g_sequence_new (NULL);
- collection = GCR_COLLECTION (object);
- children = gcr_collection_get_objects (collection);
- add_children_to_sequence (self, row->children, seq,
- collection, children, NULL, emit);
- g_list_free (children);
- }
-}
-
-static void
-on_collection_added (GcrCollection *collection,
- GObject *object,
- gpointer user_data)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data);
- GSequence *sequence;
- GSequenceIter *parent;
- GcrCollectionRow *row;
-
- if (collection == self->pv->collection) {
- sequence = self->pv->root_sequence;
- parent = NULL;
- } else {
- parent = g_hash_table_lookup (self->pv->object_to_seq, G_OBJECT (collection));
- row = g_sequence_get (parent);
- g_assert (row->children);
- sequence = row->children;
- }
-
- add_object_to_sequence (self, sequence, parent, object, TRUE);
-}
-
-static void
-remove_children_from_sequence (GcrCollectionModel *self,
- GSequence *sequence,
- GcrCollection *collection,
- GHashTable *exclude,
- gboolean emit)
-{
- GSequenceIter *seq, *next;
- GcrCollectionRow *row;
-
- g_signal_handlers_disconnect_by_func (collection, on_collection_added, self);
- g_signal_handlers_disconnect_by_func (collection, on_collection_removed, self);
-
- for (seq = g_sequence_get_begin_iter (sequence);
- !g_sequence_iter_is_end (seq); seq = next) {
- next = g_sequence_iter_next (seq);
- row = g_sequence_get (seq);
- if (!exclude || g_hash_table_lookup (exclude, row->object) == NULL)
- remove_object_from_sequence (self, sequence, seq, row->object, emit);
- }
-}
-
-static void
-remove_object_from_sequence (GcrCollectionModel *self,
- GSequence *sequence,
- GSequenceIter *seq,
- GObject *object,
- gboolean emit)
-{
- GcrCollectionRow *row;
- GtkTreePath *path = NULL;
-
- if (emit) {
- path = sequence_iter_to_path (self, seq);
- g_assert (path != NULL);
- }
-
- row = g_sequence_get (seq);
- g_assert (row->object == object);
-
- g_object_weak_unref (object, on_object_gone, self);
- g_signal_handlers_disconnect_by_func (object, on_object_notify, self);
-
- if (row->children) {
- g_assert (self->pv->mode == GCR_COLLECTION_MODEL_TREE);
- g_assert (GCR_IS_COLLECTION (object));
- remove_children_from_sequence (self, row->children,
- GCR_COLLECTION (object), NULL, emit);
- g_assert (g_sequence_get_length (row->children) == 0);
- g_sequence_free (row->children);
- row->children = NULL;
- }
-
- if (self->pv->selected)
- g_hash_table_remove (self->pv->selected, object);
- if (!g_hash_table_remove (self->pv->object_to_seq, object))
- g_assert_not_reached ();
-
- g_sequence_remove (seq);
- g_slice_free (GcrCollectionRow, row);
-
- /* Fire signal for this removed row */
- if (path != NULL) {
- gtk_tree_model_row_deleted (GTK_TREE_MODEL (self), path);
- gtk_tree_path_free (path);
- }
-
-}
-
-static void
-on_collection_removed (GcrCollection *collection,
- GObject *object,
- gpointer user_data)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data);
- GSequenceIter *seq;
- GSequence *sequence;
-
- seq = g_hash_table_lookup (self->pv->object_to_seq, object);
- g_return_if_fail (seq != NULL);
-
- sequence = g_sequence_iter_get_sequence (seq);
- g_assert (sequence != NULL);
-
- remove_object_from_sequence (self, sequence, seq, object, TRUE);
-}
-
-static void
-free_owned_columns (gpointer data)
-{
- GcrColumn *columns;
- g_assert (data);
-
- /* Only the property column is in use */
- for (columns = data; columns->property_name; ++columns)
- g_free ((gchar*)columns->property_name);
- g_free (data);
-}
-
-static GtkTreeModelFlags
-gcr_collection_model_real_get_flags (GtkTreeModel *model)
-{
- return GTK_TREE_MODEL_ITERS_PERSIST;
-}
-
-static gint
-gcr_collection_model_real_get_n_columns (GtkTreeModel *model)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- return self->pv->n_columns;
-}
-
-static GType
-gcr_collection_model_real_get_column_type (GtkTreeModel *model,
- gint column_id)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- g_return_val_if_fail (column_id >= 0 && column_id <= self->pv->n_columns, 0);
-
- /* The last is the selected column */
- if (column_id == self->pv->n_columns)
- return G_TYPE_BOOLEAN;
-
- return self->pv->columns[column_id].column_type;
-}
-
-static gboolean
-gcr_collection_model_real_get_iter (GtkTreeModel *model,
- GtkTreeIter *iter,
- GtkTreePath *path)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- const gint *indices;
- GSequence *sequence;
- GSequenceIter *seq;
- GcrCollectionRow *row;
- gint count;
- gint i;
-
- sequence = self->pv->root_sequence;
- seq = NULL;
-
- indices = gtk_tree_path_get_indices_with_depth (path, &count);
- if (count == 0)
- return FALSE;
-
- for (i = 0; i < count; i++) {
- if (!sequence)
- return FALSE;
- seq = g_sequence_get_iter_at_pos (sequence, indices[i]);
- if (g_sequence_iter_is_end (seq))
- return FALSE;
- row = g_sequence_get (seq);
- sequence = row->children;
- }
-
- return sequence_iter_to_tree (self, seq, iter);
-}
-
-static GtkTreePath*
-gcr_collection_model_real_get_path (GtkTreeModel *model,
- GtkTreeIter *iter)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GSequenceIter *seq;
-
- if (iter == NULL)
- return gtk_tree_path_new ();
-
- seq = sequence_iter_for_tree (self, iter);
- g_return_val_if_fail (seq != NULL, NULL);
- return sequence_iter_to_path (self, seq);
-}
-
-static void
-gcr_collection_model_real_get_value (GtkTreeModel *model,
- GtkTreeIter *iter,
- gint column_id,
- GValue *value)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GObject *object;
- GValue original;
- const GcrColumn *column;
- GParamSpec *spec;
-
- object = gcr_collection_model_object_for_iter (self, iter);
- g_return_if_fail (G_IS_OBJECT (object));
- g_return_if_fail (column_id >= 0 && column_id < self->pv->n_columns);
-
- /* The selected column? Last one */
- if (column_id == self->pv->n_columns - 1) {
- g_value_init (value, G_TYPE_BOOLEAN);
- g_value_set_boolean (value, gcr_collection_model_is_selected (self, iter));
- return;
- }
-
- /* Figure out which property */
- column = &self->pv->columns[column_id];
- g_assert (column->property_name);
- g_value_init (value, column->column_type);
-
- /* Lookup the property on the object */
- spec = g_object_class_find_property (G_OBJECT_GET_CLASS (object), column->property_name);
- if (spec != NULL) {
- /* A transformer is specified, or mismatched types */
- if (column->transformer || column->column_type != column->property_type) {
- memset (&original, 0, sizeof (original));
- g_value_init (&original, column->property_type);
- g_object_get_property (object, column->property_name, &original);
-
- if (column->transformer) {
- (column->transformer) (&original, value);
- } else {
- g_warning ("%s property of %s class was of type %s instead of type %s"
- " and cannot be converted due to lack of transformer",
- column->property_name, G_OBJECT_TYPE_NAME (object),
- g_type_name (column->property_type),
- g_type_name (column->column_type));
- spec = NULL;
- }
-
- /* Simple, no transformation necessary */
- } else {
- g_object_get_property (object, column->property_name, value);
- }
- }
-
- if (spec == NULL) {
-
- /* All the number types have sane defaults */
- if (column->column_type == G_TYPE_STRING)
- g_value_set_string (value, "");
- }
-}
-
-static gboolean
-gcr_collection_model_real_iter_next (GtkTreeModel *model,
- GtkTreeIter *iter)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GSequenceIter *seq = sequence_iter_for_tree (self, iter);
- g_return_val_if_fail (seq != NULL, FALSE);
- return sequence_iter_to_tree (self, g_sequence_iter_next (seq), iter);
-}
-
-static gboolean
-gcr_collection_model_real_iter_children (GtkTreeModel *model,
- GtkTreeIter *iter,
- GtkTreeIter *parent)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GSequence *sequence = child_sequence_for_tree (self, parent);
- return sequence && sequence_iter_to_tree (self, g_sequence_get_begin_iter (sequence), iter);
-}
-
-static gboolean
-gcr_collection_model_real_iter_has_child (GtkTreeModel *model,
- GtkTreeIter *iter)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GSequence *sequence = child_sequence_for_tree (self, iter);
- return sequence && !g_sequence_iter_is_end (g_sequence_get_begin_iter (sequence));
-}
-
-static gint
-gcr_collection_model_real_iter_n_children (GtkTreeModel *model,
- GtkTreeIter *iter)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GSequence *sequence = child_sequence_for_tree (self, iter);
- return sequence ? g_sequence_get_length (sequence) : 0;
-}
-
-static gboolean
-gcr_collection_model_real_iter_nth_child (GtkTreeModel *model,
- GtkTreeIter *iter,
- GtkTreeIter *parent,
- gint n)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GSequence *sequence;
- GSequenceIter *seq;
-
- sequence = child_sequence_for_tree (self, parent);
- if (sequence == NULL)
- return FALSE;
- seq = g_sequence_get_iter_at_pos (sequence, n);
- return sequence_iter_to_tree (self, seq, iter);
-}
-
-static gboolean
-gcr_collection_model_real_iter_parent (GtkTreeModel *model,
- GtkTreeIter *iter,
- GtkTreeIter *child)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (model);
- GSequenceIter *seq;
- GcrCollectionRow *row;
-
- seq = sequence_iter_for_tree (self, child);
- g_return_val_if_fail (seq != NULL, FALSE);
- row = g_sequence_get (seq);
- if (row->parent == NULL)
- return FALSE;
- return sequence_iter_to_tree (self, row->parent, iter);
-}
-
-static void
-gcr_collection_model_real_ref_node (GtkTreeModel *model,
- GtkTreeIter *iter)
-{
- /* Nothing to do */
-}
-
-static void
-gcr_collection_model_real_unref_node (GtkTreeModel *model,
- GtkTreeIter *iter)
-{
- /* Nothing to do */
-}
-
-static void
-gcr_collection_model_tree_model_init (GtkTreeModelIface *iface)
-{
- iface->get_flags = gcr_collection_model_real_get_flags;
- iface->get_n_columns = gcr_collection_model_real_get_n_columns;
- iface->get_column_type = gcr_collection_model_real_get_column_type;
- iface->get_iter = gcr_collection_model_real_get_iter;
- iface->get_path = gcr_collection_model_real_get_path;
- iface->get_value = gcr_collection_model_real_get_value;
- iface->iter_next = gcr_collection_model_real_iter_next;
- iface->iter_children = gcr_collection_model_real_iter_children;
- iface->iter_has_child = gcr_collection_model_real_iter_has_child;
- iface->iter_n_children = gcr_collection_model_real_iter_n_children;
- iface->iter_nth_child = gcr_collection_model_real_iter_nth_child;
- iface->iter_parent = gcr_collection_model_real_iter_parent;
- iface->ref_node = gcr_collection_model_real_ref_node;
- iface->unref_node = gcr_collection_model_real_unref_node;
-}
-
-static void
-collection_resort_sequence (GcrCollectionModel *self,
- GSequenceIter *parent,
- GSequence *sequence)
-{
- GPtrArray *previous;
- GSequenceIter *seq, *next;
- gint *new_order;
- GtkTreePath *path;
- GtkTreeIter iter;
- GcrCollectionRow *row;
- gint index;
- gint i;
-
- /* Make note of how things stand, and at same time resort all kids */
- previous = g_ptr_array_new ();
- for (seq = g_sequence_get_begin_iter (sequence);
- !g_sequence_iter_is_end (seq); seq = next) {
- next = g_sequence_iter_next (seq);
- row = g_sequence_get (seq);
- if (row->children)
- collection_resort_sequence (self, seq, row->children);
- g_ptr_array_add (previous, row->object);
- }
-
- if (previous->len == 0) {
- g_ptr_array_free (previous, TRUE);
- return;
- }
-
- /* Actually perform the sort */
- g_sequence_sort (sequence, self->pv->order_current, self);
-
- /* Now go through and map out how things changed */
- new_order = g_new0 (gint, previous->len);
- for (i = 0; i < previous->len; i++) {
- seq = g_hash_table_lookup (self->pv->object_to_seq, previous->pdata[i]);
- g_assert (seq != NULL);
- index = g_sequence_iter_get_position (seq);
- g_assert (index >= 0 && index < previous->len);
- new_order[index] = i;
- }
-
- g_ptr_array_free (previous, TRUE);
-
- path = sequence_iter_to_path (self, parent);
- if (parent == NULL) {
- gtk_tree_model_rows_reordered (GTK_TREE_MODEL (self), path, NULL, new_order);
- } else {
- if (!sequence_iter_to_tree (self, parent, &iter))
- g_assert_not_reached ();
- gtk_tree_model_rows_reordered (GTK_TREE_MODEL (self), path, &iter, new_order);
- }
- gtk_tree_path_free (path);
- g_free (new_order);
-}
-
-static gboolean
-gcr_collection_model_get_sort_column_id (GtkTreeSortable *sortable,
- gint *sort_column_id,
- GtkSortType *order)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable);
-
- if (order)
- *order = self->pv->sort_order_type;
- if (sort_column_id)
- *sort_column_id = self->pv->sort_column_id;
- return (self->pv->sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID &&
- self->pv->sort_column_id != GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID);
-}
-
-static void
-gcr_collection_model_set_sort_column_id (GtkTreeSortable *sortable,
- gint sort_column_id,
- GtkSortType order)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable);
- GCompareDataFunc func;
- gpointer argument;
- const GcrColumn *column;
- gboolean reverse;
-
- reverse = (order == GTK_SORT_DESCENDING);
-
- if (sort_column_id == GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID) {
- func = reverse ? order_sequence_as_unsorted_reverse : order_sequence_as_unsorted;
- argument = NULL;
-
- } else if (sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID) {
- func = reverse ? order_sequence_by_closure_reverse : order_sequence_by_closure;
- argument = &self->pv->default_sort_closure;
-
- } else if (sort_column_id >= 0 && sort_column_id < self->pv->n_columns) {
- if (self->pv->column_sort_closures[sort_column_id].sort_func) {
- func = reverse ? order_sequence_by_closure_reverse : order_sequence_by_closure;
- argument = &self->pv->column_sort_closures[sort_column_id];
- } else {
- column = &self->pv->columns[sort_column_id];
- if (!(column->flags & GCR_COLUMN_SORTABLE))
- return;
- if (!lookup_compare_func (column->property_type)) {
- g_warning ("no sort implementation defined for type '%s' on column '%s'",
- g_type_name (column->property_type), column->property_name);
- return;
- }
-
- func = reverse ? order_sequence_by_property_reverse : order_sequence_by_property;
- argument = (gpointer)column;
- }
- } else {
- g_warning ("invalid sort_column_id passed to gtk_tree_sortable_set_sort_column_id(): %d",
- sort_column_id);
- return;
- }
-
- if (sort_column_id != self->pv->sort_column_id ||
- order != self->pv->sort_order_type) {
- self->pv->sort_column_id = sort_column_id;
- self->pv->sort_order_type = order;
- gtk_tree_sortable_sort_column_changed (sortable);
- }
-
- if (func != self->pv->order_current ||
- argument != self->pv->order_argument) {
- self->pv->order_current = func;
- self->pv->order_argument = (gpointer)argument;
- collection_resort_sequence (self, NULL, self->pv->root_sequence);
- }
-}
-
-static void
-clear_sort_closure (GcrCollectionSortClosure *closure)
-{
- if (closure->destroy_func)
- (closure->destroy_func) (closure->user_data);
- closure->sort_func = NULL;
- closure->destroy_func = NULL;
- closure->user_data = NULL;
-}
-
-static void
-set_sort_closure (GcrCollectionSortClosure *closure,
- GtkTreeIterCompareFunc func,
- gpointer data,
- GDestroyNotify destroy)
-{
- clear_sort_closure (closure);
- closure->sort_func = func;
- closure->user_data = data;
- closure->destroy_func = destroy;
-}
-
-static void
-gcr_collection_model_set_sort_func (GtkTreeSortable *sortable,
- gint sort_column_id,
- GtkTreeIterCompareFunc func,
- gpointer data,
- GDestroyNotify destroy)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable);
-
- g_return_if_fail (sort_column_id >= 0 && sort_column_id < self->pv->n_columns);
-
- set_sort_closure (&self->pv->column_sort_closures[sort_column_id],
- func, data, destroy);
-
- /* Resorts if necessary */
- if (self->pv->sort_column_id == sort_column_id) {
- gcr_collection_model_set_sort_column_id (sortable,
- self->pv->sort_column_id,
- self->pv->sort_order_type);
- }
-}
-
-static void
-gcr_collection_model_set_default_sort_func (GtkTreeSortable *sortable,
- GtkTreeIterCompareFunc func,
- gpointer data, GDestroyNotify destroy)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable);
-
- set_sort_closure (&self->pv->default_sort_closure,
- func, data, destroy);
-
- /* Resorts if necessary */
- if (self->pv->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID) {
- gcr_collection_model_set_sort_column_id (sortable,
- self->pv->sort_column_id,
- self->pv->sort_order_type);
- }
-}
-
-static gboolean
-gcr_collection_model_has_default_sort_func (GtkTreeSortable *sortable)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable);
-
- return (self->pv->default_sort_closure.sort_func != NULL);
-}
-
-static void
-gcr_collection_model_tree_sortable_init (GtkTreeSortableIface *iface)
-{
- iface->get_sort_column_id = gcr_collection_model_get_sort_column_id;
- iface->set_sort_column_id = gcr_collection_model_set_sort_column_id;
- iface->set_sort_func = gcr_collection_model_set_sort_func;
- iface->set_default_sort_func = gcr_collection_model_set_default_sort_func;
- iface->has_default_sort_func = gcr_collection_model_has_default_sort_func;
-}
-
-static void
-gcr_collection_model_init (GcrCollectionModel *self)
-{
- self->pv = gcr_collection_model_get_instance_private (self);
-
- self->pv->root_sequence = g_sequence_new (NULL);
- self->pv->object_to_seq = g_hash_table_new (g_direct_hash, g_direct_equal);
- self->pv->sort_column_id = GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID;
- self->pv->sort_order_type = GTK_SORT_ASCENDING;
- self->pv->order_current = order_sequence_as_unsorted;
-}
-
-static void
-gcr_collection_model_set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (object);
- GcrColumn *columns;
-
- switch (prop_id) {
- case PROP_MODE:
- self->pv->mode = g_value_get_enum (value);
- break;
- case PROP_COLLECTION:
- gcr_collection_model_set_collection (self, g_value_get_object (value));
- break;
- case PROP_COLUMNS:
- columns = g_value_get_pointer (value);
- if (columns)
- gcr_collection_model_set_columns (self, columns);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_collection_model_get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (object);
-
- switch (prop_id) {
- case PROP_MODE:
- g_value_set_enum (value, self->pv->mode);
- break;
- case PROP_COLLECTION:
- g_value_set_object (value, self->pv->collection);
- break;
- case PROP_COLUMNS:
- g_value_set_pointer (value, (gpointer)self->pv->columns);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_collection_model_dispose (GObject *object)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (object);
-
- /* Disconnect from all rows */
- if (self->pv->collection) {
- remove_children_from_sequence (self, self->pv->root_sequence,
- self->pv->collection, NULL, FALSE);
- g_object_unref (self->pv->collection);
- self->pv->collection = NULL;
- }
-
- G_OBJECT_CLASS (gcr_collection_model_parent_class)->dispose (object);
-}
-
-static void
-gcr_collection_model_finalize (GObject *object)
-{
- GcrCollectionModel *self = GCR_COLLECTION_MODEL (object);
- guint i;
-
- g_assert (!self->pv->collection);
-
- g_assert (g_sequence_get_length (self->pv->root_sequence) == 0);
- g_sequence_free (self->pv->root_sequence);
- g_assert (g_hash_table_size (self->pv->object_to_seq) == 0);
- g_hash_table_destroy (self->pv->object_to_seq);
-
- if (self->pv->selected) {
- g_assert (g_hash_table_size (self->pv->selected) == 0);
- g_hash_table_destroy (self->pv->selected);
- self->pv->selected = NULL;
- }
-
- self->pv->columns = NULL;
- for (i = 0; i < self->pv->n_columns; i++)
- clear_sort_closure (&self->pv->column_sort_closures[i]);
- g_free (self->pv->column_sort_closures);
- clear_sort_closure (&self->pv->default_sort_closure);
-
- G_OBJECT_CLASS (gcr_collection_model_parent_class)->finalize (object);
-}
-
-static void
-gcr_collection_model_class_init (GcrCollectionModelClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- gcr_collection_model_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->dispose = gcr_collection_model_dispose;
- gobject_class->finalize = gcr_collection_model_finalize;
- gobject_class->set_property = gcr_collection_model_set_property;
- gobject_class->get_property = gcr_collection_model_get_property;
-
- g_object_class_install_property (gobject_class, PROP_MODE,
- g_param_spec_enum ("mode", "Mode", "Tree or list mode",
- GCR_TYPE_COLLECTION_MODEL_MODE, GCR_COLLECTION_MODEL_TREE,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_COLLECTION,
- g_param_spec_object ("collection", "Object Collection", "Collection to get objects from",
- GCR_TYPE_COLLECTION,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_COLUMNS,
- g_param_spec_pointer ("columns", "Columns", "Columns for the model",
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-}
-
-/**
- * gcr_collection_model_new: (skip)
- * @collection: the collection to represent
- * @mode: whether list or tree mode
- * @...: the column names and types
- *
- * Create a new #GcrCollectionModel. The variable argument list should contain
- * pairs of property names, and #GType values. The variable argument list should
- * be terminated with %NULL.
- *
- * Returns: (transfer full): a newly allocated model, which should be released
- * with g_object_unref().
- */
-GcrCollectionModel*
-gcr_collection_model_new (GcrCollection *collection,
- GcrCollectionModelMode mode,
- ...)
-{
- GcrColumn column;
- GcrCollectionModel *self;
- const gchar *arg;
- GArray *array;
- va_list va;
-
- /* With a null terminator */
- array = g_array_new (TRUE, TRUE, sizeof (GcrColumn));
-
- va_start (va, mode);
- while ((arg = va_arg (va, const gchar*)) != NULL) {
- memset (&column, 0, sizeof (column));
- column.property_name = g_strdup (arg);
- column.property_type = va_arg (va, GType);
- column.column_type = column.property_type;
- g_array_append_val (array, column);
- }
- va_end (va);
-
- self = gcr_collection_model_new_full (collection, mode, (GcrColumn*)array->data);
- g_object_set_data_full (G_OBJECT (self), "gcr_collection_model_new",
- g_array_free (array, FALSE), free_owned_columns);
- return self;
-}
-
-/**
- * gcr_collection_model_new_full: (skip)
- * @collection: the collection to represent
- * @mode: whether list or tree mode
- * @columns: the columns the model should contain
- *
- * Create a new #GcrCollectionModel.
- *
- * Returns: (transfer full): a newly allocated model, which should be released
- * with g_object_unref()
- */
-GcrCollectionModel*
-gcr_collection_model_new_full (GcrCollection *collection,
- GcrCollectionModelMode mode,
- const GcrColumn *columns)
-{
- GcrCollectionModel *self = g_object_new (GCR_TYPE_COLLECTION_MODEL,
- "collection", collection,
- "mode", mode,
- NULL);
- gcr_collection_model_set_columns (self, columns);
- return self;
-}
-
-/**
- * gcr_collection_model_set_columns: (skip)
- * @self: The model
- * @columns: The columns the model should contain
- *
- * Set the columns that the model should contain. @columns is an array of
- * #GcrColumn structures, with the last one containing %NULL for all values.
- *
- * This function can only be called once, and only if the model was not created
- * without a set of columns. This function cannot be called after the model
- * has been added to a view.
- *
- * The columns are accessed as static data. They should continue to remain
- * in memory for longer than the GcrCollectionModel object.
- *
- * Returns: The number of columns
- */
-guint
-gcr_collection_model_set_columns (GcrCollectionModel *self,
- const GcrColumn *columns)
-{
- const GcrColumn *col;
- guint n_columns;
-
- g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), 0);
- g_return_val_if_fail (columns, 0);
- g_return_val_if_fail (self->pv->n_columns == 0, 0);
-
- /* Count the number of columns, extra column for selected */
- for (col = columns, n_columns = 1; col->property_name; ++col)
- ++n_columns;
-
- /* We expect the columns to stay around */
- self->pv->columns = columns;
- self->pv->n_columns = n_columns;
- self->pv->column_sort_closures = g_new0 (GcrCollectionSortClosure, self->pv->n_columns);
-
- return n_columns - 1;
-}
-
-/**
- * gcr_collection_model_get_collection:
- * @self: a collection model
- *
- * Get the collection which this model represents
- *
- * Returns: (transfer none): the collection, owned by the model
- */
-GcrCollection *
-gcr_collection_model_get_collection (GcrCollectionModel *self)
-{
- g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), NULL);
- return self->pv->collection;
-}
-
-/**
- * gcr_collection_model_set_collection:
- * @self: a collection model
- * @collection: (nullable): the collection or %NULL
- *
- * Set the collection which this model represents
- */
-void
-gcr_collection_model_set_collection (GcrCollectionModel *self,
- GcrCollection *collection)
-{
- GcrCollection *previous;
- GHashTable *exclude;
- GList *children = NULL;
- GList *l;
-
- g_return_if_fail (GCR_IS_COLLECTION_MODEL (self));
- g_return_if_fail (collection == NULL || GCR_IS_COLLECTION (collection));
-
- if (collection == self->pv->collection)
- return;
-
- if (collection)
- g_object_ref (collection);
- previous = self->pv->collection;
- self->pv->collection = collection;
-
- if (collection)
- children = gcr_collection_get_objects (collection);
-
- if (previous) {
- exclude = g_hash_table_new (g_direct_hash, g_direct_equal);
- for (l = children; l != NULL; l = g_list_next (l))
- g_hash_table_insert (exclude, l->data, l->data);
-
- remove_children_from_sequence (self, self->pv->root_sequence,
- previous, exclude, TRUE);
-
- g_hash_table_destroy (exclude);
- g_object_unref (previous);
- }
-
- if (collection) {
- add_children_to_sequence (self, self->pv->root_sequence,
- NULL, collection, children,
- self->pv->object_to_seq, TRUE);
- g_list_free (children);
- }
-
- g_object_notify (G_OBJECT (self), "collection");
-}
-
-/**
- * gcr_collection_model_object_for_iter:
- * @self: The model
- * @iter: The row
- *
- * Get the object that is represented by the given row in the model.
- *
- * Returns: (transfer none): The object, owned by the model.
- */
-GObject *
-gcr_collection_model_object_for_iter (GcrCollectionModel *self, const GtkTreeIter *iter)
-{
- g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), NULL);
- g_return_val_if_fail (iter != NULL, NULL);
- g_return_val_if_fail (iter->stamp == COLLECTION_MODEL_STAMP, NULL);
- g_return_val_if_fail (G_IS_OBJECT (iter->user_data), NULL);
-
- return G_OBJECT (iter->user_data);
-}
-
-/**
- * gcr_collection_model_iter_for_object:
- * @self: The model
- * @object: The object
- * @iter: The row for the object
- *
- * Set @iter to the row for the given object. If the object is not in this
- * model, then %FALSE will be returned.
- *
- * Returns: %TRUE if the object was present.
- */
-gboolean
-gcr_collection_model_iter_for_object (GcrCollectionModel *self, GObject *object,
- GtkTreeIter *iter)
-{
- GSequenceIter *seq;
-
- g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), FALSE);
- g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
- g_return_val_if_fail (iter != NULL, FALSE);
-
- seq = g_hash_table_lookup (self->pv->object_to_seq, object);
- if (seq == NULL)
- return FALSE;
-
- return sequence_iter_to_tree (self, seq, iter);
-}
-
-/**
- * gcr_collection_model_column_for_selected:
- * @self: The model
- *
- * Get the column identifier for the column that contains the values
- * of the selected state.
- *
- * Returns: The column identifier.
- */
-gint
-gcr_collection_model_column_for_selected (GcrCollectionModel *self)
-{
- g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), 0);
- g_assert (self->pv->n_columns > 0);
- return self->pv->n_columns - 1;
-}
-
-/**
- * gcr_collection_model_toggle_selected:
- * @self: The model
- * @iter: The row
- *
- * Toggle the selected state of a given row.
- */
-void
-gcr_collection_model_toggle_selected (GcrCollectionModel *self, GtkTreeIter *iter)
-{
- GObject *object;
-
- g_return_if_fail (GCR_IS_COLLECTION_MODEL (self));
-
- object = gcr_collection_model_object_for_iter (self, iter);
- g_return_if_fail (G_IS_OBJECT (object));
-
- if (!self->pv->selected)
- self->pv->selected = selected_hash_table_new ();
-
- if (g_hash_table_lookup (self->pv->selected, object))
- g_hash_table_remove (self->pv->selected, object);
- else
- g_hash_table_insert (self->pv->selected, object, object);
-}
-
-/**
- * gcr_collection_model_change_selected:
- * @self: The model
- * @iter: The row
- * @selected: Whether the row should be selected or not.
- *
- * Set whether a given row is toggled selected or not.
- */
-void
-gcr_collection_model_change_selected (GcrCollectionModel *self, GtkTreeIter *iter, gboolean selected)
-{
- GtkTreePath *path;
- GObject *object;
-
- g_return_if_fail (GCR_IS_COLLECTION_MODEL (self));
-
- object = gcr_collection_model_object_for_iter (self, iter);
- g_return_if_fail (G_IS_OBJECT (object));
-
- if (!self->pv->selected)
- self->pv->selected = g_hash_table_new (g_direct_hash, g_direct_equal);
-
- if (selected)
- g_hash_table_insert (self->pv->selected, object, object);
- else
- g_hash_table_remove (self->pv->selected, object);
-
- /* Tell the view that this row changed */
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (self), iter);
- g_return_if_fail (path);
- gtk_tree_model_row_changed (GTK_TREE_MODEL (self), path, iter);
- gtk_tree_path_free (path);
-}
-
-/**
- * gcr_collection_model_is_selected:
- * @self: The model
- * @iter: The row
- *
- * Check whether a given row has been toggled as selected.
- *
- * Returns: Whether the row has been selected.
- */
-gboolean
-gcr_collection_model_is_selected (GcrCollectionModel *self, GtkTreeIter *iter)
-{
- GObject *object;
-
- g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), FALSE);
-
- object = gcr_collection_model_object_for_iter (self, iter);
- g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
-
- if (!self->pv->selected)
- return FALSE;
-
- return g_hash_table_lookup (self->pv->selected, object) ? TRUE : FALSE;
-}
-
-/**
- * gcr_collection_model_get_selected_objects:
- * @self: the collection model
- *
- * Get a list of checked/selected objects.
- *
- * Returns: (transfer container) (element-type GObject.Object): a list of selected
- * objects, which should be freed with g_list_free()
- */
-GList *
-gcr_collection_model_get_selected_objects (GcrCollectionModel *self)
-{
- GHashTableIter iter;
- GList *result = NULL;
- gpointer key;
-
- g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), NULL);
-
- if (!self->pv->selected)
- return NULL;
-
- g_hash_table_iter_init (&iter, self->pv->selected);
- while (g_hash_table_iter_next (&iter, &key, NULL))
- result = g_list_prepend (result, key);
- return result;
-}
-
-/**
- * gcr_collection_model_set_selected_objects:
- * @self: the collection model
- * @selected: (element-type GObject.Object): a list of objects to select
- *
- * Set the checked/selected objects.
- */
-void
-gcr_collection_model_set_selected_objects (GcrCollectionModel *self,
- GList *selected)
-{
- GHashTable *newly_selected;
- GList *old_selection;
- GtkTreeIter iter;
- GList *l;
-
- old_selection = gcr_collection_model_get_selected_objects (self);
- newly_selected = selected_hash_table_new ();
-
- /* Select all the objects in selected which aren't already selected */
- for (l = selected; l; l = g_list_next (l)) {
- if (!self->pv->selected || !g_hash_table_lookup (self->pv->selected, l->data)) {
- if (!gcr_collection_model_iter_for_object (self, l->data, &iter))
- g_return_if_reached ();
- gcr_collection_model_change_selected (self, &iter, TRUE);
- }
-
- /* Note that we've seen this one */
- g_hash_table_insert (newly_selected, l->data, l->data);
- }
-
- /* Unselect all the objects which aren't supposed to be selected */
- for (l = old_selection; l; l = g_list_next (l)) {
- if (!g_hash_table_lookup (newly_selected, l->data)) {
- if (!gcr_collection_model_iter_for_object (self, l->data, &iter))
- g_return_if_reached ();
- gcr_collection_model_change_selected (self, &iter, FALSE);
- }
- }
-
- g_list_free (old_selection);
- g_hash_table_destroy (newly_selected);
-}
diff --git a/ui/gcr-collection-model.h b/ui/gcr-collection-model.h
deleted file mode 100644
index a202046..0000000
--- a/ui/gcr-collection-model.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_COLLECTION_MODEL_H__
-#define __GCR_COLLECTION_MODEL_H__
-
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-collection.h"
-#include "gcr/gcr-column.h"
-
-typedef enum {
- GCR_COLLECTION_MODEL_LIST = 0,
- GCR_COLLECTION_MODEL_TREE
-} GcrCollectionModelMode;
-
-#define GCR_TYPE_COLLECTION_MODEL (gcr_collection_model_get_type ())
-#define GCR_COLLECTION_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COLLECTION_MODEL, GcrCollectionModel))
-#define GCR_COLLECTION_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_COLLECTION_MODEL, GcrCollectionModelClass))
-#define GCR_IS_COLLECTION_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COLLECTION_MODEL))
-#define GCR_IS_COLLECTION_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_COLLECTION_MODEL))
-#define GCR_COLLECTION_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_COLLECTION_MODEL, GcrCollectionModelClass))
-
-typedef struct _GcrCollectionModel GcrCollectionModel;
-typedef struct _GcrCollectionModelClass GcrCollectionModelClass;
-typedef struct _GcrCollectionModelPrivate GcrCollectionModelPrivate;
-
-struct _GcrCollectionModel {
- GObject parent;
-
- /*< private >*/
- GcrCollectionModelPrivate *pv;
-};
-
-struct _GcrCollectionModelClass {
- GObjectClass parent_class;
-};
-
-GType gcr_collection_model_get_type (void);
-
-GcrCollectionModel* gcr_collection_model_new (GcrCollection *collection,
- GcrCollectionModelMode mode,
- ...) G_GNUC_NULL_TERMINATED;
-
-GcrCollectionModel* gcr_collection_model_new_full (GcrCollection *collection,
- GcrCollectionModelMode mode,
- const GcrColumn *columns);
-
-guint gcr_collection_model_set_columns (GcrCollectionModel *self,
- const GcrColumn *columns);
-
-GcrCollection * gcr_collection_model_get_collection (GcrCollectionModel *self);
-
-void gcr_collection_model_set_collection (GcrCollectionModel *self,
- GcrCollection *collection);
-
-GObject* gcr_collection_model_object_for_iter (GcrCollectionModel *self,
- const GtkTreeIter *iter);
-
-gboolean gcr_collection_model_iter_for_object (GcrCollectionModel *self,
- GObject *object,
- GtkTreeIter *iter);
-
-gint gcr_collection_model_column_for_selected (GcrCollectionModel *self);
-
-void gcr_collection_model_toggle_selected (GcrCollectionModel *self,
- GtkTreeIter *iter);
-
-void gcr_collection_model_change_selected (GcrCollectionModel *self,
- GtkTreeIter *iter,
- gboolean selected);
-
-gboolean gcr_collection_model_is_selected (GcrCollectionModel *self,
- GtkTreeIter *iter);
-
-GList* gcr_collection_model_get_selected_objects (GcrCollectionModel *self);
-
-void gcr_collection_model_set_selected_objects (GcrCollectionModel *self,
- GList *selected);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrCollectionModel, g_object_unref)
-
-#endif /* __GCR_COLLECTION_MODEL_H__ */
diff --git a/ui/gcr-combo-selector.c b/ui/gcr-combo-selector.c
deleted file mode 100644
index cac6419..0000000
--- a/ui/gcr-combo-selector.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr/gcr-internal.h"
-
-#include "gcr-collection-model.h"
-#include "gcr-combo-selector.h"
-
-#include <glib/gi18n-lib.h>
-
-#include <string.h>
-
-/**
- * GcrComboSelector:
- *
- * A widget that can be used to select a certificate or key. It allows
- * the user to select one object from the selector at a time.
- */
-
-enum {
- PROP_0,
- PROP_COLLECTION
-};
-
-struct _GcrComboSelectorPrivate {
- GcrCollection *collection;
- GcrCollectionModel *model;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrComboSelector, gcr_combo_selector, GTK_TYPE_COMBO_BOX);
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static GObject*
-gcr_combo_selector_constructor (GType type, guint n_props, GObjectConstructParam *props)
-{
- GcrComboSelector *self = GCR_COMBO_SELECTOR (G_OBJECT_CLASS (gcr_combo_selector_parent_class)->constructor(type, n_props, props));
- GtkCellRenderer *cell;
-
- g_return_val_if_fail (self, NULL);
-
- self->pv->model = gcr_collection_model_new (self->pv->collection,
- GCR_COLLECTION_MODEL_LIST,
- "icon", G_TYPE_ICON,
- "markup", G_TYPE_STRING,
- NULL);
-
- gtk_combo_box_set_model (GTK_COMBO_BOX (self), GTK_TREE_MODEL (self->pv->model));
-
- /* The icon */
- cell = gtk_cell_renderer_pixbuf_new ();
- g_object_set (cell, "stock-size", GTK_ICON_SIZE_DND, NULL);
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self), cell, FALSE);
- gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (self), cell, "gicon", 0);
-
- /* The markup */
- cell = gtk_cell_renderer_text_new ();
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self), cell, TRUE);
- gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (self), cell, "markup", 1);
-
- return G_OBJECT (self);
-}
-
-static void
-gcr_combo_selector_init (GcrComboSelector *self)
-{
- self->pv = gcr_combo_selector_get_instance_private (self);
-}
-
-static void
-gcr_combo_selector_dispose (GObject *obj)
-{
- GcrComboSelector *self = GCR_COMBO_SELECTOR (obj);
-
- if (self->pv->model)
- g_object_unref (self->pv->model);
- self->pv->model = NULL;
-
- if (self->pv->collection)
- g_object_unref (self->pv->collection);
- self->pv->collection = NULL;
-
- G_OBJECT_CLASS (gcr_combo_selector_parent_class)->dispose (obj);
-}
-
-static void
-gcr_combo_selector_finalize (GObject *obj)
-{
- GcrComboSelector *self = GCR_COMBO_SELECTOR (obj);
-
- g_assert (!self->pv->collection);
- g_assert (!self->pv->model);
-
- G_OBJECT_CLASS (gcr_combo_selector_parent_class)->finalize (obj);
-}
-
-static void
-gcr_combo_selector_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrComboSelector *self = GCR_COMBO_SELECTOR (obj);
-
- switch (prop_id) {
- case PROP_COLLECTION:
- g_return_if_fail (!self->pv->collection);
- self->pv->collection = g_value_dup_object (value);
- g_return_if_fail (self->pv->collection);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_combo_selector_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrComboSelector *self = GCR_COMBO_SELECTOR (obj);
-
- switch (prop_id) {
- case PROP_COLLECTION:
- g_value_set_object (value, gcr_combo_selector_get_collection (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_combo_selector_class_init (GcrComboSelectorClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->constructor = gcr_combo_selector_constructor;
- gobject_class->dispose = gcr_combo_selector_dispose;
- gobject_class->finalize = gcr_combo_selector_finalize;
- gobject_class->set_property = gcr_combo_selector_set_property;
- gobject_class->get_property = gcr_combo_selector_get_property;
-
- /**
- * GcrComboSelector:collection:
- *
- * The collection which contains the objects to display in the selector.
- */
- g_object_class_install_property (gobject_class, PROP_COLLECTION,
- g_param_spec_object ("collection", "Collection", "Collection to select from",
- GCR_TYPE_COLLECTION,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_combo_selector_new:
- * @collection: The collection that contains the objects to display
- *
- * Create a new #GcrTreeSelector.
- *
- * Returns: A newly allocated selector, which should be released with
- * g_object_unref().
- */
-GcrComboSelector*
-gcr_combo_selector_new (GcrCollection *collection)
-{
- return g_object_new (GCR_TYPE_COMBO_SELECTOR,
- "collection", collection,
- NULL);
-}
-
-/**
- * gcr_combo_selector_get_collection:
- * @self: The selector
- *
- * Get the collection that this selector is displaying objects from.
- *
- * Returns: (transfer none): The collection, owned by the selector.
- */
-GcrCollection *
-gcr_combo_selector_get_collection (GcrComboSelector *self)
-{
- g_return_val_if_fail (GCR_IS_COMBO_SELECTOR (self), NULL);
- return self->pv->collection;
-}
-
-/**
- * gcr_combo_selector_get_selected:
- * @self: The selector
- *
- * Get the selected object in the selector, or %NULL if nothing selected.
- *
- * Returns: (transfer none): the selected object, owned by the selector, or %NULL
- */
-GObject *
-gcr_combo_selector_get_selected (GcrComboSelector *self)
-{
- GtkTreeIter iter;
-
- g_return_val_if_fail (GCR_IS_COMBO_SELECTOR (self), NULL);
- gtk_combo_box_get_active_iter (GTK_COMBO_BOX (self), &iter);
-
- return gcr_collection_model_object_for_iter (self->pv->model, &iter);
-}
-
-/**
- * gcr_combo_selector_set_selected:
- * @self: The selector
- * @selected: (nullable): the object to select or %NULL
- *
- * Set the currently selected object in the selector, or clear the selection
- * if selected is set to %NULL.
- */
-void
-gcr_combo_selector_set_selected (GcrComboSelector *self, GObject *selected)
-{
- GtkTreeIter iter;
-
- g_return_if_fail (GCR_IS_COMBO_SELECTOR (self));
-
- if (selected) {
- if (!gcr_collection_model_iter_for_object (self->pv->model, selected, &iter))
- g_return_if_reached ();
- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (self), &iter);
- } else {
- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (self), NULL);
- }
-}
diff --git a/ui/gcr-combo-selector.h b/ui/gcr-combo-selector.h
deleted file mode 100644
index e46ef8a..0000000
--- a/ui/gcr-combo-selector.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __GCR_COMBO_SELECTOR_H__
-#define __GCR_COMBO_SELECTOR_H__
-
-#include "gcr/gcr-types.h"
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_COMBO_SELECTOR (gcr_combo_selector_get_type ())
-#define GCR_COMBO_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COMBO_SELECTOR, GcrComboSelector))
-#define GCR_COMBO_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_COMBO_SELECTOR, GcrComboSelectorClass))
-#define GCR_IS_COMBO_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COMBO_SELECTOR))
-#define GCR_IS_COMBO_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_COMBO_SELECTOR))
-#define GCR_COMBO_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_COMBO_SELECTOR, GcrComboSelectorClass))
-
-typedef struct _GcrComboSelector GcrComboSelector;
-typedef struct _GcrComboSelectorClass GcrComboSelectorClass;
-typedef struct _GcrComboSelectorPrivate GcrComboSelectorPrivate;
-
-struct _GcrComboSelector {
- GtkComboBox parent;
-
- /*< private >*/
- GcrComboSelectorPrivate *pv;
-};
-
-struct _GcrComboSelectorClass {
- /*< private >*/
- GtkComboBoxClass parent_class;
-};
-
-GType gcr_combo_selector_get_type (void);
-
-GcrComboSelector* gcr_combo_selector_new (GcrCollection *collection);
-
-GcrCollection* gcr_combo_selector_get_collection (GcrComboSelector *self);
-
-GObject* gcr_combo_selector_get_selected (GcrComboSelector *self);
-
-void gcr_combo_selector_set_selected (GcrComboSelector *self,
- GObject *selected);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrComboSelector, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_COMBO_SELECTOR_H__ */
diff --git a/ui/gcr-deprecated.h b/ui/gcr-deprecated.h
deleted file mode 100644
index c374eb1..0000000
--- a/ui/gcr-deprecated.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef GCR_DEPRECATED_H_
-#define GCR_DEPRECATED_H_
-#ifndef GCR_DISABLE_DEPRECATED
-#ifndef __GI_SCANNER__
-
-#include <glib.h>
-
-#include "gcr-certificate-basics-widget.h"
-#include "gcr-certificate-details-widget.h"
-#include "gcr-certificate-renderer.h"
-#include "gcr-viewer.h"
-
-G_BEGIN_DECLS
-
-G_DEPRECATED_FOR(gcr_renderer_render_view)
-void gcr_renderer_render (GcrRenderer *self,
- GcrViewer *viewer);
-
-G_DEPRECATED_FOR(gcr_renderer_get_attributes)
-GckAttributes * gcr_certificate_renderer_get_attributes (GcrCertificateRenderer *self);
-
-G_DEPRECATED_FOR(gcr_renderer_set_attributes)
-void gcr_certificate_renderer_set_attributes (GcrCertificateRenderer *self,
- GckAttributes *attrs);
-
-G_END_DECLS
-
-#endif /* __GI_SCANNER__ */
-#endif /* GCR_DISABLE_DEPRECATED */
-#endif /* GCRTYPES_H_ */
diff --git a/ui/gcr-dialog-util.c b/ui/gcr-dialog-util.c
deleted file mode 100644
index e9c7fa0..0000000
--- a/ui/gcr-dialog-util.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr-dialog-util.h"
-
-#include <string.h>
-
-typedef struct {
- GtkDialog *dialog;
- gboolean was_modal;
- gboolean destroyed;
- gulong response_sig;
- gulong unmap_sig;
- gulong delete_sig;
- gulong destroy_sig;
-} DialogRunClosure;
-
-static void
-dialog_run_closure_free (gpointer data)
-{
- DialogRunClosure *closure = data;
- g_object_unref (closure->dialog);
- g_assert (closure->response_sig == 0);
- g_assert (closure->unmap_sig == 0);
- g_assert (closure->delete_sig == 0);
- g_assert (closure->destroy_sig == 0);
- g_free (closure);
-}
-
-static void
-complete_task (GTask *task, int response_id)
-{
- DialogRunClosure *closure = g_task_get_task_data (task);
-
- g_object_ref (task);
-
- if (!closure->destroyed) {
- if (!closure->was_modal)
- gtk_window_set_modal (GTK_WINDOW (closure->dialog), FALSE);
-
- g_signal_handler_disconnect (closure->dialog, closure->response_sig);
- closure->response_sig = 0;
- g_signal_handler_disconnect (closure->dialog, closure->unmap_sig);
- closure->unmap_sig = 0;
- g_signal_handler_disconnect (closure->dialog, closure->delete_sig);
- closure->delete_sig = 0;
- g_signal_handler_disconnect (closure->dialog, closure->destroy_sig);
- closure->destroy_sig = 0;
- }
-
- g_task_return_int (task, response_id);
- g_clear_object (&task);
-}
-
-static void
-on_dialog_unmap (GtkDialog *dialog,
- gpointer user_data)
-{
- GTask *task = G_TASK (user_data);
-
- complete_task (task, GTK_RESPONSE_NONE);
-}
-
-static void
-on_dialog_response (GtkDialog *dialog,
- gint response_id,
- gpointer user_data)
-{
- GTask *task = G_TASK (user_data);
- complete_task (task, response_id);
-}
-
-static gint
-on_dialog_delete (GtkDialog *dialog,
- GdkEventAny *event,
- gpointer user_data)
-{
- GTask *task = G_TASK (user_data);
- complete_task (task, GTK_RESPONSE_NONE);
- return TRUE; /* Do not destroy */
-}
-
-static void
-on_dialog_destroy (GtkDialog *dialog,
- gpointer user_data)
-{
- GTask *task = G_TASK (user_data);
- DialogRunClosure *closure = g_task_get_task_data (task);
-
- /* complete will be called by run_unmap_handler */
- closure->destroyed = TRUE;
-}
-
-void
-_gcr_dialog_util_run_async (GtkDialog *dialog,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GTask *task;
- DialogRunClosure *closure;
-
- g_return_if_fail (GTK_IS_DIALOG (dialog));
- g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
-
- task = g_task_new (dialog, cancellable, callback, user_data);
- g_task_set_source_tag (task, _gcr_dialog_util_run_async);
-
- closure = g_new0 (DialogRunClosure, 1);
- closure->dialog = g_object_ref (dialog);
- closure->was_modal = gtk_window_get_modal (GTK_WINDOW (dialog));
- if (!closure->was_modal)
- gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-
- if (!gtk_widget_get_visible (GTK_WIDGET (dialog)))
- gtk_widget_show (GTK_WIDGET (dialog));
-
- g_task_set_task_data (task, closure, dialog_run_closure_free);
-
- closure->response_sig = g_signal_connect_data (dialog, "response",
- G_CALLBACK (on_dialog_response),
- g_object_ref (task),
- (GClosureNotify)g_object_unref, 0);
-
- closure->unmap_sig = g_signal_connect_data (dialog, "unmap",
- G_CALLBACK (on_dialog_unmap),
- g_object_ref (task),
- (GClosureNotify)g_object_unref, 0);
-
- closure->delete_sig = g_signal_connect_data (dialog, "delete-event",
- G_CALLBACK (on_dialog_delete),
- g_object_ref (task),
- (GClosureNotify)g_object_unref, 0);
-
- closure->destroy_sig = g_signal_connect_data (dialog, "destroy",
- G_CALLBACK (on_dialog_destroy),
- g_object_ref (task),
- (GClosureNotify)g_object_unref, 0);
-
- g_clear_object (&task);
-}
-
-
-gint
-_gcr_dialog_util_run_finish (GtkDialog *dialog,
- GAsyncResult *result)
-{
- g_return_val_if_fail (g_task_is_valid (result, dialog), GTK_RESPONSE_NONE);
-
- return g_task_propagate_int (G_TASK (result), NULL);
-}
diff --git a/ui/gcr-dialog-util.h b/ui/gcr-dialog-util.h
deleted file mode 100644
index b40b14c..0000000
--- a/ui/gcr-dialog-util.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef GCR_DIALOG_UTIL_H
-#define GCR_DIALOG_UTIL_H
-
-#include <gtk/gtk.h>
-#include <gio/gio.h>
-
-G_BEGIN_DECLS
-
-void _gcr_dialog_util_run_async (GtkDialog *dialog,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
-
-gint _gcr_dialog_util_run_finish (GtkDialog *dialog,
- GAsyncResult *result);
-
-G_END_DECLS
-
-#endif /* __GCR_TOKEN_MANAGER_H__ */
diff --git a/ui/gcr-display-scrolled.c b/ui/gcr-display-scrolled.c
deleted file mode 100644
index 964acee..0000000
--- a/ui/gcr-display-scrolled.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-
-#include "config.h"
-
-#include "gcr-display-scrolled.h"
-#include "gcr-viewer.h"
-
-static void _gcr_display_scrolled_viewer_iface (GcrViewerIface *iface);
-
-struct _GcrDisplayScrolledPrivate {
- GcrViewer *internal;
-};
-
-G_DEFINE_TYPE_WITH_CODE (GcrDisplayScrolled, _gcr_display_scrolled, GTK_TYPE_SCROLLED_WINDOW,
- G_ADD_PRIVATE (GcrDisplayScrolled);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_VIEWER, _gcr_display_scrolled_viewer_iface));
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static void
-_gcr_display_scrolled_init (GcrDisplayScrolled *self)
-{
- self->pv = _gcr_display_scrolled_get_instance_private (self);
- self->pv->internal = gcr_viewer_new ();
-}
-
-static void
-_gcr_display_scrolled_constructed (GObject *object)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (object);
-
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (self), GTK_SHADOW_ETCHED_IN);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (self), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->pv->internal));
- gtk_widget_show (GTK_WIDGET (self->pv->internal));
-}
-
-static void
-_gcr_display_scrolled_get_preferred_height (GtkWidget *widget, gint *minimal_height,
- gint *natural_height)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (widget);
- gint minimal, natural;
-
- GTK_WIDGET_CLASS (_gcr_display_scrolled_parent_class)->get_preferred_height (widget,
- minimal_height,
- natural_height);
-
- minimal = 0;
- natural = 0;
-
- gtk_widget_get_preferred_height (GTK_WIDGET (self->pv->internal),
- &minimal, &natural);
-
- /* This is messy, we add a extra for the etching height */
- *minimal_height = MAX (minimal + 3, *minimal_height);
- *natural_height = MAX (natural + 3, *natural_height);
-}
-
-static void
-_gcr_display_scrolled_get_preferred_width (GtkWidget *widget, gint *minimal_width,
- gint *natural_width)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (widget);
- gint minimal, natural;
-
- GTK_WIDGET_CLASS (_gcr_display_scrolled_parent_class)->get_preferred_width (widget,
- minimal_width,
- natural_width);
-
- minimal = 0;
- natural = 0;
-
- gtk_widget_get_preferred_width (GTK_WIDGET (self->pv->internal),
- &minimal, &natural);
-
- /* This is messy, we add a extra for the scrollbar width, etching */
- *minimal_width = MAX (minimal + 32, *minimal_width);
- *natural_width = MAX (natural + 32, *natural_width);
-}
-
-static void
-_gcr_display_scrolled_class_init (GcrDisplayScrolledClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-
- widget_class->get_preferred_height = _gcr_display_scrolled_get_preferred_height;
- widget_class->get_preferred_width = _gcr_display_scrolled_get_preferred_width;
-
- object_class->constructed = _gcr_display_scrolled_constructed;
-}
-
-static void
-_gcr_display_scrolled_real_add_renderer (GcrViewer *viewer, GcrRenderer *renderer)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer);
- gcr_viewer_add_renderer (self->pv->internal, renderer);
-}
-
-static void
-_gcr_display_scrolled_real_insert_renderer (GcrViewer *viewer,
- GcrRenderer *renderer,
- GcrRenderer *before)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer);
- gcr_viewer_insert_renderer (self->pv->internal, renderer, before);
-}
-
-static void
-_gcr_display_scrolled_real_remove_renderer (GcrViewer *viewer, GcrRenderer *renderer)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer);
- gcr_viewer_remove_renderer (self->pv->internal, renderer);
-}
-
-static guint
-_gcr_display_scrolled_real_count_renderers (GcrViewer *viewer)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer);
- return gcr_viewer_count_renderers (self->pv->internal);
-}
-
-static GcrRenderer*
-_gcr_display_scrolled_real_get_renderer (GcrViewer *viewer, guint index_)
-{
- GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer);
- return gcr_viewer_get_renderer (self->pv->internal, index_);
-}
-
-static void
-_gcr_display_scrolled_viewer_iface (GcrViewerIface *iface)
-{
- iface->add_renderer = _gcr_display_scrolled_real_add_renderer;
- iface->insert_renderer = _gcr_display_scrolled_real_insert_renderer;
- iface->remove_renderer = _gcr_display_scrolled_real_remove_renderer;
- iface->count_renderers = _gcr_display_scrolled_real_count_renderers;
- iface->get_renderer = _gcr_display_scrolled_real_get_renderer;
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-GcrDisplayScrolled*
-_gcr_display_scrolled_new (void)
-{
- return g_object_new (GCR_TYPE_DISPLAY_SCROLLED, NULL);
-}
diff --git a/ui/gcr-display-scrolled.h b/ui/gcr-display-scrolled.h
deleted file mode 100644
index 8726ae2..0000000
--- a/ui/gcr-display-scrolled.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_DISPLAY_SCROLLED_H__
-#define __GCR_DISPLAY_SCROLLED_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_DISPLAY_SCROLLED (_gcr_display_scrolled_get_type ())
-#define GCR_DISPLAY_SCROLLED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_DISPLAY_SCROLLED, GcrDisplayScrolled))
-#define GCR_DISPLAY_SCROLLED_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_DISPLAY_SCROLLED, GcrDisplayScrolledClass))
-#define GCR_IS_DISPLAY_SCROLLED(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_DISPLAY_SCROLLED))
-#define GCR_IS_DISPLAY_SCROLLED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_DISPLAY_SCROLLED))
-#define GCR_DISPLAY_SCROLLED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_DISPLAY_SCROLLED, GcrDisplayScrolledClass))
-
-typedef struct _GcrDisplayScrolled GcrDisplayScrolled;
-typedef struct _GcrDisplayScrolledClass GcrDisplayScrolledClass;
-typedef struct _GcrDisplayScrolledPrivate GcrDisplayScrolledPrivate;
-
-struct _GcrDisplayScrolled {
- /*< private >*/
- GtkScrolledWindow parent;
- GcrDisplayScrolledPrivate *pv;
-};
-
-struct _GcrDisplayScrolledClass {
- GtkScrolledWindowClass parent_class;
-};
-
-GType _gcr_display_scrolled_get_type (void);
-
-GcrDisplayScrolled* _gcr_display_scrolled_new (void);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrDisplayScrolled, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_DISPLAY_SCROLLED_H__ */
diff --git a/ui/gcr-display-view.c b/ui/gcr-display-view.c
deleted file mode 100644
index 766a3a2..0000000
--- a/ui/gcr-display-view.c
+++ /dev/null
@@ -1,1232 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr-display-view.h"
-#include "gcr-renderer.h"
-#include "gcr-viewer.h"
-
-#include "egg/egg-oid.h"
-#include "egg/egg-hex.h"
-
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
-
-static void _gcr_display_view_viewer_iface (GcrViewerIface *iface);
-
-#define ZWSP "\342\200\213"
-#define NORMAL_MARGIN 10
-#define FIELD_MARGIN 17
-#define COLUMN_MARGIN 6
-#define ICON_MARGIN 8
-#define MESSAGE_PADDING 8
-
-typedef struct _GcrDisplayItem {
- GcrDisplayView *display_view;
- GcrRenderer *renderer;
- gboolean expanded;
- gboolean details;
- GtkTextMark *beginning;
- GtkTextMark *ending;
- GtkWidget *details_widget;
- GtkTextChildAnchor *area_anchor;
- GtkTextTag *extra_tag;
- gint field_width;
- GdkPixbuf *pixbuf;
- GtkTextTag *field_tag;
- GtkTextTag *details_tag;
- gulong data_changed_id;
-} GcrDisplayItem;
-
-struct _GcrDisplayViewPrivate {
- GtkTextBuffer *buffer;
- GPtrArray *renderers;
- GHashTable *items;
- GtkTextTag *title_tag;
- GtkTextTag *content_tag;
- GtkTextTag *heading_tag;
- GtkTextTag *message_tag;
- GtkTextTag *monospace_tag;
- GtkTextTag *area_tag;
- GcrDisplayItem *current_item;
- gint text_height;
- GdkCursor *cursor;
-
- gboolean have_measurements;
- gint minimal_width;
- gint natural_width;
- gint minimal_height;
- gint natural_height;
-};
-
-G_DEFINE_TYPE_WITH_CODE (GcrDisplayView, _gcr_display_view, GTK_TYPE_TEXT_VIEW,
- G_ADD_PRIVATE (GcrDisplayView);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_VIEWER, _gcr_display_view_viewer_iface));
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-static void
-ensure_measurements (GcrDisplayView *self)
-{
- PangoLayout *layout;
- PangoRectangle extents;
- gint icon_width;
- gint icon_height;
- GHashTableIter iter;
- GcrDisplayItem *item;
- gpointer value;
- gboolean expanded;
-
- if (self->pv->have_measurements)
- return;
-
- /* See if anything is expanded? */
- expanded = FALSE;
- g_hash_table_iter_init (&iter, self->pv->items);
- while (g_hash_table_iter_next (&iter, NULL, &value)) {
- item = value;
- if (item->expanded) {
- expanded = TRUE;
- break;
- }
- }
-
- /*
- * We use a string in our widget font as the basis for our measurements.
- * These are just estimates of what we need, and what looks goodish.
- * There's room here for improvement. If this is causes problems for
- * you or bothers you, scratch that itch:
- */
-
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), "0123456789");
- pango_layout_get_extents (layout, NULL, &extents);
- pango_extents_to_pixels (&extents, NULL);
- g_object_unref (layout);
-
- if (!gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &icon_width, &icon_height)) {
- icon_width = 48;
- icon_height = 48;
- }
-
- if (expanded) {
- /* If expanded, display more 10 lines at least */
- self->pv->minimal_height = extents.height * 14;
- self->pv->natural_height = extents.height * 25;
- } else {
- /* If not expanded we can get by with 9 lines */
- self->pv->minimal_height = extents.height * 8;
- self->pv->natural_height = extents.height * 9;
- }
-
- self->pv->minimal_width = icon_width + (extents.width * 5);
- self->pv->natural_width = icon_width + (extents.width * 8);
- self->pv->have_measurements = TRUE;
-}
-
-static void
-ensure_text_height (GcrDisplayView *self)
-{
- PangoRectangle extents;
- PangoLayout *layout;
-
- if (self->pv->text_height > 0)
- return;
-
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), "Wp");
- pango_layout_get_extents (layout, NULL, &extents);
- pango_extents_to_pixels (&extents, NULL);
- g_object_unref (layout);
-
- self->pv->text_height = extents.height;
-}
-
-static void
-recalculate_and_resize (GcrDisplayView *self)
-{
- self->pv->have_measurements = FALSE;
- gtk_widget_queue_resize (GTK_WIDGET (self));
-}
-
-static GtkTextTagTable*
-create_tag_table (GcrDisplayView *self)
-{
- GtkTextTagTable *tags;
- gint width, height;
-
- g_assert (GCR_IS_DISPLAY_VIEW (self));
-
- tags = gtk_text_tag_table_new ();
-
- if (!gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &width, &height))
- width = 48;
-
- self->pv->title_tag = g_object_new (GTK_TYPE_TEXT_TAG,
- "name", "title",
- "scale", PANGO_SCALE_LARGE,
- "right-margin", (ICON_MARGIN * 2) + width,
- "pixels-below-lines", 6,
- "weight", PANGO_WEIGHT_BOLD,
- NULL);
- gtk_text_tag_table_add (tags, self->pv->title_tag);
-
- self->pv->content_tag = g_object_new (GTK_TYPE_TEXT_TAG,
- "name", "content",
- "right-margin", (ICON_MARGIN * 2) + width,
- "left-margin", FIELD_MARGIN,
- "pixels-below-lines", 3,
- "wrap-mode", GTK_WRAP_WORD,
- NULL);
- gtk_text_tag_table_add (tags, self->pv->content_tag);
-
- self->pv->message_tag = g_object_new (GTK_TYPE_TEXT_TAG,
- "name", "message",
- "right-margin", (ICON_MARGIN * 2) + width,
- "rise", 3 * PANGO_SCALE,
- "pixels-below-lines", 3,
- "wrap-mode", GTK_WRAP_WORD,
- NULL);
- gtk_text_tag_table_add (tags, self->pv->message_tag);
-
- self->pv->heading_tag = g_object_new (GTK_TYPE_TEXT_TAG,
- "name", "heading",
- "pixels-above-lines", 9,
- "pixels-below-lines", 3,
- "weight", PANGO_WEIGHT_BOLD,
- NULL);
- gtk_text_tag_table_add (tags, self->pv->heading_tag);
-
- self->pv->monospace_tag = g_object_new (GTK_TYPE_TEXT_TAG,
- "name", "monospace",
- "family", "monospace",
- NULL);
- gtk_text_tag_table_add (tags, self->pv->monospace_tag);
-
- self->pv->area_tag = g_object_new (GTK_TYPE_TEXT_TAG,
- "name", "area",
- "justification", GTK_JUSTIFY_CENTER,
- NULL);
- gtk_text_tag_table_add (tags, self->pv->area_tag);
-
- return tags;
-}
-
-static void
-on_expander_realize (GtkWidget *widget, gpointer user_data)
-{
- GdkCursor *cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), GDK_ARROW);
- gdk_window_set_cursor (gtk_widget_get_window (widget), cursor);
- g_object_unref (cursor);
-}
-
-static void
-on_expander_expanded (GObject *object, GParamSpec *param_spec, gpointer user_data)
-{
- GtkExpander *expander = GTK_EXPANDER (object);
- GcrDisplayItem *item = user_data;
- item->expanded = gtk_expander_get_expanded (expander);
- gcr_renderer_render_view (item->renderer, GCR_VIEWER (item->display_view));
- recalculate_and_resize (item->display_view);
-}
-
-static GcrDisplayItem*
-create_display_item (GcrDisplayView *self, GcrRenderer *renderer)
-{
- GcrDisplayItem *item;
- GtkTextTagTable *tags;
- GtkTextIter iter;
- GtkWidget *widget;
- GtkWidget *label;
- GtkStyleContext *style;
- gchar *text;
-
- item = g_new0 (GcrDisplayItem, 1);
- item->display_view = self;
- item->renderer = renderer;
-
- tags = gtk_text_buffer_get_tag_table (self->pv->buffer);
-
- g_assert (!item->field_tag);
- item->field_width = 0;
- item->field_tag = g_object_new (GTK_TYPE_TEXT_TAG,
- "left-margin", item->field_width + FIELD_MARGIN,
- "indent", item->field_width,
- "pixels-below-lines", 3,
- "wrap-mode", GTK_WRAP_WORD_CHAR,
- NULL);
- gtk_text_tag_table_add (tags, item->field_tag);
-
- g_assert (!item->details_tag);
- item->details_tag = g_object_new (GTK_TYPE_TEXT_TAG, NULL);
- gtk_text_tag_table_add (tags, item->details_tag);
-
- /*
- * Add two lines space that delimit this from later items. The
- * item will live between the two zero width spaces.
- */
- gtk_text_buffer_get_end_iter (self->pv->buffer, &iter);
- gtk_text_buffer_insert (self->pv->buffer, &iter, "\n\n", -1);
- if (!gtk_text_iter_backward_char (&iter))
- g_assert_not_reached ();
-
- /* The mark that determines the beginning of this item, with left gravity. */
- item->beginning = gtk_text_buffer_create_mark (self->pv->buffer, NULL, &iter, TRUE);
- g_object_ref (item->beginning);
-
- /* The mark that determines the end of this item, with right gravity. */
- item->ending = gtk_text_buffer_create_mark (self->pv->buffer, NULL, &iter, FALSE);
- g_object_ref (item->ending);
-
- widget = gtk_expander_new_with_mnemonic ("");
- label = gtk_expander_get_label_widget (GTK_EXPANDER (widget));
- text = g_strdup_printf ("<b>%s</b>", _("_Details"));
- gtk_label_set_markup_with_mnemonic (GTK_LABEL (label), text);
- g_signal_connect (widget, "notify::expanded", G_CALLBACK (on_expander_expanded), item);
- g_signal_connect (widget, "realize", G_CALLBACK (on_expander_realize), NULL);
- item->expanded = gtk_expander_get_expanded (GTK_EXPANDER (widget));
- g_free (text);
-
- gtk_widget_set_halign (widget, 0.5);
- gtk_widget_set_valign (widget, 0.5);
- gtk_widget_set_margin_top (widget, 6);
- gtk_widget_set_margin_bottom (widget, 9);
- gtk_widget_show_all (widget);
-
- item->details_widget = gtk_event_box_new ();
- gtk_event_box_set_visible_window (GTK_EVENT_BOX (item->details_widget), FALSE);
- gtk_container_add (GTK_CONTAINER (item->details_widget), widget);
- g_signal_connect (item->details_widget, "realize", G_CALLBACK (on_expander_realize), NULL);
- style = gtk_widget_get_style_context (GTK_WIDGET (item->details_widget));
- gtk_style_context_add_class (style, "gcr-red");
- g_object_ref (item->details_widget);
-
- return item;
-}
-
-static void
-destroy_display_item (gpointer data)
-{
- GcrDisplayItem *item = data;
- GtkTextIter iter, end;
- GtkTextTagTable *tags;
- GcrDisplayView *self;
-
- g_assert (item);
-
- g_assert (GCR_IS_DISPLAY_VIEW (item->display_view));
- self = item->display_view;
-
- tags = gtk_text_buffer_get_tag_table (self->pv->buffer);
- gtk_text_tag_table_remove (tags, item->field_tag);
- gtk_text_tag_table_remove (tags, item->details_tag);
-
- g_object_unref (item->field_tag);
- g_object_unref (item->details_tag);
-
- if (item->pixbuf)
- g_object_unref (item->pixbuf);
- item->pixbuf = NULL;
-
- g_assert (item->details_widget);
- g_object_unref (item->details_widget);
- item->details_widget = NULL;
-
- g_clear_object (&item->area_anchor);
-
- g_return_if_fail (!gtk_text_mark_get_deleted (item->beginning));
- g_return_if_fail (!gtk_text_mark_get_deleted (item->ending));
-
- /* Setup iters to encompass our delemiter characters see create_display_item() */
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->beginning);
- gtk_text_iter_backward_char (&iter);
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &end, item->ending);
- gtk_text_iter_forward_char (&end);
- gtk_text_buffer_delete (self->pv->buffer, &iter, &end);
-
- gtk_text_buffer_delete_mark (self->pv->buffer, item->beginning);
- gtk_text_buffer_delete_mark (self->pv->buffer, item->ending);
-
- g_object_unref (item->beginning);
- g_object_unref (item->ending);
-
- g_free (item);
-}
-
-static GcrDisplayItem*
-lookup_display_item (GcrDisplayView *self, GcrRenderer *renderer)
-{
- GcrDisplayItem *item = g_hash_table_lookup (self->pv->items, renderer);
- g_return_val_if_fail (item, NULL);
- g_assert (item->display_view == self);
- return item;
-}
-
-static GcrDisplayItem*
-find_item_at_iter (GcrDisplayView *self, GtkTextIter *iter)
-{
- GHashTableIter hi;
- GcrDisplayItem *item;
- gpointer value;
- GtkTextIter start, end;
-
- g_hash_table_iter_init (&hi, self->pv->items);
- while (g_hash_table_iter_next (&hi, NULL, &value)) {
- item = value;
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &start, item->beginning);
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &end, item->ending);
-
- if (gtk_text_iter_compare (iter, &start) >= 0 &&
- gtk_text_iter_compare (iter, &end) < 0)
- return item;
- }
-
- return NULL;
-}
-
-static void
-on_renderer_data_changed (GcrRenderer *renderer,
- gpointer user_data)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (user_data);
-
- /* Item may be removed, but not yet destroyed */
- if (!g_hash_table_lookup (self->pv->items, renderer))
- return;
-
- /* Just ask the renderer to render itself on us */
- gcr_renderer_render_view (renderer, GCR_VIEWER (self));
-}
-
-static void
-paint_item_icon (GcrDisplayView *self,
- GcrDisplayItem *item,
- GdkRectangle *visible,
- cairo_t *cr)
-{
- GtkTextIter iter;
- GdkRectangle location;
- GtkTextView *view;
-
- if (item->pixbuf == NULL)
- return;
-
- view = GTK_TEXT_VIEW (self);
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->beginning);
- gtk_text_view_get_iter_location (view, &iter, &location);
-
- location.height = gdk_pixbuf_get_height (item->pixbuf);
- location.width = gdk_pixbuf_get_width (item->pixbuf);
- location.x = visible->width - location.width - ICON_MARGIN;
-
- if (!gdk_rectangle_intersect (visible, &location, NULL))
- return;
-
- gtk_text_view_buffer_to_window_coords (view, GTK_TEXT_WINDOW_TEXT,
- location.x, location.y,
- &location.x, &location.y);
-
- cairo_save (cr);
- gdk_cairo_set_source_pixbuf (cr, item->pixbuf, location.x, location.y);
- cairo_rectangle (cr, location.x, location.y, location.width, location.height);
- cairo_fill (cr);
- cairo_restore (cr);
-}
-
-static void
-paint_item_border (GcrDisplayView *self,
- GcrDisplayItem *item,
- GtkStyleContext *context,
- GdkRectangle *visible,
- gint index,
- cairo_t *cr)
-{
- GtkTextView *view;
- GtkTextIter iter, end;
- GdkRectangle location;
-
- if (index == 0)
- return;
-
- view = GTK_TEXT_VIEW (self);
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->beginning);
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &end, item->ending);
-
- /* Don't paint for non-visible items */
- if (gtk_text_iter_compare (&iter, &end) == 0)
- return;
-
- ensure_text_height (self);
-
- gtk_text_view_get_iter_location (view, &iter, &location);
-
- location.height = 2;
- location.width = visible->width - (NORMAL_MARGIN * 2);
- location.x = NORMAL_MARGIN;
- location.y -= self->pv->text_height / 2;
-
- if (!gdk_rectangle_intersect (visible, &location, NULL))
- return;
-
- gtk_render_background (context, cr, location.x, location.y - 0.5, location.width, 1);
-}
-
-static void
-paint_extras (GcrDisplayView *self, cairo_t *cr)
-{
- GdkRectangle visible;
- GcrDisplayItem *item;
- GtkStyleContext *context;
- guint i;
-
- gtk_text_view_get_visible_rect (GTK_TEXT_VIEW (self), &visible);
- context = gtk_widget_get_style_context (GTK_WIDGET (self));
-
- for (i = 0; i < self->pv->renderers->len; i++) {
- item = g_hash_table_lookup (self->pv->items, self->pv->renderers->pdata[i]);
- g_assert (item != NULL);
- paint_item_icon (self, item, &visible, cr);
- paint_item_border (self, item, context, &visible, i, cr);
- }
-}
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static GObject*
-_gcr_display_view_constructor (GType type, guint n_props, GObjectConstructParam *props)
-{
- GObject *obj = G_OBJECT_CLASS (_gcr_display_view_parent_class)->constructor (type, n_props, props);
- GcrDisplayView *self = NULL;
- GtkTextView *view = NULL;
- GtkTextTagTable *tags;
-
- g_return_val_if_fail (obj, NULL);
-
- self = GCR_DISPLAY_VIEW (obj);
- view = GTK_TEXT_VIEW (obj);
-
- tags = create_tag_table (self);
- self->pv->buffer = gtk_text_buffer_new (tags);
- g_object_unref (tags);
-
- gtk_text_view_set_buffer (view, self->pv->buffer);
- gtk_text_view_set_editable (view, FALSE);
- gtk_text_view_set_left_margin (view, NORMAL_MARGIN);
- gtk_text_view_set_right_margin (view, NORMAL_MARGIN);
- gtk_text_view_set_cursor_visible (view, FALSE);
-
- return obj;
-}
-
-static void
-_gcr_display_view_init (GcrDisplayView *self)
-{
- self->pv = _gcr_display_view_get_instance_private (self);
- self->pv->items = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, destroy_display_item);
- self->pv->renderers = g_ptr_array_new_with_free_func (g_object_unref);
-}
-
-static void
-_gcr_display_view_dispose (GObject *obj)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (obj);
- GcrRenderer *renderer;
- GcrDisplayItem *item;
-
- while (self->pv->renderers->len) {
- renderer = g_ptr_array_index (self->pv->renderers, 0);
- item = g_hash_table_lookup (self->pv->items, renderer);
- g_return_if_fail (item);
- g_signal_handler_disconnect (renderer, item->data_changed_id);
- if (!g_hash_table_remove (self->pv->items, renderer))
- g_return_if_reached ();
- g_ptr_array_remove_index_fast (self->pv->renderers, 0);
- }
-
- if (self->pv->buffer)
- g_object_unref (self->pv->buffer);
- self->pv->buffer = NULL;
-
- g_assert (g_hash_table_size (self->pv->items) == 0);
-
- G_OBJECT_CLASS (_gcr_display_view_parent_class)->dispose (obj);
-}
-
-static void
-_gcr_display_view_finalize (GObject *obj)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (obj);
-
- if (self->pv->buffer)
- g_object_unref (self->pv->buffer);
- self->pv->buffer = NULL;
-
- g_assert (g_hash_table_size (self->pv->items) == 0);
- g_hash_table_destroy (self->pv->items);
- self->pv->items = NULL;
-
- g_assert (self->pv->renderers);
- g_assert (self->pv->renderers->len == 0);
- g_ptr_array_free (self->pv->renderers, TRUE);
- self->pv->renderers = NULL;
-
- g_assert (self->pv->content_tag);
- g_object_unref (self->pv->content_tag);
- self->pv->content_tag = NULL;
-
- g_assert (self->pv->heading_tag);
- g_object_unref (self->pv->heading_tag);
- self->pv->heading_tag = NULL;
-
- g_assert (self->pv->monospace_tag);
- g_object_unref (self->pv->monospace_tag);
- self->pv->monospace_tag = NULL;
-
- g_assert (self->pv->title_tag);
- g_object_unref (self->pv->title_tag);
- self->pv->title_tag = NULL;
-
- g_clear_object (&self->pv->cursor);
-
- G_OBJECT_CLASS (_gcr_display_view_parent_class)->finalize (obj);
-}
-
-static void
-_gcr_display_view_realize (GtkWidget *widget)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (widget);
- GdkDisplay *display;
-
- if (GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->realize)
- GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->realize (widget);
-
- if (!self->pv->cursor) {
- display = gtk_widget_get_display (GTK_WIDGET (self));
- self->pv->cursor = gdk_cursor_new_for_display (display, GDK_ARROW);
- }
-
- gdk_window_set_cursor (gtk_text_view_get_window (GTK_TEXT_VIEW (self), GTK_TEXT_WINDOW_WIDGET),
- self->pv->cursor);
-}
-
-static gboolean
-_gcr_display_view_button_press_event (GtkWidget *widget, GdkEventButton *event)
-{
- GtkTextView *text_view = GTK_TEXT_VIEW (widget);
- GcrDisplayView *self = GCR_DISPLAY_VIEW (widget);
- GcrDisplayItem *item;
- gboolean handled = FALSE;
- GtkTextIter iter;
- gint x, y;
-
- if (GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->button_press_event)
- handled = GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->button_press_event (
- widget, event);
-
- if (event->window == gtk_text_view_get_window (text_view, GTK_TEXT_WINDOW_TEXT)) {
- gtk_text_view_window_to_buffer_coords (text_view, GTK_TEXT_WINDOW_TEXT,
- event->x, event->y, &x, &y);
- gtk_text_view_get_iter_at_location (text_view, &iter, x, y);
-
- item = find_item_at_iter (self, &iter);
- self->pv->current_item = item;
- }
-
- return handled;
-}
-
-static gboolean
-_gcr_display_view_draw (GtkWidget *widget, cairo_t *cr)
-{
- GdkWindow *window;
- gboolean handled = TRUE;
-
- /* Have GtkTextView draw the text first. */
- if (GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->draw)
- handled = GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->draw (widget, cr);
-
- window = gtk_text_view_get_window (GTK_TEXT_VIEW (widget), GTK_TEXT_WINDOW_TEXT);
- if (gtk_cairo_should_draw_window (cr, window))
- paint_extras (GCR_DISPLAY_VIEW (widget), cr);
-
- return handled;
-}
-
-static void
-_gcr_display_get_preferred_height (GtkWidget *widget, gint *minimal_height,
- gint *natural_height)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (widget);
- ensure_measurements (self);
- *minimal_height = self->pv->minimal_height;
- *natural_height = self->pv->natural_height;
-}
-
-static void
-_gcr_display_get_preferred_width (GtkWidget *widget, gint *minimal_width,
- gint *natural_width)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (widget);
- ensure_measurements (self);
- *minimal_width = self->pv->minimal_width;
- *natural_width = self->pv->natural_width;
-}
-
-static void
-_gcr_display_view_populate_popup (GtkTextView *text_view,
-#if GTK_CHECK_VERSION (3, 8, 0)
- GtkWidget *menu
-#else
- GtkMenu *menu
-#endif
- )
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (text_view);
-
- if (GTK_TEXT_VIEW_CLASS (_gcr_display_view_parent_class)->populate_popup)
- GTK_TEXT_VIEW_CLASS (_gcr_display_view_parent_class)->populate_popup (text_view, menu);
-
- /* Ask the current renderer to add menu items */
- if (self->pv->current_item)
- gcr_renderer_popuplate_popup (self->pv->current_item->renderer,
- GCR_VIEWER (self), GTK_MENU (menu));
-}
-
-static void
-_gcr_display_view_class_init (GcrDisplayViewClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
- GtkTextViewClass *text_view_class = GTK_TEXT_VIEW_CLASS (klass);
-
- _gcr_display_view_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->constructor = _gcr_display_view_constructor;
- gobject_class->dispose = _gcr_display_view_dispose;
- gobject_class->finalize = _gcr_display_view_finalize;
-
- widget_class->realize = _gcr_display_view_realize;
- widget_class->button_press_event = _gcr_display_view_button_press_event;
- widget_class->get_preferred_height = _gcr_display_get_preferred_height;
- widget_class->get_preferred_width = _gcr_display_get_preferred_width;
- widget_class->draw = _gcr_display_view_draw;
-
- text_view_class->populate_popup = _gcr_display_view_populate_popup;
-
- /* Load a CSS once */
- do {
- GtkCssProvider* provider = gtk_css_provider_new ();
- GdkDisplay* display = gdk_display_get_default ();
- GdkScreen* screen = gdk_display_get_default_screen (display);
- GError *err = NULL;
-
- gtk_style_context_add_provider_for_screen (screen,
- GTK_STYLE_PROVIDER(provider),
- GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
-
- if (!gtk_css_provider_load_from_data (GTK_CSS_PROVIDER(provider),
- ".gcr-red * { background-color: red; }\n", -1, &err)) {
- g_warning ("couldn't load style: %s",
- err && err->message ? err->message : "");
- }
- g_object_unref (provider);
- } while (0);
-}
-
-static void
-_gcr_display_view_real_insert_renderer (GcrViewer *viewer,
- GcrRenderer *renderer,
- GcrRenderer *before)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer);
- GcrDisplayItem *item;
- guint i;
-
- if (before != NULL)
- g_return_if_fail (g_hash_table_lookup (self->pv->items, before) != NULL);
-
- item = create_display_item (self, renderer);
- g_object_ref (renderer);
-
- /* Insert it at the right place */
- if (before != NULL) {
- g_ptr_array_add (self->pv->renderers, NULL);
- for (i = self->pv->renderers->len; i > 0; i--) {
- self->pv->renderers->pdata[i] = self->pv->renderers->pdata[i - 1];
- if (self->pv->renderers->pdata[i] == before) {
- self->pv->renderers->pdata[i - 1] = renderer;
- break;
- }
- }
-
- /* Must have been found */
- g_assert (i > 0);
-
- /* No before, just add to end */
- } else {
- g_ptr_array_add (self->pv->renderers, renderer);
- }
-
- g_hash_table_insert (self->pv->items, renderer, item);
-
- gcr_renderer_render_view (renderer, viewer);
- item->data_changed_id = g_signal_connect (renderer, "data-changed",
- G_CALLBACK (on_renderer_data_changed), self);
-}
-
-static void
-_gcr_display_view_real_add_renderer (GcrViewer *viewer, GcrRenderer *renderer)
-{
- _gcr_display_view_real_insert_renderer (viewer, renderer, NULL);
-}
-
-static void
-_gcr_display_view_real_remove_renderer (GcrViewer *viewer, GcrRenderer *renderer)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer);
- GcrDisplayItem *item;
-
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- /* Unhook the callback */
- g_signal_handler_disconnect (renderer, item->data_changed_id);
-
- /* Destroys the display item */
- g_assert (item->display_view == self);
- g_hash_table_remove (self->pv->items, renderer);
-
- /* Unrefs the renderer */
- if (!g_ptr_array_remove (self->pv->renderers, renderer))
- g_return_if_reached ();
-}
-
-static guint
-_gcr_display_view_real_count_renderers (GcrViewer *viewer)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer);
- return self->pv->renderers->len;
-}
-
-static GcrRenderer*
-_gcr_display_view_real_get_renderer (GcrViewer *viewer, guint index_)
-{
- GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer);
- g_return_val_if_fail (index_ < self->pv->renderers->len, NULL);
- return g_ptr_array_index (self->pv->renderers, index_);
-}
-
-static void
-_gcr_display_view_viewer_iface (GcrViewerIface *iface)
-{
- iface->add_renderer = (gpointer)_gcr_display_view_real_add_renderer;
- iface->insert_renderer = (gpointer)_gcr_display_view_real_insert_renderer;
- iface->remove_renderer = (gpointer)_gcr_display_view_real_remove_renderer;
- iface->count_renderers = (gpointer)_gcr_display_view_real_count_renderers;
- iface->get_renderer = (gpointer)_gcr_display_view_real_get_renderer;
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-GcrDisplayView*
-_gcr_display_view_new (void)
-{
- return g_object_new (GCR_TYPE_DISPLAY_VIEW, NULL);
-}
-
-void
-_gcr_display_view_begin (GcrDisplayView *self,
- GcrRenderer *renderer)
-{
- GtkTextIter start, iter;
- GcrDisplayItem *item;
- GList *widgets, *l;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- /* Remove the details widget so it doesn't get destroyed */
- if (gtk_widget_get_parent (item->details_widget))
- gtk_container_remove (GTK_CONTAINER (self), item->details_widget);
-
- /* Remove area widgets so they don't get destroyed unnecessarily */
- if (item->area_anchor) {
- g_assert (!gtk_text_child_anchor_get_deleted (item->area_anchor));
- widgets = gtk_text_child_anchor_get_widgets (item->area_anchor);
- for (l = widgets; l != NULL; l = g_list_next (l))
- gtk_container_remove (GTK_CONTAINER (self), l->data);
- g_list_free (widgets);
- g_object_unref (item->area_anchor);
- item->area_anchor = NULL;
- }
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &start, item->beginning);
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
- gtk_text_buffer_delete (self->pv->buffer, &start, &iter);
-
- item->extra_tag = NULL;
- item->field_width = 0;
- item->details = FALSE;
-}
-
-void
-_gcr_display_view_end (GcrDisplayView *self,
- GcrRenderer *renderer)
-{
- GcrDisplayItem *item;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-}
-
-void
-_gcr_display_view_start_details (GcrDisplayView *self, GcrRenderer *renderer)
-{
- GtkTextChildAnchor *anchor;
- GcrDisplayItem *item;
- GtkTextIter iter;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- if (item->details) {
- g_warning ("A GcrRenderer implementation has called %s twice in one render",
- G_STRFUNC);
- return;
- }
-
- item->extra_tag = item->details_tag;
- item->details = TRUE;
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
- anchor = gtk_text_buffer_create_child_anchor (self->pv->buffer, &iter);
- gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (self), item->details_widget, anchor);
- gtk_widget_show_all (item->details_widget);
- gtk_text_buffer_insert (self->pv->buffer, &iter, "\n", 1);
-}
-
-void
-_gcr_display_view_append_content (GcrDisplayView *self, GcrRenderer *renderer,
- const gchar *content, const gchar *details)
-{
- GcrDisplayItem *item;
- GtkTextIter iter;
- gchar *memory = NULL;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- g_return_if_fail (content);
-
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- if (item->details && !item->expanded)
- return;
-
- if (details)
- content = memory = g_strdup_printf ("%s: %s", content, details);
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, content, -1,
- self->pv->content_tag, item->extra_tag, NULL);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1,
- item->extra_tag, NULL);
-
- g_free (memory);
-}
-
-void
-_gcr_display_view_append_value (GcrDisplayView *self, GcrRenderer *renderer, const gchar *field,
- const gchar *value, gboolean monospace)
-{
- GcrDisplayItem *item;
- PangoRectangle extents;
- PangoTabArray *tabs;
- PangoLayout *layout;
- GtkTextIter iter;
- gchar *text;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- g_return_if_fail (field);
-
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- if (item->details && !item->expanded)
- return;
-
- text = g_strdup_printf ("%s:", field);
- if (value == NULL)
- value = "";
-
- /* Measure the width of the field */
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), text);
- pango_layout_get_extents (layout, NULL, &extents);
- pango_extents_to_pixels (&extents, NULL);
- g_object_unref (layout);
-
- /* An estimate of the text height */
- self->pv->text_height = extents.height;
-
- /* Make the tab wide enough to accomodate */
- if (extents.width > item->field_width) {
- item->field_width = extents.width + COLUMN_MARGIN;
- tabs = pango_tab_array_new (1, TRUE);
- pango_tab_array_set_tab (tabs, 0, PANGO_TAB_LEFT, item->field_width);
- g_object_set (item->field_tag,
- "left-margin", FIELD_MARGIN,
- "indent", 0 - item->field_width,
- "tabs", tabs,
- NULL);
- pango_tab_array_free (tabs);
- }
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, text, -1,
- item->field_tag, item->extra_tag, NULL);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\t", 1,
- item->extra_tag, NULL);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, value, -1, item->field_tag,
- monospace ? self->pv->monospace_tag : item->extra_tag,
- monospace ? item->extra_tag : NULL, NULL);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1,
- item->extra_tag, NULL);
-
- g_free (text);
-}
-
-void
-_gcr_display_view_append_hex (GcrDisplayView *self, GcrRenderer *renderer,
- const gchar *field, gconstpointer value, gsize n_value)
-{
- gchar *display;
-
- display = egg_hex_encode_full (value, n_value, TRUE, " ", 1);
- _gcr_display_view_append_value (self, renderer, field, display, TRUE);
- g_free (display);
-}
-
-void
-_gcr_display_view_append_title (GcrDisplayView *self, GcrRenderer *renderer, const gchar *title)
-{
- GcrDisplayItem *item;
- GtkTextIter iter;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- g_return_if_fail (title);
-
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- if (item->details && !item->expanded)
- return;
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, title, -1,
- self->pv->title_tag, item->extra_tag, NULL);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1,
- item->extra_tag, NULL);
-}
-
-void
-_gcr_display_view_append_heading (GcrDisplayView *self, GcrRenderer *renderer, const gchar *heading)
-{
- GcrDisplayItem *item;
- GtkTextIter iter;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- g_return_if_fail (heading);
-
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- if (item->details && !item->expanded)
- return;
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, heading, -1,
- self->pv->heading_tag, item->extra_tag, NULL);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1,
- item->extra_tag, NULL);
-}
-
-void
-_gcr_display_view_append_fingerprint (GcrDisplayView *self, GcrRenderer *renderer, const guchar *data,
- gsize n_data, const gchar *name, GChecksumType type)
-{
- GChecksum *checksum;
- guint8 *buffer;
- gsize n_buffer;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
-
- checksum = g_checksum_new (type);
- g_return_if_fail (checksum);
- g_checksum_update (checksum, data, n_data);
-
- n_buffer = g_checksum_type_get_length (type);
- g_return_if_fail (n_buffer);
- buffer = g_malloc0 (n_buffer);
-
- g_checksum_get_digest (checksum, buffer, &n_buffer);
- g_checksum_free (checksum);
-
- _gcr_display_view_append_hex (self, renderer, name, buffer, n_buffer);
-
- g_free (buffer);
-}
-
-void
-_gcr_display_view_append_message (GcrDisplayView *self,
- GcrRenderer *renderer,
- GtkMessageType message_type,
- const gchar *message)
-{
- const gchar *name = NULL;
- GtkWidget *image = NULL;
- GcrDisplayItem *item;
- GtkTextChildAnchor *anchor;
- GtkTextIter iter;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- g_return_if_fail (GCR_IS_RENDERER (renderer));
-
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- switch (message_type) {
- case GTK_MESSAGE_INFO:
- name = "dialog-information";
- break;
-
- case GTK_MESSAGE_QUESTION:
- name = "dialog-question";
- break;
-
- case GTK_MESSAGE_WARNING:
- name = "dialog-warning";
- break;
-
- case GTK_MESSAGE_ERROR:
- name = "dialog-error";
- break;
-
- case GTK_MESSAGE_OTHER:
- break;
-
- default:
- g_warning ("unknown GtkMessageType: %u", message_type);
- break;
- }
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
-
- if (name != NULL) {
- image = gtk_image_new_from_icon_name (name, GTK_ICON_SIZE_MENU);
-#if GTK_CHECK_VERSION (3, 12, 0)
- gtk_widget_set_margin_start (image, MESSAGE_PADDING);
- gtk_widget_set_margin_end (image, MESSAGE_PADDING);
-#else
- gtk_widget_set_margin_left (image, MESSAGE_PADDING);
- gtk_widget_set_margin_right (image, MESSAGE_PADDING);
-#endif
- gtk_widget_show (image);
-
- anchor = gtk_text_buffer_create_child_anchor (self->pv->buffer, &iter);
- gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (self), image, anchor);
- }
-
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, message, -1,
- self->pv->message_tag, item->extra_tag, NULL);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1,
- item->extra_tag, NULL);
-}
-
-void
-_gcr_display_view_set_icon (GcrDisplayView *self, GcrRenderer *renderer, GIcon *icon)
-{
- GcrDisplayItem *item;
- GdkScreen *screen;
- GtkIconTheme *icon_theme;
- gint width, height;
- GtkIconInfo *info;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item);
-
- if (item->pixbuf)
- g_object_unref (item->pixbuf);
- item->pixbuf = NULL;
-
- if (!icon)
- return;
-
- screen = gtk_widget_get_screen (GTK_WIDGET (self));
- icon_theme = gtk_icon_theme_get_for_screen (screen);
-
- if (!gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &width, &height))
- g_return_if_reached ();
-
- info = gtk_icon_theme_lookup_by_gicon (icon_theme, icon, MIN (width, height),
- GTK_ICON_LOOKUP_USE_BUILTIN);
-
- if (info) {
- GtkStyleContext *style = gtk_widget_get_style_context (GTK_WIDGET (self));
- item->pixbuf = gtk_icon_info_load_symbolic_for_context (info, style, FALSE, NULL);
-#if GTK_CHECK_VERSION(3, 8, 0)
- g_object_unref (info);
-#else
- gtk_icon_info_free (info);
-#endif
- }
-}
-
-void
-_gcr_display_view_add_widget_area (GcrDisplayView *self,
- GcrRenderer *renderer,
- GtkWidget *area)
-{
- GtkTextIter iter, start;
- GcrDisplayItem *item;
-
- g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
- g_return_if_fail (GTK_IS_WIDGET (area));
-
- item = lookup_display_item (self, renderer);
- g_return_if_fail (item != NULL);
- g_return_if_fail (item->area_anchor == NULL);
-
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &start, item->ending);
- iter = start;
-
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n" ZWSP, -1, self->pv->area_tag, NULL);
- gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
-
- item->area_anchor = gtk_text_buffer_create_child_anchor (self->pv->buffer, &iter);
- g_object_ref (item->area_anchor);
- gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (self), area, item->area_anchor);
- gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, ZWSP "\n", -1, self->pv->area_tag, NULL);
-}
diff --git a/ui/gcr-display-view.h b/ui/gcr-display-view.h
deleted file mode 100644
index 99c3bed..0000000
--- a/ui/gcr-display-view.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __GCR_DISPLAY_VIEW_H__
-#define __GCR_DISPLAY_VIEW_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-certificate.h"
-#include "gcr/gcr-types.h"
-
-#include "gcr-viewer.h"
-
-G_BEGIN_DECLS
-
-#define GCR_DISPLAY_VIEW_LINE_BREAK 0x2028
-
-#define GCR_TYPE_DISPLAY_VIEW (_gcr_display_view_get_type ())
-#define GCR_DISPLAY_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_DISPLAY_VIEW, GcrDisplayView))
-#define GCR_DISPLAY_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_DISPLAY_VIEW, GcrDisplayViewClass))
-#define GCR_IS_DISPLAY_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_DISPLAY_VIEW))
-#define GCR_IS_DISPLAY_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_DISPLAY_VIEW))
-#define GCR_DISPLAY_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_DISPLAY_VIEW, GcrDisplayViewClass))
-
-typedef struct _GcrDisplayView GcrDisplayView;
-typedef struct _GcrDisplayViewClass GcrDisplayViewClass;
-typedef struct _GcrDisplayViewPrivate GcrDisplayViewPrivate;
-
-struct _GcrDisplayView {
- /*< private >*/
- GtkTextView parent;
- GcrDisplayViewPrivate *pv;
-};
-
-struct _GcrDisplayViewClass {
- GtkTextViewClass parent_class;
-};
-
-GType _gcr_display_view_get_type (void);
-
-GcrDisplayView* _gcr_display_view_new (void);
-
-void _gcr_display_view_begin (GcrDisplayView *self,
- GcrRenderer *renderer);
-
-void _gcr_display_view_end (GcrDisplayView *self,
- GcrRenderer *renderer);
-
-void _gcr_display_view_append_value (GcrDisplayView *self,
- GcrRenderer *renderer,
- const gchar *field,
- const gchar *value,
- gboolean monospace);
-
-void _gcr_display_view_append_hex (GcrDisplayView *self,
- GcrRenderer *renderer,
- const gchar *field,
- gconstpointer value,
- gsize n_value);
-
-void _gcr_display_view_append_title (GcrDisplayView *self,
- GcrRenderer *renderer,
- const gchar *title);
-
-void _gcr_display_view_append_content (GcrDisplayView *self,
- GcrRenderer *renderer,
- const gchar *content,
- const gchar *details);
-
-void _gcr_display_view_start_details (GcrDisplayView *self,
- GcrRenderer *renderer);
-
-void _gcr_display_view_append_heading (GcrDisplayView *self,
- GcrRenderer *renderer,
- const gchar *heading);
-
-void _gcr_display_view_append_fingerprint (GcrDisplayView *self,
- GcrRenderer *renderer,
- const guchar *data,
- gsize n_data,
- const gchar *name,
- GChecksumType type);
-
-void _gcr_display_view_append_message (GcrDisplayView *self,
- GcrRenderer *renderer,
- GtkMessageType message_type,
- const gchar *message);
-
-void _gcr_display_view_set_icon (GcrDisplayView *self,
- GcrRenderer *renderer,
- GIcon *icon);
-
-void _gcr_display_view_add_widget_area (GcrDisplayView *self,
- GcrRenderer *render,
- GtkWidget *area);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrDisplayView, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_DISPLAY_VIEW_H__ */
diff --git a/ui/gcr-failure-renderer.c b/ui/gcr-failure-renderer.c
deleted file mode 100644
index 46ad600..0000000
--- a/ui/gcr-failure-renderer.c
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr/gcr-icons.h"
-#include "gcr/gcr-parser.h"
-
-#include "gcr-display-view.h"
-#include "gcr-failure-renderer.h"
-#include "gcr-secure-entry-buffer.h"
-
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
-
-/**
- * GcrFailureRenderer:
- *
- * A renderer that can be used for unsupported data.
- */
-
-enum {
- PROP_0,
- PROP_LABEL,
- PROP_ATTRIBUTES
-};
-
-struct _GcrFailureRendererPrivate {
- gchar *label;
- GError *error;
-};
-
-static void gcr_renderer_iface_init (GcrRendererIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GcrFailureRenderer, gcr_failure_renderer, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrFailureRenderer);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_renderer_iface_init);
-);
-
-static void
-gcr_failure_renderer_init (GcrFailureRenderer *self)
-{
- self->pv = gcr_failure_renderer_get_instance_private (self);
-}
-
-static void
-gcr_failure_renderer_finalize (GObject *obj)
-{
- GcrFailureRenderer *self = GCR_FAILURE_RENDERER (obj);
-
- g_error_free (self->pv->error);
- g_free (self->pv->label);
-
- G_OBJECT_CLASS (gcr_failure_renderer_parent_class)->finalize (obj);
-}
-
-static void
-gcr_failure_renderer_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrFailureRenderer *self = GCR_FAILURE_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_free (self->pv->label);
- self->pv->label = g_value_dup_string (value);
- g_object_notify (obj, "label");
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- break;
- case PROP_ATTRIBUTES:
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_failure_renderer_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrFailureRenderer *self = GCR_FAILURE_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_value_take_string (value, self->pv->label);
- break;
- case PROP_ATTRIBUTES:
- g_value_set_boxed (value, NULL);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_failure_renderer_class_init (GcrFailureRendererClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->finalize = gcr_failure_renderer_finalize;
- gobject_class->set_property = gcr_failure_renderer_set_property;
- gobject_class->get_property = gcr_failure_renderer_get_property;
-
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "Label", "Failure Label",
- "",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_ATTRIBUTES,
- g_param_spec_boxed ("attributes", "Attributes", "Renderer attributes",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-static void
-gcr_failure_renderer_render (GcrRenderer *renderer,
- GcrViewer *viewer)
-{
- GcrFailureRenderer *self = GCR_FAILURE_RENDERER (renderer);
- GcrDisplayView *view;
- gchar *display;
- GIcon *icon;
-
- if (GCR_IS_DISPLAY_VIEW (viewer)) {
- view = GCR_DISPLAY_VIEW (viewer);
-
- } else {
- g_warning ("GcrFailureRenderer only works with internal specific "
- "GcrViewer returned by gcr_viewer_new().");
- return;
- }
-
- _gcr_display_view_begin (view, renderer);
-
- if (g_error_matches (self->pv->error, GCR_DATA_ERROR, GCR_ERROR_UNRECOGNIZED))
- icon = g_themed_icon_new ("dialog-warning");
- else
- icon = g_themed_icon_new ("dialog-error");
- _gcr_display_view_set_icon (view, renderer, icon);
- g_object_unref (icon);
-
- _gcr_display_view_append_title (view, renderer, self->pv->label);
-
- if (self->pv->label)
- display = g_strdup_printf (_("Could not display “%s”"), self->pv->label);
- else
- display = g_strdup (_("Could not display file"));
- _gcr_display_view_append_content (view, renderer, display, NULL);
- g_free (display);
-
- if (self->pv->error->message)
- _gcr_display_view_append_value (view, renderer, _("Reason"),
- self->pv->error->message, FALSE);
-
- _gcr_display_view_end (view, renderer);
-}
-
-static void
-gcr_renderer_iface_init (GcrRendererIface *iface)
-{
- iface->render_view = gcr_failure_renderer_render;
-}
-
-/**
- * gcr_failure_renderer_new:
- * @label: (nullable): the label for the failure
- * @error: the error to display
- *
- * Create a new renderer for an error.
- *
- * Returns: (transfer full) (type GcrUi.FailureRenderer): the new renderer
- */
-GcrRenderer *
-gcr_failure_renderer_new (const gchar *label,
- GError *error)
-{
- GcrFailureRenderer *renderer;
-
- renderer = g_object_new (GCR_TYPE_FAILURE_RENDERER,
- "label", label,
- NULL);
-
- renderer->pv->error = g_error_copy (error);
- return GCR_RENDERER (renderer);
-}
-
-/**
- * gcr_failure_renderer_new_unsupported:
- * @label: the label for the failure
- *
- * Create a new renderer for unsupported data.
- *
- * Returns: (transfer full): the new renderer
- */
-GcrRenderer *
-gcr_failure_renderer_new_unsupported (const gchar *label)
-{
- GcrRenderer *renderer;
- GError *error;
-
- error = g_error_new (GCR_DATA_ERROR, GCR_ERROR_UNRECOGNIZED,
- _("Cannot display a file of this type."));
-
- renderer = gcr_failure_renderer_new (label, error);
-
- g_error_free (error);
- return renderer;
-}
diff --git a/ui/gcr-failure-renderer.h b/ui/gcr-failure-renderer.h
deleted file mode 100644
index 4dd1027..0000000
--- a/ui/gcr-failure-renderer.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_FAILURE_RENDERER_H__
-#define __GCR_FAILURE_RENDERER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr-renderer.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_FAILURE_RENDERER (gcr_failure_renderer_get_type ())
-#define GCR_FAILURE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_FAILURE_RENDERER, GcrFailureRenderer))
-#define GCR_FAILURE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_FAILURE_RENDERER, GcrFailureRendererClass))
-#define GCR_IS_FAILURE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_FAILURE_RENDERER))
-#define GCR_IS_FAILURE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_FAILURE_RENDERER))
-#define GCR_FAILURE_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_FAILURE_RENDERER, GcrFailureRendererClass))
-
-typedef struct _GcrFailureRenderer GcrFailureRenderer;
-typedef struct _GcrFailureRendererClass GcrFailureRendererClass;
-typedef struct _GcrFailureRendererPrivate GcrFailureRendererPrivate;
-
-struct _GcrFailureRenderer {
- /*< private >*/
- GObject parent;
- GcrFailureRendererPrivate *pv;
-};
-
-struct _GcrFailureRendererClass {
- /*< private >*/
- GObjectClass parent_class;
-};
-
-GType gcr_failure_renderer_get_type (void);
-
-GcrRenderer * gcr_failure_renderer_new (const gchar *label,
- GError *error);
-
-GcrRenderer * gcr_failure_renderer_new_unsupported (const gchar *label);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrFailureRenderer, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_FAILURE_RENDERER_H__ */
diff --git a/ui/gcr-gnupg-renderer.c b/ui/gcr-gnupg-renderer.c
deleted file mode 100644
index 73fb5d6..0000000
--- a/ui/gcr-gnupg-renderer.c
+++ /dev/null
@@ -1,852 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr-icons.h"
-#include "gcr/gcr-gnupg-records.h"
-#include "gcr/gcr-openpgp.h"
-#include "gcr/gcr-simple-certificate.h"
-#include "gcr/gcr-types.h"
-
-#include "gcr-display-view.h"
-#include "gcr-gnupg-renderer.h"
-#include "gcr-renderer.h"
-
-#include "gck/gck.h"
-
-#include "egg/egg-hex.h"
-
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
-
-#include <stdlib.h>
-
-enum {
- PROP_0,
- PROP_RECORDS,
- PROP_LABEL,
- PROP_ATTRIBUTES
-};
-
-struct _GcrGnupgRendererPrivate {
- GPtrArray *records;
- GckAttributes *attrs;
- gchar *label;
-};
-
-static void _gcr_gnupg_renderer_iface_init (GcrRendererIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GcrGnupgRenderer, _gcr_gnupg_renderer, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrGnupgRenderer);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, _gcr_gnupg_renderer_iface_init);
-);
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-static gchar *
-calculate_label (GcrGnupgRenderer *self)
-{
- gchar *userid;
- gchar *label = NULL;
-
- if (self->pv->attrs) {
- if (gck_attributes_find_string (self->pv->attrs, CKA_LABEL, &label))
- return label;
- }
-
- userid = _gcr_gnupg_records_get_user_id (self->pv->records);
- if (userid != NULL) {
- if (!_gcr_gnupg_records_parse_user_id (userid, &label, NULL, NULL))
- label = NULL;
- }
-
- if (label != NULL)
- return label;
-
- if (self->pv->label)
- return g_strdup (self->pv->label);
-
- return g_strdup (_("PGP Key"));
-}
-
-static void
-_gcr_gnupg_renderer_init (GcrGnupgRenderer *self)
-{
- self->pv = _gcr_gnupg_renderer_get_instance_private (self);
-}
-
-static void
-_gcr_gnupg_renderer_finalize (GObject *obj)
-{
- GcrGnupgRenderer *self = GCR_GNUPG_RENDERER (obj);
-
- gck_attributes_unref (self->pv->attrs);
- g_free (self->pv->label);
- if (self->pv->records)
- g_ptr_array_unref (self->pv->records);
-
- G_OBJECT_CLASS (_gcr_gnupg_renderer_parent_class)->finalize (obj);
-}
-
-static void
-_gcr_gnupg_renderer_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrGnupgRenderer *self = GCR_GNUPG_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_RECORDS:
- _gcr_gnupg_renderer_set_records (self, g_value_get_boxed (value));
- break;
- case PROP_LABEL:
- g_free (self->pv->label);
- self->pv->label = g_value_dup_string (value);
- g_object_notify (obj, "label");
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- break;
- case PROP_ATTRIBUTES:
- _gcr_gnupg_renderer_set_attributes (self, g_value_get_boxed (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_gnupg_renderer_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrGnupgRenderer *self = GCR_GNUPG_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_RECORDS:
- g_value_set_object (value, self->pv->records);
- break;
- case PROP_LABEL:
- g_value_take_string (value, calculate_label (self));
- break;
- case PROP_ATTRIBUTES:
- g_value_set_boxed (value, self->pv->attrs);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_gnupg_renderer_class_init (GcrGnupgRendererClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GckBuilder builder = GCK_BUILDER_INIT;
-
- _gcr_gnupg_renderer_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->finalize = _gcr_gnupg_renderer_finalize;
- gobject_class->set_property = _gcr_gnupg_renderer_set_property;
- gobject_class->get_property = _gcr_gnupg_renderer_get_property;
-
- g_object_class_install_property (gobject_class, PROP_RECORDS,
- g_param_spec_boxed ("records", "Records", "Gnupg records to display",
- G_TYPE_PTR_ARRAY,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_ATTRIBUTES,
- g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "Label", "Certificate Label",
- "",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /* Register this as a renderer which can be loaded */
- gck_builder_add_ulong (&builder, CKA_CLASS, CKO_GCR_GNUPG_RECORDS);
- gcr_renderer_register (GCR_TYPE_GNUPG_RENDERER, gck_builder_end (&builder));
-}
-
-static const gchar *
-name_for_algo (guint algo)
-{
- switch (algo)
- {
- case GCR_OPENPGP_ALGO_RSA:
- case GCR_OPENPGP_ALGO_RSA_E:
- case GCR_OPENPGP_ALGO_RSA_S:
- return _("RSA");
- case GCR_OPENPGP_ALGO_ELG_E:
- return _("Elgamal");
- case GCR_OPENPGP_ALGO_DSA:
- return _("DSA");
- default:
- return NULL;
- }
-}
-
-static const gchar *
-capability_for_code (gchar code)
-{
- switch (code) {
- case 'e': case 'E':
- return _("Encrypt");
- case 's': case 'S':
- return _("Sign");
- case 'c': case 'C':
- return _("Certify");
- case 'a': case 'A':
- return _("Authenticate");
- case 'D':
- return C_("capability", "Disabled");
- default:
- return NULL;
- }
-}
-
-static gchar *
-capabilities_for_codes (const gchar *codes)
-{
- const gchar *cap;
- GString *result;
- guint i;
-
- result = g_string_new ("");
- for (i = 0; codes[i] != 0; i++) {
- if (result->len)
- g_string_append_unichar (result, GCR_DISPLAY_VIEW_LINE_BREAK);
- cap = capability_for_code (codes[i]);
- if (cap != NULL)
- g_string_append (result, cap);
- else
- g_string_append_c (result, codes[i]);
- }
- return g_string_free (result, FALSE);
-}
-
-static const gchar *
-status_for_code (gchar code)
-{
- switch (code) {
- case 'o':
- return _("Unknown");
- case 'i':
- return _("Invalid");
- case 'd':
- return C_("ownertrust", "Disabled");
- case 'r':
- return _("Revoked");
- case 'e':
- return _("Expired");
- case 'q': case '-':
- return _("Undefined trust");
- case 'n':
- return _("Distrusted");
- case 'm':
- return _("Marginally trusted");
- case 'f':
- return _("Fully trusted");
- case 'u':
- return _("Ultimately trusted");
- default:
- return NULL;
- }
-}
-
-static const gchar *
-message_for_code (gchar code,
- GtkMessageType *message_type)
-{
- *message_type = GTK_MESSAGE_OTHER;
- switch (code) {
- case 'o':
- *message_type = GTK_MESSAGE_QUESTION;
- return _("The information in this key has not yet been verified");
- case 'i':
- *message_type = GTK_MESSAGE_ERROR;
- return _("This key is invalid");
- case 'd':
- *message_type = GTK_MESSAGE_WARNING;
- return _("This key has been disabled");
- case 'r':
- *message_type = GTK_MESSAGE_ERROR;
- return _("This key has been revoked");
- case 'e':
- *message_type = GTK_MESSAGE_ERROR;
- return _("This key has expired");
- case 'q': case '-':
- return NULL;
- case 'n':
- *message_type = GTK_MESSAGE_WARNING;
- return _("This key is distrusted");
- case 'm':
- *message_type = GTK_MESSAGE_OTHER;
- return _("This key is marginally trusted");
- case 'f':
- *message_type = GTK_MESSAGE_OTHER;
- return _("This key is fully trusted");
- case 'u':
- *message_type = GTK_MESSAGE_OTHER;
- return _("This key is ultimately trusted");
- default:
- return NULL;
- }
-}
-
-static void
-append_key_record (GcrGnupgRenderer *self,
- GcrDisplayView *view,
- GcrRecord *record,
- const gchar *title)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- const gchar *value;
- gchar *display;
- GDateTime *date;
- gchar code;
- guint algo;
- guint bits;
-
- _gcr_display_view_append_heading (view, renderer, title);
-
- /* Key ID */
- value = _gcr_record_get_raw (record, GCR_RECORD_KEY_KEYID);
- if (value != NULL)
- _gcr_display_view_append_value (view, renderer, _("Key ID"), value, TRUE);
-
- /* Algorithm */
- if (_gcr_record_get_uint (record, GCR_RECORD_KEY_ALGO, &algo)) {
- display = NULL;
- value = name_for_algo (algo);
- if (value == NULL)
- value = display = g_strdup_printf ("%u", algo);
- _gcr_display_view_append_value (view, renderer, _("Algorithm"), value, FALSE);
- g_free (display);
- }
-
- /* Key Size */
- if (_gcr_record_get_uint (record, GCR_RECORD_KEY_BITS, &bits)) {
- display = g_strdup_printf ("%u", bits);
- _gcr_display_view_append_value (view, renderer, _("Key Size"), display, FALSE);
- g_free (display);
- }
-
- /* Created */
- date = _gcr_record_get_date (record, GCR_RECORD_KEY_TIMESTAMP);
- if (date != NULL) {
- display = g_date_time_format (date, "%x");
- _gcr_display_view_append_value (view, renderer, _("Created"), display, FALSE);
- g_free (display);
- g_date_time_unref (date);
- }
-
- /* Expiry */
- date = _gcr_record_get_date (record, GCR_RECORD_KEY_EXPIRY);
- if (date != NULL) {
- display = g_date_time_format (date, "%x");
- _gcr_display_view_append_value (view, renderer, _("Expiry"), display, FALSE);
- g_free (display);
- g_date_time_unref (date);
- }
-
- /* Capabilities */
- value = _gcr_record_get_raw (record, GCR_RECORD_PUB_CAPS);
- if (value != NULL && value[0] != '\0') {
- display = capabilities_for_codes (value);
- _gcr_display_view_append_value (view, renderer, _("Capabilities"), display, FALSE);
- g_free (display);
- }
-
- /* Owner Trust */
- code = _gcr_record_get_char (record, GCR_RECORD_KEY_OWNERTRUST);
- if (code != 0) {
- display = NULL;
- value = status_for_code (code);
- if (value == NULL) {
- value = display = g_new0 (gchar, 2);
- display[0] = code;
- }
- _gcr_display_view_append_value (view, renderer, _("Owner trust"), value, FALSE);
- g_free (display);
- }
-}
-
-static void
-append_uid_record (GcrGnupgRenderer *self,
- GcrDisplayView *view,
- GcrRecord *record)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- gchar *userid;
- gchar *name;
- gchar *comment;
- gchar *email;
- GDateTime *date;
- gchar *display;
-
- _gcr_display_view_append_heading (view, renderer, _("User ID"));
-
- userid = _gcr_record_get_string (record, GCR_RECORD_UID_USERID);
- if (userid == NULL) {
- _gcr_display_view_append_value (view, renderer, _("Value"), _("Unknown"), FALSE);
- return;
- }
-
- if (_gcr_gnupg_records_parse_user_id (userid, &name, &email, &comment)) {
- if (name != NULL)
- _gcr_display_view_append_value (view, renderer, _("Name"), name, FALSE);
- g_free (name);
- if (email != NULL)
- _gcr_display_view_append_value (view, renderer, _("Email"), email, FALSE);
- g_free (email);
- if (comment != NULL)
- _gcr_display_view_append_value (view, renderer, _("Comment"), comment, FALSE);
- g_free (comment);
-
- /* Unparseable user id */
- } else {
- _gcr_display_view_append_value (view, renderer, _("Value"), userid, FALSE);
- }
-
- /* Created */
- date = _gcr_record_get_date (record, GCR_RECORD_UID_TIMESTAMP);
- if (date != NULL) {
- display = g_date_time_format (date, "%x");
- _gcr_display_view_append_value (view, renderer, _("Created"), display, FALSE);
- g_free (display);
- g_date_time_unref (date);
- }
-
- /* Expiry */
- date = _gcr_record_get_date (record, GCR_RECORD_UID_EXPIRY);
- if (date != NULL) {
- display = g_date_time_format (date, "%x");
- _gcr_display_view_append_value (view, renderer, _("Expiry"), display, FALSE);
- g_free (display);
- g_date_time_unref (date);
- }
-
- g_free (userid);
-}
-
-static void
-append_uat_record (GcrGnupgRenderer *self,
- GcrDisplayView *view,
- GcrRecord *record)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- gchar **parts;
- gchar *display;
- const gchar *value;
- GDateTime *date;
-
- _gcr_display_view_append_heading (view, renderer, _("User Attribute"));
-
- /* Size */
- value = _gcr_record_get_raw (record, GCR_RECORD_UAT_COUNT_SIZE);
- if (value != NULL) {
- parts = g_strsplit (value, " ", 2);
- if (parts && parts[0] && parts[1])
- _gcr_display_view_append_value (view, renderer, _("Size"), parts[1], FALSE);
- g_strfreev (parts);
- }
-
- /* Created */
- date = _gcr_record_get_date (record, GCR_RECORD_KEY_TIMESTAMP);
- if (date != NULL) {
- display = g_date_time_format (date, "%x");
- _gcr_display_view_append_value (view, renderer, _("Created"), display, FALSE);
- g_free (display);
- g_date_time_unref (date);
- }
-
- /* Expiry */
- date = _gcr_record_get_date (record, GCR_RECORD_KEY_EXPIRY);
- if (date != NULL) {
- display = g_date_time_format (date, "%x");
- _gcr_display_view_append_value (view, renderer, _("Expiry"), display, FALSE);
- g_free (display);
- g_date_time_unref (date);
- }
-}
-
-static const gchar *
-signature_klass_string (const gchar *klass)
-{
- char *end;
- guint val;
-
- val = strtoul (klass, &end, 16);
- if (end != klass + 2)
- return NULL;
-
- switch (val) {
- case 0x00:
- return _("Signature of a binary document");
- case 0x01:
- return _("Signature of a canonical text document");
- case 0x02:
- return _("Standalone signature");
- case 0x10:
- return _("Generic certification of key");
- case 0x11:
- return _("Persona certification of key");
- case 0x12:
- return _("Casual certification of key");
- case 0x13:
- return _("Positive certification of key");
- case 0x18:
- return _("Subkey binding signature");
- case 0x19:
- return _("Primary key binding signature");
- case 0x1F:
- return _("Signature directly on key");
- case 0x20:
- return _("Key revocation signature");
- case 0x28:
- return _("Subkey revocation signature");
- case 0x30:
- return _("Certification revocation signature");
- case 0x40:
- return _("Timestamp signature");
- case 0x50:
- return _("Third-party confirmation signature");
- default:
- return NULL;
- }
-}
-
-static void
-append_sig_record (GcrGnupgRenderer *self,
- GcrDisplayView *view,
- GcrRecord *record,
- const gchar *keyid)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- const gchar *sigid;
- gchar *display;
- const gchar *value;
- const gchar *klass;
- guint algo;
-
- /* Hide self-signatures. There's so many of them */
- sigid = _gcr_record_get_raw (record, GCR_RECORD_SIG_KEYID);
- if (sigid && keyid && g_str_equal (sigid, keyid))
- return;
-
- _gcr_display_view_append_heading (view, renderer, _("Signature"));
-
- /* Key ID */
- if (sigid != NULL)
- _gcr_display_view_append_value (view, renderer, _("Key ID"), sigid, TRUE);
-
- /* Algorithm */
- if (_gcr_record_get_uint (record, GCR_RECORD_SIG_ALGO, &algo)) {
- display = NULL;
- value = name_for_algo (algo);
- if (value == NULL)
- value = display = g_strdup_printf ("%u", algo);
- _gcr_display_view_append_value (view, renderer, _("Algorithm"), value, FALSE);
- g_free (display);
- }
-
- /* User ID */
- display = _gcr_record_get_string (record, GCR_RECORD_SIG_USERID);
- if (display != NULL)
- _gcr_display_view_append_value (view, renderer, _("User ID"), display, FALSE);
- g_free (display);
-
- /* Signature class */
- klass = _gcr_record_get_raw (record, GCR_RECORD_SIG_CLASS);
- if (klass != NULL) {
- value = NULL;
- if (strlen (klass) >= 2) {
- value = signature_klass_string (klass);
- if (value != NULL) {
- _gcr_display_view_append_value (view, renderer, _("Class"), value, FALSE);
- if (klass[2] == 'l')
- _gcr_display_view_append_value (view, renderer, _("Type"), _("Local only"), FALSE);
- else if (klass[2] == 'x')
- _gcr_display_view_append_value (view, renderer, _("Type"), _("Exportable"), FALSE);
- }
- }
- if (value == NULL)
- _gcr_display_view_append_value (view, renderer, _("Class"), klass, FALSE);
- }
-}
-
-static void
-append_rvk_record (GcrGnupgRenderer *self,
- GcrDisplayView *view,
- GcrRecord *record)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- const gchar *value;
- gchar *display;
- guint algo;
-
- _gcr_display_view_append_heading (view, renderer, _("Revocation Key"));
-
- /* Algorithm */
- if (_gcr_record_get_uint (record, GCR_RECORD_RVK_ALGO, &algo)) {
- display = NULL;
- value = name_for_algo (algo);
- if (value == NULL)
- value = display = g_strdup_printf ("%u", algo);
- _gcr_display_view_append_value (view, renderer, _("Algorithm"), value, FALSE);
- g_free (display);
- }
-
- value = _gcr_record_get_raw (record, GCR_RECORD_RVK_FINGERPRINT);
- if (value != NULL)
- _gcr_display_view_append_value (view, renderer, _("Fingerprint"), value, TRUE);
-}
-
-static void
-append_fpr_record (GcrGnupgRenderer *self,
- GcrDisplayView *view,
- GcrRecord *record,
- GQuark last_schema)
-{
- GcrRenderer *renderer = GCR_RENDERER (self);
- const gchar *value;
- gpointer raw;
- gsize n_raw;
-
- if (last_schema != GCR_RECORD_SCHEMA_PUB &&
- last_schema != GCR_RECORD_SCHEMA_SUB &&
- last_schema != GCR_RECORD_SCHEMA_SEC &&
- last_schema != GCR_RECORD_SCHEMA_SSB)
- return;
-
- value = _gcr_record_get_raw (record, GCR_RECORD_FPR_FINGERPRINT);
- if (value != NULL) {
- raw = egg_hex_decode (value, -1, &n_raw);
- if (raw != NULL)
- _gcr_display_view_append_hex (view, renderer, _("Fingerprint"), raw, n_raw);
- else
- _gcr_display_view_append_value (view, renderer, _("Fingerprint"), value, TRUE);
- g_free (raw);
- }
-}
-
-static void
-_gcr_gnupg_renderer_render (GcrRenderer *renderer,
- GcrViewer *viewer)
-{
- GtkMessageType message_type;
- GcrGnupgRenderer *self;
- GcrDisplayView *view;
- GDateTime *date;
- const gchar *value;
- gchar *display;
- gchar *userid;
- gchar *email;
- gchar *comment;
- GIcon *icon;
- GQuark schema;
- GQuark last_schema;
- gchar code;
- guint i;
-
- self = GCR_GNUPG_RENDERER (renderer);
-
- if (GCR_IS_DISPLAY_VIEW (viewer)) {
- view = GCR_DISPLAY_VIEW (viewer);
-
- } else {
- g_warning ("GcrGnupgRenderer only works with internal specific "
- "GcrViewer returned by gcr_viewer_new().");
- return;
- }
-
- _gcr_display_view_begin (view, renderer);
-
- if (self->pv->records == NULL || self->pv->records->len == 0) {
- _gcr_display_view_end (view, renderer);
- return;
- }
-
- icon = _gcr_gnupg_records_get_icon (self->pv->records);
- _gcr_display_view_set_icon (view, GCR_RENDERER (self), icon);
- g_object_unref (icon);
-
- display = calculate_label (self);
- _gcr_display_view_append_title (view, renderer, display);
- g_free (display);
-
- userid = _gcr_gnupg_records_get_user_id (self->pv->records);
- if (userid != NULL) {
- if (_gcr_gnupg_records_parse_user_id (userid, NULL, &email, &comment)) {
- if (email != NULL)
- _gcr_display_view_append_content (view, renderer, _("Email"), email);
- g_free (email);
- if (comment != NULL)
- _gcr_display_view_append_content (view, renderer, _("Comment"), comment);
- g_free (comment);
- }
- g_free (userid);
- }
-
- code = _gcr_record_get_char (self->pv->records->pdata[0], GCR_RECORD_TRUST);
- if (code != 'e') {
- date = _gcr_record_get_date (self->pv->records->pdata[0], GCR_RECORD_KEY_EXPIRY);
- if (date != NULL) {
- display = g_date_time_format (date, "%x");
- _gcr_display_view_append_content (view, renderer, _("Expires"), display);
- g_date_time_unref (date);
- g_free (display);
- }
- }
-
- /* The warning or status */
- value = message_for_code (code, &message_type);
- if (value != NULL)
- _gcr_display_view_append_message (view, renderer, message_type, value);
-
- _gcr_display_view_start_details (view, renderer);
-
- value = _gcr_gnupg_records_get_keyid (self->pv->records);
- last_schema = 0;
-
- for (i = 0; i < self->pv->records->len; i++) {
- schema = _gcr_record_get_schema (self->pv->records->pdata[i]);
- if (schema == GCR_RECORD_SCHEMA_PUB)
- append_key_record (self, view, self->pv->records->pdata[i], _("Public Key"));
- else if (schema == GCR_RECORD_SCHEMA_SUB)
- append_key_record (self, view, self->pv->records->pdata[i], _("Public Subkey"));
- else if (schema == GCR_RECORD_SCHEMA_SEC)
- append_key_record (self, view, self->pv->records->pdata[i], _("Secret Key"));
- else if (schema == GCR_RECORD_SCHEMA_SSB)
- append_key_record (self, view, self->pv->records->pdata[i], _("Secret Subkey"));
- else if (schema == GCR_RECORD_SCHEMA_UID)
- append_uid_record (self, view, self->pv->records->pdata[i]);
- else if (schema == GCR_RECORD_SCHEMA_UAT)
- append_uat_record (self, view, self->pv->records->pdata[i]);
- else if (schema == GCR_RECORD_SCHEMA_SIG)
- append_sig_record (self, view, self->pv->records->pdata[i], value);
- else if (schema == GCR_RECORD_SCHEMA_RVK)
- append_rvk_record (self, view, self->pv->records->pdata[i]);
- else if (schema == GCR_RECORD_SCHEMA_FPR)
- append_fpr_record (self, view, self->pv->records->pdata[i], last_schema);
- last_schema = schema;
- }
-
- _gcr_display_view_end (view, renderer);
-}
-
-static void
-_gcr_gnupg_renderer_iface_init (GcrRendererIface *iface)
-{
- iface->render_view = _gcr_gnupg_renderer_render;
-}
-
-GcrGnupgRenderer *
-_gcr_gnupg_renderer_new (GPtrArray *records)
-{
- g_return_val_if_fail (records != NULL, NULL);
-
- return g_object_new (GCR_TYPE_GNUPG_RENDERER,
- "records", records,
- NULL);
-}
-
-GcrGnupgRenderer *
-_gcr_gnupg_renderer_new_for_attributes (const gchar *label,
- GckAttributes *attrs)
-{
- g_return_val_if_fail (attrs != NULL, NULL);
-
- return g_object_new (GCR_TYPE_GNUPG_RENDERER,
- "label", label,
- "attributes", attrs,
- NULL);
-}
-
-GPtrArray *
-_gcr_gnupg_renderer_get_records (GcrGnupgRenderer *self)
-{
- g_return_val_if_fail (GCR_IS_GNUPG_RENDERER (self), NULL);
- return self->pv->records;
-}
-
-void
-_gcr_gnupg_renderer_set_records (GcrGnupgRenderer *self,
- GPtrArray *records)
-{
- g_return_if_fail (GCR_IS_GNUPG_RENDERER (self));
-
- if (records)
- g_ptr_array_ref (records);
- if (self->pv->records)
- g_ptr_array_unref (self->pv->records);
- self->pv->records = records;
-
- if (self->pv->attrs) {
- gck_attributes_unref (self->pv->attrs);
- self->pv->attrs = NULL;
- g_object_notify (G_OBJECT (self), "attributes");
- }
-
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- g_object_notify (G_OBJECT (self), "records");
-}
-
-GckAttributes*
-_gcr_gnupg_renderer_get_attributes (GcrGnupgRenderer *self)
-{
- g_return_val_if_fail (GCR_IS_GNUPG_RENDERER (self), NULL);
- return self->pv->attrs;
-}
-
-void
-_gcr_gnupg_renderer_set_attributes (GcrGnupgRenderer *self,
- GckAttributes *attrs)
-{
- const GckAttribute *attr;
- GPtrArray *records;
-
- g_return_if_fail (GCR_IS_GNUPG_RENDERER (self));
-
- attr = gck_attributes_find (attrs, CKA_VALUE);
- g_return_if_fail (attr != NULL);
- records = _gcr_records_parse_colons (attr->value, attr->length);
- g_return_if_fail (records != NULL);
-
- if (attrs)
- gck_attributes_ref (attrs);
- gck_attributes_unref (self->pv->attrs);
- self->pv->attrs = attrs;
-
- if (self->pv->records)
- g_ptr_array_unref (self->pv->records);
- self->pv->records = records;
- g_object_notify (G_OBJECT (self), "records");
-
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- g_object_notify (G_OBJECT (self), "attributes");
-
-}
diff --git a/ui/gcr-gnupg-renderer.h b/ui/gcr-gnupg-renderer.h
deleted file mode 100644
index fc68713..0000000
--- a/ui/gcr-gnupg-renderer.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> can be included directly."
-#endif
-
-#ifndef __GCR_GNUPG_RENDERER_H__
-#define __GCR_GNUPG_RENDERER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-record.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_GNUPG_RENDERER (_gcr_gnupg_renderer_get_type ())
-#define GCR_GNUPG_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_GNUPG_RENDERER, GcrGnupgRenderer))
-#define GCR_GNUPG_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_GNUPG_RENDERER, GcrGnupgRendererClass))
-#define GCR_IS_GNUPG_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_GNUPG_RENDERER))
-#define GCR_IS_GNUPG_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_GNUPG_RENDERER))
-#define GCR_GNUPG_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_GNUPG_RENDERER, GcrGnupgRendererClass))
-
-typedef struct _GcrGnupgRenderer GcrGnupgRenderer;
-typedef struct _GcrGnupgRendererClass GcrGnupgRendererClass;
-typedef struct _GcrGnupgRendererPrivate GcrGnupgRendererPrivate;
-
-struct _GcrGnupgRenderer {
- GObject parent;
-
- /*< private >*/
- GcrGnupgRendererPrivate *pv;
-};
-
-struct _GcrGnupgRendererClass {
- GObjectClass parent_class;
-};
-
-GType _gcr_gnupg_renderer_get_type (void);
-
-GcrGnupgRenderer * _gcr_gnupg_renderer_new (GPtrArray *records);
-
-GcrGnupgRenderer * _gcr_gnupg_renderer_new_for_attributes (const gchar *label,
- GckAttributes *attrs);
-
-GPtrArray * _gcr_gnupg_renderer_get_records (GcrGnupgRenderer *self);
-
-void _gcr_gnupg_renderer_set_records (GcrGnupgRenderer *self,
- GPtrArray *records);
-
-GckAttributes * _gcr_gnupg_renderer_get_attributes (GcrGnupgRenderer *self);
-
-void _gcr_gnupg_renderer_set_attributes (GcrGnupgRenderer *self,
- GckAttributes *attrs);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrGnupgRenderer, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_GNUPG_RENDERER_H__ */
diff --git a/ui/gcr-import-button.c b/ui/gcr-import-button.c
deleted file mode 100644
index f3a6478..0000000
--- a/ui/gcr-import-button.c
+++ /dev/null
@@ -1,592 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr-internal.h"
-#include "gcr/gcr-library.h"
-#include "gcr/gcr-marshal.h"
-#include "gcr/gcr-parser.h"
-#include "gcr/gcr-version.h"
-
-#include "eggimagemenuitem.h"
-#include "gcr-import-button.h"
-#include "gcr-pkcs11-import-interaction.h"
-
-#include <glib/gi18n-lib.h>
-
-enum {
- PROP_0,
- PROP_LABEL
-};
-
-/**
- * GcrImportButton:
- *
- * A button which imports keys and certificates.
- *
- * The import button shows a spinner when the button is activated. When more
- * than one importer is available, it shows a drop down to select which to
- * import to.
- */
-
-/**
- * GcrImportButtonClass:
- * @parent_class: The parent class
- * @importing: Emitted when the import begins.
- * @imported: Emitted when the import completes, or fails.
- *
- * Class struct for [class@ImportButton].
- */
-
-struct _GcrImportButtonPrivate {
- GList *queued;
- GList *importers;
- gboolean ready;
- gboolean created;
- gboolean importing;
- gchar *imported;
- GtkWidget *spinner;
- GtkWidget *arrow;
- GtkWidget *label;
- GCancellable *cancellable;
- GtkMenu *menu;
-};
-
-enum {
- IMPORTING,
- IMPORTED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-static GQuark QUARK_IMPORTER = 0;
-
-#if GCR_CHECK_VERSION(4,0,0)
-#error Port this class to derive from GtkMenuButton during 4.x ABI bump
-#endif
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrImportButton, gcr_import_button, GTK_TYPE_BUTTON);
-
-static void
-gcr_import_button_init (GcrImportButton *self)
-{
- self->pv = gcr_import_button_get_instance_private (self);
- self->pv->cancellable = g_cancellable_new ();
-
- self->pv->label = gtk_label_new ("");
- gtk_label_set_use_underline (GTK_LABEL (self->pv->label), TRUE);
-}
-
-static void
-update_import_button (GcrImportButton *self)
-{
- gchar *message;
- gchar *label;
-
- /* Initializing, set a spinner */
- if (self->pv->queued && !self->pv->ready) {
- gtk_widget_show (self->pv->spinner);
- gtk_spinner_start (GTK_SPINNER (self->pv->spinner));
- gtk_widget_hide (self->pv->arrow);
- gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
- gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("Initializing\xE2\x80\xA6"));
-
- /* Importing, set a spinner */
- } else if (self->pv->importing) {
- gtk_widget_show (self->pv->spinner);
- gtk_spinner_start (GTK_SPINNER (self->pv->spinner));
- gtk_widget_hide (self->pv->arrow);
- gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
- gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("Import is in progress\xE2\x80\xA6"));
-
- } else if (self->pv->imported) {
- gtk_widget_hide (self->pv->spinner);
- gtk_spinner_stop (GTK_SPINNER (self->pv->spinner));
- gtk_widget_hide (self->pv->arrow);
- gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
- message = g_strdup_printf (_("Imported to: %s"), self->pv->imported);
- gtk_widget_set_tooltip_text (GTK_WIDGET (self), message);
- g_free (message);
-
- /* Not importing, but have importers */
- } else if (self->pv->importers) {
-
- gtk_widget_hide (self->pv->spinner);
- gtk_spinner_stop (GTK_SPINNER (self->pv->spinner));
- gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE);
-
- /* More than one importer */
- if (self->pv->importers->next) {
- gtk_widget_show (self->pv->arrow);
- gtk_widget_set_tooltip_text (GTK_WIDGET (self), NULL);
-
- /* Only one importer */
- } else {
- gtk_widget_hide (self->pv->arrow);
- g_object_get (self->pv->importers->data, "label", &label, NULL);
- message = g_strdup_printf (_("Import to: %s"), label);
- gtk_widget_set_tooltip_text (GTK_WIDGET (self), message);
- g_free (message);
- g_free (label);
- }
-
- /* No importers, none compatible */
- } else if (self->pv->created) {
- gtk_widget_hide (self->pv->spinner);
- gtk_spinner_stop (GTK_SPINNER (self->pv->spinner));
- gtk_widget_hide (self->pv->arrow);
-
- gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
- gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("Cannot import because there are no compatible importers"));
-
- /* No importers yet added */
- } else {
- gtk_widget_hide (self->pv->spinner);
- gtk_spinner_stop (GTK_SPINNER (self->pv->spinner));
- gtk_widget_hide (self->pv->arrow);
-
- gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
- gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("No data to import"));
- }
-}
-
-static void
-on_library_pkcs11_ready (GObject *source,
- GAsyncResult *result,
- gpointer user_data)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (user_data);
- GList *queued, *l;
-
- self->pv->ready = TRUE;
-
- /* Process the parsed items that have been seen */
- queued = self->pv->queued;
- self->pv->queued = NULL;
- for (l = queued; l != NULL; l = g_list_next (l))
- gcr_import_button_add_parsed (self, l->data);
- g_assert (self->pv->queued == NULL);
- g_list_free_full (queued, gcr_parsed_unref);
-}
-
-static void
-gcr_import_button_constructed (GObject *obj)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (obj);
- GtkWidget *grid;
-
- G_OBJECT_CLASS (gcr_import_button_parent_class)->constructed (obj);
-
- self->pv->spinner = gtk_spinner_new ();
- self->pv->arrow = gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON);
- grid = gtk_grid_new ();
-
- gtk_orientable_set_orientation (GTK_ORIENTABLE (grid), GTK_ORIENTATION_HORIZONTAL);
- gtk_container_add (GTK_CONTAINER (grid), self->pv->spinner);
- gtk_container_add (GTK_CONTAINER (grid), self->pv->label);
- gtk_container_add (GTK_CONTAINER (grid), self->pv->arrow);
- gtk_grid_set_row_spacing (GTK_GRID (grid), 3);
- gtk_widget_set_hexpand (grid, TRUE);
- gtk_widget_set_halign (grid, GTK_ALIGN_CENTER);
-
- gtk_widget_show (self->pv->label);
- gtk_widget_show (grid);
-
- gtk_container_add (GTK_CONTAINER (self), grid);
-
- update_import_button (self);
-
- gcr_pkcs11_initialize_async (NULL, on_library_pkcs11_ready, g_object_ref (self));
-}
-
-static void
-gcr_import_button_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- gtk_label_set_label (GTK_LABEL (self->pv->label), g_value_get_string (value));
- g_object_notify (obj, "label");
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_import_button_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_value_set_string (value, gtk_label_get_label (GTK_LABEL (self->pv->label)));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_import_button_dispose (GObject *obj)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (obj);
-
- gck_list_unref_free (self->pv->importers);
- self->pv->importers = NULL;
- g_cancellable_cancel (self->pv->cancellable);
- g_clear_object (&self->pv->menu);
-
- g_list_free_full (self->pv->queued, gcr_parsed_unref);
- self->pv->queued = NULL;
-
- G_OBJECT_CLASS (gcr_import_button_parent_class)->dispose (obj);
-}
-
-static void
-gcr_import_button_finalize (GObject *obj)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (obj);
-
- g_object_unref (self->pv->cancellable);
-
- G_OBJECT_CLASS (gcr_import_button_parent_class)->finalize (obj);
-}
-
-static void
-on_import_complete (GObject *importer,
- GAsyncResult *result,
- gpointer user_data)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (user_data);
- GError *error = NULL;
-
- g_return_if_fail (self->pv->imported == NULL);
-
- self->pv->importing = FALSE;
-
- gcr_importer_import_finish (GCR_IMPORTER (importer), result, &error);
- if (error == NULL) {
- g_object_get (importer, "label", &self->pv->imported, NULL);
- gck_list_unref_free (self->pv->importers);
- self->pv->importers = NULL;
- }
-
- g_signal_emit (self, signals[IMPORTED], 0, importer, error);
- g_clear_error (&error);
-
- update_import_button (self);
-}
-
-static void
-begin_import (GcrImportButton *self,
- GcrImporter *importer)
-{
- GTlsInteraction *interaction;
- GtkWindow *window;
-
- g_return_if_fail (self->pv->importing == FALSE);
-
- g_signal_emit (self, signals[IMPORTING], 0, importer);
-
- self->pv->importing = TRUE;
- g_free (self->pv->imported);
- self->pv->imported = NULL;
-
- /* TODO: Hack. Need to figure out how to pair these up... */
- if (g_strcmp0 (G_OBJECT_TYPE_NAME (importer), "GcrPkcs11Importer") == 0) {
- window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self)));
- interaction = _gcr_pkcs11_import_interaction_new (window);
- gcr_importer_set_interaction (importer, interaction);
- g_object_unref (interaction);
- }
-
- gcr_importer_import_async (importer,
- self->pv->cancellable,
- on_import_complete,
- g_object_ref (self));
-}
-
-static void
-on_importer_menu_activated (GtkMenuItem *menu_item,
- gpointer user_data)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (user_data);
- GcrImporter *importer;
-
- importer = g_object_get_qdata (G_OBJECT (menu_item), QUARK_IMPORTER);
- g_return_if_fail (GCR_IMPORTER (importer));
- g_return_if_fail (self->pv->importing == FALSE);
-
- begin_import (self, importer);
- update_import_button (self);
-}
-
-static void
-update_importer_menu (GcrImportButton *self)
-{
- GtkWidget *menu_item;
- GtkWidget *image;
- GList *children, *l;
- GIcon *icon;
- gchar *label;
-
- if (!self->pv->menu) {
- self->pv->menu = GTK_MENU (gtk_menu_new ());
- g_object_ref_sink (self->pv->menu);
- }
-
- children = gtk_container_get_children (GTK_CONTAINER (self->pv->menu));
- for (l = children; l != NULL; l = g_list_next (l))
- gtk_container_remove (GTK_CONTAINER (self->pv->menu), l->data);
- g_list_free (children);
-
- for (l = self->pv->importers; l != NULL; l = g_list_next (l)) {
- g_object_get (l->data, "label", &label, "icon", &icon, NULL);
- menu_item = egg_image_menu_item_new_with_label (label);
- g_signal_connect (menu_item, "activate", G_CALLBACK (on_importer_menu_activated), self);
- g_object_set_qdata (G_OBJECT (menu_item), QUARK_IMPORTER, l->data);
- image = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_MENU);
- egg_image_menu_item_set_image (EGG_IMAGE_MENU_ITEM (menu_item), image);
- egg_image_menu_item_set_always_show_image (EGG_IMAGE_MENU_ITEM (menu_item), TRUE);
- gtk_widget_show (image);
- gtk_widget_show (menu_item);
- gtk_container_add (GTK_CONTAINER (self->pv->menu), menu_item);
- g_object_unref (icon);
- g_free (label);
- }
-}
-
-#if !GTK_CHECK_VERSION (3,22,0)
-static void
-on_menu_position (GtkMenu *menu,
- gint *x,
- gint *y,
- gboolean *push_in,
- gpointer user_data)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (user_data);
- GtkWidget *widget = GTK_WIDGET (self);
- GtkAllocation allocation;
- GtkRequisition menu_req;
- GdkRectangle monitor;
- GdkWindow *window;
- GtkWidget *toplevel;
- GdkScreen *screen;
- gint monitor_num;
- gint sx = 0;
- gint sy = 0;
-
- g_return_if_fail (x != NULL);
- g_return_if_fail (y != NULL);
- g_return_if_fail (push_in != NULL);
-
- gtk_widget_get_allocation (widget, &allocation);
-
- if (!gtk_widget_get_has_window (widget)) {
- sx += allocation.x;
- sy += allocation.y;
- }
-
- window = gtk_widget_get_window (widget);
- gdk_window_get_root_coords (window, sx, sy, &sx, &sy);
-
- gtk_widget_get_preferred_size (GTK_WIDGET (menu), NULL, &menu_req);
- if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
- *x = sx;
- else
- *x = sx + allocation.width - menu_req.width;
- *y = sy;
-
- screen = gtk_widget_get_screen (widget);
- monitor_num = gdk_screen_get_monitor_at_window (screen, window);
- if (monitor_num < 0)
- monitor_num = 0;
- gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
-
- if (*x < monitor.x)
- *x = monitor.x;
- else if (*x + menu_req.width > monitor.x + monitor.width)
- *x = monitor.x + monitor.width - menu_req.width;
-
- if (monitor.y + monitor.height - *y - allocation.height >= menu_req.height)
- *y += allocation.height;
- else if (*y - monitor.y >= menu_req.height)
- *y -= menu_req.height;
- else if (monitor.y + monitor.height - *y - allocation.height > *y - monitor.y)
- *y += allocation.height;
- else
- *y -= menu_req.height;
-
- gtk_menu_set_monitor (menu, monitor_num);
-
- toplevel = gtk_widget_get_parent (GTK_WIDGET (menu));
- if (GTK_IS_WINDOW (toplevel) && gtk_widget_get_visible (toplevel))
- gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU);
-
- *push_in = FALSE;
-}
-#endif
-
-static void
-gcr_import_button_clicked (GtkButton *button)
-{
- GcrImportButton *self = GCR_IMPORT_BUTTON (button);
-
- g_return_if_fail (self->pv->importing == FALSE);
- g_return_if_fail (self->pv->importers != NULL);
-
- /* More than one importer, show the menu */
- if (self->pv->importers->next) {
- update_importer_menu (self);
-#if GTK_CHECK_VERSION (3,22,0)
- if (gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_LTR)
- gtk_menu_popup_at_widget (self->pv->menu,
- GTK_WIDGET (self),
- GDK_GRAVITY_SOUTH_WEST, GDK_GRAVITY_NORTH_WEST,
- NULL);
- else
- gtk_menu_popup_at_widget (self->pv->menu,
- GTK_WIDGET (self),
- GDK_GRAVITY_SOUTH_EAST, GDK_GRAVITY_NORTH_EAST,
- NULL);
-
-#else
- gtk_menu_popup (self->pv->menu, NULL, NULL, on_menu_position,
- self, 1, gtk_get_current_event_time ());
-#endif
-
- /* Only one importer, import on click */
- } else {
- begin_import (self, self->pv->importers->data);
- }
-
- update_import_button (self);
-}
-
-static void
-gcr_import_button_class_init (GcrImportButtonClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GtkButtonClass *button_class = GTK_BUTTON_CLASS (klass);
-
- gobject_class->constructed = gcr_import_button_constructed;
- gobject_class->dispose = gcr_import_button_dispose;
- gobject_class->finalize = gcr_import_button_finalize;
- gobject_class->get_property = gcr_import_button_get_property;
- gobject_class->set_property = gcr_import_button_set_property;
-
- button_class->clicked = gcr_import_button_clicked;
-
- g_object_class_override_property (gobject_class, PROP_LABEL, "label");
-
- /**
- * GcrImportButton::importing:
- * @self: the import button
- * @importer: the importer that will be imported to
- *
- * Signal emitted when an import begins.
- */
- signals[IMPORTING] = g_signal_new ("importing", GCR_TYPE_IMPORT_BUTTON, G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GcrImportButtonClass, importing),
- NULL, NULL, NULL,
- G_TYPE_NONE, 1, G_TYPE_OBJECT);
-
- /**
- * GcrImportButton::imported:
- * @self: the import button
- * @importer: the importer that was imported to
- * @error: if import was successful %NULL, or an error
- *
- * Signal emitted when an import completes or fails.
- */
- signals[IMPORTED] = g_signal_new ("imported", GCR_TYPE_IMPORT_BUTTON, G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GcrImportButtonClass, imported),
- NULL, NULL, _gcr_marshal_VOID__OBJECT_BOXED,
- G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_ERROR);
-
- QUARK_IMPORTER = g_quark_from_static_string ("gcr-import-button-importer");
-}
-
-/**
- * gcr_import_button_new:
- * @label: (nullable): label to display on the button
- *
- * Create a new #GcrImportButton.
- *
- * Returns: (transfer full): a newly created #GcrImportButton
- */
-GcrImportButton *
-gcr_import_button_new (const gchar *label)
-{
- return g_object_new (GCR_TYPE_IMPORT_BUTTON,
- "label", label,
- NULL);
-}
-
-/**
- * gcr_import_button_add_parsed:
- * @self: an import button
- * @parsed: a parsed item
- *
- * Queue an item to import via the button
- */
-void
-gcr_import_button_add_parsed (GcrImportButton *self,
- GcrParsed *parsed)
-{
- GList *importers;
-
- g_return_if_fail (GCR_IS_IMPORT_BUTTON (self));
- g_return_if_fail (parsed != NULL);
-
- if (!self->pv->ready) {
- self->pv->queued = g_list_prepend (self->pv->queued, gcr_parsed_ref (parsed));
- update_import_button (self);
- return;
- }
-
- g_free (self->pv->imported);
- self->pv->imported = NULL;
-
- if (self->pv->created) {
- importers = gcr_importer_queue_and_filter_for_parsed (self->pv->importers, parsed);
- } else {
- importers = gcr_importer_create_for_parsed (parsed);
- self->pv->created = TRUE;
- }
-
- gck_list_unref_free (self->pv->importers);
- self->pv->importers = importers;
-
- update_import_button (self);
-}
diff --git a/ui/gcr-import-button.h b/ui/gcr-import-button.h
deleted file mode 100644
index 5a06408..0000000
--- a/ui/gcr-import-button.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_IMPORT_BUTTON_H__
-#define __GCR_IMPORT_BUTTON_H__
-
-#include "gcr/gcr-importer.h"
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_IMPORT_BUTTON (gcr_import_button_get_type ())
-#define GCR_IMPORT_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_IMPORT_BUTTON, GcrImportButton))
-#define GCR_IMPORT_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_IMPORT_BUTTON, GcrImportButtonClass))
-#define GCR_IS_IMPORT_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_IMPORT_BUTTON))
-#define GCR_IS_IMPORT_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_IMPORT_BUTTON))
-#define GCR_IMPORT_BUTTON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_IMPORT_BUTTON, GcrImportButtonClass))
-
-typedef struct _GcrImportButton GcrImportButton;
-typedef struct _GcrImportButtonClass GcrImportButtonClass;
-typedef struct _GcrImportButtonPrivate GcrImportButtonPrivate;
-
-struct _GcrImportButton {
- GtkButton parent;
-
- /*< private >*/
- GcrImportButtonPrivate *pv;
-};
-
-struct _GcrImportButtonClass {
- GtkButtonClass parent_class;
-
- void (*importing) (GcrImportButton *self,
- GcrImporter *importer);
-
- void (*imported) (GcrImportButton *self,
- GcrImporter *importer,
- GError *error);
-
- /*< private >*/
- gpointer padding[10];
-};
-
-GType gcr_import_button_get_type (void) G_GNUC_CONST;
-
-GcrImportButton * gcr_import_button_new (const gchar *label);
-
-void gcr_import_button_add_parsed (GcrImportButton *self,
- GcrParsed *parsed);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrImportButton, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_IMPORT_BUTTON_H__ */
diff --git a/ui/gcr-key-renderer.c b/ui/gcr-key-renderer.c
deleted file mode 100644
index 850a2ca..0000000
--- a/ui/gcr-key-renderer.c
+++ /dev/null
@@ -1,481 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr/gcr-fingerprint.h"
-#include "gcr/gcr-icons.h"
-#include "gcr/gcr-subject-public-key.h"
-
-#include "gcr-key-renderer.h"
-#include "gcr-display-view.h"
-#include "gcr-renderer.h"
-#include "gcr-viewer.h"
-
-#include "gck/gck.h"
-
-#include "egg/egg-asn1x.h"
-
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
-
-/**
- * GcrKeyRenderer:
- *
- * An implementation of #GcrRenderer which renders keys.
- */
-
-/**
- * GcrKeyRendererClass:
- * @parent_class: The parent class.
- *
- * The class for #GcrKeyRenderer.
- */
-
-enum {
- PROP_0,
- PROP_LABEL,
- PROP_ATTRIBUTES,
- PROP_OBJECT
-};
-
-struct _GcrKeyRendererPrivate {
- guint key_size;
- gchar *label;
- GckAttributes *attributes;
- GckObject *object;
- GIcon *icon;
- gulong notify_sig;
- GBytes *spk;
-};
-
-static void gcr_key_renderer_renderer_iface (GcrRendererIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GcrKeyRenderer, gcr_key_renderer, G_TYPE_OBJECT,
- G_ADD_PRIVATE (GcrKeyRenderer);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_key_renderer_renderer_iface));
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-static gchar*
-calculate_label (GcrKeyRenderer *self)
-{
- gchar *label;
-
- if (self->pv->label)
- return g_strdup (self->pv->label);
-
- if (self->pv->attributes) {
- if (gck_attributes_find_string (self->pv->attributes, CKA_LABEL, &label))
- return label;
- }
-
- return g_strdup (_("Key"));
-}
-
-static GckAttributes *
-calculate_attrs (GcrKeyRenderer *self)
-{
- if (self->pv->attributes)
- return gck_attributes_ref (self->pv->attributes);
-
- if (GCK_IS_OBJECT_CACHE (self->pv->object))
- return gck_object_cache_get_attributes (GCK_OBJECT_CACHE (self->pv->object));
-
- return NULL;
-}
-
-static guchar *
-calculate_fingerprint (GcrKeyRenderer *self,
- GckAttributes *attrs,
- GChecksumType algorithm,
- gsize *n_fingerprint)
-{
- if (self->pv->spk)
- return gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (self->pv->spk, NULL),
- g_bytes_get_size (self->pv->spk),
- algorithm, n_fingerprint);
-
- return gcr_fingerprint_from_attributes (attrs, algorithm, n_fingerprint);
-}
-
-static void
-on_subject_public_key (GObject *source,
- GAsyncResult *result,
- gpointer user_data)
-{
- GcrKeyRenderer *self = GCR_KEY_RENDERER (user_data);
- GError *error = NULL;
- GNode *node;
-
- node = _gcr_subject_public_key_load_finish (result, &error);
- if (error != NULL) {
- g_message ("couldn't load key information: %s", error->message);
- g_clear_error (&error);
-
- } else {
- if (self->pv->spk)
- g_bytes_unref (self->pv->spk);
- self->pv->spk = NULL;
-
- self->pv->spk = egg_asn1x_encode (node, NULL);
- if (self->pv->spk == NULL)
- g_warning ("invalid subjectPublicKey loaded: %s",
- egg_asn1x_message (node));
- egg_asn1x_destroy (node);
-
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- }
-
- g_object_unref (self);
-}
-
-static void
-update_subject_public_key (GcrKeyRenderer *self)
-{
- if (self->pv->spk)
- g_bytes_unref (self->pv->spk);
- self->pv->spk = NULL;
-
- if (!self->pv->object)
- return;
-
- _gcr_subject_public_key_load_async (self->pv->object, NULL,
- on_subject_public_key,
- g_object_ref (self));
-}
-
-static void
-on_object_cache_attributes (GObject *obj,
- GParamSpec *spec,
- gpointer user_data)
-{
- GcrKeyRenderer *self = GCR_KEY_RENDERER (user_data);
- update_subject_public_key (self);
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
-}
-
-static void
-gcr_key_renderer_init (GcrKeyRenderer *self)
-{
- self->pv = gcr_key_renderer_get_instance_private (self);
- self->pv->icon = g_themed_icon_new (GCR_ICON_KEY);
-}
-
-static void
-gcr_key_renderer_dispose (GObject *obj)
-{
- GcrKeyRenderer *self = GCR_KEY_RENDERER (obj);
-
- if (self->pv->spk)
- g_bytes_unref (self->pv->spk);
- self->pv->spk = NULL;
-
- if (self->pv->object && self->pv->notify_sig) {
- g_signal_handler_disconnect (self->pv->object, self->pv->notify_sig);
- self->pv->notify_sig = 0;
- }
- g_clear_object (&self->pv->object);
-
- G_OBJECT_CLASS (gcr_key_renderer_parent_class)->dispose (obj);
-}
-
-static void
-gcr_key_renderer_finalize (GObject *obj)
-{
- GcrKeyRenderer *self = GCR_KEY_RENDERER (obj);
-
- if (self->pv->attributes)
- gck_attributes_unref (self->pv->attributes);
- self->pv->attributes = NULL;
-
- g_free (self->pv->label);
- self->pv->label = NULL;
-
- if (self->pv->icon)
- g_object_unref (self->pv->icon);
- self->pv->icon = NULL;
-
- G_OBJECT_CLASS (gcr_key_renderer_parent_class)->finalize (obj);
-}
-
-static void
-gcr_key_renderer_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrKeyRenderer *self = GCR_KEY_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_free (self->pv->label);
- self->pv->label = g_value_dup_string (value);
- g_object_notify (obj, "label");
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- break;
- case PROP_ATTRIBUTES:
- gck_attributes_unref (self->pv->attributes);
- self->pv->attributes = g_value_dup_boxed (value);
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- break;
- case PROP_OBJECT:
- g_clear_object (&self->pv->object);
- self->pv->object = g_value_dup_object (value);
- if (self->pv->object) {
- gck_attributes_unref (self->pv->attributes);
- self->pv->attributes = NULL;
- }
- if (GCK_IS_OBJECT_CACHE (self->pv->object)) {
- self->pv->notify_sig = g_signal_connect (self->pv->object,
- "notify::attributes",
- G_CALLBACK (on_object_cache_attributes),
- self);
- on_object_cache_attributes (G_OBJECT (self->pv->object), NULL, self);
- }
- g_object_notify (obj, "attributes");
- g_object_notify (obj, "object");
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_key_renderer_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrKeyRenderer *self = GCR_KEY_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_value_take_string (value, calculate_label (self));
- break;
- case PROP_ATTRIBUTES:
- g_value_take_boxed (value, calculate_attrs (self));
- break;
- case PROP_OBJECT:
- g_value_set_object (value, self->pv->object);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_key_renderer_class_init (GcrKeyRendererClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GckBuilder builder = GCK_BUILDER_INIT;
-
- gcr_key_renderer_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->dispose = gcr_key_renderer_dispose;
- gobject_class->finalize = gcr_key_renderer_finalize;
- gobject_class->set_property = gcr_key_renderer_set_property;
- gobject_class->get_property = gcr_key_renderer_get_property;
-
- g_object_class_override_property (gobject_class, PROP_LABEL, "label");
- g_object_class_override_property (gobject_class, PROP_ATTRIBUTES, "attributes");
-
- g_object_class_install_property (gobject_class, PROP_OBJECT,
- g_param_spec_object ("object", "Object", "Key Object", GCK_TYPE_OBJECT,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /* Register this as a view which can be loaded */
- gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY);
- gcr_renderer_register (GCR_TYPE_KEY_RENDERER, gck_builder_end (&builder));
-}
-
-static void
-gcr_key_renderer_real_render (GcrRenderer *renderer, GcrViewer *viewer)
-{
- GcrKeyRenderer *self;
- GcrDisplayView *view;
- const gchar *text = "";
- GckAttributes *attrs;
- gpointer fingerprint;
- gsize n_fingerprint;
- gchar *display;
- gulong klass;
- gulong key_type;
- guint size;
-
- self = GCR_KEY_RENDERER (renderer);
-
- if (GCR_IS_DISPLAY_VIEW (viewer)) {
- view = GCR_DISPLAY_VIEW (viewer);
-
- } else {
- g_warning ("GcrKeyRenderer only works with internal specific "
- "GcrViewer returned by gcr_viewer_new().");
- return;
- }
-
- _gcr_display_view_begin (view, renderer);
-
- attrs = calculate_attrs (self);
- if (attrs == NULL) {
- _gcr_display_view_end (view, renderer);
- return;
- }
-
- if (!gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) ||
- !gck_attributes_find_ulong (attrs, CKA_KEY_TYPE, &key_type)) {
- g_warning ("private key does not have the CKA_CLASS and CKA_KEY_TYPE attributes");
- _gcr_display_view_end (view, renderer);
- gck_attributes_unref (attrs);
- return;
- }
-
- _gcr_display_view_set_icon (view, renderer, self->pv->icon);
-
- display = calculate_label (self);
- _gcr_display_view_append_title (view, renderer, display);
- g_free (display);
-
- if (klass == CKO_PRIVATE_KEY) {
- if (key_type == CKK_RSA)
- text = _("Private RSA Key");
- else if (key_type == CKK_DSA)
- text = _("Private DSA Key");
- else if (key_type == CKK_EC)
- text = _("Private Elliptic Curve Key");
- else
- text = _("Private Key");
- } else if (klass == CKO_PUBLIC_KEY) {
- if (key_type == CKK_RSA)
- text = _("Public DSA Key");
- else if (key_type == CKK_DSA)
- text = _("Public DSA Key");
- else if (key_type == CKK_EC)
- text = _("Public Elliptic Curve Key");
- else
- text = _("Public Key");
- }
-
- _gcr_display_view_append_content (view, renderer, text, NULL);
-
- size = _gcr_subject_public_key_attributes_size (attrs);
- if (size > 0) {
- display = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "%u bit", "%u bits", size), size);
- _gcr_display_view_append_content (view, renderer, _("Strength"), display);
- g_free (display);
- }
-
- _gcr_display_view_start_details (view, renderer);
-
- if (key_type == CKK_RSA)
- text = _("RSA");
- else if (key_type == CKK_DSA)
- text = _("DSA");
- else if (key_type == CKK_EC)
- text = _("Elliptic Curve");
- else
- text = _("Unknown");
- _gcr_display_view_append_value (view, renderer, _("Algorithm"), text, FALSE);
-
- if (size == 0)
- display = g_strdup (_("Unknown"));
- else
- display = g_strdup_printf ("%u", size);
- _gcr_display_view_append_value (view, renderer, _("Size"), display, FALSE);
- g_free (display);
-
- /* Fingerprints */
- _gcr_display_view_append_heading (view, renderer, _("Fingerprints"));
-
- fingerprint = calculate_fingerprint (self, attrs, G_CHECKSUM_SHA1, &n_fingerprint);
- if (fingerprint) {
- _gcr_display_view_append_hex (view, renderer, _("SHA1"), fingerprint, n_fingerprint);
- g_free (fingerprint);
- }
- fingerprint = calculate_fingerprint (self, attrs, G_CHECKSUM_SHA256, &n_fingerprint);
- if (fingerprint) {
- _gcr_display_view_append_hex (view, renderer, _("SHA256"), fingerprint, n_fingerprint);
- g_free (fingerprint);
- }
-
- _gcr_display_view_end (view, renderer);
- gck_attributes_unref (attrs);
-}
-
-static void
-gcr_key_renderer_renderer_iface (GcrRendererIface *iface)
-{
- iface->render_view = gcr_key_renderer_real_render;
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_key_renderer_new:
- * @label: (nullable): label describing the key
- * @attrs: (nullable): key to display, or %NULL
- *
- * Create a new key renderer which renders a given key in the attributes.
- *
- * Returns: (transfer full): a newly allocated #GcrKeyRenderer, which should be
- * freed with g_object_unref()
- */
-GcrKeyRenderer*
-gcr_key_renderer_new (const gchar *label, GckAttributes *attrs)
-{
- return g_object_new (GCR_TYPE_KEY_RENDERER, "label", label, "attributes", attrs, NULL);
-}
-
-/**
- * gcr_key_renderer_set_attributes:
- * @self: The key renderer
- * @attrs: (nullable): the attributes to display
- *
- * Get the attributes displayed in the renderer. The attributes should represent
- * either an RSA, DSA, or EC key in PKCS#11 style.
- */
-void
-gcr_key_renderer_set_attributes (GcrKeyRenderer *self, GckAttributes *attrs)
-{
- g_return_if_fail (GCR_IS_KEY_RENDERER (self));
-
- if (self->pv->attributes)
- gck_attributes_unref (self->pv->attributes);
- self->pv->attributes = attrs;
- if (self->pv->attributes)
- gck_attributes_ref (self->pv->attributes);
-
- g_object_notify (G_OBJECT (self), "attributes");
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
-}
-
-/**
- * gcr_key_renderer_get_attributes:
- * @self: The key renderer
- *
- * Get the attributes displayed in the renderer.
- *
- * Returns: (transfer none) (nullable): the attributes, owned by the renderer
- */
-GckAttributes*
-gcr_key_renderer_get_attributes (GcrKeyRenderer *self)
-{
- g_return_val_if_fail (GCR_IS_KEY_RENDERER (self), NULL);
- return self->pv->attributes;
-}
diff --git a/ui/gcr-key-renderer.h b/ui/gcr-key-renderer.h
deleted file mode 100644
index 0ff592f..0000000
--- a/ui/gcr-key-renderer.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_KEY_RENDERER_H__
-#define __GCR_KEY_RENDERER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-types.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_KEY_RENDERER (gcr_key_renderer_get_type ())
-#define GCR_KEY_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_KEY_RENDERER, GcrKeyRenderer))
-#define GCR_KEY_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_KEY_RENDERER, GcrKeyRendererClass))
-#define GCR_IS_KEY_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_KEY_RENDERER))
-#define GCR_IS_KEY_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_KEY_RENDERER))
-#define GCR_KEY_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_KEY_RENDERER, GcrKeyRendererClass))
-
-typedef struct _GcrKeyRenderer GcrKeyRenderer;
-typedef struct _GcrKeyRendererClass GcrKeyRendererClass;
-typedef struct _GcrKeyRendererPrivate GcrKeyRendererPrivate;
-
-struct _GcrKeyRenderer {
- GObject parent;
-
- /*< private >*/
- GcrKeyRendererPrivate *pv;
-};
-
-struct _GcrKeyRendererClass {
- GObjectClass parent_class;
-};
-
-GType gcr_key_renderer_get_type (void);
-
-GcrKeyRenderer* gcr_key_renderer_new (const gchar *label,
- GckAttributes *attrs);
-
-void gcr_key_renderer_set_attributes (GcrKeyRenderer *self,
- GckAttributes *attrs);
-
-GckAttributes* gcr_key_renderer_get_attributes (GcrKeyRenderer *self);
-
-G_END_DECLS
-
-#endif /* __GCR_KEY_RENDERER_H__ */
diff --git a/ui/gcr-key-widget.c b/ui/gcr-key-widget.c
deleted file mode 100644
index 708671c..0000000
--- a/ui/gcr-key-widget.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr-key-renderer.h"
-#include "gcr-key-widget.h"
-#include "gcr-renderer.h"
-#include "gcr-viewer.h"
-
-#include "gck/gck.h"
-
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
-
-/**
- * GcrKeyWidget:
- *
- * A key widget and renderer
- *
- * A key widget can be used to display a RSA, DSA or EC key. The widget is
- * normally in a collapsed state showing only details, but can be expanded by
- * the user.
- *
- * Use [ctor@KeyWidget.new] to create a new key widget. Only one key can be
- * displayed. A key widget contains a [iface@Viewer] internally and
- * [class@KeyRenderer] is used to render the key to the viewer. To show more
- * than one key in a view, create the viewer and add renderers to it.
- */
-
-enum {
- PROP_0,
- PROP_ATTRIBUTES
-};
-
-struct _GcrKeyWidget {
- GtkBin parent;
-
- /*< private >*/
- GcrKeyWidgetPrivate *pv;
-};
-
-struct _GcrKeyWidgetClass {
- /*< private >*/
- GtkBinClass parent_class;
-};
-
-struct _GcrKeyWidgetPrivate {
- GcrViewer *viewer;
- GcrKeyRenderer *renderer;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrKeyWidget, gcr_key_widget, GTK_TYPE_BIN);
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static GObject*
-gcr_key_widget_constructor (GType type, guint n_props, GObjectConstructParam *props)
-{
- GObject *obj = G_OBJECT_CLASS (gcr_key_widget_parent_class)->constructor (type, n_props, props);
- GcrKeyWidget *self = NULL;
-
- g_return_val_if_fail (obj, NULL);
-
- self = GCR_KEY_WIDGET (obj);
-
- self->pv->viewer = gcr_viewer_new_scrolled ();
- gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->pv->viewer));
- gtk_widget_show (GTK_WIDGET (self->pv->viewer));
-
- gcr_viewer_add_renderer (self->pv->viewer, GCR_RENDERER (self->pv->renderer));
- return obj;
-}
-
-static void
-gcr_key_widget_init (GcrKeyWidget *self)
-{
- self->pv = gcr_key_widget_get_instance_private (self);
- self->pv->renderer = gcr_key_renderer_new (NULL, NULL);
-}
-
-static void
-gcr_key_widget_finalize (GObject *obj)
-{
- GcrKeyWidget *self = GCR_KEY_WIDGET (obj);
-
- g_assert (self->pv->renderer);
- g_object_unref (self->pv->renderer);
- self->pv->renderer = NULL;
-
- g_assert (self->pv->viewer);
- self->pv->viewer = NULL;
-
- G_OBJECT_CLASS (gcr_key_widget_parent_class)->finalize (obj);
-}
-
-static void
-gcr_key_widget_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrKeyWidget *self = GCR_KEY_WIDGET (obj);
-
- switch (prop_id) {
- case PROP_ATTRIBUTES:
- gcr_key_widget_set_attributes (self, g_value_get_boxed (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_key_widget_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrKeyWidget *self = GCR_KEY_WIDGET (obj);
-
- switch (prop_id) {
- case PROP_ATTRIBUTES:
- g_value_set_boxed (value, gcr_key_widget_get_attributes (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_key_widget_class_init (GcrKeyWidgetClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gcr_key_widget_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->constructor = gcr_key_widget_constructor;
- gobject_class->finalize = gcr_key_widget_finalize;
- gobject_class->set_property = gcr_key_widget_set_property;
- gobject_class->get_property = gcr_key_widget_get_property;
-
- g_object_class_install_property (gobject_class, PROP_ATTRIBUTES,
- g_param_spec_boxed ("attributes", "Attributes", "The data displayed in the widget",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_key_widget_new:
- * @attrs: (nullable): key to display, or %NULL
- *
- * Create a new key widget which displays a given key in the attributes.
- *
- * Returns: A newly allocated #GcrKeyWidget, which should be freed
- * with g_object_unref().
- */
-GcrKeyWidget*
-gcr_key_widget_new (GckAttributes *attrs)
-{
- return g_object_new (GCR_TYPE_KEY_WIDGET, "attributes", attrs, NULL);
-}
-
-/**
- * gcr_key_widget_set_attributes:
- * @self: The key widget
- * @attrs: (nullable): the attributes to display
- *
- * Get the attributes displayed in the widget. The attributes should represent
- * either an RSA, DSA or EC key in PKCS#11 style.
- */
-void
-gcr_key_widget_set_attributes (GcrKeyWidget *self, GckAttributes *attrs)
-{
- g_return_if_fail (GCR_IS_KEY_WIDGET (self));
- gcr_key_renderer_set_attributes (self->pv->renderer, attrs);
-}
-
-/**
- * gcr_key_widget_get_attributes:
- * @self: The key widget
- *
- * Get the attributes displayed in the widget.
- *
- * Returns: (nullable) (transfer none): The attributes, owned by the widget.
- */
-GckAttributes*
-gcr_key_widget_get_attributes (GcrKeyWidget *self)
-{
- g_return_val_if_fail (GCR_IS_KEY_WIDGET (self), NULL);
- return gcr_key_renderer_get_attributes (self->pv->renderer);
-}
diff --git a/ui/gcr-key-widget.h b/ui/gcr-key-widget.h
deleted file mode 100644
index bdbb797..0000000
--- a/ui/gcr-key-widget.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_KEY_WIDGET_H__
-#define __GCR_KEY_WIDGET_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-types.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_KEY_WIDGET (gcr_key_widget_get_type ())
-#define GCR_KEY_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_KEY_WIDGET, GcrKeyWidget))
-#define GCR_KEY_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_KEY_WIDGET, GcrKeyWidgetClass))
-#define GCR_IS_KEY_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_KEY_WIDGET))
-#define GCR_IS_KEY_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_KEY_WIDGET))
-#define GCR_KEY_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_KEY_WIDGET, GcrKeyWidgetClass))
-
-typedef struct _GcrKeyWidget GcrKeyWidget;
-typedef struct _GcrKeyWidgetClass GcrKeyWidgetClass;
-typedef struct _GcrKeyWidgetPrivate GcrKeyWidgetPrivate;
-
-/*
- * TODO: GcrKeyWidget and GcrKeyWidgetClass are hidden until
- * we can figure out what they should be derived from.
- */
-
-GType gcr_key_widget_get_type (void);
-
-GcrKeyWidget* gcr_key_widget_new (GckAttributes *attrs);
-
-void gcr_key_widget_set_attributes (GcrKeyWidget *self,
- GckAttributes *attrs);
-
-GckAttributes* gcr_key_widget_get_attributes (GcrKeyWidget *self);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrKeyWidget, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_KEY_WIDGET_H__ */
diff --git a/ui/gcr-list-selector.c b/ui/gcr-list-selector.c
deleted file mode 100644
index 9445c6a..0000000
--- a/ui/gcr-list-selector.c
+++ /dev/null
@@ -1,442 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr/gcr-internal.h"
-
-#include "gcr-collection-model.h"
-#include "gcr-list-selector.h"
-#include "gcr-list-selector-private.h"
-#include "gcr-live-search.h"
-
-#include <glib/gi18n-lib.h>
-
-#include <string.h>
-
-/**
- * GcrListSelector:
- *
- * A selector widget to select 1 or more certificates or keys from a list.
- *
- * Live search is available for quick filtering.
- */
-
-enum {
- PROP_0,
- PROP_COLLECTION
-};
-
-struct _GcrListSelectorPrivate {
- GcrCollection *collection;
- GcrCollectionModel *model;
-
- GtkTreeModelFilter *filter;
- GtkWidget *search_widget;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrListSelector, gcr_list_selector, GTK_TYPE_TREE_VIEW);
-
-static gboolean
-object_is_visible (GcrListSelector *self, GObject *object)
-{
- gchar *text;
- gboolean visible;
-
- if (g_object_class_find_property (G_OBJECT_GET_CLASS (object), "search-text"))
- g_object_get (object, "search-text", &text, NULL);
- else
- g_object_get (object, "label", &text, NULL);
-
- visible = _gcr_live_search_match (GCR_LIVE_SEARCH (self->pv->search_widget), text);
- g_free (text);
-
- return visible;
-}
-
-static gboolean
-on_tree_filter_visible_func (GtkTreeModel *model, GtkTreeIter *iter,
- gpointer user_data)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (user_data);
- GObject *object;
-
- if (self->pv->search_widget == NULL ||
- !gtk_widget_get_visible (self->pv->search_widget))
- return TRUE;
-
- object = gcr_collection_model_object_for_iter (self->pv->model, iter);
- if (object != NULL)
- return object_is_visible (self, object);
-
- return FALSE;
-}
-
-static gboolean
-on_tree_view_start_search (GtkTreeView *view, gpointer user_data)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (view);
-
- if (self->pv->search_widget == NULL)
- return FALSE;
-
- if (gtk_widget_get_visible (self->pv->search_widget))
- gtk_widget_grab_focus (self->pv->search_widget);
- else
- gtk_widget_show (self->pv->search_widget);
-
- return TRUE;
-}
-
-static void
-on_search_widget_text_notify (GcrLiveSearch *search, GParamSpec *pspec,
- gpointer user_data)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (user_data);
-#if 0
- GtkTreeViewColumn *focus_column;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GtkTreePath *path;
- gboolean set_cursor = FALSE;
-#endif
-
- gtk_tree_model_filter_refilter (self->pv->filter);
-
-#if 0
- /* Set cursor on the first object. */
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
- gtk_tree_view_get_cursor (GTK_TREE_VIEW (view), &path, &focus_column);
-
- if (path == NULL) {
- path = gtk_tree_path_new_from_string ("0");
- set_cursor = TRUE;
- }
-
- if (set_cursor) {
- /* FIXME: Workaround for GTK bug #621651, we have to make sure
- * the path is valid. */
- if (gtk_tree_model_get_iter (model, &iter, path)) {
- gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), path,
- focus_column, FALSE);
- }
- }
-
- gtk_tree_path_free (path);
-#endif
-}
-
-static void
-on_search_widget_activate (GtkWidget *search, gpointer user_data)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (user_data);
- GtkTreePath *path;
- GtkTreeViewColumn *focus_column;
-
- gtk_tree_view_get_cursor (GTK_TREE_VIEW (self), &path, &focus_column);
- if (path != NULL) {
- gtk_tree_view_row_activated (GTK_TREE_VIEW (self), path, focus_column);
- gtk_tree_path_free (path);
-
- gtk_widget_hide (search);
- }
-}
-
-static gboolean
-on_search_widget_key_navigation (GtkWidget *search, GdkEvent *event, gpointer user_data)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (user_data);
- GdkEvent *new_event;
- gboolean ret = FALSE;
-
- new_event = gdk_event_copy (event);
- gtk_widget_grab_focus (GTK_WIDGET (self));
- ret = gtk_widget_event (GTK_WIDGET (self), new_event);
- gtk_widget_grab_focus (search);
-
- gdk_event_free (new_event);
-
- return ret;
-}
-
-static void
-on_check_column_toggled (GtkCellRendererToggle *cell, gchar *path, gpointer user_data)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (user_data);
- GtkTreeIter iter, model_iter;
-
- g_assert (path != NULL);
-
- if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (self->pv->filter), &iter, path)) {
- gtk_tree_model_filter_convert_iter_to_child_iter (self->pv->filter, &model_iter, &iter);
- gcr_collection_model_toggle_selected (self->pv->model, &model_iter);
- }
-}
-
-static void
-gcr_list_selector_constructed (GObject *object)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (object);
- GtkCellRenderer *cell;
- GtkTreeViewColumn *column;
- guint column_id;
-
- G_OBJECT_CLASS (gcr_list_selector_parent_class)->constructed (object);
-
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (self), FALSE);
-
- self->pv->model = gcr_collection_model_new (self->pv->collection,
- GCR_COLLECTION_MODEL_LIST,
- "icon", G_TYPE_ICON,
- "markup", G_TYPE_STRING,
- NULL);
-
- self->pv->filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (
- GTK_TREE_MODEL (self->pv->model), NULL));
- gtk_tree_model_filter_set_visible_func (self->pv->filter,
- on_tree_filter_visible_func, self, NULL);
-
- gtk_tree_view_set_model (GTK_TREE_VIEW (self), GTK_TREE_MODEL (self->pv->filter));
-
- /* The check */
-
- cell = gtk_cell_renderer_toggle_new ();
- g_signal_connect (cell, "toggled", G_CALLBACK (on_check_column_toggled), self);
-
- column_id = gcr_collection_model_column_for_selected (self->pv->model);
- column = gtk_tree_view_column_new_with_attributes ("", cell, "active", column_id, NULL);
- gtk_tree_view_column_set_resizable (column, FALSE);
- gtk_tree_view_append_column (GTK_TREE_VIEW (self), column);
-
- column = gtk_tree_view_column_new ();
-
- /* The icon */
- cell = gtk_cell_renderer_pixbuf_new ();
- g_object_set (cell, "stock-size", GTK_ICON_SIZE_DND, NULL);
- gtk_tree_view_column_pack_start (column, cell, FALSE);
- gtk_tree_view_column_add_attribute (column, cell, "gicon", 0);
-
- /* The markup */
- cell = gtk_cell_renderer_text_new ();
- gtk_tree_view_column_pack_start (column, cell, TRUE);
- gtk_tree_view_column_add_attribute (column, cell, "markup", 1);
-
- gtk_tree_view_append_column (GTK_TREE_VIEW (self), column);
-}
-
-static void
-gcr_list_selector_init (GcrListSelector *self)
-{
- self->pv = gcr_list_selector_get_instance_private (self);
-}
-
-static void
-gcr_list_selector_dispose (GObject *obj)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (obj);
-
- if (self->pv->filter)
- g_object_unref (self->pv->filter);
- self->pv->filter = NULL;
-
- if (self->pv->model)
- g_object_unref (self->pv->model);
- self->pv->model = NULL;
-
- if (self->pv->collection)
- g_object_unref (self->pv->collection);
- self->pv->collection = NULL;
-
- _gcr_list_selector_set_live_search (self, NULL);
-
- G_OBJECT_CLASS (gcr_list_selector_parent_class)->dispose (obj);
-}
-
-static void
-gcr_list_selector_finalize (GObject *obj)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (obj);
-
- g_assert (!self->pv->collection);
- g_assert (!self->pv->model);
-
- G_OBJECT_CLASS (gcr_list_selector_parent_class)->finalize (obj);
-}
-
-static void
-gcr_list_selector_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (obj);
-
- switch (prop_id) {
- case PROP_COLLECTION:
- g_return_if_fail (!self->pv->collection);
- self->pv->collection = g_value_dup_object (value);
- g_return_if_fail (self->pv->collection);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_list_selector_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrListSelector *self = GCR_LIST_SELECTOR (obj);
-
- switch (prop_id) {
- case PROP_COLLECTION:
- g_value_set_object (value, gcr_list_selector_get_collection (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_list_selector_class_init (GcrListSelectorClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->constructed = gcr_list_selector_constructed;
- gobject_class->dispose = gcr_list_selector_dispose;
- gobject_class->finalize = gcr_list_selector_finalize;
- gobject_class->set_property = gcr_list_selector_set_property;
- gobject_class->get_property = gcr_list_selector_get_property;
-
- /**
- * GcrListSelector:collection:
- *
- * The collection which contains the objects to display in the selector.
- */
- g_object_class_install_property (gobject_class, PROP_COLLECTION,
- g_param_spec_object ("collection", "Collection", "Collection to select from",
- GCR_TYPE_COLLECTION,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_list_selector_new:
- * @collection: The collection that contains the objects to display
- *
- * Create a new #GcrListSelector.
- *
- * Returns: (transfer full): a newly allocated selector, which should be
- * released with g_object_unref()
- */
-GcrListSelector *
-gcr_list_selector_new (GcrCollection *collection)
-{
- return g_object_new (GCR_TYPE_LIST_SELECTOR,
- "collection", collection,
- NULL);
-}
-
-/**
- * gcr_list_selector_get_collection:
- * @self: The selector
- *
- * Get the collection that this selector is displaying objects from.
- *
- * Returns: (transfer none): The collection, owned by the selector.
- */
-GcrCollection *
-gcr_list_selector_get_collection (GcrListSelector *self)
-{
- g_return_val_if_fail (GCR_IS_LIST_SELECTOR (self), NULL);
- return self->pv->collection;
-}
-
-/**
- * gcr_list_selector_get_selected:
- * @self: The selector
- *
- * Get a list of selected objects.
- *
- * Returns: (transfer container) (element-type GObject.Object): the list of
- * selected objects, to be released with g_list_free()
- */
-GList*
-gcr_list_selector_get_selected (GcrListSelector *self)
-{
- g_return_val_if_fail (GCR_IS_LIST_SELECTOR (self), NULL);
- return gcr_collection_model_get_selected_objects (self->pv->model);
-}
-
-/**
- * gcr_list_selector_set_selected:
- * @self: The selector
- * @selected: (element-type GObject.Object): the list of objects to select
- *
- * Select certain objects in the selector.
- */
-void
-gcr_list_selector_set_selected (GcrListSelector *self, GList *selected)
-{
- g_return_if_fail (GCR_IS_LIST_SELECTOR (self));
- gcr_collection_model_set_selected_objects (self->pv->model, selected);
-}
-
-
-void
-_gcr_list_selector_set_live_search (GcrListSelector *self, GcrLiveSearch *search)
-{
- g_return_if_fail (GCR_IS_LIST_SELECTOR (self));
-
- /* remove old handlers if old search was not null */
- if (self->pv->search_widget != NULL) {
- g_signal_handlers_disconnect_by_func (self, on_tree_view_start_search, NULL);
-
- g_signal_handlers_disconnect_by_func (self->pv->search_widget,
- on_search_widget_text_notify, self);
- g_signal_handlers_disconnect_by_func (self->pv->search_widget,
- on_search_widget_activate, self);
- g_signal_handlers_disconnect_by_func (self->pv->search_widget,
- on_search_widget_key_navigation, self);
- g_object_unref (self->pv->search_widget);
- self->pv->search_widget = NULL;
- }
-
- /* connect handlers if new search is not null */
- if (search != NULL) {
- self->pv->search_widget = GTK_WIDGET (g_object_ref (search));
-
- g_signal_connect (self, "start-interactive-search",
- G_CALLBACK (on_tree_view_start_search), NULL);
-
- g_signal_connect (self->pv->search_widget, "notify::text",
- G_CALLBACK (on_search_widget_text_notify), self);
- g_signal_connect (self->pv->search_widget, "activate",
- G_CALLBACK (on_search_widget_activate), self);
- g_signal_connect (self->pv->search_widget, "key-navigation",
- G_CALLBACK (on_search_widget_key_navigation), self);
- }
-}
diff --git a/ui/gcr-list-selector.h b/ui/gcr-list-selector.h
deleted file mode 100644
index 0d980bb..0000000
--- a/ui/gcr-list-selector.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_LIST_SELECTOR_H__
-#define __GCR_LIST_SELECTOR_H__
-
-#include "gcr/gcr-types.h"
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_LIST_SELECTOR (gcr_list_selector_get_type ())
-#define GCR_LIST_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_LIST_SELECTOR, GcrListSelector))
-#define GCR_LIST_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_LIST_SELECTOR, GcrListSelectorClass))
-#define GCR_IS_LIST_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_LIST_SELECTOR))
-#define GCR_IS_LIST_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_LIST_SELECTOR))
-#define GCR_LIST_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_LIST_SELECTOR, GcrListSelectorClass))
-
-typedef struct _GcrListSelector GcrListSelector;
-typedef struct _GcrListSelectorClass GcrListSelectorClass;
-typedef struct _GcrListSelectorPrivate GcrListSelectorPrivate;
-
-struct _GcrListSelector {
- GtkTreeView parent;
-
- /*< private >*/
- GcrListSelectorPrivate *pv;
-};
-
-struct _GcrListSelectorClass {
-
- /*< private >*/
- GtkTreeViewClass parent_class;
-};
-
-GType gcr_list_selector_get_type (void);
-
-GcrListSelector* gcr_list_selector_new (GcrCollection *collection);
-
-GcrCollection* gcr_list_selector_get_collection (GcrListSelector *self);
-
-GList* gcr_list_selector_get_selected (GcrListSelector *self);
-
-void gcr_list_selector_set_selected (GcrListSelector *self,
- GList *selected);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrListSelector, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_LIST_SELECTOR_H__ */
diff --git a/ui/gcr-live-search.c b/ui/gcr-live-search.c
deleted file mode 100644
index a70bf30..0000000
--- a/ui/gcr-live-search.c
+++ /dev/null
@@ -1,656 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- * Copyright (C) 2010 Collabora Ltd.
- * Copyright (C) 2007-2010 Nokia Corporation.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Authors: Felix Kaser <felix.kaser@collabora.co.uk>
- * Xavier Claessens <xavier.claessens@collabora.co.uk>
- * Claudio Saavedra <csaavedra@igalia.com>
- * Stef Walter <stefw@collabora.co.uk>
- */
-
-/* Code borrowed from Empathy */
-
-#include "config.h"
-
-#include "gcr-live-search.h"
-
-#include "gcr/gcr-marshal.h"
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-
-#include <string.h>
-
-struct _GcrLiveSearchPrivate {
- GtkWidget *search_entry;
- GtkWidget *hook_widget;
- GPtrArray *stripped_words;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrLiveSearch, _gcr_live_search, GTK_TYPE_BOX)
-
-enum {
- PROP_0,
- PROP_HOOK_WIDGET,
- PROP_TEXT
-};
-
-enum {
- ACTIVATE,
- KEYNAV,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL];
-
-static void on_hook_widget_destroy (GtkWidget *object, gpointer user_data);
-
-static gunichar
-stripped_char (gunichar ch)
-{
- gunichar retval = 0;
- GUnicodeType utype;
- gunichar decomp[4];
- gsize dlen;
-
- utype = g_unichar_type (ch);
-
- switch (utype) {
- case G_UNICODE_CONTROL:
- case G_UNICODE_FORMAT:
- case G_UNICODE_UNASSIGNED:
- case G_UNICODE_NON_SPACING_MARK:
- case G_UNICODE_SPACING_MARK:
- case G_UNICODE_ENCLOSING_MARK:
- /* Ignore those */
- break;
- case G_UNICODE_PRIVATE_USE:
- case G_UNICODE_SURROGATE:
- case G_UNICODE_LOWERCASE_LETTER:
- case G_UNICODE_MODIFIER_LETTER:
- case G_UNICODE_OTHER_LETTER:
- case G_UNICODE_TITLECASE_LETTER:
- case G_UNICODE_UPPERCASE_LETTER:
- case G_UNICODE_DECIMAL_NUMBER:
- case G_UNICODE_LETTER_NUMBER:
- case G_UNICODE_OTHER_NUMBER:
- case G_UNICODE_CONNECT_PUNCTUATION:
- case G_UNICODE_DASH_PUNCTUATION:
- case G_UNICODE_CLOSE_PUNCTUATION:
- case G_UNICODE_FINAL_PUNCTUATION:
- case G_UNICODE_INITIAL_PUNCTUATION:
- case G_UNICODE_OTHER_PUNCTUATION:
- case G_UNICODE_OPEN_PUNCTUATION:
- case G_UNICODE_CURRENCY_SYMBOL:
- case G_UNICODE_MODIFIER_SYMBOL:
- case G_UNICODE_MATH_SYMBOL:
- case G_UNICODE_OTHER_SYMBOL:
- case G_UNICODE_LINE_SEPARATOR:
- case G_UNICODE_PARAGRAPH_SEPARATOR:
- case G_UNICODE_SPACE_SEPARATOR:
- default:
- ch = g_unichar_tolower (ch);
- dlen = g_unichar_fully_decompose (ch, FALSE, decomp, 4);
- if (dlen > 0)
- retval = decomp[0];
- }
-
- return retval;
-}
-
-static void
-append_word (GPtrArray **word_array, GString **word)
-{
- if (*word != NULL) {
- if (*word_array == NULL)
- *word_array = g_ptr_array_new_with_free_func (g_free);
- g_ptr_array_add (*word_array, g_string_free (*word, FALSE));
- *word = NULL;
- }
-}
-
-GPtrArray *
-_gcr_live_search_strip_utf8_string (const gchar *string)
-{
- GPtrArray *word_array = NULL;
- GString *word = NULL;
- const gchar *p;
-
- if (string == NULL || *string == '\0')
- return NULL;
-
- for (p = string; *p != '\0'; p = g_utf8_next_char (p)) {
- gunichar sc;
-
- /* Make the char lower-case, remove its accentuation marks, and ignore it
- * if it is just unicode marks */
- sc = stripped_char (g_utf8_get_char (p));
- if (sc == 0)
- continue;
-
- /* If it is not alpha-num, it is separator between words */
- if (!g_unichar_isalnum (sc)) {
- append_word (&word_array, &word);
- continue;
- }
-
- /* It is alpha-num, append this char to current word, or start new word */
- if (word == NULL)
- word = g_string_new (NULL);
- g_string_append_unichar (word, sc);
- }
-
- append_word (&word_array, &word);
-
- return word_array;
-}
-
-static gboolean
-live_search_match_prefix (const gchar *string, const gchar *prefix)
-{
- const gchar *p;
- const gchar *prefix_p;
- gboolean next_word = FALSE;
-
- if (prefix == NULL || prefix[0] == 0)
- return TRUE;
-
- if (string == NULL || *string == '\0')
- return FALSE;
-
- prefix_p = prefix;
- for (p = string; *p != '\0'; p = g_utf8_next_char (p)) {
- gunichar sc;
-
- /* Make the char lower-case, remove its accentuation marks, and ignore it
- * if it is just unicode marks */
- sc = stripped_char (g_utf8_get_char (p));
- if (sc == 0)
- continue;
-
- /* If we want to go to next word, ignore alpha-num chars */
- if (next_word && g_unichar_isalnum (sc))
- continue;
- next_word = FALSE;
-
- /* Ignore word separators */
- if (!g_unichar_isalnum (sc))
- continue;
-
- /* If this char does not match prefix_p, go to next word and start again
- * from the beginning of prefix */
- if (sc != g_utf8_get_char (prefix_p)) {
- next_word = TRUE;
- prefix_p = prefix;
- continue;
- }
-
- /* prefix_p match, verify to next char. If this was the last of prefix,
- * it means it completely machted and we are done. */
- prefix_p = g_utf8_next_char (prefix_p);
- if (*prefix_p == '\0')
- return TRUE;
- }
-
- return FALSE;
-}
-
-gboolean
-_gcr_live_search_match_words (const gchar *string, GPtrArray *words)
-{
- guint i;
-
- if (words == NULL)
- return TRUE;
-
- for (i = 0; i < words->len; i++)
- if (!live_search_match_prefix (string, g_ptr_array_index (words, i)))
- return FALSE;
-
- return TRUE;
-}
-
-static gboolean
-fire_key_navigation_sig (GcrLiveSearch *self, GdkEventKey *event)
-{
- gboolean ret;
-
- g_signal_emit (self, signals[KEYNAV], 0, event, &ret);
- return ret;
-}
-
-static gboolean
-on_search_entry_key_pressed (GtkEntry *entry, GdkEventKey *event, gpointer user_data)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data);
-
- /* if esc key pressed, hide the search */
- if (event->keyval == GDK_KEY_Escape) {
- gtk_widget_hide (GTK_WIDGET (self));
- return TRUE;
- }
-
- /* emit key navigation signal, so other widgets can respond to it properly */
- if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down
- || event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_Page_Down) {
- return fire_key_navigation_sig (self, event);
- }
-
- if (event->keyval == GDK_KEY_Home || event->keyval == GDK_KEY_End ||
- event->keyval == GDK_KEY_space) {
- /* If the live search is visible, the entry should catch the Home/End
- * and space events */
- if (!gtk_widget_get_visible (GTK_WIDGET (self))) {
- return fire_key_navigation_sig (self, event);
- }
- }
-
- return FALSE;
-}
-
-static void
-on_search_entry_text_changed (GtkEntry *entry, gpointer user_data)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data);
- const gchar *text;
-
- text = gtk_entry_get_text (entry);
-
- if (text == NULL || *text == '\0')
- gtk_widget_hide (GTK_WIDGET (self));
- else
- gtk_widget_show (GTK_WIDGET (self));
-
- if (self->pv->stripped_words != NULL)
- g_ptr_array_unref (self->pv->stripped_words);
-
- self->pv->stripped_words = _gcr_live_search_strip_utf8_string (text);
-
- g_object_notify (G_OBJECT (self), "text");
-}
-
-static void
-on_search_entry_close_pressed (GtkEntry *entry, GtkEntryIconPosition icon_pos,
- GdkEvent *event, gpointer user_data)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data);
- gtk_widget_hide (GTK_WIDGET (self));
-}
-
-static gboolean
-on_hook_widget_key_press_event (GtkWidget *widget, GdkEventKey *event,
- gpointer user_data)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data);
- GdkEvent *new_event;
- gboolean ret;
-
- /* dont forward this event to the entry, else the event is consumed by the
- * entry and does not close the window */
- if (!gtk_widget_get_visible (GTK_WIDGET (self)) &&
- event->keyval == GDK_KEY_Escape)
- return FALSE;
-
- /* do not show the search if CTRL and/or ALT are pressed with a key
- * this is needed, because otherwise the CTRL + F accel would not work,
- * because the entry consumes it */
- if (event->state & (GDK_MOD1_MASK | GDK_CONTROL_MASK) ||
- event->keyval == GDK_KEY_Control_L ||
- event->keyval == GDK_KEY_Control_R)
- return FALSE;
-
- /* dont forward the up/down and Page Up/Down arrow keys to the entry,
- * they are needed for navigation in the treeview and are not needed in
- * the search entry */
- if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down ||
- event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_Page_Down)
- return FALSE;
-
- if (event->keyval == GDK_KEY_Home || event->keyval == GDK_KEY_End ||
- event->keyval == GDK_KEY_space) {
- /* Home/End and space keys have to be forwarded to the entry only if
- * the live search is visible (to move the cursor inside the entry). */
- if (!gtk_widget_get_visible (GTK_WIDGET (self)))
- return FALSE;
- }
-
- /* realize the widget if it is not realized yet */
- gtk_widget_realize (self->pv->search_entry);
- if (!gtk_widget_has_focus (self->pv->search_entry)) {
- gtk_widget_grab_focus (self->pv->search_entry);
- gtk_editable_set_position (GTK_EDITABLE (self->pv->search_entry), -1);
- }
-
- /* forward the event to the search entry */
- new_event = gdk_event_copy ((GdkEvent *) event);
- ret = gtk_widget_event (self->pv->search_entry, new_event);
- gdk_event_free (new_event);
-
- return ret;
-}
-
-static void
-on_search_entry_activate (GtkEntry *entry, GcrLiveSearch *self)
-{
- g_signal_emit (self, signals[ACTIVATE], 0);
-}
-
-static void
-live_search_release_hook_widget (GcrLiveSearch *self)
-{
- /* remove old handlers if old source was not null */
- if (self->pv->hook_widget != NULL) {
- g_signal_handlers_disconnect_by_func (self->pv->hook_widget,
- on_hook_widget_key_press_event, self);
- g_signal_handlers_disconnect_by_func (self->pv->hook_widget,
- on_hook_widget_destroy, self);
- g_object_unref (self->pv->hook_widget);
- self->pv->hook_widget = NULL;
- }
-}
-
-static void
-on_hook_widget_destroy (GtkWidget *object, gpointer user_data)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data);
-
- /* unref the hook widget and hide search */
- gtk_widget_hide (GTK_WIDGET (self));
- live_search_release_hook_widget (self);
-}
-
-static void
-live_search_dispose (GObject *obj)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (obj);
-
- live_search_release_hook_widget (self);
-
- G_OBJECT_CLASS (_gcr_live_search_parent_class)->dispose (obj);
-}
-
-static void
-live_search_finalize (GObject *obj)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (obj);
-
- if (self->pv->stripped_words != NULL)
- g_ptr_array_unref (self->pv->stripped_words);
-
- G_OBJECT_CLASS (_gcr_live_search_parent_class)->finalize (obj);
-}
-
-static void
-live_search_get_property (GObject *object, guint param_id,
- GValue *value, GParamSpec *pspec)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (object);
-
- switch (param_id) {
- case PROP_HOOK_WIDGET:
- g_value_set_object (value, _gcr_live_search_get_hook_widget (self));
- break;
- case PROP_TEXT:
- g_value_set_string (value, _gcr_live_search_get_text (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-static void
-live_search_set_property (GObject *object, guint param_id,
- const GValue *value, GParamSpec *pspec)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (object);
-
- switch (param_id) {
- case PROP_HOOK_WIDGET:
- _gcr_live_search_set_hook_widget (self, g_value_get_object (value));
- break;
- case PROP_TEXT:
- _gcr_live_search_set_text (self, g_value_get_string (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- };
-}
-
-static void
-live_search_unmap (GtkWidget *widget)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (widget);
-
- GTK_WIDGET_CLASS (_gcr_live_search_parent_class)->unmap (widget);
-
- /* unmap can happen if a parent gets hidden, in that case we want to hide
- * the live search as well, so when it gets mapped again, the live search
- * won't be shown. */
- gtk_widget_hide (widget);
-
- gtk_entry_set_text (GTK_ENTRY (self->pv->search_entry), "");
- gtk_widget_grab_focus (self->pv->hook_widget);
-}
-
-static void
-live_search_show (GtkWidget *widget)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (widget);
-
- if (!gtk_widget_has_focus (self->pv->search_entry))
- gtk_widget_grab_focus (self->pv->search_entry);
-
- GTK_WIDGET_CLASS (_gcr_live_search_parent_class)->show (widget);
-}
-
-static void
-live_search_grab_focus (GtkWidget *widget)
-{
- GcrLiveSearch *self = GCR_LIVE_SEARCH (widget);
-
- if (!gtk_widget_has_focus (self->pv->search_entry)) {
- gtk_widget_grab_focus (self->pv->search_entry);
- gtk_editable_set_position (GTK_EDITABLE (self->pv->search_entry), -1);
- }
-}
-
-static void
-_gcr_live_search_class_init (GcrLiveSearchClass *klass)
-{
- GObjectClass *object_class = (GObjectClass *) klass;
- GtkWidgetClass *widget_class = (GtkWidgetClass *) klass;
- GParamSpec *param_spec;
-
- object_class->finalize = live_search_finalize;
- object_class->dispose = live_search_dispose;
- object_class->get_property = live_search_get_property;
- object_class->set_property = live_search_set_property;
-
- widget_class->unmap = live_search_unmap;
- widget_class->show = live_search_show;
- widget_class->grab_focus = live_search_grab_focus;
-
- signals[ACTIVATE] = g_signal_new ("activate",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- 0,
- NULL, NULL, NULL,
- G_TYPE_NONE, 0);
-
- signals[KEYNAV] = g_signal_new ("key-navigation",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- 0,
- g_signal_accumulator_true_handled, NULL,
- _gcr_marshal_BOOLEAN__BOXED,
- G_TYPE_BOOLEAN, 1, GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
-
- param_spec = g_param_spec_object ("hook-widget", "Live Search Hook Widget",
- "The live search catches key-press-events on this widget",
- GTK_TYPE_WIDGET,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_STATIC_STRINGS);
- g_object_class_install_property (object_class, PROP_HOOK_WIDGET, param_spec);
-
- param_spec = g_param_spec_string ("text", "Live Search Text",
- "The text of the live search entry",
- "",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_STATIC_STRINGS);
- g_object_class_install_property (object_class, PROP_TEXT, param_spec);
-}
-
-static void
-_gcr_live_search_init (GcrLiveSearch *self)
-{
- self->pv = _gcr_live_search_get_instance_private (self);
-
- gtk_widget_set_no_show_all (GTK_WIDGET (self), TRUE);
-
- self->pv->search_entry = gtk_entry_new ();
- gtk_entry_set_icon_from_icon_name (GTK_ENTRY (self->pv->search_entry),
- GTK_ENTRY_ICON_SECONDARY, "window-close");
- gtk_entry_set_icon_activatable (GTK_ENTRY (self->pv->search_entry),
- GTK_ENTRY_ICON_SECONDARY, TRUE);
- gtk_entry_set_icon_sensitive (GTK_ENTRY (self->pv->search_entry),
- GTK_ENTRY_ICON_SECONDARY, TRUE);
- gtk_widget_show (self->pv->search_entry);
-
- gtk_box_pack_start (GTK_BOX (self), self->pv->search_entry, TRUE, TRUE, 0);
-
- g_signal_connect (self->pv->search_entry, "icon_release",
- G_CALLBACK (on_search_entry_close_pressed), self);
- g_signal_connect (self->pv->search_entry, "changed",
- G_CALLBACK (on_search_entry_text_changed), self);
- g_signal_connect (self->pv->search_entry, "key-press-event",
- G_CALLBACK (on_search_entry_key_pressed), self);
- g_signal_connect (self->pv->search_entry, "activate",
- G_CALLBACK (on_search_entry_activate), self);
-
- self->pv->hook_widget = NULL;
-}
-
-/**
- * _gcr_live_search_new:
- * @hook: (nullable): the widget to hook
- *
- * Create a new #GcrLiveSearch.
- *
- * Returns: (transfer full) (type GcrUi.LiveSearch): The new widget
- */
-GtkWidget *
-_gcr_live_search_new (GtkWidget *hook)
-{
- g_return_val_if_fail (hook == NULL || GTK_IS_WIDGET (hook), NULL);
-
- return g_object_new (GCR_TYPE_LIVE_SEARCH,
- "hook-widget", hook,
- NULL);
-}
-
-/* public methods */
-
-GtkWidget *
-_gcr_live_search_get_hook_widget (GcrLiveSearch *self)
-{
- g_return_val_if_fail (GCR_IS_LIVE_SEARCH (self), NULL);
-
- return self->pv->hook_widget;
-}
-
-void
-_gcr_live_search_set_hook_widget (GcrLiveSearch *self, GtkWidget *hook)
-{
- g_return_if_fail (GCR_IS_LIVE_SEARCH (self));
- g_return_if_fail (hook == NULL || GTK_IS_WIDGET (hook));
-
- /* release the actual widget */
- live_search_release_hook_widget (self);
-
- /* connect handlers if new source is not null */
- if (hook != NULL) {
- self->pv->hook_widget = g_object_ref (hook);
- g_signal_connect (self->pv->hook_widget, "key-press-event",
- G_CALLBACK (on_hook_widget_key_press_event),
- self);
- g_signal_connect (self->pv->hook_widget, "destroy",
- G_CALLBACK (on_hook_widget_destroy),
- self);
- }
-}
-
-const gchar *
-_gcr_live_search_get_text (GcrLiveSearch *self)
-{
- g_return_val_if_fail (GCR_IS_LIVE_SEARCH (self), NULL);
-
- return gtk_entry_get_text (GTK_ENTRY (self->pv->search_entry));
-}
-
-void
-_gcr_live_search_set_text (GcrLiveSearch *self, const gchar *text)
-{
- g_return_if_fail (GCR_IS_LIVE_SEARCH (self));
- g_return_if_fail (text != NULL);
-
- gtk_entry_set_text (GTK_ENTRY (self->pv->search_entry), text);
-}
-
-/**
- * _gcr_live_search_match:
- * @self: a #GcrLiveSearch
- * @string: a string where to search, must be valid UTF-8.
- *
- * Search if one of the words in @string string starts with the current text
- * of @self.
- *
- * Searching for "aba" in "Abasto" will match, searching in "Moraba" will not,
- * and searching in "A tool (abacus)" will do.
- *
- * The match is not case-sensitive, and regardless of the accentuation marks.
- *
- * Returns: %TRUE if a match is found, %FALSE otherwise.
- *
- **/
-gboolean
-_gcr_live_search_match (GcrLiveSearch *self, const gchar *string)
-{
- g_return_val_if_fail (GCR_IS_LIVE_SEARCH (self), FALSE);
-
- return _gcr_live_search_match_words (string, self->pv->stripped_words);
-}
-
-gboolean
-_gcr_live_search_match_string (const gchar *string, const gchar *prefix)
-{
- GPtrArray *words;
- gboolean match;
-
- words = _gcr_live_search_strip_utf8_string (prefix);
- match = _gcr_live_search_match_words (string, words);
- if (words != NULL)
- g_ptr_array_unref (words);
-
- return match;
-}
-
-GPtrArray *
-_gcr_live_search_get_words (GcrLiveSearch *self)
-{
- return self->pv->stripped_words;
-}
diff --git a/ui/gcr-live-search.h b/ui/gcr-live-search.h
deleted file mode 100644
index cf048fd..0000000
--- a/ui/gcr-live-search.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- * Copyright (C) 2010 Collabora Ltd.
- * Copyright (C) 2007-2010 Nokia Corporation.
- *
- * 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, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Authors: Felix Kaser <felix.kaser@collabora.co.uk>
- * Xavier Claessens <xavier.claessens@collabora.co.uk>
- * Claudio Saavedra <csaavedra@igalia.com>
- * Stef Walter <stefw@collabora.co.uk>
- */
-
-/* Code borrowed from Empathy */
-
-#ifndef __GCR_LIVE_SEARCH_H__
-#define __GCR_LIVE_SEARCH_H__
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_LIVE_SEARCH (_gcr_live_search_get_type ())
-#define GCR_LIVE_SEARCH(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GCR_TYPE_LIVE_SEARCH, GcrLiveSearch))
-#define GCR_LIVE_SEARCH_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GCR_TYPE_LIVE_SEARCH, GcrLiveSearchClass))
-#define GCR_IS_LIVE_SEARCH(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GCR_TYPE_LIVE_SEARCH))
-#define GCR_IS_LIVE_SEARCH_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GCR_TYPE_LIVE_SEARCH))
-#define GCR_LIVE_SEARCH_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GCR_TYPE_LIVE_SEARCH, GcrLiveSearchClass))
-
-typedef struct _GcrLiveSearch GcrLiveSearch;
-typedef struct _GcrLiveSearchClass GcrLiveSearchClass;
-typedef struct _GcrLiveSearchPrivate GcrLiveSearchPrivate;
-
-struct _GcrLiveSearch {
- /*< private >*/
- GtkBox parent;
- GcrLiveSearchPrivate *pv;
-};
-
-struct _GcrLiveSearchClass {
- GtkBoxClass parent_class;
-};
-
-GType _gcr_live_search_get_type (void) G_GNUC_CONST;
-
-GtkWidget * _gcr_live_search_new (GtkWidget *hook);
-
-GtkWidget * _gcr_live_search_get_hook_widget (GcrLiveSearch *self);
-void _gcr_live_search_set_hook_widget (GcrLiveSearch *self,
- GtkWidget *hook);
-
-const gchar * _gcr_live_search_get_text (GcrLiveSearch *self);
-void _gcr_live_search_set_text (GcrLiveSearch *self,
- const gchar *text);
-
-gboolean _gcr_live_search_match (GcrLiveSearch *self,
- const gchar *string);
-
-GPtrArray * _gcr_live_search_strip_utf8_string (const gchar *string);
-
-gboolean _gcr_live_search_match_words (const gchar *string,
- GPtrArray *words);
-
-GPtrArray * _gcr_live_search_get_words (GcrLiveSearch *self);
-
-/* Made public for unit tests */
-gboolean _gcr_live_search_match_string (const gchar *string,
- const gchar *prefix);
-
-G_END_DECLS
-
-#endif /* __GCR_LIVE_SEARCH_H__ */
diff --git a/ui/gcr-pkcs11-import-dialog.c b/ui/gcr-pkcs11-import-dialog.c
deleted file mode 100644
index 746b946..0000000
--- a/ui/gcr-pkcs11-import-dialog.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2008 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr/gcr-icons.h"
-
-#include "gcr-dialog-util.h"
-#include "gcr-secure-entry-buffer.h"
-#include "gcr-pkcs11-import-dialog.h"
-
-#include "egg/egg-secure-memory.h"
-
-#include <gtk/gtk.h>
-
-#include <glib/gi18n-lib.h>
-
-EGG_SECURE_DECLARE (import_dialog);
-
-enum {
- PROP_0,
- PROP_IMPORTER
-};
-
-struct _GcrPkcs11ImportDialog {
- GtkDialog parent;
- GtkBuilder *builder;
- GtkWidget *password_area;
- GtkLabel *token_label;
- GtkImage *token_image;
- GtkEntry *password_entry;
- GtkEntry *label_entry;
- gboolean label_changed;
-};
-
-G_DEFINE_TYPE (GcrPkcs11ImportDialog, _gcr_pkcs11_import_dialog, GTK_TYPE_DIALOG);
-
-static void
-on_label_changed (GtkEditable *editable,
- gpointer user_data)
-{
- GcrPkcs11ImportDialog *self = GCR_PKCS11_IMPORT_DIALOG (user_data);
- self->label_changed = TRUE;
-}
-
-static void
-_gcr_pkcs11_import_dialog_constructed (GObject *obj)
-{
- GcrPkcs11ImportDialog *self = GCR_PKCS11_IMPORT_DIALOG (obj);
- GError *error = NULL;
- GtkEntryBuffer *buffer;
- GtkWidget *widget;
- GtkBox *contents;
- GtkWidget *button;
-
- G_OBJECT_CLASS (_gcr_pkcs11_import_dialog_parent_class)->constructed (obj);
-
- if (!gtk_builder_add_from_resource (self->builder, "/org/gnome/gcr/ui/gcr-pkcs11-import-dialog.ui", &error)) {
- g_warning ("couldn't load ui builder file: %s", error->message);
- return;
- }
-
- /* Fill in the dialog from builder */
- widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "pkcs11-import-dialog"));
- contents = GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self)));
- gtk_box_pack_start (contents, widget, TRUE, TRUE, 0);
-
- /* The password area */
- self->password_area = GTK_WIDGET (gtk_builder_get_object (self->builder, "unlock-area"));
- gtk_widget_hide (self->password_area);
-
- /* Add a secure entry */
- buffer = gcr_secure_entry_buffer_new ();
- self->password_entry = GTK_ENTRY (gtk_builder_get_object (self->builder, "password-entry"));
- gtk_entry_set_buffer (self->password_entry, buffer);
- gtk_entry_set_activates_default (self->password_entry, TRUE);
- g_object_unref (buffer);
-
- self->token_label = GTK_LABEL (gtk_builder_get_object (self->builder, "token-description"));
- self->token_image = GTK_IMAGE (gtk_builder_get_object (self->builder, "token-image"));
-
- /* Setup the label */
- self->label_entry = GTK_ENTRY (gtk_builder_get_object (self->builder, "label-entry"));
- g_signal_connect (self->label_entry, "changed", G_CALLBACK (on_label_changed), self);
- gtk_entry_set_activates_default (self->label_entry, TRUE);
-
- /* Add our various buttons */
- button = gtk_dialog_add_button (GTK_DIALOG (self), _("_Cancel"), GTK_RESPONSE_CANCEL);
- gtk_button_set_use_underline (GTK_BUTTON (button), TRUE);
- button = gtk_dialog_add_button (GTK_DIALOG (self), _("_OK"), GTK_RESPONSE_OK);
- gtk_button_set_use_underline (GTK_BUTTON (button), TRUE);
- gtk_dialog_set_default_response (GTK_DIALOG (self), GTK_RESPONSE_OK);
-
- gtk_window_set_modal (GTK_WINDOW (self), TRUE);
-}
-
-static void
-_gcr_pkcs11_import_dialog_init (GcrPkcs11ImportDialog *self)
-{
- self->builder = gtk_builder_new ();
-}
-
-static void
-_gcr_pkcs11_import_dialog_finalize (GObject *obj)
-{
- GcrPkcs11ImportDialog *self = GCR_PKCS11_IMPORT_DIALOG (obj);
-
- g_object_unref (self->builder);
-
- G_OBJECT_CLASS (_gcr_pkcs11_import_dialog_parent_class)->finalize (obj);
-}
-
-static void
-_gcr_pkcs11_import_dialog_class_init (GcrPkcs11ImportDialogClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->constructed = _gcr_pkcs11_import_dialog_constructed;
- gobject_class->finalize = _gcr_pkcs11_import_dialog_finalize;
-}
-
-GcrPkcs11ImportDialog *
-_gcr_pkcs11_import_dialog_new (GtkWindow *parent)
-{
- GcrPkcs11ImportDialog *dialog;
-
- g_return_val_if_fail (parent == NULL || GTK_IS_WINDOW (parent), NULL);
-
- dialog = g_object_new (GCR_TYPE_PKCS11_IMPORT_DIALOG,
- "transient-for", parent,
- NULL);
-
- return g_object_ref_sink (dialog);
-}
-
-void
-_gcr_pkcs11_import_dialog_get_supplements (GcrPkcs11ImportDialog *self,
- GckBuilder *builder)
-{
- const gchar *label;
-
- g_return_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self));
- g_return_if_fail (builder != NULL);
-
- label = gtk_entry_get_text (self->label_entry);
- if (self->label_changed && label != NULL && label[0])
- gck_builder_set_string (builder, CKA_LABEL, label);
-}
-
-void
-_gcr_pkcs11_import_dialog_set_supplements (GcrPkcs11ImportDialog *self,
- GckBuilder *builder)
-{
- gchar *label;
-
- g_return_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self));
- g_return_if_fail (builder != NULL);
-
- if (!gck_builder_find_string (builder, CKA_LABEL, &label))
- label = NULL;
-
- if (label == NULL)
- gtk_entry_set_placeholder_text (self->label_entry, _("Automatically chosen"));
- gtk_entry_set_text (self->label_entry, label == NULL ? "" : label);
- g_free (label);
-
- self->label_changed = FALSE;
-}
-
-gboolean
-_gcr_pkcs11_import_dialog_run (GcrPkcs11ImportDialog *self)
-{
- gboolean ret = FALSE;
-
- g_return_val_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self), FALSE);
-
- if (gtk_dialog_run (GTK_DIALOG (self)) == GTK_RESPONSE_OK) {
- ret = TRUE;
- }
-
- gtk_widget_hide (GTK_WIDGET (self));
-
- return ret;
-}
-
-void
-_gcr_pkcs11_import_dialog_run_async (GcrPkcs11ImportDialog *self,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- g_return_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self));
-
- _gcr_dialog_util_run_async (GTK_DIALOG (self), cancellable, callback, user_data);
-}
-
-gboolean
-_gcr_pkcs11_import_dialog_run_finish (GcrPkcs11ImportDialog *self,
- GAsyncResult *result)
-{
- gint response;
-
- g_return_val_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self), FALSE);
-
- response = _gcr_dialog_util_run_finish (GTK_DIALOG (self), result);
-
- gtk_widget_hide (GTK_WIDGET (self));
-
- return (response == GTK_RESPONSE_OK) ? TRUE : FALSE;
-}
-
-GTlsInteractionResult
-_gcr_pkcs11_import_dialog_run_ask_password (GcrPkcs11ImportDialog *self,
- GTlsPassword *password,
- GCancellable *cancellable,
- GError **error)
-{
- GckTokenInfo *token_info;
- const gchar *value;
- GckSlot *slot;
- GIcon *icon;
- gboolean ret;
-
- g_return_val_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self), G_TLS_INTERACTION_UNHANDLED);
- g_return_val_if_fail (G_IS_TLS_PASSWORD (password), G_TLS_INTERACTION_UNHANDLED);
- g_return_val_if_fail (error == NULL || *error == NULL, G_TLS_INTERACTION_UNHANDLED);
-
- if (GCK_IS_PASSWORD (password)) {
- slot = gck_password_get_token (GCK_PASSWORD (password));
- token_info = gck_slot_get_token_info (slot);
- icon = gcr_icon_for_token (token_info);
- gtk_image_set_from_gicon (self->token_image, icon, GTK_ICON_SIZE_BUTTON);
- gck_token_info_free (token_info);
- g_object_unref (icon);
- }
-
- gtk_label_set_text (self->token_label, g_tls_password_get_description (password));
-
- gtk_widget_show (self->password_area);
-
- ret = _gcr_pkcs11_import_dialog_run (self);
-
- gtk_widget_hide (self->password_area);
-
- if (!ret) {
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED,
- _("The user cancelled the operation"));
- return G_TLS_INTERACTION_FAILED;
- }
-
- value = gtk_entry_get_text (self->password_entry);
- g_tls_password_set_value_full (password, egg_secure_strdup (value),
- -1, egg_secure_free);
- return G_TLS_INTERACTION_HANDLED;
-}
diff --git a/ui/gcr-pkcs11-import-dialog.h b/ui/gcr-pkcs11-import-dialog.h
deleted file mode 100644
index 57f799a..0000000
--- a/ui/gcr-pkcs11-import-dialog.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2008 Stefan Walter
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_PKCS11_IMPORT_DIALOG_H__
-#define __GCR_PKCS11_IMPORT_DIALOG_H__
-
-#include <gck/gck.h>
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_PKCS11_IMPORT_DIALOG (_gcr_pkcs11_import_dialog_get_type ())
-G_DECLARE_FINAL_TYPE (GcrPkcs11ImportDialog, _gcr_pkcs11_import_dialog,
- GCR, PKCS11_IMPORT_DIALOG,
- GtkDialog)
-
-GcrPkcs11ImportDialog * _gcr_pkcs11_import_dialog_new (GtkWindow *parent);
-
-void _gcr_pkcs11_import_dialog_get_supplements (GcrPkcs11ImportDialog *self,
- GckBuilder *builder);
-
-void _gcr_pkcs11_import_dialog_set_supplements (GcrPkcs11ImportDialog *self,
- GckBuilder *builder);
-
-gboolean _gcr_pkcs11_import_dialog_run (GcrPkcs11ImportDialog *self);
-
-void _gcr_pkcs11_import_dialog_run_async (GcrPkcs11ImportDialog *self,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
-
-gboolean _gcr_pkcs11_import_dialog_run_finish (GcrPkcs11ImportDialog *self,
- GAsyncResult *result);
-
-GTlsInteractionResult _gcr_pkcs11_import_dialog_run_ask_password (GcrPkcs11ImportDialog *self,
- GTlsPassword *password,
- GCancellable *cancellable,
- GError **error);
-
-G_END_DECLS
-
-#endif /* __GCR_PKCS11_IMPORT_DIALOG_H__ */
diff --git a/ui/gcr-pkcs11-import-dialog.ui b/ui/gcr-pkcs11-import-dialog.ui
deleted file mode 100644
index b95d0ff..0000000
--- a/ui/gcr-pkcs11-import-dialog.ui
+++ /dev/null
@@ -1,255 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<interface>
- <!-- interface-requires gtk+ 2.12 -->
- <object class="GtkVBox" id="pkcs11-import-dialog">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="border_width">6</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkFrame" id="unlock-area">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
- <child>
- <object class="GtkAlignment" id="alignment2">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="left_padding">12</property>
- <child>
- <object class="GtkBox" id="box1">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="orientation">vertical</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkLabel" id="password-description">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">In order to import, please enter the password.</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkGrid" id="grid2">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
- <child>
- <object class="GtkEntry" id="password-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="invisible_char">●</property>
- <property name="visibility">False</property>
- <property name="width_chars">20</property>
- <property name="invisible_char_set">True</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="password-label">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Password:</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="token-label">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Token:</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="box2">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkImage" id="token-image">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="stock">gtk-missing-image</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="token-description">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label"></property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label5">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Unlock</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="settings-area">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
- <child>
- <object class="GtkAlignment" id="alignment1">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="left_padding">12</property>
- <child>
- <object class="GtkGrid" id="grid1">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
- <child>
- <object class="GtkLabel" id="label-label">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Label:</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="label-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="invisible_char">●</property>
- <property name="width_chars">20</property>
- <property name="invisible_char_set">True</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="margin_bottom">6</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Import settings</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <object class="GtkSizeGroup" id="entry-size-group">
- <property name="mode">GTK_SIZE_GROUP_HORIZONTAL</property>
- <widgets>
- <widget name="password-label"/>
- <widget name="token-label"/>
- <widget name="label-label"/>
- </widgets>
- </object>
-</interface>
diff --git a/ui/gcr-pkcs11-import-interaction.c b/ui/gcr-pkcs11-import-interaction.c
deleted file mode 100644
index bb0dc5d..0000000
--- a/ui/gcr-pkcs11-import-interaction.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2008 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr/gcr-import-interaction.h"
-
-#include "gcr-dialog-util.h"
-#include "gcr-pkcs11-import-interaction.h"
-
-#include <glib/gi18n-lib.h>
-
-enum {
- PROP_0,
- PROP_PARENT_WINDOW
-};
-
-struct _GcrPkcs11ImportInteraction {
- GTlsInteraction parent;
- gboolean supplemented;
- GtkWindow *parent_window;
- GcrPkcs11ImportDialog *dialog;
-};
-
-static void _gcr_pkcs11_import_interaction_iface_init (GcrImportInteractionIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE(GcrPkcs11ImportInteraction, _gcr_pkcs11_import_interaction, G_TYPE_TLS_INTERACTION,
- G_IMPLEMENT_INTERFACE (GCR_TYPE_IMPORT_INTERACTION, _gcr_pkcs11_import_interaction_iface_init));
-
-static void
-_gcr_pkcs11_import_interaction_init (GcrPkcs11ImportInteraction *self)
-{
- self->dialog = _gcr_pkcs11_import_dialog_new (self->parent_window);
-}
-
-static void
-_gcr_pkcs11_import_interaction_dispose (GObject *obj)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (obj);
-
- g_clear_object (&self->dialog);
-
- G_OBJECT_CLASS (_gcr_pkcs11_import_interaction_parent_class)->dispose (obj);
-}
-
-static void
-_gcr_pkcs11_import_interaction_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (obj);
-
- switch (prop_id) {
- case PROP_PARENT_WINDOW:
- gtk_window_set_transient_for (GTK_WINDOW (self->dialog),
- g_value_get_object (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_pkcs11_import_interaction_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (obj);
-
- switch (prop_id) {
- case PROP_PARENT_WINDOW:
- g_value_set_object (value, gtk_window_get_transient_for (GTK_WINDOW (self->dialog)));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static GTlsInteractionResult
-_gcr_pkcs11_import_interaction_ask_password (GTlsInteraction *interaction,
- GTlsPassword *password,
- GCancellable *cancellable,
- GError **error)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction);
-
- g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED);
-
- self->supplemented = TRUE;
- return _gcr_pkcs11_import_dialog_run_ask_password (self->dialog, password, cancellable, error);
-}
-
-static void
-_gcr_pkcs11_import_interaction_supplement_prep (GcrImportInteraction *interaction,
- GckBuilder *builder)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction);
-
- self->supplemented = FALSE;
- _gcr_pkcs11_import_dialog_set_supplements (self->dialog, builder);
-}
-
-static GTlsInteractionResult
-_gcr_pkcs11_import_interaction_supplement (GcrImportInteraction *interaction,
- GckBuilder *builder,
- GCancellable *cancellable,
- GError **error)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction);
-
- g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED);
-
- if (self->supplemented)
- return G_TLS_INTERACTION_HANDLED;
-
- self->supplemented = TRUE;
- if (_gcr_pkcs11_import_dialog_run (self->dialog)) {
- _gcr_pkcs11_import_dialog_get_supplements (self->dialog, builder);
- return G_TLS_INTERACTION_HANDLED;
-
- } else {
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED, _("The user cancelled the operation"));
- return G_TLS_INTERACTION_FAILED;
- }
-}
-
-static void
-on_dialog_run_async (GObject *source,
- GAsyncResult *result,
- gpointer user_data)
-{
- GTask *task = G_TASK (user_data);
- GckBuilder *builder = g_task_get_task_data (task);
-
- if (_gcr_pkcs11_import_dialog_run_finish (GCR_PKCS11_IMPORT_DIALOG (source), result)) {
- _gcr_pkcs11_import_dialog_get_supplements (GCR_PKCS11_IMPORT_DIALOG (source), builder);
- g_task_return_boolean (task, TRUE);
-
- } else {
- g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_CANCELLED,
- _("The user cancelled the operation"));
- }
-
- g_clear_object (&task);
-}
-
-static void
-_gcr_pkcs11_import_interaction_supplement_async (GcrImportInteraction *interaction,
- GckBuilder *builder,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction);
- GTask *task;
-
- g_return_if_fail (self->dialog != NULL);
-
- task = g_task_new (interaction, cancellable, callback, user_data);
- g_task_set_source_tag (task, _gcr_pkcs11_import_interaction_supplement_async);
-
- /* If dialog was already shown, then short circuit */
- if (self->supplemented) {
- g_task_return_boolean (task, TRUE);
-
- } else {
- self->supplemented = TRUE;
- g_task_set_task_data (task, gck_builder_ref (builder),
- (GDestroyNotify) gck_builder_unref);
- _gcr_pkcs11_import_dialog_run_async (self->dialog, cancellable,
- on_dialog_run_async,
- g_object_ref (task));
- }
-
- g_clear_object (&task);
-}
-
-static GTlsInteractionResult
-_gcr_pkcs11_import_interaction_supplement_finish (GcrImportInteraction *interaction,
- GAsyncResult *result,
- GError **error)
-{
- GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction);
-
- g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED);
- g_return_val_if_fail (g_task_is_valid (result, interaction), G_TLS_INTERACTION_UNHANDLED);
-
- if (!g_task_propagate_boolean (G_TASK (result), error))
- return G_TLS_INTERACTION_FAILED;
-
- return G_TLS_INTERACTION_HANDLED;
-
-}
-
-static void
-_gcr_pkcs11_import_interaction_iface_init (GcrImportInteractionIface *iface)
-{
- iface->supplement_prep = _gcr_pkcs11_import_interaction_supplement_prep;
- iface->supplement = _gcr_pkcs11_import_interaction_supplement;
- iface->supplement_async = _gcr_pkcs11_import_interaction_supplement_async;
- iface->supplement_finish = _gcr_pkcs11_import_interaction_supplement_finish;
-}
-
-static void
-_gcr_pkcs11_import_interaction_class_init (GcrPkcs11ImportInteractionClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GTlsInteractionClass *interaction_class = G_TLS_INTERACTION_CLASS (klass);
-
- gobject_class->dispose = _gcr_pkcs11_import_interaction_dispose;
- gobject_class->set_property = _gcr_pkcs11_import_interaction_set_property;
- gobject_class->get_property = _gcr_pkcs11_import_interaction_get_property;
-
- interaction_class->ask_password = _gcr_pkcs11_import_interaction_ask_password;
-
- g_object_class_install_property (gobject_class, PROP_PARENT_WINDOW,
- g_param_spec_object ("parent-window", "Parent Window", "Prompt Parent Window",
- GTK_TYPE_WINDOW,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-GTlsInteraction *
-_gcr_pkcs11_import_interaction_new (GtkWindow *parent_window)
-{
- g_return_val_if_fail (parent_window == NULL || GTK_IS_WINDOW (parent_window), NULL);
- return g_object_new (GCR_TYPE_PKCS11_IMPORT_INTERACTION,
- "parent-window", parent_window,
- NULL);
-}
diff --git a/ui/gcr-pkcs11-import-interaction.h b/ui/gcr-pkcs11-import-interaction.h
deleted file mode 100644
index a36db2e..0000000
--- a/ui/gcr-pkcs11-import-interaction.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef __GCR_PKCS11_IMPORT_INTERACTION_H__
-#define __GCR_PKCS11_IMPORT_INTERACTION_H__
-
-#include "gcr-pkcs11-import-dialog.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_PKCS11_IMPORT_INTERACTION (_gcr_pkcs11_import_interaction_get_type ())
-G_DECLARE_FINAL_TYPE (GcrPkcs11ImportInteraction, _gcr_pkcs11_import_interaction,
- GCR, PKCS11_IMPORT_INTERACTION,
- GTlsInteraction)
-
-GTlsInteraction * _gcr_pkcs11_import_interaction_new (GtkWindow *parent_window);
-
-G_END_DECLS
-
-#endif /* __GCR_PKCS11_IMPORT_INTERACTION_H__ */
diff --git a/ui/gcr-prompt-dialog.c b/ui/gcr-prompt-dialog.c
deleted file mode 100644
index 80726ba..0000000
--- a/ui/gcr-prompt-dialog.c
+++ /dev/null
@@ -1,1060 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stef@thewalter.net>
- */
-
-#include "config.h"
-
-#include "gcr/gcr-prompt.h"
-
-#include "gcr-prompt-dialog.h"
-#include "gcr-secure-entry-buffer.h"
-
-#include <gtk/gtk.h>
-#ifdef GDK_WINDOWING_X11
-#include <gdk/gdkx.h>
-#endif
-#ifdef GDK_WINDOWING_WAYLAND
-#include <gdk/gdkwayland.h>
-#endif
-#include <glib/gi18n.h>
-
-/**
- * GcrPromptDialog:
- *
- * A [iface@Gcr.Prompt] implementation which shows a GTK dialog. The dialog
- * will remain visible (but insensitive) between prompts. If the user cancels
- * the dialog between prompts, then the dialog will be hidden.
- */
-
-#ifdef GCR_DISABLE_GRABS
-#define GRAB_KEYBOARD 0
-#else
-#define GRAB_KEYBOARD 1
-#endif
-
-typedef enum {
- PROMPT_NONE,
- PROMPT_CONFIRMING,
- PROMPT_PASSWORDING
-} PromptMode;
-
-enum {
- PROP_0,
- PROP_MESSAGE,
- PROP_DESCRIPTION,
- PROP_WARNING,
- PROP_CHOICE_LABEL,
- PROP_CHOICE_CHOSEN,
- PROP_PASSWORD_NEW,
- PROP_PASSWORD_STRENGTH,
- PROP_CALLER_WINDOW,
- PROP_CONTINUE_LABEL,
- PROP_CANCEL_LABEL,
-
- PROP_PASSWORD_VISIBLE,
- PROP_CONFIRM_VISIBLE,
- PROP_WARNING_VISIBLE,
- PROP_CHOICE_VISIBLE,
-};
-
-struct _GcrPromptDialogPrivate {
- gchar *title;
- gchar *message;
- gchar *description;
- gchar *warning;
- gchar *choice_label;
- gboolean choice_chosen;
- gboolean password_new;
- guint password_strength;
- gchar *caller_window;
- gchar *continue_label;
- gchar *cancel_label;
-
- GSimpleAsyncResult *async_result;
- GcrPromptReply last_reply;
- GtkWidget *widget_grid;
- GtkWidget *continue_button;
- GtkWidget *spinner;
- GtkWidget *image;
- GtkWidget *password_entry;
- GtkEntryBuffer *password_buffer;
- GtkEntryBuffer *confirm_buffer;
- PromptMode mode;
-#if GTK_CHECK_VERSION (3,20,0)
- GdkSeat *grabbed_seat;
-#else
- GdkDevice *grabbed_device;
-#endif
- gulong grab_broken_id;
- gboolean grab_disabled;
- gboolean was_closed;
-};
-
-static void gcr_prompt_dialog_prompt_iface (GcrPromptIface *iface);
-
-static gboolean ungrab_keyboard (GtkWidget *win,
- GdkEvent *event,
- gpointer unused);
-
-G_DEFINE_TYPE_WITH_CODE (GcrPromptDialog, gcr_prompt_dialog, GTK_TYPE_DIALOG,
- G_ADD_PRIVATE (GcrPromptDialog);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_PROMPT, gcr_prompt_dialog_prompt_iface);
-);
-
-#ifdef GDK_WINDOWING_X11
-static gboolean
-update_transient_for_x11 (GcrPromptDialog *self, GdkWindow *window)
-{
- gint64 handle;
- gchar *end;
- GdkDisplay *display;
- GdkWindow *transient_for;
-
- if (!GDK_IS_X11_WINDOW (window))
- return FALSE;
-
- handle = g_ascii_strtoll (self->pv->caller_window, &end, 10);
- if (!end || *end != '\0') {
- g_warning ("couldn't parse caller-window property: %s", self->pv->caller_window);
- return FALSE;
- }
-
- display = gtk_widget_get_display (GTK_WIDGET (self));
- transient_for = gdk_x11_window_foreign_new_for_display (display, (Window)handle);
- if (transient_for == NULL) {
- g_warning ("caller-window property doesn't represent a window on current display: %s",
- self->pv->caller_window);
- return FALSE;
- }
-
- gdk_window_set_transient_for (window, transient_for);
- g_object_unref (transient_for);
- return TRUE;
-}
-#endif
-
-#ifdef GDK_WINDOWING_WAYLAND
-static gboolean
-update_transient_for_wl (GcrPromptDialog *self, GdkWindow *window)
-{
- if (!GDK_IS_WAYLAND_WINDOW (window))
- return FALSE;
-
- if (gdk_wayland_window_set_transient_for_exported (window, self->pv->caller_window)) {
- g_debug ("Succesfully set transient for WL window %s", self->pv->caller_window);
- return TRUE;
- }
-
- g_warning ("caller-window property doesn't represent a window on current display: %s",
- self->pv->caller_window);
- return FALSE;
-}
-#endif
-
-static void
-update_transient_for (GcrPromptDialog *self)
-{
- GdkWindow *window;
- gboolean success = FALSE;
-
- if (self->pv->caller_window == NULL || g_str_equal (self->pv->caller_window, "")) {
- gtk_window_set_modal (GTK_WINDOW (self), FALSE);
- return;
- }
-
- window = gtk_widget_get_window (GTK_WIDGET (self));
- if (window == NULL)
- return;
-
-#ifdef GDK_WINDOWING_X11
- if (!success)
- success |= update_transient_for_x11 (self, window);
-#endif
-#ifdef GDK_WINDOWING_WAYLAND
- if (!success)
- success |= update_transient_for_wl (self, window);
-#endif
-
- if (!success) {
- g_warning ("Couldn't set transient to caller window");
- }
-
- gtk_window_set_modal (GTK_WINDOW (self), TRUE);
-}
-
-static void
-gcr_prompt_dialog_init (GcrPromptDialog *self)
-{
- self->pv = gcr_prompt_dialog_get_instance_private (self);
-
- /*
- * This is a stupid hack to work around to help the window act like
- * a normal object with regards to reference counting and unref.
- */
- gtk_window_set_has_user_ref_count (GTK_WINDOW (self), FALSE);
-}
-
-static void
-gcr_prompt_dialog_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj);
-
- switch (prop_id) {
- case PROP_MESSAGE:
- g_free (self->pv->message);
- self->pv->message = g_value_dup_string (value);
- g_object_notify (obj, "message");
- break;
- case PROP_DESCRIPTION:
- g_free (self->pv->description);
- self->pv->description = g_value_dup_string (value);
- g_object_notify (obj, "description");
- break;
- case PROP_WARNING:
- g_free (self->pv->warning);
- self->pv->warning = g_value_dup_string (value);
- if (self->pv->warning && self->pv->warning[0] == '\0') {
- g_free (self->pv->warning);
- self->pv->warning = NULL;
- }
- g_object_notify (obj, "warning");
- g_object_notify (obj, "warning-visible");
- break;
- case PROP_CHOICE_LABEL:
- g_free (self->pv->choice_label);
- self->pv->choice_label = g_value_dup_string (value);
- if (self->pv->choice_label && self->pv->choice_label[0] == '\0') {
- g_free (self->pv->choice_label);
- self->pv->choice_label = NULL;
- }
- g_object_notify (obj, "choice-label");
- g_object_notify (obj, "choice-visible");
- break;
- case PROP_CHOICE_CHOSEN:
- self->pv->choice_chosen = g_value_get_boolean (value);
- g_object_notify (obj, "choice-chosen");
- break;
- case PROP_PASSWORD_NEW:
- self->pv->password_new = g_value_get_boolean (value);
- g_object_notify (obj, "password-new");
- g_object_notify (obj, "confirm-visible");
- break;
- case PROP_CALLER_WINDOW:
- g_free (self->pv->caller_window);
- self->pv->caller_window = g_value_dup_string (value);
- if (self->pv->caller_window && self->pv->caller_window[0] == '\0') {
- g_free (self->pv->caller_window);
- self->pv->caller_window = NULL;
- }
- update_transient_for (self);
- g_object_notify (obj, "caller-window");
- break;
- case PROP_CONTINUE_LABEL:
- g_free (self->pv->continue_label);
- self->pv->continue_label = g_value_dup_string (value);
- g_object_notify (obj, "continue-label");
- break;
- case PROP_CANCEL_LABEL:
- g_free (self->pv->cancel_label);
- self->pv->cancel_label = g_value_dup_string (value);
- g_object_notify (obj, "cancel-label");
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_prompt_dialog_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj);
-
- switch (prop_id) {
- case PROP_MESSAGE:
- g_value_set_string (value, self->pv->message);
- break;
- case PROP_DESCRIPTION:
- g_value_set_string (value, self->pv->description);
- break;
- case PROP_WARNING:
- g_value_set_string (value, self->pv->warning);
- break;
- case PROP_CHOICE_LABEL:
- g_value_set_string (value, self->pv->choice_label);
- break;
- case PROP_CHOICE_CHOSEN:
- g_value_set_boolean (value, self->pv->choice_chosen);
- break;
- case PROP_PASSWORD_NEW:
- g_value_set_boolean (value, self->pv->password_new);
- break;
- case PROP_PASSWORD_STRENGTH:
- g_value_set_int (value, self->pv->password_strength);
- break;
- case PROP_CALLER_WINDOW:
- g_value_set_string (value, self->pv->caller_window);
- break;
- case PROP_PASSWORD_VISIBLE:
- g_value_set_boolean (value, self->pv->mode == PROMPT_PASSWORDING);
- break;
- case PROP_CONFIRM_VISIBLE:
- g_value_set_boolean (value, self->pv->password_new &&
- self->pv->mode == PROMPT_PASSWORDING);
- break;
- case PROP_WARNING_VISIBLE:
- g_value_set_boolean (value, self->pv->warning && self->pv->warning[0]);
- break;
- case PROP_CHOICE_VISIBLE:
- g_value_set_boolean (value, self->pv->choice_label && self->pv->choice_label[0]);
- break;
- case PROP_CONTINUE_LABEL:
- g_value_set_string (value, self->pv->continue_label);
- break;
- case PROP_CANCEL_LABEL:
- g_value_set_string (value, self->pv->cancel_label);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-
-static void
-on_password_changed (GtkEditable *editable,
- gpointer user_data)
-{
- int upper, lower, digit, misc;
- const char *password;
- gdouble pwstrength;
- int length, i;
-
- password = gtk_entry_get_text (GTK_ENTRY (editable));
-
- /*
- * This code is based on the Master Password dialog in Firefox
- * (pref-masterpass.js)
- * Original code triple-licensed under the MPL, GPL, and LGPL
- * so is license-compatible with this file
- */
-
- length = strlen (password);
- upper = 0;
- lower = 0;
- digit = 0;
- misc = 0;
-
- for ( i = 0; i < length ; i++) {
- if (g_ascii_isdigit (password[i]))
- digit++;
- else if (g_ascii_islower (password[i]))
- lower++;
- else if (g_ascii_isupper (password[i]))
- upper++;
- else
- misc++;
- }
-
- if (length > 5)
- length = 5;
- if (digit > 3)
- digit = 3;
- if (upper > 3)
- upper = 3;
- if (misc > 3)
- misc = 3;
-
- pwstrength = ((length * 0.1) - 0.2) +
- (digit * 0.1) +
- (misc * 0.15) +
- (upper * 0.1);
-
- if (pwstrength < 0.0)
- pwstrength = 0.0;
- if (pwstrength > 1.0)
- pwstrength = 1.0;
-
- gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (user_data), pwstrength);
-}
-
-
-static const gchar*
-grab_status_message (GdkGrabStatus status)
-{
- switch (status) {
- case GDK_GRAB_SUCCESS:
- g_return_val_if_reached ("");
- break;
- case GDK_GRAB_ALREADY_GRABBED:
- return "already grabbed";
- case GDK_GRAB_INVALID_TIME:
- return "invalid time";
- case GDK_GRAB_NOT_VIEWABLE:
- return "not viewable";
- case GDK_GRAB_FROZEN:
- return "frozen";
- default:
- g_message ("unknown grab status: %d", (int)status);
- return "unknown";
- }
-}
-
-static gboolean
-on_grab_broken (GtkWidget *widget,
- GdkEventGrabBroken * event,
- gpointer user_data)
-{
- ungrab_keyboard (widget, (GdkEvent *)event, user_data);
- return TRUE;
-}
-
-#if GTK_CHECK_VERSION (3,20,0)
-static gboolean
-grab_keyboard (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (user_data);
- GdkGrabStatus status;
- GdkSeat *seat;
- GdkDisplay *display;
-
- if (self->pv->grabbed_seat || !GRAB_KEYBOARD)
- return FALSE;
-
- display = gtk_widget_get_display (widget);
- seat = gdk_display_get_default_seat (display);
- status = gdk_seat_grab (seat, gtk_widget_get_window (widget),
- GDK_SEAT_CAPABILITY_ALL,
- TRUE, NULL, event, NULL, NULL);
- if (status == GDK_GRAB_SUCCESS) {
- self->pv->grab_broken_id = g_signal_connect (widget, "grab-broken-event",
- G_CALLBACK (on_grab_broken), self);
- gtk_grab_add (widget);
- self->pv->grabbed_seat = seat;
- } else {
- g_message ("could not grab keyboard: %s", grab_status_message (status));
- }
-
- /* Always return false, so event is handled elsewhere */
- return FALSE;
-}
-
-static gboolean
-ungrab_keyboard (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (user_data);
-
- if (self->pv->grabbed_seat) {
- g_signal_handler_disconnect (widget, self->pv->grab_broken_id);
- gdk_seat_ungrab (self->pv->grabbed_seat);
- gtk_grab_remove (widget);
- self->pv->grabbed_seat = NULL;
- self->pv->grab_broken_id = 0;
- }
-
- /* Always return false, so event is handled elsewhere */
- return FALSE;
-}
-#else
-static gboolean
-grab_keyboard (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (user_data);
- GdkGrabStatus status;
- guint32 at;
- GdkDevice *device = NULL;
- GdkDeviceManager *manager;
- GdkDisplay *display;
- GList *devices, *l;
-
- if (self->pv->grabbed_device || !GRAB_KEYBOARD)
- return FALSE;
-
- display = gtk_widget_get_display (widget);
- manager = gdk_display_get_device_manager (display);
- devices = gdk_device_manager_list_devices (manager, GDK_DEVICE_TYPE_MASTER);
- for (l = devices; l; l = g_list_next (l)) {
- device = l->data;
- if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
- break;
- }
- g_list_free (devices);
-
- if (!device) {
- g_message ("couldn't find device to grab");
- return FALSE;
- }
-
- at = event ? gdk_event_get_time (event) : GDK_CURRENT_TIME;
- status = gdk_device_grab (device, gtk_widget_get_window (widget),
- GDK_OWNERSHIP_APPLICATION, TRUE,
- GDK_KEY_PRESS | GDK_KEY_RELEASE, NULL, at);
- if (status == GDK_GRAB_SUCCESS) {
- self->pv->grab_broken_id = g_signal_connect (widget, "grab-broken-event",
- G_CALLBACK (on_grab_broken), self);
- gtk_device_grab_add (widget, device, TRUE);
- self->pv->grabbed_device = device;
- } else {
- g_message ("could not grab keyboard: %s", grab_status_message (status));
- }
-
- /* Always return false, so event is handled elsewhere */
- return FALSE;
-}
-
-static gboolean
-ungrab_keyboard (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- guint32 at = event ? gdk_event_get_time (event) : GDK_CURRENT_TIME;
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (user_data);
-
- if (self->pv->grabbed_device) {
- g_signal_handler_disconnect (widget, self->pv->grab_broken_id);
- gdk_device_ungrab (self->pv->grabbed_device, at);
- gtk_device_grab_remove (widget, self->pv->grabbed_device);
- self->pv->grabbed_device = NULL;
- self->pv->grab_broken_id = 0;
- }
-
- /* Always return false, so event is handled elsewhere */
- return FALSE;
-}
-#endif
-
-static gboolean
-window_state_changed (GtkWidget *win, GdkEventWindowState *event, gpointer data)
-{
- GdkWindowState state = gdk_window_get_state (gtk_widget_get_window (win));
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (data);
-
- if (state & GDK_WINDOW_STATE_WITHDRAWN ||
- state & GDK_WINDOW_STATE_ICONIFIED ||
- state & GDK_WINDOW_STATE_FULLSCREEN ||
- state & GDK_WINDOW_STATE_MAXIMIZED) {
- self->pv->grab_disabled = TRUE;
- ungrab_keyboard (win, (GdkEvent*)event, data);
- } else if (self->pv->grab_disabled) {
- self->pv->grab_disabled = FALSE;
- grab_keyboard (win, (GdkEvent*)event, data);
- }
-
- return FALSE;
-}
-
-static void
-gcr_prompt_dialog_constructed (GObject *obj)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj);
- GtkDialog *dialog;
- PangoAttrList *attrs;
- GtkWidget *widget;
- GtkWidget *entry;
- GtkWidget *content;
- GtkWidget *button;
- GtkGrid *grid;
-
- G_OBJECT_CLASS (gcr_prompt_dialog_parent_class)->constructed (obj);
-
- dialog = GTK_DIALOG (self);
- button = gtk_dialog_add_button (dialog, _("_Cancel"), GTK_RESPONSE_CANCEL);
- g_object_bind_property (self, "cancel-label", button, "label", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
- gtk_button_set_use_underline (GTK_BUTTON (button), TRUE);
- button = gtk_dialog_add_button (dialog, _("_OK"), GTK_RESPONSE_OK);
- g_object_bind_property (self, "continue-label", button, "label", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
- gtk_button_set_use_underline (GTK_BUTTON (button), TRUE);
- self->pv->continue_button = button;
-
- gtk_window_set_type_hint (GTK_WINDOW (dialog), GDK_WINDOW_TYPE_HINT_NORMAL);
- gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
- gtk_window_set_keep_above (GTK_WINDOW (dialog), TRUE);
- gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK);
-
- content = gtk_dialog_get_content_area (dialog);
-
- grid = GTK_GRID (gtk_grid_new ());
- gtk_container_set_border_width (GTK_CONTAINER (grid), 6);
- gtk_widget_set_hexpand (GTK_WIDGET (grid), TRUE);
- gtk_grid_set_column_homogeneous (grid, FALSE);
- gtk_grid_set_column_spacing (grid, 12);
- gtk_grid_set_row_spacing (grid, 6);
-
- /* The prompt image */
- self->pv->image = gtk_image_new_from_icon_name ("dialog-password", GTK_ICON_SIZE_DIALOG);
- gtk_widget_set_valign (self->pv->image, GTK_ALIGN_START);
- gtk_grid_attach (grid, self->pv->image, -1, 0, 1, 4);
- gtk_widget_show (self->pv->image);
-
- /* The prompt spinner on the continue button */
- widget = gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog),
- GTK_RESPONSE_OK);
- self->pv->spinner = gtk_spinner_new ();
- gtk_button_set_image (GTK_BUTTON (widget), self->pv->spinner);
- gtk_button_set_image_position (GTK_BUTTON (widget), GTK_POS_LEFT);
-
- /* The message label */
- widget = gtk_label_new ("");
- attrs = pango_attr_list_new ();
- pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD));
- pango_attr_list_insert (attrs, pango_attr_scale_new (PANGO_SCALE_LARGE));
- gtk_label_set_attributes (GTK_LABEL (widget), attrs);
- pango_attr_list_unref (attrs);
- gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE);
- gtk_widget_set_halign (widget, GTK_ALIGN_START);
- gtk_widget_set_hexpand (widget, TRUE);
- gtk_widget_set_margin_bottom (widget, 8);
- g_object_bind_property (self, "message", widget, "label", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, widget, 0, 0, 2, 1);
- gtk_widget_show (widget);
-
- /* The description label */
- widget = gtk_label_new ("");
- gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE);
- gtk_widget_set_halign (widget, GTK_ALIGN_START);
- gtk_widget_set_hexpand (widget, TRUE);
- gtk_widget_set_margin_bottom (widget, 4);
- g_object_bind_property (self, "description", widget, "label", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, widget, 0, 1, 2, 1);
- gtk_widget_show (widget);
-
- /* The password label */
- widget = gtk_label_new (_("Password:"));
- gtk_widget_set_halign (widget, GTK_ALIGN_START);
- gtk_widget_set_hexpand (widget, FALSE);
- g_object_bind_property (self, "password-visible", widget, "visible", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, widget, 0, 2, 1, 1);
-
- /* The password entry */
- self->pv->password_buffer = gcr_secure_entry_buffer_new ();
- entry = gtk_entry_new_with_buffer (self->pv->password_buffer);
- gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE);
- gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
- gtk_widget_set_hexpand (entry, TRUE);
- g_object_bind_property (self, "password-visible", entry, "visible", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, entry, 1, 2, 1, 1);
- self->pv->password_entry = entry;
-
- /* The confirm label */
- widget = gtk_label_new (_("Confirm:"));
- gtk_widget_set_halign (widget, GTK_ALIGN_START);
- gtk_widget_set_hexpand (widget, FALSE);
- g_object_bind_property (self, "confirm-visible", widget, "visible", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, widget, 0, 3, 1, 1);
-
- /* The confirm entry */
- self->pv->confirm_buffer = gcr_secure_entry_buffer_new ();
- widget = gtk_entry_new_with_buffer (self->pv->confirm_buffer);
- gtk_widget_set_hexpand (widget, TRUE);
- gtk_entry_set_visibility (GTK_ENTRY (widget), FALSE);
- gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE);
- g_object_bind_property (self, "confirm-visible", widget, "visible", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, widget, 1, 3, 1, 1);
-
- /* The quality progress bar */
- widget = gtk_progress_bar_new ();
- gtk_widget_set_hexpand (widget, TRUE);
- g_object_bind_property (self, "confirm-visible", widget, "visible", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, widget, 1, 4, 1, 1);
- g_signal_connect (entry, "changed", G_CALLBACK (on_password_changed), widget);
-
- /* The warning */
- widget = gtk_label_new ("");
- attrs = pango_attr_list_new ();
- pango_attr_list_insert (attrs, pango_attr_style_new (PANGO_STYLE_ITALIC));
- gtk_label_set_attributes (GTK_LABEL (widget), attrs);
- pango_attr_list_unref (attrs);
- gtk_widget_set_hexpand (widget, FALSE);
- g_object_bind_property (self, "warning", widget, "label", G_BINDING_DEFAULT);
- g_object_bind_property (self, "warning-visible", widget, "visible", G_BINDING_DEFAULT);
- gtk_grid_attach (grid, widget, 0, 5, 2, 1);
- gtk_widget_show (widget);
-
- /* The checkbox */
- widget = g_object_new (GTK_TYPE_CHECK_BUTTON, "use-underline", TRUE, NULL);
- g_object_bind_property (self, "choice-label", widget, "label", G_BINDING_DEFAULT);
- g_object_bind_property (self, "choice-visible", widget, "visible", G_BINDING_DEFAULT);
- g_object_bind_property (self, "choice-chosen", widget, "active", G_BINDING_BIDIRECTIONAL);
- gtk_widget_set_hexpand (widget, FALSE);
- gtk_grid_attach (grid, widget, 0, 6, 2, 1);
-
- gtk_container_add (GTK_CONTAINER (content), GTK_WIDGET (grid));
- gtk_widget_show (GTK_WIDGET (grid));
- self->pv->widget_grid = GTK_WIDGET (grid);
-
- g_signal_connect (self, "map-event", G_CALLBACK (grab_keyboard), self);
- g_signal_connect (self, "unmap-event", G_CALLBACK (ungrab_keyboard), self);
- g_signal_connect (self, "window-state-event", G_CALLBACK (window_state_changed), self);
-
-}
-
-static gboolean
-handle_password_response (GcrPromptDialog *self)
-{
- const gchar *password;
- const gchar *confirm;
- const gchar *env;
- gint strength;
-
- password = gtk_entry_buffer_get_text (self->pv->password_buffer);
-
- /* Is it a new password? */
- if (self->pv->password_new) {
- confirm = gtk_entry_buffer_get_text (self->pv->confirm_buffer);
-
- /* Do the passwords match? */
- if (!g_str_equal (password, confirm)) {
- gcr_prompt_set_warning (GCR_PROMPT (self), _("Passwords do not match."));
- return FALSE;
- }
-
- /* Don't allow blank passwords if in paranoid mode */
- env = g_getenv ("GNOME_KEYRING_PARANOID");
- if (env && *env) {
- gcr_prompt_set_warning (GCR_PROMPT (self), _("Password cannot be blank"));
- return FALSE;
- }
- }
-
- if (g_str_equal (password, ""))
- strength = 0;
- else
- strength = 1;
-
- self->pv->password_strength = strength;
- g_object_notify (G_OBJECT (self), "password-strength");
- return TRUE;
-}
-
-static void
-gcr_prompt_dialog_response (GtkDialog *dialog,
- gint response_id)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (dialog);
- GSimpleAsyncResult *res;
-
- /*
- * If this is called while no prompting is going on, then the dialog
- * is waiting for the caller to perform some action. Close the dialog.
- */
-
- if (self->pv->mode == PROMPT_NONE) {
- g_return_if_fail (response_id != GTK_RESPONSE_OK);
- gcr_prompt_close (GCR_PROMPT (self));
- return;
- }
-
- switch (response_id) {
- case GTK_RESPONSE_OK:
- switch (self->pv->mode) {
- case PROMPT_PASSWORDING:
- if (!handle_password_response (self))
- return;
- break;
- default:
- break;
- }
- self->pv->last_reply = GCR_PROMPT_REPLY_CONTINUE;
- break;
-
- default:
- self->pv->last_reply = GCR_PROMPT_REPLY_CANCEL;
- break;
- }
-
- gtk_widget_set_sensitive (self->pv->continue_button, FALSE);
- gtk_widget_set_sensitive (self->pv->widget_grid, FALSE);
- gtk_widget_show (self->pv->spinner);
- gtk_spinner_start (GTK_SPINNER (self->pv->spinner));
- self->pv->mode = PROMPT_NONE;
-
- res = self->pv->async_result;
- self->pv->async_result = NULL;
-
- g_simple_async_result_complete (res);
- g_object_unref (res);
-}
-
-static void
-gcr_prompt_dialog_dispose (GObject *obj)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj);
-
- gcr_prompt_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_DELETE_EVENT);
- g_assert (self->pv->async_result == NULL);
-
- gcr_prompt_close (GCR_PROMPT (self));
-
- ungrab_keyboard (GTK_WIDGET (self), NULL, self);
-#if GTK_CHECK_VERSION (3,20,0)
- g_assert (self->pv->grabbed_seat == NULL);
-#else
- g_assert (self->pv->grabbed_device == NULL);
-#endif
-
- G_OBJECT_CLASS (gcr_prompt_dialog_parent_class)->dispose (obj);
-}
-
-static void
-gcr_prompt_dialog_finalize (GObject *obj)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj);
-
- g_free (self->pv->title);
- g_free (self->pv->message);
- g_free (self->pv->description);
- g_free (self->pv->warning);
- g_free (self->pv->choice_label);
- g_free (self->pv->caller_window);
-
- g_object_unref (self->pv->password_buffer);
- g_object_unref (self->pv->confirm_buffer);
-
- G_OBJECT_CLASS (gcr_prompt_dialog_parent_class)->finalize (obj);
-}
-
-static void
-gcr_prompt_dialog_class_init (GcrPromptDialogClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
- GtkDialogClass *dialog_class = GTK_DIALOG_CLASS (klass);
-
- gobject_class->constructed = gcr_prompt_dialog_constructed;
- gobject_class->get_property = gcr_prompt_dialog_get_property;
- gobject_class->set_property = gcr_prompt_dialog_set_property;
- gobject_class->dispose = gcr_prompt_dialog_dispose;
- gobject_class->finalize = gcr_prompt_dialog_finalize;
-
- dialog_class->response = gcr_prompt_dialog_response;
-
- g_object_class_override_property (gobject_class, PROP_MESSAGE, "message");
-
- g_object_class_override_property (gobject_class, PROP_DESCRIPTION, "description");
-
- g_object_class_override_property (gobject_class, PROP_WARNING, "warning");
-
- g_object_class_override_property (gobject_class, PROP_PASSWORD_NEW, "password-new");
-
- g_object_class_override_property (gobject_class, PROP_PASSWORD_STRENGTH, "password-strength");
-
- g_object_class_override_property (gobject_class, PROP_CHOICE_LABEL, "choice-label");
-
- g_object_class_override_property (gobject_class, PROP_CHOICE_CHOSEN, "choice-chosen");
-
- g_object_class_override_property (gobject_class, PROP_CALLER_WINDOW, "caller-window");
-
- g_object_class_override_property (gobject_class, PROP_CONTINUE_LABEL, "continue-label");
-
- g_object_class_override_property (gobject_class, PROP_CANCEL_LABEL, "cancel-label");
-
- /**
- * GcrPromptDialog:password-visible:
- *
- * Whether the password entry is visible or not.
- */
- g_object_class_install_property (gobject_class, PROP_PASSWORD_VISIBLE,
- g_param_spec_boolean ("password-visible", "Password visible", "Password field is visible",
- FALSE,
- G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrPromptDialog:confirm-visible:
- *
- * Whether the password confirm entry is visible or not.
- */
- g_object_class_install_property (gobject_class, PROP_CONFIRM_VISIBLE,
- g_param_spec_boolean ("confirm-visible", "Confirm visible", "Confirm field is visible",
- FALSE,
- G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrPromptDialog:warning-visible:
- *
- * Whether the warning label is visible or not.
- */
- g_object_class_install_property (gobject_class, PROP_WARNING_VISIBLE,
- g_param_spec_boolean ("warning-visible", "Warning visible", "Warning is visible",
- FALSE,
- G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrPromptDialog:choice-visible:
- *
- * Whether the choice check box is visible or not.
- */
- g_object_class_install_property (gobject_class, PROP_CHOICE_VISIBLE,
- g_param_spec_boolean ("choice-visible", "Choice visible", "Choice is visible",
- FALSE,
- G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-}
-
-static void
-gcr_prompt_dialog_password_async (GcrPrompt *prompt,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt);
- GObject *obj;
-
- if (self->pv->async_result != NULL) {
- g_warning ("this prompt is already prompting");
- return;
- }
-
- self->pv->mode = PROMPT_PASSWORDING;
- self->pv->async_result = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
- gcr_prompt_dialog_password_async);
-
- gtk_entry_buffer_set_text (self->pv->password_buffer, "", 0);
- gtk_entry_buffer_set_text (self->pv->confirm_buffer, "", 0);
-
- if (self->pv->was_closed) {
- self->pv->last_reply = GCR_PROMPT_REPLY_CANCEL;
- g_simple_async_result_complete_in_idle (self->pv->async_result);
- return;
- }
-
- gtk_image_set_from_icon_name (GTK_IMAGE (self->pv->image),
- "dialog-password", GTK_ICON_SIZE_DIALOG);
- gtk_widget_set_sensitive (self->pv->continue_button, TRUE);
- gtk_widget_set_sensitive (self->pv->widget_grid, TRUE);
- gtk_widget_hide (self->pv->spinner);
- gtk_spinner_stop (GTK_SPINNER (self->pv->spinner));
-
- obj = G_OBJECT (self);
- g_object_notify (obj, "password-visible");
- g_object_notify (obj, "confirm-visible");
- g_object_notify (obj, "warning-visible");
- g_object_notify (obj, "choice-visible");
-
- gtk_widget_grab_focus (self->pv->password_entry);
- gtk_widget_show (GTK_WIDGET (self));
-}
-
-static const gchar *
-gcr_prompt_dialog_password_finish (GcrPrompt *prompt,
- GAsyncResult *result,
- GError **error)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt);
-
- g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (prompt),
- gcr_prompt_dialog_password_async), NULL);
-
- if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
- return NULL;
-
- if (self->pv->last_reply == GCR_PROMPT_REPLY_CONTINUE)
- return gtk_entry_buffer_get_text (self->pv->password_buffer);
- return NULL;
-}
-
-static void
-gcr_prompt_dialog_confirm_async (GcrPrompt *prompt,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt);
- GtkWidget *button;
- GObject *obj;
-
- if (self->pv->async_result != NULL) {
- g_warning ("this prompt is already prompting");
- return;
- }
-
- self->pv->mode = PROMPT_CONFIRMING;
- self->pv->async_result = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
- gcr_prompt_dialog_confirm_async);
-
- if (self->pv->was_closed) {
- self->pv->last_reply = GCR_PROMPT_REPLY_CANCEL;
- g_simple_async_result_complete_in_idle (self->pv->async_result);
- return;
- }
-
- gtk_image_set_from_icon_name (GTK_IMAGE (self->pv->image),
- "dialog-question", GTK_ICON_SIZE_DIALOG);
- gtk_widget_set_sensitive (self->pv->continue_button, TRUE);
- gtk_widget_set_sensitive (self->pv->widget_grid, TRUE);
- gtk_widget_hide (self->pv->spinner);
- gtk_spinner_stop (GTK_SPINNER (self->pv->spinner));
-
- button = gtk_dialog_get_widget_for_response (GTK_DIALOG (self), GTK_RESPONSE_OK);
- gtk_widget_grab_focus (button);
-
- obj = G_OBJECT (self);
- g_object_notify (obj, "password-visible");
- g_object_notify (obj, "confirm-visible");
- g_object_notify (obj, "warning-visible");
- g_object_notify (obj, "choice-visible");
-
- gtk_widget_show (GTK_WIDGET (self));
-}
-
-static GcrPromptReply
-gcr_prompt_dialog_confirm_finish (GcrPrompt *prompt,
- GAsyncResult *result,
- GError **error)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt);
-
- g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (prompt),
- gcr_prompt_dialog_confirm_async), GCR_PROMPT_REPLY_CANCEL);
-
- if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
- return GCR_PROMPT_REPLY_CANCEL;
-
- return self->pv->last_reply;
-}
-
-static void
-gcr_prompt_dialog_close (GcrPrompt *prompt)
-{
- GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt);
- if (!self->pv->was_closed) {
- self->pv->was_closed = TRUE;
- gtk_widget_hide (GTK_WIDGET (self));
- }
-}
-
-static void
-gcr_prompt_dialog_prompt_iface (GcrPromptIface *iface)
-{
- iface->prompt_password_async = gcr_prompt_dialog_password_async;
- iface->prompt_password_finish = gcr_prompt_dialog_password_finish;
- iface->prompt_confirm_async = gcr_prompt_dialog_confirm_async;
- iface->prompt_confirm_finish = gcr_prompt_dialog_confirm_finish;
- iface->prompt_close = gcr_prompt_dialog_close;
-}
diff --git a/ui/gcr-prompt-dialog.h b/ui/gcr-prompt-dialog.h
deleted file mode 100644
index 9a94457..0000000
--- a/ui/gcr-prompt-dialog.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2011 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stef@thewalter.net>
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_PROMPT_DIALOG_H__
-#define __GCR_PROMPT_DIALOG_H__
-
-#include <gtk/gtk.h>
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_PROMPT_DIALOG (gcr_prompt_dialog_get_type ())
-#define GCR_PROMPT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_PROMPT_DIALOG, GcrPromptDialog))
-#define GCR_PROMPT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_PROMPT_DIALOG, GcrPromptDialogClass))
-#define GCR_IS_PROMPT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_PROMPT_DIALOG))
-#define GCR_IS_PROMPT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_PROMPT_DIALOG))
-#define GCR_PROMPT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_PROMPT_DIALOG, GcrPromptDialogClass))
-
-typedef struct _GcrPromptDialog GcrPromptDialog;
-typedef struct _GcrPromptDialogClass GcrPromptDialogClass;
-typedef struct _GcrPromptDialogPrivate GcrPromptDialogPrivate;
-
-struct _GcrPromptDialog {
- GtkDialog parent;
-
- /*< private >*/
- GcrPromptDialogPrivate *pv;
-};
-
-struct _GcrPromptDialogClass {
- GtkDialogClass parent_class;
-};
-
-GType gcr_prompt_dialog_get_type (void);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrPromptDialog, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_PROMPT_DIALOG_H__ */
diff --git a/ui/gcr-prompter-tool.c b/ui/gcr-prompter-tool.c
deleted file mode 100644
index 2d3f71e..0000000
--- a/ui/gcr-prompter-tool.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* gcr-viewer-tool.c: Command line utility
-
- Copyright (C) 2011 Collabora Ltd.
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#include "config.h"
-
-#include "gcr/gcr.h"
-#include "gcr/gcr-dbus-constants.h"
-
-#include <glib/gi18n.h>
-#include <gtk/gtk.h>
-
-#include <locale.h>
-#include <stdlib.h>
-#include <string.h>
-#include <syslog.h>
-
-#define QUIT_TIMEOUT 10
-
-static GcrSystemPrompter *the_prompter = NULL;
-static gboolean registered_prompter = FALSE;
-static gboolean acquired_system_prompter = FALSE;
-static gboolean acquired_private_prompter = FALSE;
-static guint timeout_source = 0;
-
-static gboolean
-on_timeout_quit (gpointer unused)
-{
- g_debug ("%d second inactivity timeout, quitting", QUIT_TIMEOUT);
- gtk_main_quit ();
-
- return FALSE; /* Don't run again */
-}
-
-static void
-start_timeout (void)
-{
- if (g_getenv ("GCR_PERSIST") != NULL)
- return;
-
- if (!timeout_source)
- timeout_source = g_timeout_add_seconds (QUIT_TIMEOUT, on_timeout_quit, NULL);
-}
-
-static void
-stop_timeout (void)
-{
- if (timeout_source)
- g_source_remove (timeout_source);
- timeout_source = 0;
-}
-
-static void
-on_prompter_prompting (GObject *obj,
- GParamSpec *param,
- gpointer user_data)
-{
- if (gcr_system_prompter_get_prompting (the_prompter))
- stop_timeout ();
- else
- start_timeout ();
-}
-
-static void
-on_bus_acquired (GDBusConnection *connection,
- const gchar *name,
- gpointer user_data)
-{
- g_debug ("bus acquired: %s", name);
-
- if (!registered_prompter)
- gcr_system_prompter_register (the_prompter, connection);
-
- registered_prompter = TRUE;
-}
-
-static void
-on_name_acquired (GDBusConnection *connection,
- const gchar *name,
- gpointer user_data)
-{
- g_debug ("acquired name: %s", name);
-
- if (g_strcmp0 (name, GCR_DBUS_PROMPTER_SYSTEM_BUS_NAME) == 0)
- acquired_system_prompter = TRUE;
-
- else if (g_strcmp0 (name, GCR_DBUS_PROMPTER_PRIVATE_BUS_NAME) == 0)
- acquired_private_prompter = TRUE;
-}
-
-static void
-on_name_lost (GDBusConnection *connection,
- const gchar *name,
- gpointer user_data)
-{
- g_debug ("lost name: %s", name);
-
- /* Called like so when no connection can be made */
- if (connection == NULL) {
- g_warning ("couldn't connect to session bus");
- gtk_main_quit ();
-
- } else if (g_strcmp0 (name, GCR_DBUS_PROMPTER_SYSTEM_BUS_NAME) == 0) {
- acquired_system_prompter = FALSE;
-
- } else if (g_strcmp0 (name, GCR_DBUS_PROMPTER_PRIVATE_BUS_NAME) == 0) {
- acquired_private_prompter = FALSE;
-
- }
-}
-
-static void
-log_handler (const gchar *log_domain,
- GLogLevelFlags log_level,
- const gchar *message,
- gpointer user_data)
-{
- int level;
-
- /* Note that crit and err are the other way around in syslog */
-
- switch (G_LOG_LEVEL_MASK & log_level) {
- case G_LOG_LEVEL_ERROR:
- level = LOG_CRIT;
- break;
- case G_LOG_LEVEL_CRITICAL:
- level = LOG_ERR;
- break;
- case G_LOG_LEVEL_WARNING:
- level = LOG_WARNING;
- break;
- case G_LOG_LEVEL_MESSAGE:
- level = LOG_NOTICE;
- break;
- case G_LOG_LEVEL_INFO:
- level = LOG_INFO;
- break;
- case G_LOG_LEVEL_DEBUG:
- level = LOG_DEBUG;
- break;
- default:
- level = LOG_ERR;
- break;
- }
-
- /* Log to syslog first */
- if (log_domain)
- syslog (level, "%s: %s", log_domain, message);
- else
- syslog (level, "%s", message);
-
- /* And then to default handler for aborting and stuff like that */
- g_log_default_handler (log_domain, log_level, message, user_data);
-}
-
-static void
-printerr_handler (const gchar *string)
-{
- /* Print to syslog and stderr */
- syslog (LOG_WARNING, "%s", string);
- fprintf (stderr, "%s", string);
-}
-
-static void
-prepare_logging ()
-{
- GLogLevelFlags flags = G_LOG_FLAG_FATAL | G_LOG_LEVEL_ERROR |
- G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING |
- G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO;
-
- openlog ("gcr-prompter", LOG_PID, LOG_AUTH);
-
- g_log_set_handler (NULL, flags, log_handler, NULL);
- g_log_set_handler ("Glib", flags, log_handler, NULL);
- g_log_set_handler ("Gtk", flags, log_handler, NULL);
- g_log_set_handler ("Gnome", flags, log_handler, NULL);
- g_log_set_handler ("Gcr", flags, log_handler, NULL);
- g_log_set_handler ("Gck", flags, log_handler, NULL);
- g_log_set_default_handler (log_handler, NULL);
- g_set_printerr_handler (printerr_handler);
-}
-
-int
-main (int argc, char *argv[])
-{
- guint system_owner_id;
- guint private_owner_id;
-
- gtk_init (&argc, &argv);
-
-#ifdef HAVE_LOCALE_H
- /* internationalisation */
- setlocale (LC_ALL, "");
-#endif
-
-#ifdef HAVE_GETTEXT
- bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
- textdomain (GETTEXT_PACKAGE);
- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
-#endif
-
- prepare_logging ();
-
- the_prompter = gcr_system_prompter_new (GCR_SYSTEM_PROMPTER_SINGLE,
- GCR_TYPE_PROMPT_DIALOG);
- g_signal_connect (the_prompter, "notify::prompting",
- G_CALLBACK (on_prompter_prompting), NULL);
-
- system_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
- GCR_DBUS_PROMPTER_SYSTEM_BUS_NAME,
- G_BUS_NAME_OWNER_FLAGS_REPLACE,
- on_bus_acquired,
- on_name_acquired,
- on_name_lost,
- NULL,
- NULL);
-
- private_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
- GCR_DBUS_PROMPTER_PRIVATE_BUS_NAME,
- G_BUS_NAME_OWNER_FLAGS_REPLACE,
- on_bus_acquired,
- on_name_acquired,
- on_name_lost,
- NULL,
- NULL);
-
- start_timeout ();
- gtk_main ();
-
- if (registered_prompter)
- gcr_system_prompter_unregister (the_prompter, TRUE);
-
- g_bus_unown_name (system_owner_id);
- g_bus_unown_name (private_owner_id);
-
- g_object_unref (the_prompter);
-
- return 0;
-}
diff --git a/ui/gcr-prompter.desktop.in.in b/ui/gcr-prompter.desktop.in.in
deleted file mode 100644
index 086ec17..0000000
--- a/ui/gcr-prompter.desktop.in.in
+++ /dev/null
@@ -1,9 +0,0 @@
-[Desktop Entry]
-Name=Access Prompt
-Comment=Unlock access to passwords and other secrets
-# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
-Icon=security-medium
-Exec=@libexecdir@/gcr-prompter
-Terminal=false
-Type=Application
-NoDisplay=true
diff --git a/ui/gcr-renderer.c b/ui/gcr-renderer.c
deleted file mode 100644
index 46adae5..0000000
--- a/ui/gcr-renderer.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr-deprecated.h"
-#include "gcr-renderer.h"
-
-#include "gcr-certificate-renderer.h"
-#include "gcr-certificate-request-renderer.h"
-#include "gcr-gnupg-renderer.h"
-#include "gcr-key-renderer.h"
-
-#include "gck/gck.h"
-
-#include <gtk/gtk.h>
-
-/**
- * GcrRenderer:
- *
- * An interface that's implemented by renderers which wish to render data to a
- * [iface@Viewer].
- *
- * The interaction between [iface@Renderer] and [iface@Viewer] is not stable
- * yet, and so new renderers cannot be implemented outside the Gcr library at
- * this time.
- *
- * To lookup a renderer for a given set of attributes, use the gcr_renderer_create()
- * function. This will create and initialize a renderer that's capable of viewing
- * the data in those attributes.
- */
-
-/**
- * GcrRendererIface:
- * @parent: the parent interface type
- * @data_changed: signal emitted when data being rendered changes
- * @render_view: method invoked to render the data into a viewer
- * @populate_popup: method invoked to populate a popup menu with additional
- * renderer options
- *
- * The interface for #GcrRenderer
- */
-
-enum {
- DATA_CHANGED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-typedef struct _GcrRegistered {
- GckAttributes *attrs;
- GType renderer_type;
-} GcrRegistered;
-
-static GArray *registered_renderers = NULL;
-static gboolean registered_sorted = FALSE;
-
-static void
-gcr_renderer_default_init (GcrRendererIface *iface)
-{
- static gboolean initialized = FALSE;
- if (!initialized) {
-
- /**
- * GcrRenderer:label:
- *
- * The label to display.
- */
- g_object_interface_install_property (iface,
- g_param_spec_string ("label", "Label", "The label for the renderer",
- "",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrRenderer:attributes:
- *
- * The attributes to display.
- */
- g_object_interface_install_property (iface,
- g_param_spec_boxed ("attributes", "Attributes", "The data displayed in the renderer",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrRenderer::data-changed:
- *
- * A signal that is emitted by the renderer when it's data
- * changed and should be rerendered.
- */
- signals[DATA_CHANGED] = g_signal_new ("data-changed", GCR_TYPE_RENDERER, G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GcrRendererIface, data_changed),
- NULL, NULL, NULL, G_TYPE_NONE, 0);
-
- initialized = TRUE;
- }
-}
-
-typedef GcrRendererIface GcrRendererInterface;
-
-G_DEFINE_INTERFACE (GcrRenderer, gcr_renderer, G_TYPE_OBJECT);
-
-/**
- * gcr_renderer_render_view:
- * @self: The renderer
- * @viewer: The viewer to render to.
- *
- * Render the contents of the renderer to the given viewer.
- */
-void
-gcr_renderer_render_view (GcrRenderer *self, GcrViewer *viewer)
-{
- g_return_if_fail (GCR_IS_RENDERER (self));
- g_return_if_fail (GCR_RENDERER_GET_INTERFACE (self)->render_view);
- GCR_RENDERER_GET_INTERFACE (self)->render_view (self, viewer);
-}
-
-/**
- * gcr_renderer_render:
- * @self: the renderer
- * @viewer: the viewer to render to
- *
- * Render a renderer to the viewer.
- *
- * Deprecated: 3.2: Use gcr_renderer_render_view() instead
- */
-void
-gcr_renderer_render (GcrRenderer *self,
- GcrViewer *viewer)
-{
- gcr_renderer_render_view (self, viewer);
-}
-
-/**
- * gcr_renderer_popuplate_popup:
- * @self: The renderer
- * @viewer: The viewer that is displaying a popup
- * @menu: The popup menu being displayed
- *
- * Called by #GcrViewer when about to display a popup menu for the content
- * displayed by the renderer. The renderer can add a menu item if desired.
- */
-void
-gcr_renderer_popuplate_popup (GcrRenderer *self, GcrViewer *viewer,
- GtkMenu *menu)
-{
- g_return_if_fail (GCR_IS_RENDERER (self));
- if (GCR_RENDERER_GET_INTERFACE (self)->populate_popup)
- GCR_RENDERER_GET_INTERFACE (self)->populate_popup (self, viewer, menu);
-}
-
-/**
- * gcr_renderer_emit_data_changed:
- * @self: The renderer
- *
- * Emit the #GcrRenderer::data-changed signal on the renderer. This is used by
- * renderer implementations.
- */
-void
-gcr_renderer_emit_data_changed (GcrRenderer *self)
-{
- g_return_if_fail (GCR_IS_RENDERER (self));
- g_signal_emit (self, signals[DATA_CHANGED], 0);
-}
-
-/**
- * gcr_renderer_get_attributes:
- * @self: The renderer
- *
- * Get the PKCS#11 attributes, if any, set for this renderer to display.
- *
- * Returns: (nullable) (transfer none): the attributes, owned by the renderer
- */
-GckAttributes *
-gcr_renderer_get_attributes (GcrRenderer *self)
-{
- GckAttributes *attrs;
-
- g_return_val_if_fail (GCR_IS_RENDERER (self), NULL);
-
- g_object_get (self, "attributes", &attrs, NULL);
- if (attrs != NULL)
- gck_attributes_unref (attrs);
- return attrs;
-}
-
-/**
- * gcr_renderer_set_attributes:
- * @self: The renderer
- * @attrs: (nullable): attributes to set
- *
- * Set the PKCS#11 attributes for this renderer to display.
- */
-void
-gcr_renderer_set_attributes (GcrRenderer *self,
- GckAttributes *attrs)
-{
- g_return_if_fail (GCR_IS_RENDERER (self));
-
- g_object_set (self, "attributes", attrs, NULL);
-}
-
-static gint
-sort_registered_by_n_attrs (gconstpointer a, gconstpointer b)
-{
- const GcrRegistered *ra = a;
- const GcrRegistered *rb = b;
- gulong na, nb;
-
- g_assert (a);
- g_assert (b);
-
- na = gck_attributes_count (ra->attrs);
- nb = gck_attributes_count (rb->attrs);
-
- /* Note we're sorting in reverse order */
- if (na < nb)
- return 1;
- return (na == nb) ? 0 : -1;
-}
-
-/**
- * gcr_renderer_create:
- * @label: (nullable): The label for the renderer
- * @attrs: The attributes to render
- *
- * Create and initialize a renderer for the given attributes and label. These
- * renderers should have been preregistered via gcr_renderer_register().
- *
- * Returns: (transfer full) (nullable): a new renderer, or %NULL if no renderer
- * matched the attributes; the render should be released with g_object_unref()
- */
-GcrRenderer *
-gcr_renderer_create (const gchar *label, GckAttributes *attrs)
-{
- GcrRegistered *registered;
- gboolean matched;
- gulong n_attrs;
- gulong j;
- gsize i;
-
- g_return_val_if_fail (attrs, NULL);
-
- gcr_renderer_register_well_known ();
-
- if (!registered_renderers)
- return NULL;
-
- if (!registered_sorted) {
- g_array_sort (registered_renderers, sort_registered_by_n_attrs);
- registered_sorted = TRUE;
- }
-
- for (i = 0; i < registered_renderers->len; ++i) {
- registered = &(g_array_index (registered_renderers, GcrRegistered, i));
- n_attrs = gck_attributes_count (registered->attrs);
-
- matched = TRUE;
-
- for (j = 0; j < n_attrs; ++j) {
- if (!gck_attributes_contains (attrs, gck_attributes_at (registered->attrs, j))) {
- matched = FALSE;
- break;
- }
- }
-
- if (matched)
- return g_object_new (registered->renderer_type, "label", label,
- "attributes", attrs, NULL);
- }
-
- return NULL;
-}
-
-/**
- * gcr_renderer_register:
- * @renderer_type: The renderer class type
- * @attrs: The attributes to match
- *
- * Register a renderer to be created when matching attributes are passed to
- * gcr_renderer_create().
- */
-void
-gcr_renderer_register (GType renderer_type, GckAttributes *attrs)
-{
- GcrRegistered registered;
-
- if (!registered_renderers)
- registered_renderers = g_array_new (FALSE, FALSE, sizeof (GcrRegistered));
-
- registered.renderer_type = renderer_type;
- registered.attrs = gck_attributes_ref_sink (attrs);
- g_array_append_val (registered_renderers, registered);
- registered_sorted = FALSE;
-}
-
-/**
- * gcr_renderer_register_well_known:
- *
- * Register all the well known renderers for certificates and keys known to the
- * Gcr library.
- */
-void
-gcr_renderer_register_well_known (void)
-{
- g_type_class_unref (g_type_class_ref (GCR_TYPE_CERTIFICATE_RENDERER));
- g_type_class_unref (g_type_class_ref (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER));
- g_type_class_unref (g_type_class_ref (GCR_TYPE_KEY_RENDERER));
- g_type_class_unref (g_type_class_ref (GCR_TYPE_GNUPG_RENDERER));
-}
diff --git a/ui/gcr-renderer.h b/ui/gcr-renderer.h
deleted file mode 100644
index 1b81469..0000000
--- a/ui/gcr-renderer.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __GCR_RENDERER_H__
-#define __GCR_RENDERER_H__
-
-#include <glib-object.h>
-
-#include "gcr/gcr-column.h"
-#include "gcr/gcr-types.h"
-
-#include "gcr-viewer.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_RENDERER (gcr_renderer_get_type())
-#define GCR_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_RENDERER, GcrRenderer))
-#define GCR_IS_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_RENDERER))
-#define GCR_RENDERER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_RENDERER, GcrRendererIface))
-
-typedef struct _GcrRendererIface GcrRendererIface;
-
-struct _GcrRendererIface {
- GTypeInterface parent;
-
- /* signals */
- void (*data_changed) (GcrRenderer *self);
-
- /* virtual */
- void (*render_view) (GcrRenderer *self, GcrViewer *viewer);
-
- void (*populate_popup) (GcrRenderer *self, GcrViewer *viewer, GtkMenu *menu);
-
- /*< private >*/
- gpointer dummy1;
-
- gpointer dummy2;
- gpointer dummy3;
- gpointer dummy4;
- gpointer dummy5;
- gpointer dummy6;
- gpointer dummy7;
-
-};
-
-GType gcr_renderer_get_type (void) G_GNUC_CONST;
-
-void gcr_renderer_render_view (GcrRenderer *self,
- GcrViewer *viewer);
-
-void gcr_renderer_popuplate_popup (GcrRenderer *self,
- GcrViewer *viewer,
- GtkMenu *menu);
-
-void gcr_renderer_emit_data_changed (GcrRenderer *self);
-
-GcrRenderer* gcr_renderer_create (const gchar *label,
- GckAttributes *attrs);
-
-void gcr_renderer_register (GType renderer_type,
- GckAttributes *attrs);
-
-GckAttributes * gcr_renderer_get_attributes (GcrRenderer *self);
-
-void gcr_renderer_set_attributes (GcrRenderer *self,
- GckAttributes *attrs);
-
-void gcr_renderer_register_well_known (void);
-
-G_END_DECLS
-
-#endif /* __GCR_RENDERER_H__ */
diff --git a/ui/gcr-tree-selector.c b/ui/gcr-tree-selector.c
deleted file mode 100644
index e4db6ea..0000000
--- a/ui/gcr-tree-selector.c
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr/gcr-internal.h"
-
-#include "gcr-collection-model.h"
-#include "gcr-tree-selector.h"
-
-#include <glib/gi18n-lib.h>
-
-#include <string.h>
-
-/**
- * GcrTreeSelector:
- *
- * A tree selector can be used to select certificates or keys. It allows
- * the user to select multiple objects from a tree.
- */
-
-enum {
- PROP_0,
- PROP_COLLECTION,
- PROP_COLUMNS
-};
-
-struct _GcrTreeSelectorPrivate {
- GcrCollection *collection;
- const GcrColumn *columns;
- GcrCollectionModel *model;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrTreeSelector, gcr_tree_selector, GTK_TYPE_TREE_VIEW);
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-static void
-on_check_column_toggled (GtkCellRendererToggle *cell, gchar *path, GcrCollectionModel *model)
-{
- GtkTreeIter iter;
-
- g_assert (path != NULL);
-
- if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (model), &iter, path))
- gcr_collection_model_toggle_selected (model, &iter);
-}
-
-static void
-add_string_column (GcrTreeSelector *self, const GcrColumn *column, gint column_id)
-{
- GtkCellRenderer *cell;
- GtkTreeViewColumn *col;
- const gchar *label;
-
- g_assert (column->column_type == G_TYPE_STRING);
- g_assert (!(column->flags & GCR_COLUMN_HIDDEN));
-
- cell = gtk_cell_renderer_text_new ();
- g_object_set (G_OBJECT (cell), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
- label = column->label ? g_dpgettext2 (NULL, "column", column->label) : "";
- col = gtk_tree_view_column_new_with_attributes (label, cell, "text", column_id, NULL);
- gtk_tree_view_column_set_resizable (col, TRUE);
- if (column->flags & GCR_COLUMN_SORTABLE)
- gtk_tree_view_column_set_sort_column_id (col, column_id);
- gtk_tree_view_append_column (GTK_TREE_VIEW (self), col);
-}
-
-static void
-add_icon_column (GcrTreeSelector *self, const GcrColumn *column, gint column_id)
-{
- GtkCellRenderer *cell;
- GtkTreeViewColumn *col;
- const gchar *label;
-
- g_assert (column->column_type == G_TYPE_ICON);
- g_assert (!(column->flags & GCR_COLUMN_HIDDEN));
-
- cell = gtk_cell_renderer_pixbuf_new ();
- g_object_set (cell, "stock-size", GTK_ICON_SIZE_BUTTON, NULL);
- label = column->label ? g_dpgettext2 (NULL, "column", column->label) : "";
- col = gtk_tree_view_column_new_with_attributes (label, cell, "gicon", column_id, NULL);
- gtk_tree_view_column_set_resizable (col, TRUE);
- if (column->flags & GCR_COLUMN_SORTABLE)
- gtk_tree_view_column_set_sort_column_id (col, column_id);
- gtk_tree_view_append_column (GTK_TREE_VIEW (self), col);
-}
-
-static void
-add_check_column (GcrTreeSelector *self, guint column_id)
-{
- GtkCellRenderer *cell;
- GtkTreeViewColumn *col;
-
- cell = gtk_cell_renderer_toggle_new ();
- g_signal_connect (cell, "toggled", G_CALLBACK (on_check_column_toggled), self->pv->model);
-
- col = gtk_tree_view_column_new_with_attributes ("", cell, "active", column_id, NULL);
- gtk_tree_view_column_set_resizable (col, FALSE);
- gtk_tree_view_append_column (GTK_TREE_VIEW (self), col);
-}
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-static GObject*
-gcr_tree_selector_constructor (GType type, guint n_props, GObjectConstructParam *props)
-{
- GcrTreeSelector *self = GCR_TREE_SELECTOR (G_OBJECT_CLASS (gcr_tree_selector_parent_class)->constructor(type, n_props, props));
- const GcrColumn *column;
- guint i;
-
- g_return_val_if_fail (self, NULL);
- g_return_val_if_fail (self->pv->columns, NULL);
-
- self->pv->model = gcr_collection_model_new_full (self->pv->collection,
- GCR_COLLECTION_MODEL_TREE,
- self->pv->columns);
-
- gtk_tree_view_set_model (GTK_TREE_VIEW (self), GTK_TREE_MODEL (self->pv->model));
-
- /* First add the check mark column */
- add_check_column (self, gcr_collection_model_column_for_selected (self->pv->model));
-
- for (column = self->pv->columns, i = 0; column->property_name; ++column, ++i) {
- if (column->flags & GCR_COLUMN_HIDDEN)
- continue;
-
- if (column->column_type == G_TYPE_STRING)
- add_string_column (self, column, i);
- else if (column->column_type == G_TYPE_ICON)
- add_icon_column (self, column, i);
- else
- g_warning ("skipping unsupported column '%s' of type: %s",
- column->property_name, g_type_name (column->column_type));
- }
-
- return G_OBJECT (self);
-}
-
-static void
-gcr_tree_selector_init (GcrTreeSelector *self)
-{
- self->pv = gcr_tree_selector_get_instance_private (self);
-}
-
-static void
-gcr_tree_selector_dispose (GObject *obj)
-{
- GcrTreeSelector *self = GCR_TREE_SELECTOR (obj);
-
- if (self->pv->model)
- g_object_unref (self->pv->model);
- self->pv->model = NULL;
-
- if (self->pv->collection)
- g_object_unref (self->pv->collection);
- self->pv->collection = NULL;
-
- G_OBJECT_CLASS (gcr_tree_selector_parent_class)->dispose (obj);
-}
-
-static void
-gcr_tree_selector_finalize (GObject *obj)
-{
- GcrTreeSelector *self = GCR_TREE_SELECTOR (obj);
-
- g_assert (!self->pv->collection);
- g_assert (!self->pv->model);
-
- G_OBJECT_CLASS (gcr_tree_selector_parent_class)->finalize (obj);
-}
-
-static void
-gcr_tree_selector_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrTreeSelector *self = GCR_TREE_SELECTOR (obj);
- switch (prop_id) {
- case PROP_COLLECTION:
- g_return_if_fail (!self->pv->collection);
- self->pv->collection = g_value_dup_object (value);
- g_return_if_fail (self->pv->collection);
- break;
- case PROP_COLUMNS:
- g_return_if_fail (!self->pv->columns);
- self->pv->columns = g_value_get_pointer (value);
- g_return_if_fail (self->pv->columns);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_tree_selector_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrTreeSelector *self = GCR_TREE_SELECTOR (obj);
-
- switch (prop_id) {
- case PROP_COLLECTION:
- g_value_set_object (value, gcr_tree_selector_get_collection (self));
- break;
- case PROP_COLUMNS:
- g_value_set_pointer (value, (gpointer)gcr_tree_selector_get_columns (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_tree_selector_class_init (GcrTreeSelectorClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->constructor = gcr_tree_selector_constructor;
- gobject_class->dispose = gcr_tree_selector_dispose;
- gobject_class->finalize = gcr_tree_selector_finalize;
- gobject_class->set_property = gcr_tree_selector_set_property;
- gobject_class->get_property = gcr_tree_selector_get_property;
-
- /**
- * GcrTreeSelector:collection:
- *
- * The collection which contains the objects to display in the selector.
- */
- g_object_class_install_property (gobject_class, PROP_COLLECTION,
- g_param_spec_object ("collection", "Collection", "Collection to select from",
- GCR_TYPE_COLLECTION,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrTreeSelector:columns:
- *
- * The columns to use to display the objects.
- */
- g_object_class_install_property (gobject_class, PROP_COLUMNS,
- g_param_spec_pointer ("columns", "Columns", "Columns to display in selector",
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_tree_selector_new: (skip)
- * @collection: The collection that contains the objects to display
- * @columns: The columns to use to display the objects
- *
- * Create a new #GcrTreeSelector.
- *
- * Returns: (transfer full): a newly allocated selector, which should be
- * released with g_object_unref()
- */
-GcrTreeSelector *
-gcr_tree_selector_new (GcrCollection *collection, const GcrColumn *columns)
-{
- return g_object_new (GCR_TYPE_TREE_SELECTOR,
- "collection", collection,
- "columns", columns,
- NULL);
-}
-
-/**
- * gcr_tree_selector_get_collection:
- * @self: The selector
- *
- * Get the collection that this selector is displaying objects from.
- *
- * Returns: (transfer none): the collection, owned by the selector
- */
-GcrCollection *
-gcr_tree_selector_get_collection (GcrTreeSelector *self)
-{
- g_return_val_if_fail (GCR_IS_TREE_SELECTOR (self), NULL);
- return self->pv->collection;
-}
-
-/**
- * gcr_tree_selector_get_columns: (skip)
- * @self: The selector
- *
- * Get the columns displayed in a selector in multiple mode.
- *
- * Returns: (transfer none): The columns, owned by the selector.
- */
-const GcrColumn *
-gcr_tree_selector_get_columns (GcrTreeSelector *self)
-{
- g_return_val_if_fail (GCR_IS_TREE_SELECTOR (self), NULL);
- return self->pv->columns;
-}
-
-/**
- * gcr_tree_selector_get_selected:
- * @self: The selector
- *
- * Get a list of selected objects.
- *
- * Returns: (transfer container) (element-type GObject.Object): the list of selected
- * objects, to be released with g_list_free()
- */
-GList*
-gcr_tree_selector_get_selected (GcrTreeSelector *self)
-{
- g_return_val_if_fail (GCR_IS_TREE_SELECTOR (self), NULL);
- return gcr_collection_model_get_selected_objects (self->pv->model);
-}
-
-/**
- * gcr_tree_selector_set_selected:
- * @self: The selector
- * @selected: (element-type GObject.Object): the list of objects to select
- *
- * Select certain objects in the selector.
- */
-void
-gcr_tree_selector_set_selected (GcrTreeSelector *self, GList *selected)
-{
- g_return_if_fail (GCR_IS_TREE_SELECTOR (self));
- gcr_collection_model_set_selected_objects (self->pv->model, selected);
-}
diff --git a/ui/gcr-tree-selector.h b/ui/gcr-tree-selector.h
deleted file mode 100644
index de16602..0000000
--- a/ui/gcr-tree-selector.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __GCR_TREE_SELECTOR_H__
-#define __GCR_TREE_SELECTOR_H__
-
-#include "gcr/gcr-types.h"
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_TREE_SELECTOR (gcr_tree_selector_get_type ())
-#define GCR_TREE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_TREE_SELECTOR, GcrTreeSelector))
-#define GCR_TREE_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_TREE_SELECTOR, GcrTreeSelectorClass))
-#define GCR_IS_TREE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_TREE_SELECTOR))
-#define GCR_IS_TREE_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_TREE_SELECTOR))
-#define GCR_TREE_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_TREE_SELECTOR, GcrTreeSelectorClass))
-
-typedef struct _GcrTreeSelector GcrTreeSelector;
-typedef struct _GcrTreeSelectorClass GcrTreeSelectorClass;
-typedef struct _GcrTreeSelectorPrivate GcrTreeSelectorPrivate;
-
-struct _GcrTreeSelector {
- GtkTreeView parent;
-
- /*< private >*/
- GcrTreeSelectorPrivate *pv;
-};
-
-struct _GcrTreeSelectorClass {
- /*< private >*/
- GtkTreeViewClass parent_class;
-};
-
-GType gcr_tree_selector_get_type (void);
-
-GcrTreeSelector* gcr_tree_selector_new (GcrCollection *collection,
- const GcrColumn *columns);
-
-GcrCollection* gcr_tree_selector_get_collection (GcrTreeSelector *self);
-
-const GcrColumn* gcr_tree_selector_get_columns (GcrTreeSelector *self);
-
-GList* gcr_tree_selector_get_selected (GcrTreeSelector *self);
-
-void gcr_tree_selector_set_selected (GcrTreeSelector *self,
- GList *selected);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrTreeSelector, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_TREE_SELECTOR_H__ */
diff --git a/ui/gcr-ui.h b/ui/gcr-ui.h
deleted file mode 100644
index cbec5b3..0000000
--- a/ui/gcr-ui.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * gnome-keyring
- *
- * Copyright (C) 2010 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#ifndef GCR_API_SUBJECT_TO_CHANGE
-#error "This API has not yet reached stability."
-#endif
-
-#ifndef __GCR_UI_H__
-#define __GCR_UI_H__
-
-#include <glib.h>
-
-#include <gcr/gcr-base.h>
-
-#define __GCR_INSIDE_HEADER__
-
-#include <ui/gcr-certificate-renderer.h>
-#include <ui/gcr-certificate-widget.h>
-#include <ui/gcr-collection-model.h>
-#include <ui/gcr-combo-selector.h>
-#include <ui/gcr-deprecated.h>
-#include <ui/gcr-enum-types.h>
-#include <ui/gcr-key-renderer.h>
-#include <ui/gcr-key-widget.h>
-#include <ui/gcr-failure-renderer.h>
-#include <ui/gcr-key-renderer.h>
-#include <ui/gcr-key-widget.h>
-#include <ui/gcr-import-button.h>
-#include <ui/gcr-list-selector.h>
-#include <ui/gcr-prompt-dialog.h>
-#include <ui/gcr-renderer.h>
-#include <ui/gcr-secure-entry-buffer.h>
-#include <ui/gcr-tree-selector.h>
-#include <ui/gcr-unlock-options-widget.h>
-#include <ui/gcr-viewer.h>
-#include <ui/gcr-viewer-widget.h>
-
-#undef __GCR_INSIDE_HEADER__
-
-#endif /* __GCR_UI_H__ */
diff --git a/ui/gcr-unlock-options-widget.c b/ui/gcr-unlock-options-widget.c
deleted file mode 100644
index 7db3257..0000000
--- a/ui/gcr-unlock-options-widget.c
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr-unlock-options-widget.h"
-
-#include <glib/gi18n-lib.h>
-
-/**
- * GcrUnlockOptionsWidget:
- *
- * This widget displays a set of unlock options for the user to select.
- *
- * The user can choose between keeping caching the unlock indefinitely, or for
- * a given amount of time.
- *
- * Each option has a different name, for example #GCR_UNLOCK_OPTION_ALWAYS. These
- * names are used together with the various functions like
- * [method@UnlockOptionsWidget.get_choice].
- */
-
-/**
- * GCR_UNLOCK_OPTION_ALWAYS:
- *
- * Option name for caching unlock indefinitely.
- */
-
-/**
- * GCR_UNLOCK_OPTION_IDLE:
- *
- * Option name for caching unlock for a certain amount of idle time.
- */
-
-/**
- * GCR_UNLOCK_OPTION_SESSION:
- *
- * Option name for caching unlock for the current session.
- */
-
-/**
- * GCR_UNLOCK_OPTION_TIMEOUT:
- *
- * Option name for caching unlock for a certain amount of time.
- */
-
-enum {
- PROP_0,
- PROP_CHOICE,
- PROP_TTL
-};
-
-struct _GcrUnlockOptionsWidget {
- GtkBin parent;
-
- /*< private >*/
- GcrUnlockOptionsWidgetPrivate *pv;
-};
-
-struct _GcrUnlockOptionsWidgetClass {
- GtkBinClass parent_class;
-};
-
-struct _GcrUnlockOptionsWidgetPrivate {
- GtkBuilder *builder;
- gchar *choice;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrUnlockOptionsWidget, gcr_unlock_options_widget, GTK_TYPE_BIN);
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-static GtkToggleButton*
-builder_get_toggle_button (GtkBuilder *builder, const gchar *name)
-{
- GObject *object = gtk_builder_get_object (builder, name);
- g_return_val_if_fail (GTK_IS_TOGGLE_BUTTON (object), NULL);
- return GTK_TOGGLE_BUTTON (object);
-}
-
-static GtkSpinButton*
-builder_get_spin_button (GtkBuilder *builder, const gchar *name)
-{
- GObject *object = gtk_builder_get_object (builder, name);
- g_return_val_if_fail (GTK_IS_SPIN_BUTTON (object), NULL);
- return GTK_SPIN_BUTTON (object);
-}
-
-static const gchar*
-widget_name_for_option (const gchar *option)
-{
- g_return_val_if_fail (option, NULL);
- if (g_str_equal (option, GCR_UNLOCK_OPTION_ALWAYS))
- return "lock_always_choice";
- else if (g_str_equal (option, GCR_UNLOCK_OPTION_SESSION))
- return "lock_session_choice";
- else if (g_str_equal (option, GCR_UNLOCK_OPTION_TIMEOUT))
- return "lock_timeout_choice";
- else if (g_str_equal (option, GCR_UNLOCK_OPTION_IDLE))
- return "lock_idle_choice";
- else
- return NULL;
-}
-
-static GtkToggleButton*
-widget_button_for_option (GcrUnlockOptionsWidget *self, const gchar *option)
-{
- const gchar *name = widget_name_for_option (option);
- g_return_val_if_fail (name, NULL);
- return builder_get_toggle_button (self->pv->builder, name);
-}
-
-static const gchar*
-widget_button_to_option (GcrUnlockOptionsWidget *self, GtkToggleButton *button)
-{
- const gchar *option;
- g_return_val_if_fail (button, NULL);
- option = g_object_get_data (G_OBJECT (button), "unlock-choice");
- g_return_val_if_fail (option, NULL);
- return option;
-}
-
-static void
-on_choice_toggled (GtkToggleButton *button, GcrUnlockOptionsWidget *self)
-{
- GtkWidget *spin;
- GtkToggleButton *after, *idle;
-
- spin = GTK_WIDGET (gtk_builder_get_object (self->pv->builder, "lock_minutes_spin"));
- after = builder_get_toggle_button (self->pv->builder, "lock_timeout_choice");
- idle = builder_get_toggle_button (self->pv->builder, "lock_idle_choice");
- gtk_widget_set_sensitive (spin, gtk_toggle_button_get_active (after) ||
- gtk_toggle_button_get_active (idle));
-
- if (gtk_toggle_button_get_active (button)) {
- g_free (self->pv->choice);
- self->pv->choice = g_strdup (widget_button_to_option (self, button));
- }
-}
-
-/* -----------------------------------------------------------------------------
- * OBJECT
- */
-
-
-static GObject*
-gcr_unlock_options_widget_constructor (GType type, guint n_props, GObjectConstructParam *props)
-{
- GObject *obj = G_OBJECT_CLASS (gcr_unlock_options_widget_parent_class)->constructor (type, n_props, props);
- GcrUnlockOptionsWidget *self = NULL;
- GtkToggleButton *button;
- GtkWidget *widget;
-
- if (obj) {
- self = GCR_UNLOCK_OPTIONS_WIDGET (obj);
-
- if (!gtk_builder_add_from_resource (self->pv->builder, "/org/gnome/gcr/ui/gcr-unlock-options-widget.ui", NULL))
- g_return_val_if_reached (obj);
-
- widget = GTK_WIDGET (gtk_builder_get_object (self->pv->builder, "unlock-options-widget"));
- g_return_val_if_fail (GTK_IS_WIDGET (widget), obj);
- gtk_container_add (GTK_CONTAINER (self), widget);
- gtk_widget_show (widget);
-
- button = builder_get_toggle_button (self->pv->builder, "lock_always_choice");
- g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self);
- g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_ALWAYS);
-
- button = builder_get_toggle_button (self->pv->builder, "lock_session_choice");
- g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self);
- g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_SESSION);
- on_choice_toggled (button, self);
-
- button = builder_get_toggle_button (self->pv->builder, "lock_timeout_choice");
- g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self);
- g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_TIMEOUT);
-
- button = builder_get_toggle_button (self->pv->builder, "lock_idle_choice");
- g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self);
- g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_IDLE);
- }
-
- return obj;
-}
-
-static void
-gcr_unlock_options_widget_init (GcrUnlockOptionsWidget *self)
-{
- self->pv = gcr_unlock_options_widget_get_instance_private (self);
- self->pv->builder = gtk_builder_new ();
-}
-
-static void
-gcr_unlock_options_widget_dispose (GObject *obj)
-{
- GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj);
-
- if (self->pv->builder)
- g_object_unref (self->pv->builder);
- self->pv->builder = NULL;
-
- G_OBJECT_CLASS (gcr_unlock_options_widget_parent_class)->dispose (obj);
-}
-
-static void
-gcr_unlock_options_widget_finalize (GObject *obj)
-{
- GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj);
-
- g_assert (!self->pv->builder);
- g_free (self->pv->choice);
- self->pv->choice = NULL;
-
- G_OBJECT_CLASS (gcr_unlock_options_widget_parent_class)->finalize (obj);
-}
-
-static void
-gcr_unlock_options_widget_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj);
-
- switch (prop_id) {
- case PROP_CHOICE:
- gcr_unlock_options_widget_set_choice (self, g_value_get_string (value));
- break;
- case PROP_TTL:
- gcr_unlock_options_widget_set_ttl (self, g_value_get_uint (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_unlock_options_widget_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj);
-
- switch (prop_id) {
- case PROP_CHOICE:
- g_value_set_string (value, gcr_unlock_options_widget_get_choice (self));
- break;
- case PROP_TTL:
- g_value_set_uint (value, gcr_unlock_options_widget_get_ttl (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_unlock_options_widget_class_init (GcrUnlockOptionsWidgetClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gcr_unlock_options_widget_parent_class = g_type_class_peek_parent (klass);
-
- gobject_class->constructor = gcr_unlock_options_widget_constructor;
- gobject_class->dispose = gcr_unlock_options_widget_dispose;
- gobject_class->finalize = gcr_unlock_options_widget_finalize;
- gobject_class->set_property = gcr_unlock_options_widget_set_property;
- gobject_class->get_property = gcr_unlock_options_widget_get_property;
-
- g_object_class_install_property (gobject_class, PROP_CHOICE,
- g_param_spec_string ("choice", "Choice", "Unlock Option Choice",
- NULL,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_TTL,
- g_param_spec_uint ("ttl", "TTL", "Unlock Option Timeout in Seconds",
- 0, G_MAXUINT, 0,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_unlock_options_widget_new:
- *
- * Create a new #GcrUnlockOptionsWidget.
- *
- * Returns: (transfer full) (type GcrUi.UnlockOptionsWidget): a new #GcrUnlockOptionsWidget
- */
-GtkWidget *
-gcr_unlock_options_widget_new (void)
-{
- return g_object_new (GCR_TYPE_UNLOCK_OPTIONS_WIDGET, NULL);
-}
-
-/**
- * gcr_unlock_options_widget_get_choice:
- * @self: The unlock options widget
- *
- * Get the currently selected option, like %GCR_UNLOCK_OPTION_ALWAYS.
- *
- * Returns: The currently selected option name.
- */
-const gchar*
-gcr_unlock_options_widget_get_choice (GcrUnlockOptionsWidget *self)
-{
- g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), NULL);
- return self->pv->choice;
-}
-
-/**
- * gcr_unlock_options_widget_set_choice:
- * @self: The unlock options widget
- * @option: The option name
- *
- * Set the currently selected option. Use an option name like
- * %GCR_UNLOCK_OPTION_ALWAYS.
- */
-void
-gcr_unlock_options_widget_set_choice (GcrUnlockOptionsWidget *self, const gchar *option)
-{
- GtkToggleButton *button;
-
- g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self));
- g_return_if_fail (option);
-
- button = widget_button_for_option (self, option);
- gtk_toggle_button_set_active (button, TRUE);
-}
-
-/**
- * gcr_unlock_options_widget_get_ttl:
- * @self: The unlock options widget
- *
- * Get the timeout setting set for unlock options that have a timeout.
- * This will also return a valid value if the currently selected option
- * does not have a timeout.
- *
- * Returns: The unlock timeout in seconds.
- */
-guint
-gcr_unlock_options_widget_get_ttl (GcrUnlockOptionsWidget *self)
-{
- GtkSpinButton *spin;
- gint amount;
-
- g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), 0);
-
- spin = builder_get_spin_button (self->pv->builder, "lock_minutes_spin");
- amount = gtk_spin_button_get_value_as_int (spin);
- return amount * 60;
-}
-
-/**
- * gcr_unlock_options_widget_set_ttl:
- * @self: The unlock options widget
- * @ttl: The timeout to set, in seconds
- *
- * Set the current setting for the timeout. This can be set even when the
- * currently selected option does not have a timeout.
- */
-void
-gcr_unlock_options_widget_set_ttl (GcrUnlockOptionsWidget *self, guint ttl)
-{
- GtkSpinButton *spin;
- guint amount;
-
- g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self));
-
- amount = ttl / 60;
- if (!amount || ttl % 60)
- amount += 1;
-
- spin = builder_get_spin_button (self->pv->builder, "lock_minutes_spin");
- gtk_spin_button_set_value (spin, amount);
-}
-
-/**
- * gcr_unlock_options_widget_get_label:
- * @self: The unlock options widget
- * @option: The option name
- *
- * Get the label for one of the options. Use an option name like
- * %GCR_UNLOCK_OPTION_ALWAYS.
- *
- * Returns: The current label for the option.
- */
-const gchar*
-gcr_unlock_options_widget_get_label (GcrUnlockOptionsWidget *self, const gchar *option)
-{
- GtkToggleButton *button;
- const gchar *name;
-
- g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), NULL);
- g_return_val_if_fail (option, NULL);
-
- name = widget_name_for_option (option);
- g_return_val_if_fail (name, NULL);
-
- button = builder_get_toggle_button (self->pv->builder, name);
- g_return_val_if_fail (button, NULL);
-
- return gtk_button_get_label (GTK_BUTTON (button));
-}
-
-/**
- * gcr_unlock_options_widget_set_label:
- * @self: The unlock options widget
- * @option: The option name
- * @text: The new label
- *
- * Set the label for one of the options. Use an option name like
- * %GCR_UNLOCK_OPTION_ALWAYS.
- */
-void
-gcr_unlock_options_widget_set_label (GcrUnlockOptionsWidget *self, const gchar *option,
- const gchar *text)
-{
- GtkToggleButton *button;
- const gchar *name;
-
- g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self));
- g_return_if_fail (option);
- g_return_if_fail (text);
-
- name = widget_name_for_option (option);
- g_return_if_fail (name);
-
- button = builder_get_toggle_button (self->pv->builder, name);
- g_return_if_fail (button);
-
- gtk_button_set_label (GTK_BUTTON (button), text);
-}
-
-/**
- * gcr_unlock_options_widget_get_sensitive:
- * @self: The unlock options widget
- * @option: The option name
- *
- * Get the sensitivity state for one of the options. Use an option name like
- * %GCR_UNLOCK_OPTION_ALWAYS.
- *
- * Returns: Whether the option is sensitive or not.
- */
-gboolean
-gcr_unlock_options_widget_get_sensitive (GcrUnlockOptionsWidget *self, const gchar *option)
-{
- GtkToggleButton *button;
- GtkStateType state;
-
- g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), FALSE);
- g_return_val_if_fail (option, FALSE);
-
- button = widget_button_for_option (self, option);
- state = gtk_widget_get_state_flags (GTK_WIDGET (button));
- return (state & GTK_STATE_FLAG_INSENSITIVE) != GTK_STATE_FLAG_INSENSITIVE;
-}
-
-/**
- * gcr_unlock_options_widget_set_sensitive:
- * @self: The unlock options widget
- * @option: The option name
- * @sensitive: The sensitivity state.
- * @reason: A user displayable string which contains the reason for the sensitivity.
- *
- * Set the sensitivity state for one of the options. Use an option name like
- * %GCR_UNLOCK_OPTION_ALWAYS. The reason will be displayed as a tooltip.
- */
-void
-gcr_unlock_options_widget_set_sensitive (GcrUnlockOptionsWidget *self, const gchar *option,
- gboolean sensitive, const gchar *reason)
-{
- GtkToggleButton *button;
-
- g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self));
- g_return_if_fail (option);
-
- button = widget_button_for_option (self, option);
- gtk_widget_set_sensitive (GTK_WIDGET (button), sensitive);
-
- if (!sensitive && reason)
- gtk_widget_set_tooltip_text (GTK_WIDGET (button), reason);
- else if (sensitive)
- gtk_widget_set_has_tooltip (GTK_WIDGET (button), FALSE);
-}
diff --git a/ui/gcr-unlock-options-widget.h b/ui/gcr-unlock-options-widget.h
deleted file mode 100644
index bd1f396..0000000
--- a/ui/gcr-unlock-options-widget.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_UNLOCK_OPTIONS_WIDGET_H__
-#define __GCR_UNLOCK_OPTIONS_WIDGET_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-types.h"
-#include "gcr/gcr-unlock-options.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_UNLOCK_OPTIONS_WIDGET (gcr_unlock_options_widget_get_type ())
-#define GCR_UNLOCK_OPTIONS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_UNLOCK_OPTIONS_WIDGET, GcrUnlockOptionsWidget))
-#define GCR_UNLOCK_OPTIONS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_UNLOCK_OPTIONS_WIDGET, GcrUnlockOptionsWidgetClass))
-#define GCR_IS_UNLOCK_OPTIONS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_UNLOCK_OPTIONS_WIDGET))
-#define GCR_IS_UNLOCK_OPTIONS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_UNLOCK_OPTIONS_WIDGET))
-#define GCR_UNLOCK_OPTIONS_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_UNLOCK_OPTIONS_WIDGET, GcrUnlockOptionsWidgetClass))
-
-typedef struct _GcrUnlockOptionsWidget GcrUnlockOptionsWidget;
-typedef struct _GcrUnlockOptionsWidgetClass GcrUnlockOptionsWidgetClass;
-typedef struct _GcrUnlockOptionsWidgetPrivate GcrUnlockOptionsWidgetPrivate;
-
-/*
- * TODO: GcrUnlockOptionsWidget and GcrUnlockOptionsWidgetClass are hidden until
- * we can figure out what they should be derived from.
- */
-
-GType gcr_unlock_options_widget_get_type (void);
-
-GtkWidget* gcr_unlock_options_widget_new (void);
-
-const gchar* gcr_unlock_options_widget_get_choice (GcrUnlockOptionsWidget *self);
-
-void gcr_unlock_options_widget_set_choice (GcrUnlockOptionsWidget *self,
- const gchar *option);
-
-guint gcr_unlock_options_widget_get_ttl (GcrUnlockOptionsWidget *self);
-
-void gcr_unlock_options_widget_set_ttl (GcrUnlockOptionsWidget *self,
- guint ttl);
-
-const gchar* gcr_unlock_options_widget_get_label (GcrUnlockOptionsWidget *self,
- const gchar *option);
-
-void gcr_unlock_options_widget_set_label (GcrUnlockOptionsWidget *self,
- const gchar *option,
- const gchar *text);
-
-gboolean gcr_unlock_options_widget_get_sensitive (GcrUnlockOptionsWidget *self,
- const gchar *option);
-
-void gcr_unlock_options_widget_set_sensitive (GcrUnlockOptionsWidget *self,
- const gchar *option,
- gboolean sensitive,
- const gchar *reason);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrUnlockOptionsWidget, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_UNLOCK_OPTIONS_WIDGET_H__ */
diff --git a/ui/gcr-unlock-options-widget.ui b/ui/gcr-unlock-options-widget.ui
deleted file mode 100644
index d8e786e..0000000
--- a/ui/gcr-unlock-options-widget.ui
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<interface>
- <requires lib="gtk+" version="2.16"/>
- <!-- interface-naming-policy project-wide -->
- <object class="GtkAdjustment" id="spin_adjustment">
- <property name="lower">1</property>
- <property name="upper">999</property>
- <property name="step_increment">1</property>
- <property name="page_increment">10</property>
- </object>
- <object class="GtkVBox" id="unlock-options-widget">
- <property name="visible">True</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkRadioButton" id="lock_always_choice">
- <property name="label" translatable="yes">Automatically unlock this keyring whenever I’m logged in</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- <property name="group">lock_session_choice</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="lock_session_choice">
- <property name="label" translatable="yes">Lock this keyring when I log out</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkHBox" id="hbox2">
- <property name="visible">True</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkVBox" id="vbox5">
- <property name="visible">True</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkRadioButton" id="lock_timeout_choice">
- <property name="label" translatable="yes">Lock this keyring after</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">lock_session_choice</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkRadioButton" id="lock_idle_choice">
- <property name="label" translatable="yes">Lock this keyring if idle for</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">lock_session_choice</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkSpinButton" id="lock_minutes_spin">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="invisible_char">•</property>
- <property name="adjustment">spin_adjustment</property>
- <property name="climb_rate">1</property>
- <property name="numeric">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes" comments="Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'.">minutes</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
-</interface>
diff --git a/ui/gcr-unlock-renderer.c b/ui/gcr-unlock-renderer.c
deleted file mode 100644
index f32dfef..0000000
--- a/ui/gcr-unlock-renderer.c
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr/gcr-icons.h"
-#include "gcr/gcr-parser.h"
-
-#include "gcr-display-view.h"
-#include "gcr-secure-entry-buffer.h"
-#include "gcr-unlock-renderer.h"
-
-#include <gdk/gdk.h>
-#include <glib/gi18n-lib.h>
-
-enum {
- PROP_0,
- PROP_LABEL,
- PROP_ATTRIBUTES
-};
-
-struct _GcrUnlockRendererPrivate {
- GtkEntry *entry;
- GtkLabel *warning;
-
- GBytes *locked_data;
- gchar *label;
- gboolean unlocked;
- GList *renderers;
- guint unlock_tries;
-
- /* block widget destroys during render */
- gint no_destroy;
-};
-
-enum {
- UNLOCK_CLICKED,
- LAST_SIGNAL,
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
-static void gcr_renderer_iface_init (GcrRendererIface *iface);
-
-G_DEFINE_TYPE_WITH_CODE (GcrUnlockRenderer, _gcr_unlock_renderer, GTK_TYPE_BIN,
- G_ADD_PRIVATE (GcrUnlockRenderer);
- G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_renderer_iface_init);
-);
-
-static gchar*
-calculate_label (GcrUnlockRenderer *self)
-{
- if (self->pv->label)
- return g_strdup_printf (_("Unlock: %s"), self->pv->label);
-
- return g_strdup (_("Unlock"));
-}
-
-void
-_gcr_unlock_renderer_show_warning (GcrUnlockRenderer *self,
- const gchar *message)
-{
- gchar *text;
-
- g_return_if_fail (GCR_UNLOCK_RENDERER (self));
- g_return_if_fail (message != NULL);
-
- text = g_strdup_printf ("<i>%s</i>", message);
- gtk_label_set_markup (self->pv->warning, text);
- g_free (text);
-
- gtk_widget_show (GTK_WIDGET (self->pv->warning));
-}
-
-static void
-on_unlock_button_clicked (GtkButton *button,
- gpointer user_data)
-{
- GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (user_data);
- g_signal_emit (self, signals[UNLOCK_CLICKED], 0);
-}
-
-static void
-on_entry_activated (GtkEntry *entry,
- gpointer user_data)
-{
- GtkButton *button = GTK_BUTTON (user_data);
- gtk_button_clicked (button);
-}
-
-static void
-_gcr_unlock_renderer_init (GcrUnlockRenderer *self)
-{
- GtkWidget *box, *vbox;
- GtkWidget *button;
- GtkEntryBuffer *buffer;
-
- self->pv = _gcr_unlock_renderer_get_instance_private (self);
-
- box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
-
- buffer = gcr_secure_entry_buffer_new ();
- self->pv->entry = GTK_ENTRY (gtk_entry_new_with_buffer (buffer));
- gtk_entry_set_visibility (self->pv->entry, FALSE);
- gtk_box_pack_start (GTK_BOX (box), GTK_WIDGET (self->pv->entry), TRUE, FALSE, 0);
- gtk_widget_show (GTK_WIDGET (self->pv->entry));
- g_object_unref (buffer);
- gtk_entry_set_placeholder_text (self->pv->entry, _("Password"));
-
- button = gtk_button_new_with_label (_("Unlock"));
- gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
- g_signal_connect (button, "clicked", G_CALLBACK (on_unlock_button_clicked), self);
- g_signal_connect (self->pv->entry, "activate", G_CALLBACK (on_entry_activated), button);
- gtk_widget_show (button);
-
- vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
- gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, FALSE, 0);
- gtk_widget_show (box);
-
- self->pv->warning = GTK_LABEL (gtk_label_new (""));
- gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (self->pv->warning), FALSE, FALSE, 0);
- gtk_widget_hide (GTK_WIDGET (self->pv->warning));
-
- gtk_container_add (GTK_CONTAINER (self), vbox);
- gtk_widget_show (vbox);
-}
-
-static void
-_gcr_unlock_renderer_finalize (GObject *obj)
-{
- GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (obj);
-
- g_bytes_unref (self->pv->locked_data);
- g_free (self->pv->label);
- g_list_free_full (self->pv->renderers, g_object_unref);
-
- G_OBJECT_CLASS (_gcr_unlock_renderer_parent_class)->finalize (obj);
-}
-
-static void
-_gcr_unlock_renderer_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_free (self->pv->label);
- self->pv->label = g_value_dup_string (value);
- g_object_notify (obj, "label");
- gcr_renderer_emit_data_changed (GCR_RENDERER (self));
- break;
- case PROP_ATTRIBUTES:
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_unlock_renderer_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (obj);
-
- switch (prop_id) {
- case PROP_LABEL:
- g_value_take_string (value, calculate_label (self));
- break;
- case PROP_ATTRIBUTES:
- g_value_set_boxed (value, NULL);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_unlock_renderer_class_init (GcrUnlockRendererClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->finalize = _gcr_unlock_renderer_finalize;
- gobject_class->set_property = _gcr_unlock_renderer_set_property;
- gobject_class->get_property = _gcr_unlock_renderer_get_property;
-
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "Label", "Unlock Label",
- "",
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property (gobject_class, PROP_ATTRIBUTES,
- g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes",
- GCK_TYPE_ATTRIBUTES,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- signals[UNLOCK_CLICKED] = g_signal_new ("unlock-clicked", GCR_TYPE_UNLOCK_RENDERER, G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GcrUnlockRendererClass, unlock_clicked),
- NULL, NULL, NULL, G_TYPE_NONE, 0);
-}
-
-static void
-gcr_unlock_renderer_render (GcrRenderer *renderer,
- GcrViewer *viewer)
-{
- GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (renderer);
- GcrDisplayView *view;
- gchar *display;
- GList *renderers;
- GIcon *icon;
- GList *l;
-
- if (GCR_IS_DISPLAY_VIEW (viewer)) {
- view = GCR_DISPLAY_VIEW (viewer);
-
- } else {
- g_warning ("GcrUnlockRenderer only works with internal specific "
- "GcrViewer returned by gcr_viewer_new().");
- return;
- }
-
- /*
- * If we were successfully unlocked, then this will contain a list of
- * renderers to add to the viewer.
- */
- if (self->pv->unlocked) {
-
- /* We used prepend above, so list is backwards */
- renderers = g_list_reverse (self->pv->renderers);
- self->pv->renderers = NULL;
-
- for (l = renderers; l != NULL; l = g_list_next (l))
- gcr_viewer_insert_renderer (viewer, l->data, renderer);
- g_list_free_full (renderers, g_object_unref);
-
- /* And finally remove ourselves from the viewer */
- gcr_viewer_remove_renderer (viewer, GCR_RENDERER (self));
- /*
- * Not yet unlocked, display the unlock dialog.
- */
- } else {
-
- _gcr_display_view_begin (view, renderer);
-
- icon = g_themed_icon_new ("emblem-readonly");
- _gcr_display_view_set_icon (view, renderer, icon);
- g_object_unref (icon);
-
- display = calculate_label (self);
- _gcr_display_view_append_title (view, renderer, display);
- g_free (display);
-
- if (self->pv->label)
- display = g_strdup_printf (_("The contents of “%s” are locked. In order to view the contents, enter the correct password."),
- self->pv->label);
- else
- display = g_strdup (_("The contents are locked. In order to view the contents, enter the correct password."));
- _gcr_display_view_append_content (view, renderer, display, NULL);
- g_free (display);
-
- _gcr_display_view_add_widget_area (view, renderer, GTK_WIDGET (self));
- gtk_widget_show (GTK_WIDGET (self));
-
- _gcr_display_view_end (view, renderer);
- }
-}
-
-static void
-gcr_renderer_iface_init (GcrRendererIface *iface)
-{
- iface->render_view = gcr_unlock_renderer_render;
-}
-
-GcrUnlockRenderer*
-_gcr_unlock_renderer_new (const gchar *label,
- GBytes *locked_data)
-{
- GcrUnlockRenderer *renderer;
-
- renderer = g_object_new (GCR_TYPE_UNLOCK_RENDERER,
- "label", label,
- NULL);
- g_object_ref_sink (renderer);
-
- renderer->pv->locked_data = g_bytes_ref (locked_data);
- return renderer;
-}
-
-GcrUnlockRenderer *
-_gcr_unlock_renderer_new_for_parsed (GcrParser *parser)
-{
- g_return_val_if_fail (GCR_IS_PARSER (parser), NULL);
- return _gcr_unlock_renderer_new (gcr_parser_get_parsed_label (parser),
- gcr_parser_get_parsed_bytes (parser));
-}
-
-const gchar *
-_gcr_unlock_renderer_get_password (GcrUnlockRenderer *self)
-{
- g_return_val_if_fail (GCR_IS_UNLOCK_RENDERER (self), NULL);
- return gtk_entry_get_text (self->pv->entry);
-}
-
-void
-_gcr_unlock_renderer_set_password (GcrUnlockRenderer *self,
- const gchar *text)
-{
- g_return_if_fail (GCR_IS_UNLOCK_RENDERER (self));
- g_return_if_fail (text != NULL);
- gtk_entry_set_text (self->pv->entry, text);
-}
-
-void
-_gcr_unlock_renderer_focus_password (GcrUnlockRenderer *self)
-{
- g_return_if_fail (GCR_IS_UNLOCK_RENDERER (self));
- gtk_widget_grab_focus (GTK_WIDGET (self->pv->entry));
-}
-
-GBytes *
-_gcr_unlock_renderer_get_locked_data (GcrUnlockRenderer *self)
-{
- g_return_val_if_fail (GCR_IS_UNLOCK_RENDERER (self), NULL);
- return self->pv->locked_data;
-}
diff --git a/ui/gcr-unlock-renderer.h b/ui/gcr-unlock-renderer.h
deleted file mode 100644
index 32de573..0000000
--- a/ui/gcr-unlock-renderer.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION)
-#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly."
-#endif
-
-#ifndef __GCR_UNLOCK_RENDERER_H__
-#define __GCR_UNLOCK_RENDERER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-types.h"
-
-#include "gcr-renderer.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_UNLOCK_RENDERER (_gcr_unlock_renderer_get_type ())
-#define GCR_UNLOCK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_UNLOCK_RENDERER, GcrUnlockRenderer))
-#define GCR_UNLOCK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_UNLOCK_RENDERER, GcrUnlockRendererClass))
-#define GCR_IS_UNLOCK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_UNLOCK_RENDERER))
-#define GCR_IS_UNLOCK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_UNLOCK_RENDERER))
-#define GCR_UNLOCK_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_UNLOCK_RENDERER, GcrUnlockRendererClass))
-
-typedef struct _GcrUnlockRenderer GcrUnlockRenderer;
-typedef struct _GcrUnlockRendererClass GcrUnlockRendererClass;
-typedef struct _GcrUnlockRendererPrivate GcrUnlockRendererPrivate;
-
-struct _GcrUnlockRenderer {
- /*< private >*/
- GtkBin parent;
- GcrUnlockRendererPrivate *pv;
-};
-
-struct _GcrUnlockRendererClass {
- GtkBinClass parent_class;
-
- /* signals */
- void (*unlock_clicked) (GcrUnlockRenderer *unlock);
-};
-
-GType _gcr_unlock_renderer_get_type (void);
-
-GcrUnlockRenderer * _gcr_unlock_renderer_new (const gchar *label,
- GBytes *locked_data);
-
-GcrUnlockRenderer * _gcr_unlock_renderer_new_for_parsed (GcrParser *parser);
-
-const gchar * _gcr_unlock_renderer_get_password (GcrUnlockRenderer *self);
-
-void _gcr_unlock_renderer_set_password (GcrUnlockRenderer *self,
- const gchar *text);
-
-void _gcr_unlock_renderer_focus_password (GcrUnlockRenderer *self);
-
-void _gcr_unlock_renderer_show_warning (GcrUnlockRenderer *self,
- const gchar *message);
-
-GBytes * _gcr_unlock_renderer_get_locked_data (GcrUnlockRenderer *self);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrUnlockRenderer, g_object_unref)
-
-G_END_DECLS
-
-#endif /* __GCR_UNLOCK_RENDERER_H__ */
diff --git a/ui/gcr-viewer-tool.c b/ui/gcr-viewer-tool.c
deleted file mode 100644
index 0117d70..0000000
--- a/ui/gcr-viewer-tool.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* gcr-viewer-tool.c: Command line utility
-
- Copyright (C) 2011 Collabora Ltd.
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#include "config.h"
-
-#include "gcr-viewer-window.h"
-
-#include <glib/gi18n.h>
-#include <gtk/gtk.h>
-
-#include <locale.h>
-#include <stdlib.h>
-#include <string.h>
-
-static gchar **remaining_args = NULL;
-
-static gboolean
-print_version_and_exit (const gchar *option_name, const gchar *value,
- gpointer data, GError **error)
-{
- g_print("%s -- %s\n", _("GCR Certificate and Key Viewer"), VERSION);
- exit (0);
- return TRUE;
-}
-
-static const GOptionEntry options[] = {
- { "version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
- print_version_and_exit, N_("Show the application's version"), NULL},
- { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY,
- &remaining_args, NULL, N_("[file...]") },
- { NULL }
-};
-
-static gboolean
-on_idle_load_files (gpointer user_data)
-{
- GcrViewerWindow *window = GCR_VIEWER_WINDOW (user_data);
- GFile *file;
- gint i;
-
- if (remaining_args) {
- for (i = 0; remaining_args[i] != NULL; ++i) {
- file = g_file_new_for_commandline_arg (remaining_args[i]);
- gcr_viewer_window_load (window, file);
- g_object_unref (file);
- }
-
- g_strfreev (remaining_args);
- remaining_args = NULL;
- }
-
- return FALSE; /* Don't run this again */
-}
-
-static void
-on_window_destroy (GtkWidget *widget,
- gpointer unused)
-{
- gtk_widget_hide (widget);
- gtk_main_quit ();
-}
-
-int
-main (int argc, char *argv[])
-{
- GOptionContext *context;
- GError *error = NULL;
- GtkWindow *window;
-
-#ifdef HAVE_LOCALE_H
- /* internationalisation */
- setlocale (LC_ALL, "");
-#endif
-
-#ifdef HAVE_GETTEXT
- bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
- textdomain (GETTEXT_PACKAGE);
- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
-#endif
-
- context = g_option_context_new (N_("- View certificate and key files"));
- g_option_context_set_translation_domain (context, GETTEXT_PACKAGE);
- g_option_context_add_main_entries (context, options, GETTEXT_PACKAGE);
-
- g_option_context_add_group (context, gtk_get_option_group (TRUE));
-
- if (! g_option_context_parse (context, &argc, &argv, &error)) {
- g_critical ("Failed to parse arguments: %s", error->message);
- g_error_free (error);
- g_option_context_free (context);
- return 1;
- }
-
- g_option_context_free (context);
- g_set_application_name (_("Certificate Viewer"));
-
- gtk_init (&argc, &argv);
-
- window = gcr_viewer_window_new ();
- gtk_widget_show (GTK_WIDGET (window));
-
- g_idle_add (on_idle_load_files, window);
- g_signal_connect (window, "destroy", G_CALLBACK (on_window_destroy), NULL);
- gtk_main ();
-
- return 0;
-}
diff --git a/ui/gcr-viewer-widget.c b/ui/gcr-viewer-widget.c
deleted file mode 100644
index 4a03d5c..0000000
--- a/ui/gcr-viewer-widget.c
+++ /dev/null
@@ -1,680 +0,0 @@
-/* gcr-viewer-widget: Widget for viewer
-
- Copyright (C) 2011 Collabora Ltd.
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#include "config.h"
-
-#include "gcr/gcr-importer.h"
-#include "gcr/gcr-marshal.h"
-#include "gcr/gcr-parser.h"
-
-#include "gcr-display-scrolled.h"
-#include "gcr-failure-renderer.h"
-#include "gcr-renderer.h"
-#include "gcr-unlock-renderer.h"
-#include "gcr-viewer-widget.h"
-#include "gcr-viewer.h"
-
-#include <glib/gi18n-lib.h>
-#include <gtk/gtk.h>
-
-#include <locale.h>
-#include <string.h>
-
-/**
- * GcrViewerWidget:
- *
- * A viewer widget which can display certificates and keys that are
- * located in files.
- */
-
-enum {
- PROP_0,
- PROP_PARSER,
- PROP_DISPLAY_NAME
-};
-
-/*
- * Not yet figured out how to expose these without locking down our
- * implementation, the parent class we derive from.
- */
-
-typedef struct _GcrViewerWidgetPrivate GcrViewerWidgetPrivate;
-
-struct _GcrViewerWidget {
- /*< private >*/
- GtkBox parent;
- GcrViewerWidgetPrivate *pv;
-};
-
-struct _GcrViewerWidgetPrivate {
- GcrViewer *viewer;
- GtkInfoBar *message_bar;
- GtkLabel *message_label;
- GQueue *files_to_load;
- GcrParser *parser;
- GCancellable *cancellable;
- GList *unlocks;
- gboolean loading;
- gchar *display_name;
- gboolean display_name_explicit;
-};
-
-enum {
- ADDED,
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0, };
-
-static void viewer_load_next_file (GcrViewerWidget *self);
-static void viewer_stop_loading_files (GcrViewerWidget *self);
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrViewerWidget, gcr_viewer_widget, GTK_TYPE_BOX);
-
-static const gchar *
-get_parsed_label_or_display_name (GcrViewerWidget *self,
- GcrParser *parser)
-{
- const gchar *label;
-
- label = gcr_parser_get_parsed_label (parser);
- if (label == NULL)
- label = self->pv->display_name;
-
- return label;
-}
-
-static void
-on_parser_parsed (GcrParser *parser,
- gpointer user_data)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data);
- GckAttributes *attrs;
- GcrRenderer *renderer;
- const gchar *label;
- gboolean actual = TRUE;
-
- label = get_parsed_label_or_display_name (self, parser);
- attrs = gcr_parser_get_parsed_attributes (parser);
-
- renderer = gcr_renderer_create (label, attrs);
-
- if (renderer == NULL) {
- renderer = gcr_failure_renderer_new_unsupported (label);
- actual = FALSE;
- }
-
- /* And show the data */
- gcr_viewer_add_renderer (self->pv->viewer, renderer);
-
- /* Let callers know we're rendering data */
- if (actual == TRUE)
- g_signal_emit (self, signals[ADDED], 0, renderer,
- gcr_parser_get_parsed (parser));
-
- g_object_unref (renderer);
-}
-
-static gboolean
-on_parser_authenticate_for_unlock (GcrParser *parser,
- guint count,
- gpointer user_data)
-{
- GcrUnlockRenderer *unlock = GCR_UNLOCK_RENDERER (user_data);
- const gchar *password;
-
- if (count == 0) {
- password = _gcr_unlock_renderer_get_password (unlock);
- gcr_parser_add_password (parser, password);
- }
-
- return TRUE;
-}
-
-static void
-on_unlock_renderer_clicked (GcrUnlockRenderer *unlock,
- gpointer user_data)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data);
- GError *error = NULL;
- GBytes *data;
- gulong sig;
-
- /* Override our main authenticate signal handler */
- sig = g_signal_connect (self->pv->parser, "authenticate",
- G_CALLBACK (on_parser_authenticate_for_unlock), unlock);
-
- data = _gcr_unlock_renderer_get_locked_data (unlock);
- if (gcr_parser_parse_bytes (self->pv->parser, data, &error)) {
-
- /* Done with this unlock renderer */
- gcr_viewer_remove_renderer (self->pv->viewer, GCR_RENDERER (unlock));
- self->pv->unlocks = g_list_remove (self->pv->unlocks, unlock);
- g_object_unref (unlock);
-
- } else if (g_error_matches (error, GCR_DATA_ERROR, GCR_ERROR_LOCKED)){
- _gcr_unlock_renderer_show_warning (unlock, _("The password was incorrect"));
- _gcr_unlock_renderer_focus_password (unlock);
- _gcr_unlock_renderer_set_password (unlock, "");
- g_error_free (error);
-
- } else {
- _gcr_unlock_renderer_show_warning (unlock, error->message);
- g_error_free (error);
- }
-
- g_signal_handler_disconnect (self->pv->parser, sig);
-}
-
-static gboolean
-on_parser_authenticate_for_data (GcrParser *parser,
- guint count,
- gpointer user_data)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data);
- GcrUnlockRenderer *unlock;
-
- unlock = _gcr_unlock_renderer_new_for_parsed (parser);
- if (unlock != NULL) {
- g_object_set (unlock, "label", get_parsed_label_or_display_name (self, parser), NULL);
- gcr_viewer_add_renderer (self->pv->viewer, GCR_RENDERER (unlock));
- g_signal_connect (unlock, "unlock-clicked", G_CALLBACK (on_unlock_renderer_clicked), self);
- self->pv->unlocks = g_list_prepend (self->pv->unlocks, unlock);
- }
-
- return TRUE;
-}
-
-static void
-gcr_viewer_widget_init (GcrViewerWidget *self)
-{
- GtkWidget *area;
-
- self->pv = gcr_viewer_widget_get_instance_private (self);
-
- gtk_orientable_set_orientation (GTK_ORIENTABLE (self),
- GTK_ORIENTATION_VERTICAL);
-
- self->pv->viewer = gcr_viewer_new_scrolled ();
- gtk_box_pack_start (GTK_BOX (self), GTK_WIDGET (self->pv->viewer), TRUE, TRUE, 0);
- gtk_widget_show (GTK_WIDGET (self->pv->viewer));
-
- self->pv->message_label = GTK_LABEL (gtk_label_new (""));
- gtk_label_set_use_markup (self->pv->message_label, TRUE);
- gtk_label_set_ellipsize (self->pv->message_label, PANGO_ELLIPSIZE_END);
- gtk_widget_show (GTK_WIDGET (self->pv->message_label));
-
- self->pv->message_bar = GTK_INFO_BAR (gtk_info_bar_new ());
- gtk_box_pack_start (GTK_BOX (self), GTK_WIDGET (self->pv->message_bar), FALSE, TRUE, 0);
- area = gtk_info_bar_get_content_area (self->pv->message_bar);
- gtk_container_add (GTK_CONTAINER (area), GTK_WIDGET (self->pv->message_label));
-
- self->pv->files_to_load = g_queue_new ();
- self->pv->parser = gcr_parser_new ();
- self->pv->cancellable = g_cancellable_new ();
- self->pv->unlocks = NULL;
-
- g_signal_connect (self->pv->parser, "parsed", G_CALLBACK (on_parser_parsed), self);
- g_signal_connect_after (self->pv->parser, "authenticate", G_CALLBACK (on_parser_authenticate_for_data), self);
-}
-
-static void
-gcr_viewer_widget_get_property (GObject *obj,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj);
-
- switch (prop_id) {
- case PROP_PARSER:
- g_value_set_object (value, gcr_viewer_widget_get_parser (self));
- break;
- case PROP_DISPLAY_NAME:
- g_value_set_string (value, gcr_viewer_widget_get_display_name (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_viewer_widget_set_property (GObject *obj,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj);
-
- switch (prop_id) {
- case PROP_DISPLAY_NAME:
- gcr_viewer_widget_set_display_name (self, g_value_get_string (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-gcr_viewer_widget_dispose (GObject *obj)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj);
- GList *l;
-
- g_signal_handlers_disconnect_by_func (self->pv->parser, on_parser_parsed, self);
-
- for (l = self->pv->unlocks; l != NULL; l = g_list_next (l)) {
- g_signal_handlers_disconnect_by_func (l->data, on_unlock_renderer_clicked, self);
- g_object_unref (l->data);
- }
- g_list_free (self->pv->unlocks);
- self->pv->unlocks = NULL;
-
- while (!g_queue_is_empty (self->pv->files_to_load))
- g_object_unref (g_queue_pop_head (self->pv->files_to_load));
-
- g_cancellable_cancel (self->pv->cancellable);
-
- G_OBJECT_CLASS (gcr_viewer_widget_parent_class)->dispose (obj);
-}
-
-static void
-gcr_viewer_widget_finalize (GObject *obj)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj);
-
- g_assert (g_queue_is_empty (self->pv->files_to_load));
- g_queue_free (self->pv->files_to_load);
-
- g_free (self->pv->display_name);
- g_object_unref (self->pv->cancellable);
- g_object_unref (self->pv->parser);
-
- G_OBJECT_CLASS (gcr_viewer_widget_parent_class)->finalize (obj);
-}
-
-static void
-gcr_viewer_widget_class_init (GcrViewerWidgetClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->dispose = gcr_viewer_widget_dispose;
- gobject_class->finalize = gcr_viewer_widget_finalize;
- gobject_class->get_property = gcr_viewer_widget_get_property;
- gobject_class->set_property = gcr_viewer_widget_set_property;
-
- /**
- * GcrViewerWidget:parser:
- *
- * The parser used to parse loaded data into viewable items.
- */
- g_object_class_install_property (gobject_class, PROP_PARSER,
- g_param_spec_object ("parser", "Parser", "Parser used to parse viewable items",
- GCR_TYPE_PARSER,
- G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrViewerWidget:display-name:
- *
- * Display name for data being displayed. This is automatically
- * calculated from a loaded file, or can be explicitly set.
- *
- * Used as a hint when displaying a title for the data, but may be
- * overridden by the parsed data.
- */
- g_object_class_install_property (gobject_class, PROP_DISPLAY_NAME,
- g_param_spec_string ("display-name", "Display name", "Display name",
- NULL,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
- /**
- * GcrViewerWidget::added:
- * @self: the viewer widget
- * @renderer: (type GcrUi.Renderer): the renderer that was added
- * @parsed: (type Gcr.Parsed): the parsed item that was added
- *
- * This signal is emitted when an item is added to the viewer widget.
- */
- signals[ADDED] = g_signal_new ("added", GCR_TYPE_VIEWER_WIDGET, G_SIGNAL_RUN_LAST,
- 0, NULL, NULL, _gcr_marshal_VOID__OBJECT_BOXED,
- G_TYPE_NONE, 2, G_TYPE_OBJECT, GCR_TYPE_PARSED);
-}
-
-static void
-on_parser_parse_stream_returned (GObject *source,
- GAsyncResult *result,
- gpointer user_data)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data);
- GError *error = NULL;
- GcrRenderer *renderer;
-
- gcr_parser_parse_stream_finish (self->pv->parser, result, &error);
-
- if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) ||
- g_error_matches (error, GCR_DATA_ERROR, GCR_ERROR_CANCELLED)) {
- viewer_stop_loading_files (self);
-
- } else if (g_error_matches (error, GCR_DATA_ERROR, GCR_ERROR_LOCKED)) {
- /* Just skip this one, an unlock renderer was added */
-
- } else if (error) {
- renderer = gcr_failure_renderer_new (self->pv->display_name, error);
- gcr_viewer_add_renderer (self->pv->viewer, renderer);
- g_object_unref (renderer);
- g_error_free (error);
- }
-
- viewer_load_next_file (self);
-}
-
-static void
-update_display_name (GcrViewerWidget *self,
- gchar *display_name)
-{
- if (!self->pv->display_name_explicit) {
- g_free (self->pv->display_name);
- self->pv->display_name = g_strdup (display_name);
- g_object_notify (G_OBJECT (self), "display-name");
- }
-}
-
-static void
-on_file_read_returned (GObject *source,
- GAsyncResult *result,
- gpointer user_data)
-{
- GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data);
- GFile *file = G_FILE (source);
- GError *error = NULL;
- GFileInputStream *fis;
- GcrRenderer *renderer;
- gchar *basename, *display_name;
-
- fis = g_file_read_finish (file, result, &error);
-
- basename = g_file_get_basename (file);
- display_name = g_filename_display_name (basename);
- g_free (basename);
-
- update_display_name (self, display_name);
-
- if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
- viewer_stop_loading_files (self);
-
- } else if (error) {
- renderer = gcr_failure_renderer_new (self->pv->display_name, error);
- gcr_viewer_add_renderer (self->pv->viewer, renderer);
- g_object_unref (renderer);
- g_error_free (error);
-
- viewer_load_next_file (self);
-
- } else {
- gcr_parser_set_filename (self->pv->parser, display_name);
- gcr_parser_parse_stream_async (self->pv->parser,
- G_INPUT_STREAM (fis),
- self->pv->cancellable,
- on_parser_parse_stream_returned,
- self);
- g_object_unref (fis);
- }
- g_free (display_name);
-}
-
-static void
-viewer_stop_loading_files (GcrViewerWidget *self)
-{
- self->pv->loading = FALSE;
-}
-
-static void
-viewer_load_next_file (GcrViewerWidget *self)
-{
- GFile* file;
-
- file = g_queue_pop_head (self->pv->files_to_load);
- if (file == NULL) {
- viewer_stop_loading_files (self);
- return;
- }
-
- g_file_read_async (file, G_PRIORITY_DEFAULT, self->pv->cancellable,
- on_file_read_returned, self);
-
- g_object_unref (file);
-}
-
-/**
- * gcr_viewer_widget_new:
- *
- * Create a new viewer widget.
- *
- * Returns: (transfer full): A new #GcrViewerWidget object
- */
-GcrViewerWidget *
-gcr_viewer_widget_new (void)
-{
- return g_object_new (GCR_TYPE_VIEWER_WIDGET, NULL);
-}
-
-/**
- * gcr_viewer_widget_load_file:
- * @self: a viewer widget
- * @file: a file to load
- *
- * Display contents of a file in the viewer widget. Multiple files can
- * be loaded.
- */
-void
-gcr_viewer_widget_load_file (GcrViewerWidget *self,
- GFile *file)
-{
- g_return_if_fail (GCR_IS_VIEWER_WIDGET (self));
- g_return_if_fail (G_IS_FILE (file));
-
- g_queue_push_tail (self->pv->files_to_load, g_object_ref (file));
-
- if (!self->pv->loading)
- viewer_load_next_file (self);
-}
-
-/**
- * gcr_viewer_widget_load_bytes:
- * @self: a viewer widget
- * @display_name: (nullable): label for the loaded data
- * @data: data to load
- *
- * Parse and load some data to be displayed into the viewer widgets. The data
- * may contain multiple parseable items if the format can contain multiple
- * items.
- */
-void
-gcr_viewer_widget_load_bytes (GcrViewerWidget *self,
- const gchar *display_name,
- GBytes *data)
-{
- GError *error = NULL;
- GcrRenderer *renderer;
-
- g_return_if_fail (GCR_IS_VIEWER_WIDGET (self));
- g_return_if_fail (data != NULL);
-
- g_free (self->pv->display_name);
- self->pv->display_name = g_strdup (display_name);
-
- if (!gcr_parser_parse_bytes (self->pv->parser, data, &error)) {
- renderer = gcr_failure_renderer_new (display_name, error);
- gcr_viewer_add_renderer (self->pv->viewer, renderer);
- g_object_unref (renderer);
- g_error_free (error);
- }
-}
-
-/**
- * gcr_viewer_widget_load_data:
- * @self: a viewer widget
- * @display_name: (nullable): label for the loaded data
- * @data: (array length=n_data): data to load
- * @n_data: length of data to load
- *
- * Parse and load some data to be displayed into the viewer widgets. The data
- * may contain multiple parseable items if the format can contain multiple
- * items.
- *
- * This function will copy the data. Use [method@ViewerWidget.load_bytes] to avoid
- * copying the data.
- */
-void
-gcr_viewer_widget_load_data (GcrViewerWidget *self,
- const gchar *display_name,
- const guchar *data,
- gsize n_data)
-{
- GBytes *bytes;
-
- g_return_if_fail (GCR_IS_VIEWER_WIDGET (self));
-
- bytes = g_bytes_new (data, n_data);
- gcr_viewer_widget_load_bytes (self, display_name, bytes);
- g_bytes_unref (bytes);
-}
-
-/**
- * gcr_viewer_widget_get_viewer:
- * @self: a viewer widget
- *
- * Get the viewer used to display the viewable items.
- *
- * Returns: (transfer none): the viewer
- */
-GcrViewer *
-gcr_viewer_widget_get_viewer (GcrViewerWidget *self)
-{
- g_return_val_if_fail (GCR_IS_VIEWER_WIDGET (self), NULL);
- return self->pv->viewer;
-}
-
-/**
- * gcr_viewer_widget_get_parser:
- * @self: a viewer widget
- *
- * Get the parser used to parse loaded data into viewable items.
- *
- * Returns: (transfer none): the parser
- */
-GcrParser *
-gcr_viewer_widget_get_parser (GcrViewerWidget *self)
-{
- g_return_val_if_fail (GCR_IS_VIEWER_WIDGET (self), NULL);
- return self->pv->parser;
-}
-
-/**
- * gcr_viewer_widget_show_error:
- * @self: a viewer widget
- * @message: descriptive error message
- * @error: (nullable): detailed error
- *
- * Show an error on the viewer widget. This is displayed on a info bar near
- * the edge of the widget.
- */
-void
-gcr_viewer_widget_show_error (GcrViewerWidget *self,
- const gchar *message,
- GError *error)
-{
- gchar *markup;
-
- g_return_if_fail (GCR_IS_VIEWER_WIDGET (self));
- g_return_if_fail (message != NULL);
-
- if (error)
- markup = g_markup_printf_escaped ("<b>%s</b>: %s", message, error->message);
- else
- markup = g_markup_printf_escaped ("%s", message);
-
- gtk_info_bar_set_message_type (self->pv->message_bar, GTK_MESSAGE_ERROR);
- gtk_label_set_markup (self->pv->message_label, markup);
- gtk_widget_show (GTK_WIDGET (self->pv->message_bar));
- g_free (markup);
-}
-
-/**
- * gcr_viewer_widget_clear_error:
- * @self: a viewer widget
- *
- * Clear the error displayed on the viewer widget.
- */
-void
-gcr_viewer_widget_clear_error (GcrViewerWidget *self)
-{
- g_return_if_fail (GCR_IS_VIEWER_WIDGET (self));
- gtk_widget_hide (GTK_WIDGET (self->pv->message_bar));
-}
-
-/**
- * gcr_viewer_widget_get_display_name:
- * @self: a viewer widget
- *
- * Get the display name for data being displayed. This is automatically
- * calculated from a loaded file, or can be explicitly set.
- *
- * Used as a hint when displaying a title for the data, but may be
- * overridden by the parsed data.
- *
- * Returns: the display name
- */
-const gchar *
-gcr_viewer_widget_get_display_name (GcrViewerWidget *self)
-{
- g_return_val_if_fail (GCR_IS_VIEWER_WIDGET (self), NULL);
-
- if (!self->pv->display_name_explicit && !self->pv->display_name)
- self->pv->display_name = g_strdup (_("Certificate Viewer"));
-
- return self->pv->display_name;
-}
-
-/**
- * gcr_viewer_widget_set_display_name:
- * @self: a viewer widget
- * @display_name: the display name
- *
- * Set the display name for data being displayed. Once explicitly
- * set it will no longer be calculated automatically by loading data.
- *
- * Used as a hint when displaying a title for the data, but may be
- * overridden by the parsed data.
- */
-void
-gcr_viewer_widget_set_display_name (GcrViewerWidget *self,
- const gchar *display_name)
-{
- g_return_if_fail (GCR_IS_VIEWER_WIDGET (self));
-
- g_free (self->pv->display_name);
- self->pv->display_name = g_strdup (display_name);
- self->pv->display_name_explicit = TRUE;
- g_object_notify (G_OBJECT (self), "display-name");
-}
diff --git a/ui/gcr-viewer-widget.h b/ui/gcr-viewer-widget.h
deleted file mode 100644
index 93515c5..0000000
--- a/ui/gcr-viewer-widget.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* gcr-viewer-widget.h: Widget for viewer
-
- Copyright (C) 2011 Collabora Ltd.
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#ifndef GCR_VIEWER_WIDGET_H
-#define GCR_VIEWER_WIDGET_H
-
-#include <gtk/gtk.h>
-
-#define GCR_TYPE_VIEWER_WIDGET (gcr_viewer_widget_get_type ())
-G_DECLARE_FINAL_TYPE (GcrViewerWidget, gcr_viewer_widget,
- GCR, VIEWER_WIDGET,
- GtkBox)
-
-GcrViewerWidget * gcr_viewer_widget_new (void);
-
-void gcr_viewer_widget_load_file (GcrViewerWidget *self,
- GFile *file);
-
-void gcr_viewer_widget_load_bytes (GcrViewerWidget *self,
- const gchar *display_name,
- GBytes *data);
-
-void gcr_viewer_widget_load_data (GcrViewerWidget *self,
- const gchar *display_name,
- const guchar *data,
- gsize n_data);
-
-GcrViewer * gcr_viewer_widget_get_viewer (GcrViewerWidget *self);
-
-GcrParser * gcr_viewer_widget_get_parser (GcrViewerWidget *self);
-
-void gcr_viewer_widget_show_error (GcrViewerWidget *self,
- const gchar *message,
- GError *error);
-
-void gcr_viewer_widget_clear_error (GcrViewerWidget *self);
-
-const gchar * gcr_viewer_widget_get_display_name (GcrViewerWidget *self);
-
-void gcr_viewer_widget_set_display_name (GcrViewerWidget *self,
- const gchar *display_name);
-
-#endif /* GCR_VIEWER_WIDGET_H */
diff --git a/ui/gcr-viewer-window.c b/ui/gcr-viewer-window.c
deleted file mode 100644
index a25e10e..0000000
--- a/ui/gcr-viewer-window.c
+++ /dev/null
@@ -1,201 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* gcr-viewer-window.c: Window for viewer
-
- Copyright (C) 2011 Collabora Ltd.
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#include "config.h"
-
-#include "gcr-viewer-window.h"
-
-#include <glib/gi18n-lib.h>
-#include <gtk/gtk.h>
-
-#include <locale.h>
-#include <string.h>
-
-struct _GcrViewerWindowPrivate {
- GcrViewerWidget *viewer;
- GcrImportButton *import;
-};
-
-G_DEFINE_TYPE_WITH_PRIVATE (GcrViewerWindow, gcr_viewer_window, GTK_TYPE_WINDOW);
-
-static void
-on_viewer_renderer_added (GcrViewerWidget *viewer,
- GcrRenderer *renderer,
- GcrParsed *parsed,
- gpointer user_data)
-{
- GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data);
- gcr_import_button_add_parsed (self->pv->import, parsed);
-}
-
-static void
-gcr_viewer_window_init (GcrViewerWindow *self)
-{
- self->pv = gcr_viewer_window_get_instance_private (self);
-}
-
-static void
-on_import_button_importing (GcrImportButton *button,
- GcrImporter *importer,
- gpointer user_data)
-{
- GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data);
- gcr_viewer_widget_clear_error (self->pv->viewer);
-}
-
-static void
-on_import_button_imported (GcrImportButton *button,
- GcrImporter *importer,
- GError *error,
- gpointer user_data)
-{
- GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data);
-
- if (error == NULL) {
- g_object_set (button, "label", _("Imported"), NULL);
-
- } else {
- if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
- gcr_viewer_widget_show_error (self->pv->viewer, _("Import failed"), error);
- }
-}
-
-static void
-on_close_clicked (GtkButton *button,
- gpointer user_data)
-{
- GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data);
- gtk_widget_destroy (GTK_WIDGET (self));
-}
-
-static void
-gcr_viewer_window_constructed (GObject *obj)
-{
- GcrViewerWindow *self = GCR_VIEWER_WINDOW (obj);
- GtkWidget *bbox;
- GtkWidget *box;
- GtkWidget *button;
-
- G_OBJECT_CLASS (gcr_viewer_window_parent_class)->constructed (obj);
-
- bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
- gtk_box_set_spacing (GTK_BOX (bbox), 12);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END);
- gtk_widget_show (bbox);
-
- self->pv->import = gcr_import_button_new (_("Import"));
- g_signal_connect_object (self->pv->import, "importing",
- G_CALLBACK (on_import_button_importing),
- self, 0);
- g_signal_connect_object (self->pv->import, "imported",
- G_CALLBACK (on_import_button_imported),
- self, 0);
- gtk_widget_show (GTK_WIDGET (self->pv->import));
-
- button = gtk_button_new_with_mnemonic (_("_Close"));
- g_signal_connect_object (button, "clicked",
- G_CALLBACK (on_close_clicked),
- self, 0);
- gtk_widget_show (button);
-
- gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (bbox), GTK_WIDGET (self->pv->import), FALSE, TRUE, 0);
-
- gtk_widget_set_halign (bbox, 0.5);
- gtk_widget_set_valign (bbox, 0.5);
-#if GTK_CHECK_VERSION (3, 12, 0)
- gtk_widget_set_margin_end (bbox, 12);
-#else
- gtk_widget_set_margin_right (bbox, 12);
-#endif
-
- self->pv->viewer = gcr_viewer_widget_new ();
- g_object_bind_property (self->pv->viewer, "display-name",
- self, "title", G_BINDING_SYNC_CREATE);
- g_signal_connect_object (self->pv->viewer, "added",
- G_CALLBACK (on_viewer_renderer_added),
- self, 0);
- gtk_widget_show (GTK_WIDGET (self->pv->viewer));
-
- box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
- gtk_widget_show (box);
-
- gtk_box_pack_start (GTK_BOX (box), GTK_WIDGET (self->pv->viewer), TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (box), bbox, FALSE, FALSE, 6);
-
- gtk_container_add (GTK_CONTAINER (self), box);
-
- gtk_window_set_default_size (GTK_WINDOW (self), 250, 400);
-}
-
-static void
-gcr_viewer_window_class_init (GcrViewerWindowClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->constructed = gcr_viewer_window_constructed;
-}
-
-/**
- * gcr_viewer_window_new:
- *
- * Create a new viewer window.
- *
- * Returns: (transfer full) (type GcrUi.ViewerWindow): a new viewer window
- */
-GtkWindow *
-gcr_viewer_window_new (void)
-{
- return g_object_new (GCR_TYPE_VIEWER_WINDOW, NULL);
-}
-
-/**
- * gcr_viewer_window_load:
- * @self: a viewer window
- * @file: file to load
- *
- * Load a file into a viewer window. It may not appear immediately.
- */
-void
-gcr_viewer_window_load (GcrViewerWindow *self,
- GFile *file)
-{
- g_return_if_fail (GCR_IS_VIEWER_WINDOW (self));
- g_return_if_fail (G_IS_FILE (file));
-
- return gcr_viewer_widget_load_file (self->pv->viewer, file);
-}
-
-/**
- * gcr_viewer_window_get_viewer:
- * @self: a viewer window
- *
- * Get the actual viewer showing information in the window.
- *
- * Returns: the viewer
- */
-GcrViewer *
-gcr_viewer_window_get_viewer (GcrViewerWindow *self)
-{
- g_return_val_if_fail (GCR_IS_VIEWER_WINDOW (self), NULL);
- return gcr_viewer_widget_get_viewer (self->pv->viewer);
-}
diff --git a/ui/gcr-viewer-window.h b/ui/gcr-viewer-window.h
deleted file mode 100644
index de42926..0000000
--- a/ui/gcr-viewer-window.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
-/* gcr-viewer-window.h: Window for viewer
-
- Copyright (C) 2011 Collabora Ltd.
-
- The Gnome Keyring Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The Gnome Keyring 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the Gnome Library; see the file COPYING.LIB. If not,
- see <http://www.gnu.org/licenses/>.
-
- Author: Stef Walter <stefw@collabora.co.uk>
-*/
-
-#ifndef GCR_VIEWER_WINDOW_H
-#define GCR_VIEWER_WINDOW_H
-
-#include <gtk/gtk.h>
-
-#ifndef GCR_DISABLE_DEPRECATED
-
-#include "gcr/gcr.h"
-
-#define GCR_TYPE_VIEWER_WINDOW (gcr_viewer_window_get_type ())
-#define GCR_VIEWER_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_VIEWER_WINDOW, GcrViewerWindow))
-#define GCR_VIEWER_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_VIEWER_WINDOW, GcrViewerWindowClass))
-#define GCR_IS_VIEWER_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_VIEWER_WINDOW))
-#define GCR_IS_VIEWER_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_VIEWER_WINDOW))
-#define GCR_VIEWER_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_VIEWER_WINDOW, GcrViewerWindowClass))
-
-typedef struct _GcrViewerWindow GcrViewerWindow;
-typedef struct _GcrViewerWindowClass GcrViewerWindowClass;
-typedef struct _GcrViewerWindowPrivate GcrViewerWindowPrivate;
-
-struct _GcrViewerWindow {
- /*< private >*/
- GtkWindow parent;
- GcrViewerWindowPrivate *pv;
-};
-
-struct _GcrViewerWindowClass {
- /*< private >*/
- GtkWindowClass parent_class;
-};
-
-GType gcr_viewer_window_get_type (void);
-
-GtkWindow * gcr_viewer_window_new (void);
-
-void gcr_viewer_window_load (GcrViewerWindow *self,
- GFile *file);
-
-GcrViewer * gcr_viewer_window_get_viewer (GcrViewerWindow *self);
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrViewerWindow, g_object_unref)
-
-#endif /* GCR_DISABLE_DEPRECATED */
-
-#endif /* GCR_VIEWER_WINDOW_H */
diff --git a/ui/gcr-viewer.c b/ui/gcr-viewer.c
deleted file mode 100644
index fe71402..0000000
--- a/ui/gcr-viewer.c
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2008 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include "gcr-display-scrolled.h"
-#include "gcr-display-view.h"
-#include "gcr-renderer.h"
-#include "gcr-viewer.h"
-
-/**
- * GcrViewer:
- *
- * An abstract interface that represents a widget that can hold
- * various renderers and display their contents.
- *
- * The interaction between [iface@Renderer] and [iface@Viewer] is not stable
- * yet, and so viewers cannot be implemented outside the Gcr library at this
- * time.
- *
- * Use the [func@Viewer.new] and [func@Viewer.new_scrolled] to get default
- * implementations of viewers.
- */
-
-/**
- * GcrViewerIface:
- * @parent: The parent interface
- * @add_renderer: Virtual method to add a renderer
- * @insert_renderer: Virtual method to insert a renderer
- * @remove_renderer: Virtual method to remove a renderer
- * @count_renderers: Virtual method to count renderers
- * @get_renderer: Virtual method to get a renderer
- *
- * The interface for #GcrViewer
- */
-
-typedef GcrViewerIface GcrViewerInterface;
-
-G_DEFINE_INTERFACE (GcrViewer, gcr_viewer, GTK_TYPE_WIDGET);
-
-static void
-gcr_viewer_default_init (GcrViewerIface *iface)
-{
-
-}
-
-/* -----------------------------------------------------------------------------
- * PUBLIC
- */
-
-/**
- * gcr_viewer_new:
- *
- * Get an implementation of #GcrViewer that supports a view
- * of multiple renderers.
- *
- * Returns: (transfer full): a newly allocated #GcrViewer, which should be
- * released with g_object_unref()
- */
-GcrViewer *
-gcr_viewer_new (void)
-{
- return GCR_VIEWER (_gcr_display_view_new ());
-}
-
-/**
- * gcr_viewer_new_scrolled:
- *
- * Get an implementation of #GcrViewer that supports a scrolled view
- * of multiple renderers.
- *
- * Returns: (transfer floating): a #GcrViewer which is also a #GtkWidget
- */
-GcrViewer*
-gcr_viewer_new_scrolled (void)
-{
- return GCR_VIEWER (_gcr_display_scrolled_new ());
-}
-
-/**
- * gcr_viewer_add_renderer: (virtual add_renderer)
- * @viewer: The viewer
- * @renderer: The renderer to add
- *
- * Add a renderer to this viewer.
- */
-void
-gcr_viewer_add_renderer (GcrViewer *viewer,
- GcrRenderer *renderer)
-{
- g_return_if_fail (GCR_IS_VIEWER (viewer));
- g_return_if_fail (GCR_IS_RENDERER (renderer));
- g_return_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->add_renderer);
- GCR_VIEWER_GET_INTERFACE (viewer)->add_renderer (viewer, renderer);
-}
-
-/**
- * gcr_viewer_insert_renderer: (virtual insert_renderer)
- * @viewer: the viewer
- * @renderer: the renderer to insert
- * @before: (nullable): the renderer to insert before
- *
- * Insert a renderer at a specific point in the viewer
- */
-void
-gcr_viewer_insert_renderer (GcrViewer *viewer,
- GcrRenderer *renderer,
- GcrRenderer *before)
-{
- g_return_if_fail (GCR_IS_VIEWER (viewer));
- g_return_if_fail (GCR_IS_RENDERER (renderer));
- g_return_if_fail (!before || GCR_IS_RENDERER (before));
- g_return_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->insert_renderer);
- GCR_VIEWER_GET_INTERFACE (viewer)->insert_renderer (viewer, renderer, before);
-}
-
-/**
- * gcr_viewer_remove_renderer: (virtual remove_renderer)
- * @viewer: The viewer
- * @renderer: The renderer to remove
- *
- * Remove a renderer from this viewer.
- */
-void
-gcr_viewer_remove_renderer (GcrViewer *viewer,
- GcrRenderer *renderer)
-{
- g_return_if_fail (GCR_IS_VIEWER (viewer));
- g_return_if_fail (GCR_IS_RENDERER (renderer));
- g_return_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->remove_renderer);
- GCR_VIEWER_GET_INTERFACE (viewer)->remove_renderer (viewer, renderer);
-}
-
-/**
- * gcr_viewer_count_renderers: (virtual count_renderers)
- * @viewer: The viewer
- *
- * Get the number of renderers present in the viewer.
- *
- * Returns: The number of renderers.
- */
-guint
-gcr_viewer_count_renderers (GcrViewer *viewer)
-{
- g_return_val_if_fail (GCR_IS_VIEWER (viewer), 0);
- g_return_val_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->count_renderers, 0);
- return GCR_VIEWER_GET_INTERFACE (viewer)->count_renderers (viewer);
-}
-
-/**
- * gcr_viewer_get_renderer: (virtual get_renderer)
- * @viewer: The viewer
- * @index_: The index of the renderer to get
- *
- * Get a pointer to the renderer at the given index. It is an error to request
- * an index that is out of bounds.
- *
- * Returns: (transfer none): the render, owned by the viewer
- */
-GcrRenderer*
-gcr_viewer_get_renderer (GcrViewer *viewer,
- guint index_)
-{
- g_return_val_if_fail (GCR_IS_VIEWER (viewer), NULL);
- g_return_val_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->get_renderer, NULL);
- return GCR_VIEWER_GET_INTERFACE (viewer)->get_renderer (viewer, index_);
-}
diff --git a/ui/gcr-viewer.desktop.in.in b/ui/gcr-viewer.desktop.in.in
deleted file mode 100644
index d3b0f57..0000000
--- a/ui/gcr-viewer.desktop.in.in
+++ /dev/null
@@ -1,7 +0,0 @@
-[Desktop Entry]
-Name=View file
-MimeType=application/pkcs12;application/pkcs12+pem;application/pkcs7-mime;application/pkcs7-mime+pem;application/pkcs8;application/pkcs8+pem;application/pkix-cert;application/pkix-cert+pem;application/pkix-crl;application/pkix-crl+pem;application/x-pem-file;application/x-pem-key;application/x-pkcs12;application/x-pkcs7-certificates;application/x-x509-ca-cert;application/x-x509-user-cert;application/pkcs10;application/pkcs10+pem;application/x-spkac;application/x-spkac+base64;
-Exec=@bindir@/gcr-viewer
-Type=Application
-Terminal=false
-NoDisplay=true
diff --git a/ui/gcr-viewer.h b/ui/gcr-viewer.h
deleted file mode 100644
index fe8df50..0000000
--- a/ui/gcr-viewer.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2010 Stefan Walter
- *
- * This program 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 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef __GCR_VIEWER_H__
-#define __GCR_VIEWER_H__
-
-#include <glib-object.h>
-#include <gtk/gtk.h>
-
-#include "gcr/gcr-types.h"
-
-G_BEGIN_DECLS
-
-#define GCR_TYPE_VIEWER (gcr_viewer_get_type())
-#define GCR_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_VIEWER, GcrViewer))
-#define GCR_IS_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_VIEWER))
-#define GCR_VIEWER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_VIEWER, GcrViewerIface))
-
-typedef struct _GcrRenderer GcrRenderer;
-typedef struct _GcrViewer GcrViewer;
-typedef struct _GcrViewerIface GcrViewerIface;
-
-struct _GcrViewerIface {
- GTypeInterface parent;
-
- void (*add_renderer) (GcrViewer *viewer,
- GcrRenderer *renderer);
-
- void (*insert_renderer) (GcrViewer *viewer,
- GcrRenderer *renderer,
- GcrRenderer *before);
-
- void (*remove_renderer) (GcrViewer *viewer,
- GcrRenderer *renderer);
-
- guint (*count_renderers) (GcrViewer *viewer);
-
- GcrRenderer* (*get_renderer) (GcrViewer *viewer,
- guint index_);
-
- /*< private >*/
- gpointer dummy1;
- gpointer dummy2;
- gpointer dummy3;
- gpointer dummy4;
-};
-
-GType gcr_viewer_get_type (void);
-
-GcrViewer* gcr_viewer_new (void);
-
-GcrViewer* gcr_viewer_new_scrolled (void);
-
-void gcr_viewer_add_renderer (GcrViewer *viewer,
- GcrRenderer *renderer);
-
-void gcr_viewer_insert_renderer (GcrViewer *viewer,
- GcrRenderer *renderer,
- GcrRenderer *before);
-
-void gcr_viewer_remove_renderer (GcrViewer *viewer,
- GcrRenderer *renderer);
-
-guint gcr_viewer_count_renderers (GcrViewer *viewer);
-
-GcrRenderer* gcr_viewer_get_renderer (GcrViewer *viewer,
- guint index_);
-
-G_END_DECLS
-
-#endif /* __GCR_VIEWER_H__ */
diff --git a/ui/meson.build b/ui/meson.build
deleted file mode 100644
index 69144ce..0000000
--- a/ui/meson.build
+++ /dev/null
@@ -1,265 +0,0 @@
-subdir('icons')
-
-gcr_ui_headers_install_dir = gcr_base_headers_subdir / 'ui'
-
-gcr_ui_public_sources = files(
- 'gcr-certificate-renderer.c',
- 'gcr-certificate-widget.c',
- 'gcr-collection-model.c',
- 'gcr-combo-selector.c',
- 'gcr-failure-renderer.c',
- 'gcr-key-renderer.c',
- 'gcr-key-widget.c',
- 'gcr-import-button.c',
- 'gcr-list-selector.c',
- 'gcr-prompt-dialog.c',
- 'gcr-renderer.c',
- 'gcr-secure-entry-buffer.c',
- 'gcr-tree-selector.c',
- 'gcr-unlock-options-widget.c',
- 'gcr-viewer.c',
- 'gcr-viewer-widget.c',
-)
-
-gcr_ui_private_sources = files(
- 'eggimagemenuitem.c',
- 'gcr-certificate-basics-widget.c',
- 'gcr-certificate-details-widget.c',
- 'gcr-certificate-exporter.c',
- 'gcr-certificate-request-renderer.c',
- 'gcr-dialog-util.c',
- 'gcr-display-scrolled.c',
- 'gcr-display-view.c',
- 'gcr-gnupg-renderer.c',
- 'gcr-live-search.c',
- 'gcr-pkcs11-import-dialog.c',
- 'gcr-pkcs11-import-interaction.c',
- 'gcr-unlock-renderer.c',
- 'gcr-viewer-window.c',
-)
-
-gcr_ui_headers = files(
- 'gcr-ui.h',
- 'gcr-certificate-renderer.h',
- 'gcr-certificate-widget.h',
- 'gcr-collection-model.h',
- 'gcr-combo-selector.h',
- 'gcr-deprecated.h',
- 'gcr-failure-renderer.h',
- 'gcr-key-renderer.h',
- 'gcr-key-widget.h',
- 'gcr-import-button.h',
- 'gcr-list-selector.h',
- 'gcr-prompt-dialog.h',
- 'gcr-renderer.h',
- 'gcr-secure-entry-buffer.h',
- 'gcr-tree-selector.h',
- 'gcr-unlock-options-widget.h',
- 'gcr-viewer.h',
- 'gcr-viewer-widget.h',
-)
-
-gcr_ui_deprecated_headers = files(
- 'gcr-certificate-basics-widget.h',
- 'gcr-certificate-details-widget.h',
-)
-
-# Generated sources
-gcr_ui_enums_gen = gnome.mkenums_simple('gcr-enum-types',
- sources: gcr_ui_headers,
- install_header: true,
- install_dir: get_option('includedir') / gcr_ui_headers_install_dir,
-)
-
-gcr_ui_sources = [
- gcr_ui_private_sources,
- gcr_ui_public_sources,
- gcr_ui_enums_gen,
-]
-
-gcr_ui_deps = [
- glib_deps,
- p11kit_dep,
- libegg_dep,
- gck_dep,
- gcr_base_dep,
- gtk_dep,
-]
-
-gcr_ui_cflags = [
- '-DG_LOG_DOMAIN="Gcr"',
- '-DGCR_COMPILATION',
- '-DGCR_API_SUBJECT_TO_CHANGE',
- '-DGCK_API_SUBJECT_TO_CHANGE',
- '-DP11_KIT_API_SUBJECT_TO_CHANGE',
-]
-
-gcr_ui_symbolmap = meson.current_source_dir() / 'libgcr-ui.map'
-gcr_ui_linkflags = cc.get_supported_link_arguments(
- '-Wl,--version-script,@0@'.format(gcr_ui_symbolmap),
-)
-
-# gcr-XX is just the same as gcr-ui-XX
-gcr_ui_lib = shared_library(gcr_ui_basename,
- gcr_ui_sources,
- dependencies: gcr_ui_deps,
- c_args: gcr_ui_cflags,
- link_args: gcr_ui_linkflags,
- link_depends: gcr_ui_symbolmap,
- include_directories: config_h_dir,
- version: gcr_soversion,
- install: true,
-)
-
-gcr_ui_pkgconf_deps = [
- glib_dep,
- gio_dep,
- gobject_dep,
- gck_lib,
- gcr_base_lib,
- gtk_dep,
-]
-pkgconfig.generate(gcr_ui_lib,
- subdirs: gcr_base_headers_subdir,
- requires: gcr_ui_pkgconf_deps,
- description: 'GObject and GUI library for high level crypto parsing and display',
-)
-pkgconfig.generate(gcr_ui_lib,
- filebase: gcr_basename,
- name: gcr_basename,
- subdirs: gcr_base_headers_subdir,
- requires: gcr_ui_pkgconf_deps,
- description: 'GObject and GUI library for high level crypto parsing and display',
-)
-
-install_headers([gcr_ui_headers, gcr_ui_deprecated_headers ],
- subdir: gcr_ui_headers_install_dir,
-)
-
-gcr_ui_dep = declare_dependency(
- link_with: gcr_ui_lib,
- sources: gcr_ui_enums_gen[1], # Make sure gcr-enum-types.h can be included
-)
-
-if get_option('introspection')
- gcr_ui_gir = gnome.generate_gir(gcr_ui_lib,
- sources: [ gcr_ui_headers, gcr_ui_public_sources ],
- namespace: 'GcrUi',
- nsversion: gcr_api_version,
- export_packages: gcr_ui_basename,
- identifier_prefix: 'Gcr',
- symbol_prefix: 'gcr',
- includes: [
- 'GObject-2.0',
- 'Gio-2.0',
- 'Gtk-3.0',
- gck_gir[0],
- gcr_gir[0],
- ],
- header: 'ui/gcr-ui.h',
- extra_args: [
- '-DGCR_COMPILATION',
- '-DGCR_API_SUBJECT_TO_CHANGE',
- ],
- install: true,
- )
-
- gcr_ui_vapi = gnome.generate_vapi(gcr_ui_basename,
- sources: gcr_ui_gir[0],
- packages: [
- 'glib-2.0',
- 'gio-2.0',
- gck_vapi,
- gcr_vapi,
- 'gtk+-3.0'
- ],
- metadata_dirs: meson.current_source_dir(),
- vapi_dirs: [
- build_root / 'gck',
- build_root / 'gcr',
- ],
- gir_dirs: [
- build_root / 'gck',
- build_root / 'gcr',
- ],
- install: true,
- )
-endif
-
-# gcr-viewer
-gcr_viewer = executable('gcr-viewer',
- 'gcr-viewer-tool.c',
- dependencies: [ gcr_ui_dep, gcr_ui_deps ],
- c_args: gcr_ui_cflags,
- include_directories: config_h_dir,
- install: true,
-)
-
-i18n.merge_file(
- input: configure_file(
- input: 'gcr-viewer.desktop.in.in',
- output: '@BASENAME@',
- configuration: { 'bindir': gcr_prefix / get_option('bindir') },
- ),
- output: '@BASENAME@',
- type: 'desktop',
- po_dir: podir,
- install: true,
- install_dir: get_option('datadir') / 'applications',
-)
-
-# gcr-prompter
-gcr_prompter = executable('gcr-prompter',
- 'gcr-prompter-tool.c',
- dependencies: [ gcr_ui_dep, gcr_ui_deps ],
- c_args: gcr_ui_cflags,
- include_directories: config_h_dir,
- install: true,
- install_dir: get_option('libexecdir'),
-)
-
-i18n.merge_file(
- input: configure_file(
- input: 'gcr-prompter.desktop.in.in',
- output: '@BASENAME@',
- configuration: { 'libexecdir': gcr_prefix / get_option('libexecdir') },
- ),
- output: '@BASENAME@',
- type: 'desktop',
- po_dir: podir,
- install: true,
- install_dir: get_option('datadir') / 'applications',
-)
-
-# Register new mime types
-install_data('gcr-crypto-types.xml',
- install_dir: get_option('datadir') / 'mime' / 'packages',
-)
-
-# Manual UI testing programs
-gcr_ui_manual_tests = [
- 'frob-certificate',
- 'frob-combo-selector',
- 'frob-gnupg-selector',
- 'frob-import-button',
- 'frob-key',
- 'frob-tree-selector',
- 'frob-prompt',
- 'frob-request',
- 'frob-system-prompt',
- 'frob-unlock',
- 'frob-unlock-options',
-]
-
-gcr_ui_test_cflags = [
- '-DSRCDIR="@0@"'.format(source_root),
-]
-
-foreach _test : gcr_ui_manual_tests
- test_bin = executable('test-'+_test,
- '@0@.c'.format(_test),
- dependencies: [ gcr_ui_deps, gcr_ui_dep ],
- c_args: [ gcr_ui_cflags, gcr_ui_test_cflags ],
- include_directories: config_h_dir,
- )
-endforeach