diff --git a/internal/gui/pinChange.go b/internal/gui/pinChange.go index 7c54fab..d6690e8 100644 --- a/internal/gui/pinChange.go +++ b/internal/gui/pinChange.go @@ -7,6 +7,7 @@ import ( "fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/widget" "github.com/ubavic/bas-celik/card" + "github.com/ubavic/bas-celik/internal/gui/reader" "github.com/ubavic/bas-celik/internal/gui/widgets" "github.com/ubavic/bas-celik/internal/logger" ) @@ -78,6 +79,7 @@ func pinForm(win fyne.Window) { return } + reader.CancelReaderPoler() err := gemaltoCard.ChangePin(newPinEntry.Text, oldPinEntry.Text) if err != nil { pinDialog.Hide() @@ -89,6 +91,7 @@ func pinForm(win fyne.Window) { dialog.ShowInformation(t("pinChange.title"), t("pinChange.success"), win) logger.Info("pin changed") } + reader.RestartReaderPoler() }, CancelText: t("pinChange.cancel"), OnCancel: func() { diff --git a/internal/gui/reader/poller.go b/internal/gui/reader/poller.go index 87d57c7..ed3331a 100644 --- a/internal/gui/reader/poller.go +++ b/internal/gui/reader/poller.go @@ -9,6 +9,7 @@ import ( ) var created = false +var createdPoller *ReaderPoller type ReaderPoller struct { readerListerContext *scard.Context @@ -50,7 +51,9 @@ func NewPoller(readerLister ReaderLister, onCardEvent func(string, *scard.Contex readerLister.HookReaderChange(poller.SetReader) - return &poller, nil + createdPoller = &poller + + return createdPoller, nil } func (rp *ReaderPoller) StartPoller() { @@ -105,13 +108,11 @@ func (rp *ReaderPoller) SetReader(newReader string) { rp.readerPollerStarted.Store(false) rp.singleReaderContext.Cancel() } + rp.onCardEvent(newReader, rp.singleReaderContext) go rp.readerPoller(newReader) } func (rp *ReaderPoller) readerPoller(selectedReader string) { - - rp.onCardEvent(selectedReader, rp.singleReaderContext) - for { if selectedReader == "" { return @@ -138,3 +139,14 @@ func (rp *ReaderPoller) readerPoller(selectedReader string) { rp.onCardEvent(selectedReader, rp.singleReaderContext) } } + +func CancelReaderPoler() { + if createdPoller.readerPollerStarted.Load() { + createdPoller.readerPollerStarted.Store(false) + createdPoller.singleReaderContext.Cancel() + } +} + +func RestartReaderPoler() { + go createdPoller.readerPoller(createdPoller.currentReader) +}