plumbing for fetching certificates on demand

auto-update
Zlatin Balevsky 2021-10-26 07:59:09 +01:00
parent 4f471f7144
commit c3f9663f84
No known key found for this signature in database
GPG Key ID: A72832072D525E41
4 changed files with 141 additions and 4 deletions

View File

@ -5,5 +5,5 @@ import griffon.metadata.ArtifactProviderFor
@ArtifactProviderFor(GriffonController) @ArtifactProviderFor(GriffonController)
class ResultDetailsController { class ResultDetailsController {
} }

View File

@ -286,6 +286,7 @@ COPY_NAME_TO_CLIPBOARD=Copy name to clipboard
YOU_ALREADY_HAVE_FILE=You already have {0} copies of this file YOU_ALREADY_HAVE_FILE=You already have {0} copies of this file
RESULTS_CAME_FROM=Results came from the following users RESULTS_CAME_FROM=Results came from the following users
SELECT_SENDER=Select a sender to see additional details SELECT_SENDER=Select a sender to see additional details
SENDER_HAS_CERTIFICATES=This sender claims to have {0} certificate(s) for this file.
## Options pane ## Options pane

View File

@ -2,7 +2,14 @@ package com.muwire.gui
import com.muwire.core.Core import com.muwire.core.Core
import com.muwire.core.InfoHash import com.muwire.core.InfoHash
import com.muwire.core.Persona
import com.muwire.core.SharedFile import com.muwire.core.SharedFile
import com.muwire.core.collections.FileCollection
import com.muwire.core.filecert.Certificate
import com.muwire.core.filecert.CertificateFetchEvent
import com.muwire.core.filecert.CertificateFetchStatus
import com.muwire.core.filecert.CertificateFetchedEvent
import com.muwire.core.filecert.UIFetchCertificatesEvent
import com.muwire.core.search.UIResultEvent import com.muwire.core.search.UIResultEvent
import griffon.core.artifact.GriffonModel import griffon.core.artifact.GriffonModel
import griffon.inject.MVCMember import griffon.inject.MVCMember
@ -10,6 +17,7 @@ import griffon.metadata.ArtifactProviderFor
import net.i2p.data.Base64 import net.i2p.data.Base64
import javax.annotation.Nonnull import javax.annotation.Nonnull
import javax.swing.table.DefaultTableModel
@ArtifactProviderFor(GriffonModel) @ArtifactProviderFor(GriffonModel)
class ResultDetailsModel { class ResultDetailsModel {
@ -25,6 +33,11 @@ class ResultDetailsModel {
String key String key
List<SharedFile> localFiles List<SharedFile> localFiles
Map<Persona, CertsModel> certificates
Map<Persona, List<FileCollection>> collections
private boolean registeredForCertificates, registeredForCollections
void mvcGroupInit(Map<String,String> args) { void mvcGroupInit(Map<String,String> args) {
key = fileName + Base64.encode(infoHash.getRoot()) key = fileName + Base64.encode(infoHash.getRoot())
SharedFile[] locals = core.fileManager.getSharedFiles(infoHash.getRoot()) SharedFile[] locals = core.fileManager.getSharedFiles(infoHash.getRoot())
@ -32,5 +45,70 @@ class ResultDetailsModel {
localFiles = Collections.emptyList() localFiles = Collections.emptyList()
else else
localFiles = Arrays.asList(locals) localFiles = Arrays.asList(locals)
certificates = new HashMap<>()
collections = new HashMap<>()
}
void mvcGroupDestroy() {
if (registeredForCertificates) {
core.eventBus.unregister(CertificateFetchEvent.class, this)
core.eventBus.unregister(CertificateFetchedEvent.class, this)
}
}
void registerForCollections(Persona sender) {
if (registeredForCollections)
return
registeredForCollections = true
// TODO: finish
}
CertsModel registerForCertificates(Persona persona) {
if (certificates.containsKey(persona))
return null
if (!registeredForCertificates) {
registeredForCertificates = true
core.eventBus.with {
register(CertificateFetchEvent.class, this)
register(CertificateFetchedEvent.class, this)
}
}
def rv = new CertsModel()
certificates.put(persona, rv)
core.eventBus.publish(new UIFetchCertificatesEvent(host: persona, infoHash: infoHash))
return rv
}
void onCertificateFetchEvent(CertificateFetchEvent event) {
if (event.infoHash != infoHash)
return
runInsideUIAsync {
CertsModel model = certificates.get(event.user)
if (model == null)
return
model.status = event.status
if (event.status == CertificateFetchStatus.FETCHING)
model.count = event.count
view.refreshCertificates()
}
}
void onCertificateFetchedEvent(CertificateFetchedEvent event) {
if (event.infoHash != infoHash)
return
runInsideUIAsync {
CertsModel model = certificates.get(event.user)
if (model == null)
return
model.certificates << event.certificate
view.refreshCertificates()
}
}
static class CertsModel {
CertificateFetchStatus status
int count
final List<Certificate> certificates = new ArrayList<>()
} }
} }

View File

@ -1,14 +1,18 @@
package com.muwire.gui package com.muwire.gui
import com.muwire.core.filecert.Certificate
import com.muwire.core.search.UIResultEvent import com.muwire.core.search.UIResultEvent
import com.muwire.gui.ResultDetailsModel.CertsModel
import griffon.core.artifact.GriffonView import griffon.core.artifact.GriffonView
import griffon.inject.MVCMember import griffon.inject.MVCMember
import griffon.metadata.ArtifactProviderFor import griffon.metadata.ArtifactProviderFor
import net.i2p.data.DataHelper import net.i2p.data.DataHelper
import javax.annotation.Nonnull import javax.annotation.Nonnull
import javax.swing.JCheckBox import javax.swing.JButton
import javax.swing.JLabel
import javax.swing.JPanel import javax.swing.JPanel
import javax.swing.JScrollPane
import javax.swing.JTabbedPane import javax.swing.JTabbedPane
import javax.swing.JTable import javax.swing.JTable
import javax.swing.ListSelectionModel import javax.swing.ListSelectionModel
@ -31,6 +35,8 @@ class ResultDetailsView {
JPanel senderDetailsPanel JPanel senderDetailsPanel
JTabbedPane tabs JTabbedPane tabs
List<CertsPanel> certsPanelList = []
void initUI() { void initUI() {
int rowHeight = application.context.get("row-height") int rowHeight = application.context.get("row-height")
p = builder.panel { p = builder.panel {
@ -120,8 +126,28 @@ class ResultDetailsView {
tabs.addTab(trans("COMMENT"),commentPanel) tabs.addTab(trans("COMMENT"),commentPanel)
} }
if (event.certificates > 0) { if (event.certificates > 0) {
def certsPanel = builder.panel { def certsPanel
label(text: "TODO fetch certs") if (model.certificates.containsKey(event.sender)) {
certsPanel = new CertsPanel(model.certificates[event.sender])
certsPanel.setPreferredSize(tabs.getPreferredSize())
certsPanel.refresh()
} else {
certsPanel = builder.panel {
cardLayout()
panel(constraints: "fetch-certificates") {
label(text: trans("SENDER_HAS_CERTIFICATES", event.certificates))
JButton fetchButton = button(text : trans("VIEW_CERTIFICATES"))
fetchButton.addActionListener( {
def certsModel = model.registerForCertificates(event.sender)
def newCertsPanel = new CertsPanel(certsModel)
certsPanelList << newCertsPanel
newCertsPanel.setPreferredSize(certsPanel.getPreferredSize())
certsPanel.add(newCertsPanel, "view-certificates")
certsPanel.getLayout().last(certsPanel)
newCertsPanel.refresh()
})
}
}
} }
tabs.addTab(trans("CERTIFICATES"), certsPanel) tabs.addTab(trans("CERTIFICATES"), certsPanel)
} }
@ -150,4 +176,36 @@ class ResultDetailsView {
def showSelectSender = { def showSelectSender = {
senderDetailsPanel.getLayout().show(senderDetailsPanel, "select-sender") senderDetailsPanel.getLayout().show(senderDetailsPanel, "select-sender")
} }
void refreshCertificates() {
certsPanelList.each {it.refresh()}
}
private class CertsPanel extends JPanel {
private final ResultDetailsModel.CertsModel model
private final JLabel statusLabel
private JTable certsTable
CertsPanel(ResultDetailsModel.CertsModel model) {
this.model = model
setLayout(new BorderLayout())
statusLabel = new JLabel()
add(statusLabel, BorderLayout.NORTH)
JScrollPane scrollPane = builder.scrollPane {
certsTable = builder.table {
tableModel(list: model.certificates) {
closureColumn(header: trans("NAME"), read: { Certificate c -> c.name.name })
}
}
}
add(scrollPane, BorderLayout.CENTER)
}
void refresh() {
if (model.status != null)
statusLabel.setText(trans(model.status.name()))
certsTable.model.fireTableDataChanged()
}
}
} }