diff --git a/build.gradle b/build.gradle index b694b3a6..917e042c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,21 +1,23 @@ /* - * ****************************************************************************** - * sdrtrunk - * Copyright (C) 2014-2019 Dennis Sheirer * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * * ****************************************************************************** + * * Copyright (C) 2014-2019 Dennis Sheirer + * * + * * This program is free software: you can redistribute it and/or modify + * * it under the terms of the GNU General Public License as published by + * * the Free Software Foundation, either version 3 of the License, or + * * (at your option) any later version. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License for more details. + * * + * * You should have received a copy of the GNU General Public License + * * along with this program. If not, see + * * ***************************************************************************** * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - * ***************************************************************************** */ plugins { id 'application' @@ -52,10 +54,9 @@ dependencies { compile 'com.google.guava:guava:27.0.1-jre' compile 'com.jidesoft:jide-oss:3.6.18' compile 'com.miglayout:miglayout-swing:5.2' + compile 'io.github.dsheirer:radio-reference-api:15.0.1' compile 'javax.usb:usb-api:1.0.2' compile 'net.coderazzi:tablefilter-swing:5.4.0' - compile 'org.apache.axis:axis:1.4' - compile 'org.apache.axis:axis-jaxrpc:1.4' compile 'org.apache.commons:commons-lang3:3.8.1' compile 'org.apache.commons:commons-io:1.3.2' compile 'org.apache.mina:mina-core:2.0.19' diff --git a/imports/radioreference-14.jar b/imports/radioreference-14.jar deleted file mode 100644 index 2c7a5d90..00000000 Binary files a/imports/radioreference-14.jar and /dev/null differ diff --git a/imports/wsdl4j-1.5.1.jar b/imports/wsdl4j-1.5.1.jar deleted file mode 100644 index c6254ee6..00000000 Binary files a/imports/wsdl4j-1.5.1.jar and /dev/null differ diff --git a/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastFactory.java b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastFactory.java index bacd227b..69688d34 100644 --- a/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastFactory.java +++ b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastFactory.java @@ -1,21 +1,24 @@ -/******************************************************************************* - * sdrtrunk - * Copyright (C) 2014-2016 Dennis Sheirer +/* * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * * ****************************************************************************** + * * Copyright (C) 2014-2019 Dennis Sheirer + * * + * * This program is free software: you can redistribute it and/or modify + * * it under the terms of the GNU General Public License as published by + * * the Free Software Foundation, either version 3 of the License, or + * * (at your option) any later version. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License for more details. + * * + * * You should have received a copy of the GNU General Public License + * * along with this program. If not, see + * * ***************************************************************************** * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - * - ******************************************************************************/ + */ package io.github.dsheirer.audio.broadcast; import io.github.dsheirer.alias.AliasModel; @@ -40,6 +43,7 @@ import io.github.dsheirer.audio.convert.MP3SilenceGenerator; import io.github.dsheirer.gui.editor.Editor; import io.github.dsheirer.gui.editor.EmptyEditor; import io.github.dsheirer.icon.IconManager; +import io.github.dsheirer.preference.UserPreferences; import io.github.dsheirer.record.AudioRecorder; import io.github.dsheirer.record.mp3.MP3Recorder; import org.slf4j.Logger; @@ -147,7 +151,8 @@ public class BroadcastFactory * @param broadcastModel model for broadcastAudio configurations * @return an editor for the specified broadcastAudio configuration */ - public static Editor getEditor(BroadcastConfiguration configuration, + public static Editor getEditor(UserPreferences userPreferences, + BroadcastConfiguration configuration, BroadcastModel broadcastModel, AliasModel aliasModel, IconManager iconManager) @@ -157,7 +162,7 @@ public class BroadcastFactory switch(configuration.getBroadcastServerType()) { case BROADCASTIFY: - editor = new BroadcastifyConfigurationEditor(broadcastModel, aliasModel, iconManager); + editor = new BroadcastifyConfigurationEditor(userPreferences, broadcastModel, aliasModel, iconManager); break; case ICECAST_TCP: editor = new IcecastTCPConfigurationEditor(broadcastModel, aliasModel, iconManager); diff --git a/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastModel.java b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastModel.java index 564c1d68..70dc3983 100644 --- a/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastModel.java +++ b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastModel.java @@ -1,21 +1,23 @@ /* - * ****************************************************************************** - * sdrtrunk - * Copyright (C) 2014-2018 Dennis Sheirer * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * * ****************************************************************************** + * * Copyright (C) 2014-2019 Dennis Sheirer + * * + * * This program is free software: you can redistribute it and/or modify + * * it under the terms of the GNU General Public License as published by + * * the Free Software Foundation, either version 3 of the License, or + * * (at your option) any later version. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License for more details. + * * + * * You should have received a copy of the GNU General Public License + * * along with this program. If not, see + * * ***************************************************************************** * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - * ***************************************************************************** */ package io.github.dsheirer.audio.broadcast; @@ -586,12 +588,20 @@ public class BroadcastModel extends AbstractTableModel implements Listener getColumnClass(int columnIndex) { - if(columnIndex == COLUMN_SERVER_ICON) + switch(columnIndex) { - return ImageIcon.class; + case COLUMN_BROADCASTER_STATUS: + return BroadcastState.class; + case COLUMN_BROADCASTER_AGED_OFF_COUNT: + case COLUMN_BROADCASTER_QUEUE_SIZE: + case COLUMN_BROADCASTER_STREAMED_COUNT: + return Integer.class; + case COLUMN_SERVER_ICON: + return ImageIcon.class; + case COLUMN_STREAM_NAME: + default: + return String.class; } - - return String.class; } /** diff --git a/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastPanel.java b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastPanel.java index e1b8a9f1..1c4f643e 100644 --- a/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastPanel.java +++ b/src/main/java/io/github/dsheirer/audio/broadcast/BroadcastPanel.java @@ -1,21 +1,23 @@ /* - * ****************************************************************************** - * sdrtrunk - * Copyright (C) 2014-2019 Dennis Sheirer * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * * ****************************************************************************** + * * Copyright (C) 2014-2019 Dennis Sheirer + * * + * * This program is free software: you can redistribute it and/or modify + * * it under the terms of the GNU General Public License as published by + * * the Free Software Foundation, either version 3 of the License, or + * * (at your option) any later version. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License for more details. + * * + * * You should have received a copy of the GNU General Public License + * * along with this program. If not, see + * * ***************************************************************************** * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - * ***************************************************************************** */ package io.github.dsheirer.audio.broadcast; @@ -216,8 +218,8 @@ public class BroadcastPanel extends JPanel implements ActionListener, ListSelect if (selectedConfiguration != null) { - mEditor = BroadcastFactory.getEditor(selectedConfiguration, mBroadcastModel, mAliasModel, - mIconManager); + mEditor = BroadcastFactory.getEditor(mUserPreferences, selectedConfiguration, mBroadcastModel, + mAliasModel, mIconManager); } else { diff --git a/src/main/java/io/github/dsheirer/audio/broadcast/broadcastify/BroadcastifyConfigurationEditor.java b/src/main/java/io/github/dsheirer/audio/broadcast/broadcastify/BroadcastifyConfigurationEditor.java index f90ab827..b1fd16ea 100644 --- a/src/main/java/io/github/dsheirer/audio/broadcast/broadcastify/BroadcastifyConfigurationEditor.java +++ b/src/main/java/io/github/dsheirer/audio/broadcast/broadcastify/BroadcastifyConfigurationEditor.java @@ -1,24 +1,26 @@ -/******************************************************************************* - * sdrtrunk - * Copyright (C) 2014-2016 Dennis Sheirer +/* * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * * ****************************************************************************** + * * Copyright (C) 2014-2019 Dennis Sheirer + * * + * * This program is free software: you can redistribute it and/or modify + * * it under the terms of the GNU General Public License as published by + * * the Free Software Foundation, either version 3 of the License, or + * * (at your option) any later version. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License for more details. + * * + * * You should have received a copy of the GNU General Public License + * * along with this program. If not, see + * * ***************************************************************************** * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - * - ******************************************************************************/ + */ package io.github.dsheirer.audio.broadcast.broadcastify; -import com.radioreference.api.soap2.UserFeedBroadcast; import io.github.dsheirer.alias.AliasModel; import io.github.dsheirer.audio.broadcast.BroadcastConfiguration; import io.github.dsheirer.audio.broadcast.BroadcastConfigurationEditor; @@ -26,6 +28,8 @@ import io.github.dsheirer.audio.broadcast.BroadcastEvent; import io.github.dsheirer.audio.broadcast.BroadcastModel; import io.github.dsheirer.audio.broadcast.BroadcastServerType; import io.github.dsheirer.icon.IconManager; +import io.github.dsheirer.preference.UserPreferences; +import io.github.dsheirer.rrapi.type.UserFeedBroadcast; import io.github.dsheirer.sample.Listener; import net.miginfocom.swing.MigLayout; import org.slf4j.Logger; @@ -64,10 +68,13 @@ public class BroadcastifyConfigurationEditor extends BroadcastConfigurationEdito private JCheckBox mEnabled; private JButton mSaveButton; private JButton mResetButton; + private UserPreferences mUserPreferences; - public BroadcastifyConfigurationEditor(BroadcastModel broadcastModel, AliasModel aliasModel, IconManager iconManager) + public BroadcastifyConfigurationEditor(UserPreferences userPreferences, BroadcastModel broadcastModel, + AliasModel aliasModel, IconManager iconManager) { super(broadcastModel, aliasModel, iconManager); + mUserPreferences = userPreferences; init(); } @@ -91,7 +98,7 @@ public class BroadcastifyConfigurationEditor extends BroadcastConfigurationEdito @Override public void actionPerformed(ActionEvent e) { - final UserFeedSelectionDialog dialog = new UserFeedSelectionDialog(BroadcastifyConfigurationEditor.this); + final UserFeedSelectionDialog dialog = new UserFeedSelectionDialog(mUserPreferences,BroadcastifyConfigurationEditor.this); EventQueue.invokeLater(new Runnable() { @@ -391,7 +398,7 @@ public class BroadcastifyConfigurationEditor extends BroadcastConfigurationEdito @Override public void receive(UserFeedBroadcast userFeedBroadcast) { - mName.setText(userFeedBroadcast.getDescr()); + mName.setText(userFeedBroadcast.getDescription()); mServer.setText(userFeedBroadcast.getHostname()); mPort.setText(userFeedBroadcast.getPort()); mMountPoint.setText(userFeedBroadcast.getMount()); diff --git a/src/main/java/io/github/dsheirer/audio/broadcast/broadcastify/UserFeedSelectionDialog.java b/src/main/java/io/github/dsheirer/audio/broadcast/broadcastify/UserFeedSelectionDialog.java index 566ecc30..24e56907 100644 --- a/src/main/java/io/github/dsheirer/audio/broadcast/broadcastify/UserFeedSelectionDialog.java +++ b/src/main/java/io/github/dsheirer/audio/broadcast/broadcastify/UserFeedSelectionDialog.java @@ -1,78 +1,155 @@ -/******************************************************************************* - * sdrtrunk - * Copyright (C) 2014-2016 Dennis Sheirer +/* * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * * ****************************************************************************** + * * Copyright (C) 2014-2019 Dennis Sheirer + * * + * * This program is free software: you can redistribute it and/or modify + * * it under the terms of the GNU General Public License as published by + * * the Free Software Foundation, either version 3 of the License, or + * * (at your option) any later version. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License for more details. + * * + * * You should have received a copy of the GNU General Public License + * * along with this program. If not, see + * * ***************************************************************************** * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - * - ******************************************************************************/ + */ package io.github.dsheirer.audio.broadcast.broadcastify; -import com.radioreference.api.soap2.UserFeedBroadcast; -import io.github.dsheirer.radioreference.RadioReferenceService; +import com.google.common.eventbus.Subscribe; +import io.github.dsheirer.eventbus.MyEventBus; +import io.github.dsheirer.preference.PreferenceType; +import io.github.dsheirer.preference.UserPreferences; +import io.github.dsheirer.rrapi.RadioReferenceException; +import io.github.dsheirer.rrapi.RadioReferenceService; +import io.github.dsheirer.rrapi.type.AuthorizationInformation; +import io.github.dsheirer.rrapi.type.UserFeedBroadcast; +import io.github.dsheirer.rrapi.type.UserInfo; import io.github.dsheirer.sample.Listener; import net.miginfocom.swing.MigLayout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.swing.*; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.ListCellRenderer; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import javax.xml.rpc.ServiceException; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.net.UnknownHostException; -import java.rmi.RemoteException; +import java.util.List; public class UserFeedSelectionDialog extends JDialog implements DocumentListener { private final static Logger mLog = LoggerFactory.getLogger( UserFeedSelectionDialog.class ); + public static final String SDRTRUNK_APP_KEY = "88969092"; + private Listener mListener; + private UserPreferences mUserPreferences; private JTextField mUserNameText; private JTextField mPasswordText; + private JCheckBox mSaveCredentialsCheckBox; + private JButton mClearStoredCredentialsButton; private JButton mLookupButton; private JList mUserFeedBroadcastList; private JButton mOKButton; - public UserFeedSelectionDialog(Listener listener) + public UserFeedSelectionDialog(UserPreferences userPreferences, Listener listener) { + mUserPreferences = userPreferences; mListener = listener; + + //Register to receive radio reference preferences updates + MyEventBus.getEventBus().register(this); + init(); } private void init() { JPanel panel = new JPanel(); - panel.setLayout(new MigLayout("","[align right,grow,fill][align left,grow,fill][]","[][][][][grow][]")); + panel.setLayout(new MigLayout("","[align right,grow,fill][align left,grow,fill][]","[][][][][][grow][]")); panel.add(new JLabel("Please enter your credentials"), "align left,span"); panel.add(new JLabel("User Name:")); mUserNameText = new JTextField(); + String storedUserName = mUserPreferences.getRadioReferencePreference().getUserName(); + if(storedUserName != null) + { + mUserNameText.setText(storedUserName); + } mUserNameText.getDocument().addDocumentListener(this); panel.add(mUserNameText, "wrap"); panel.add(new JLabel("Password:")); mPasswordText = new JTextField(); + String storedPassword = mUserPreferences.getRadioReferencePreference().getPassword(); + if(storedPassword != null) + { + mPasswordText.setText(storedPassword); + } mPasswordText.getDocument().addDocumentListener(this); panel.add(mPasswordText, "wrap"); + mSaveCredentialsCheckBox = new JCheckBox("Store Credentials"); + mSaveCredentialsCheckBox.setSelected(mUserPreferences.getRadioReferencePreference().isStoreCredentials()); + mSaveCredentialsCheckBox.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + //If user unchecks box and there are stored credentials, prompt to clear them + if(!mSaveCredentialsCheckBox.isSelected() && mUserPreferences.getRadioReferencePreference().hasStoredCredentials()) + { + int choice = JOptionPane.showOptionDialog(UserFeedSelectionDialog.this, + "Would you like to remove previously stored credentials from this computer?", + "Clear Stored Credentials?", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, + null, null, 0); + + if(choice == JOptionPane.YES_OPTION) + { + mUserPreferences.getRadioReferencePreference().removeStoreCredentials(); + } + } + } + }); + panel.add(mSaveCredentialsCheckBox); + + mClearStoredCredentialsButton = new JButton("Remove"); + mClearStoredCredentialsButton.setToolTipText("Clear stored credentials"); + mClearStoredCredentialsButton.setEnabled(mUserPreferences.getRadioReferencePreference().hasStoredCredentials()); + mClearStoredCredentialsButton.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + mUserPreferences.getRadioReferencePreference().removeStoreCredentials(); + } + }); + panel.add(mClearStoredCredentialsButton, "wrap"); + mLookupButton = new JButton("Get Feeds"); - mLookupButton.setEnabled(false); + mLookupButton.setEnabled(storedPassword != null && storedPassword != null); mLookupButton.addActionListener(new ActionListener() { @Override @@ -87,45 +164,25 @@ public class UserFeedSelectionDialog extends JDialog implements DocumentListener { try { - RadioReferenceService service = - new RadioReferenceService(mUserNameText.getText(), mPasswordText.getText()); + AuthorizationInformation authorizationInformation = new AuthorizationInformation(SDRTRUNK_APP_KEY, + mUserNameText.getText(), mPasswordText.getText()); - UserFeedBroadcast[] feeds = service.getUserFeedBroadcasts(); + mLog.debug("User:" + authorizationInformation.getUserName() + " Pass:" + authorizationInformation.getPassword() + " Key:" + authorizationInformation.getApplicationKey()); - mUserFeedBroadcastList.setListData(feeds); + RadioReferenceService service = new RadioReferenceService(authorizationInformation); + UserInfo userInfo = service.getUserInfo(); + mLog.info("RR User:" + userInfo.getUserName() + " Expiration Date:" + userInfo.getExpirationDate()); + List feeds = service.getUserFeeds(); + + mUserFeedBroadcastList.setListData(feeds.toArray(new UserFeedBroadcast[feeds.size()])); } - catch(ServiceException se) + catch(RadioReferenceException rre) { JOptionPane.showMessageDialog(UserFeedSelectionDialog.this, "Unable to create radio reference web service client. See log file.", "Error", JOptionPane.ERROR_MESSAGE); - mLog.error("Error creating the radio reference web service client", se); - } - catch(RemoteException re) - { - Throwable cause = re.getCause(); - - if(cause == null) - { - JOptionPane.showMessageDialog(UserFeedSelectionDialog.this, - re.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); - } - else if(cause instanceof UnknownHostException) - { - JOptionPane.showMessageDialog(UserFeedSelectionDialog.this, - "Broadcastify server is unavailable", "No Server", - JOptionPane.ERROR_MESSAGE); - } - else - { - JOptionPane.showMessageDialog(UserFeedSelectionDialog.this, - "An unknown error has occurred. Please see log file.", "" + - "Unknown Error", JOptionPane.ERROR_MESSAGE); - - mLog.error("Error retrieving user broadcast feed configurations from radio reference " + - "service: ", re); - } + mLog.error("Error creating the radio reference web service client", rre); } mLookupButton.setEnabled(true); @@ -160,6 +217,7 @@ public class UserFeedSelectionDialog extends JDialog implements DocumentListener { if(mListener != null) { + storeCredentials(); mListener.receive((UserFeedBroadcast)mUserFeedBroadcastList.getSelectedValue()); } @@ -182,11 +240,37 @@ public class UserFeedSelectionDialog extends JDialog implements DocumentListener setTitle("Broadcastify Feed Lookup"); setLayout(new BorderLayout()); add(panel, BorderLayout.CENTER); - setSize(300,250); + setSize(400,450); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setModalityType(ModalityType.APPLICATION_MODAL); } + /** + * Stores login credentials in the user preferences + */ + private void storeCredentials() + { + boolean store = mSaveCredentialsCheckBox.isSelected(); + mUserPreferences.getRadioReferencePreference().setStoreCredentials(store); + + if(store) + { + String userName = mUserNameText.getText(); + + if(userName != null) + { + mUserPreferences.getRadioReferencePreference().setUserName(userName); + } + + String password = mPasswordText.getText(); + + if(password != null) + { + mUserPreferences.getRadioReferencePreference().setPassword(password); + } + } + } + private void updateButtons() { String username = mUserNameText.getText(); @@ -240,8 +324,20 @@ public class UserFeedSelectionDialog extends JDialog implements DocumentListener setForeground(list.getForeground()); } - setText(value.getDescr()); + setText(value.getDescription()); - return this; } + return this; + } + } + + @Subscribe + public void preferenceUpdated(PreferenceType preferenceType) + { + if(preferenceType == PreferenceType.RADIO_REFERENCE) + { + //Update the store-credentials checkbox only, so we don't change the username or password currently displayed + mSaveCredentialsCheckBox.setSelected(mUserPreferences.getRadioReferencePreference().isStoreCredentials()); + mClearStoredCredentialsButton.setEnabled(mUserPreferences.getRadioReferencePreference().hasStoredCredentials()); + } } } diff --git a/src/main/java/io/github/dsheirer/preference/PreferenceType.java b/src/main/java/io/github/dsheirer/preference/PreferenceType.java index a0be3509..c17a5885 100644 --- a/src/main/java/io/github/dsheirer/preference/PreferenceType.java +++ b/src/main/java/io/github/dsheirer/preference/PreferenceType.java @@ -1,21 +1,23 @@ /* - * ****************************************************************************** - * sdrtrunk - * Copyright (C) 2014-2019 Dennis Sheirer * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * * ****************************************************************************** + * * Copyright (C) 2014-2019 Dennis Sheirer + * * + * * This program is free software: you can redistribute it and/or modify + * * it under the terms of the GNU General Public License as published by + * * the Free Software Foundation, either version 3 of the License, or + * * (at your option) any later version. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License for more details. + * * + * * You should have received a copy of the GNU General Public License + * * along with this program. If not, see + * * ***************************************************************************** * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - * ***************************************************************************** */ package io.github.dsheirer.preference; @@ -26,9 +28,10 @@ package io.github.dsheirer.preference; public enum PreferenceType { DECODE_EVENT, - JMBE_LIBRARY, DIRECTORY, IDENTIFIER, + JMBE_LIBRARY, MULTI_FREQUENCY, + RADIO_REFERENCE, TUNER; } diff --git a/src/main/java/io/github/dsheirer/preference/UserPreferences.java b/src/main/java/io/github/dsheirer/preference/UserPreferences.java index 2474d90e..0682f3b7 100644 --- a/src/main/java/io/github/dsheirer/preference/UserPreferences.java +++ b/src/main/java/io/github/dsheirer/preference/UserPreferences.java @@ -1,21 +1,23 @@ /* - * ****************************************************************************** - * sdrtrunk - * Copyright (C) 2014-2019 Dennis Sheirer * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * * ****************************************************************************** + * * Copyright (C) 2014-2019 Dennis Sheirer + * * + * * This program is free software: you can redistribute it and/or modify + * * it under the terms of the GNU General Public License as published by + * * the Free Software Foundation, either version 3 of the License, or + * * (at your option) any later version. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License for more details. + * * + * * You should have received a copy of the GNU General Public License + * * along with this program. If not, see + * * ***************************************************************************** * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - * ***************************************************************************** */ package io.github.dsheirer.preference; @@ -26,6 +28,7 @@ import io.github.dsheirer.preference.directory.DirectoryPreference; import io.github.dsheirer.preference.event.DecodeEventPreference; import io.github.dsheirer.preference.identifier.TalkgroupFormatPreference; import io.github.dsheirer.preference.playlist.PlaylistPreference; +import io.github.dsheirer.preference.radioreference.RadioReferencePreference; import io.github.dsheirer.preference.source.ChannelMultiFrequencyPreference; import io.github.dsheirer.preference.source.TunerPreference; import io.github.dsheirer.preference.swing.SwingPreference; @@ -54,6 +57,7 @@ public class UserPreferences implements Listener private DirectoryPreference mDirectoryPreference; private ChannelMultiFrequencyPreference mChannelMultiFrequencyPreference; private PlaylistPreference mPlaylistPreference; + private RadioReferencePreference mRadioReferencePreference; private TalkgroupFormatPreference mTalkgroupFormatPreference; private TunerPreference mTunerPreference; private SwingPreference mSwingPreference = new SwingPreference(); @@ -106,6 +110,14 @@ public class UserPreferences implements Listener return mPlaylistPreference; } + /** + * Radio reference web services preferences + */ + public RadioReferencePreference getRadioReferencePreference() + { + return mRadioReferencePreference; + } + /** * Identifier preferences */ @@ -141,6 +153,7 @@ public class UserPreferences implements Listener mDirectoryPreference = new DirectoryPreference(this::receive); mChannelMultiFrequencyPreference = new ChannelMultiFrequencyPreference(this::receive); mPlaylistPreference = new PlaylistPreference(this::receive, mDirectoryPreference); + mRadioReferencePreference = new RadioReferencePreference(this::receive); mTalkgroupFormatPreference = new TalkgroupFormatPreference(this::receive); mTunerPreference = new TunerPreference(this::receive); } diff --git a/src/main/java/io/github/dsheirer/preference/radioreference/RadioReferencePreference.java b/src/main/java/io/github/dsheirer/preference/radioreference/RadioReferencePreference.java new file mode 100644 index 00000000..72e7f1c1 --- /dev/null +++ b/src/main/java/io/github/dsheirer/preference/radioreference/RadioReferencePreference.java @@ -0,0 +1,181 @@ +/* + * + * * ****************************************************************************** + * * Copyright (C) 2014-2019 Dennis Sheirer + * * + * * This program is free software: you can redistribute it and/or modify + * * it under the terms of the GNU General Public License as published by + * * the Free Software Foundation, either version 3 of the License, or + * * (at your option) any later version. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License for more details. + * * + * * You should have received a copy of the GNU General Public License + * * along with this program. If not, see + * * ***************************************************************************** + * + * + */ + +package io.github.dsheirer.preference.radioreference; + +import io.github.dsheirer.preference.Preference; +import io.github.dsheirer.preference.PreferenceType; +import io.github.dsheirer.sample.Listener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.prefs.Preferences; + +/** + * User preferences for the display of channel decode events + */ +public class RadioReferencePreference extends Preference +{ + private final static Logger mLog = LoggerFactory.getLogger(RadioReferencePreference.class); + private Preferences mPreferences = Preferences.userNodeForPackage(RadioReferencePreference.class); + private static final String STORE_CREDENTIALS = "store.credentials"; + private static final String USER_NAME = "user.name"; + private static final String PASSWORD = "user.authorization"; + + private String mUserName; + private String mPassword; + private Boolean mStoreCredentials; + + /** + * Constructs an instance. + * @param updateListener to receive notifications when preferences are updated. + */ + public RadioReferencePreference(Listener updateListener) + { + super(updateListener); + loadSettings(); + } + + @Override + public PreferenceType getPreferenceType() + { + return PreferenceType.RADIO_REFERENCE; + } + + private void loadSettings() + { + mStoreCredentials = mPreferences.getBoolean(STORE_CREDENTIALS, true); + } + + /** + * Clears user credentials and resets username and password to null + */ + public void removeStoreCredentials() + { + setStoreCredentials(false); + setUserName(null); + setPassword(null); + notifyPreferenceUpdated(); + } + + /** + * Indicates if there are any non-null values stored for user name or password + * @return true if there are values stored + */ + public boolean hasStoredCredentials() + { + return mPreferences.get(USER_NAME, null) != null || mPreferences.get(PASSWORD, null) != null; + } + + /** + * User name + */ + public String getUserName() + { + if(mUserName == null) + { + mUserName = mPreferences.get(USER_NAME, null); + } + + return mUserName; + } + + /** + * Sets user name + * @param username to store or null to remove any stored value + */ + public void setUserName(String username) + { + mUserName = username; + + if(mUserName == null) + { + mPreferences.remove(USER_NAME); + } + else + { + mPreferences.put(USER_NAME, mUserName); + } + + notifyPreferenceUpdated(); + } + + /** + * Password + * @return password + */ + public String getPassword() + { + if(mPassword == null) + { + mPassword = mPreferences.get(PASSWORD, null); + } + + return mPassword; + } + + /** + * Sets the preferences persisted password. + * @param password to store or null to remove any stored value + */ + public void setPassword(String password) + { + mPassword = password; + + if(mPassword == null) + { + mPreferences.remove(PASSWORD); + } + else + { + mPreferences.put(PASSWORD, mPassword); + } + + notifyPreferenceUpdated(); + } + + /** + * Indicates if the credentials should be persisted in the preferences store. + * + * @return true if credentials should be stored. + */ + public boolean isStoreCredentials() + { + if(mStoreCredentials == null) + { + mStoreCredentials = mPreferences.getBoolean(STORE_CREDENTIALS, true); + } + + return mStoreCredentials; + } + + /** + * Set the store credentials option + * @param store true to store credentials + */ + public void setStoreCredentials(boolean store) + { + mStoreCredentials = store; + mPreferences.putBoolean(STORE_CREDENTIALS, store); + notifyPreferenceUpdated(); + } +} diff --git a/src/main/java/io/github/dsheirer/radioreference/RadioReferenceService.java b/src/main/java/io/github/dsheirer/radioreference/RadioReferenceService.java deleted file mode 100644 index 36cea61c..00000000 --- a/src/main/java/io/github/dsheirer/radioreference/RadioReferenceService.java +++ /dev/null @@ -1,153 +0,0 @@ -/******************************************************************************* - * sdrtrunk - * Copyright (C) 2014-2016 Dennis Sheirer - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see - * - ******************************************************************************/ -package io.github.dsheirer.radioreference; - -import com.radioreference.api.soap2.AuthInfo; -import com.radioreference.api.soap2.RRWsdlLocator; -import com.radioreference.api.soap2.RRWsdlPortType; -import com.radioreference.api.soap2.UserFeedBroadcast; -import com.radioreference.api.soap2.UserInfo; -import org.apache.axis.AxisFault; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.xml.rpc.ServiceException; -import java.rmi.RemoteException; -import java.text.SimpleDateFormat; - -public class RadioReferenceService -{ - private final static Logger mLog = LoggerFactory.getLogger( RadioReferenceService.class ); - private final SimpleDateFormat SDF = new SimpleDateFormat("MM-dd-yyyy"); - - public static final String SDRTRUNK_APP_KEY = "88969092"; - public static final String RADIO_REFERENCE_API_VERSION = "14"; - public static final String SOAP_RPC_RESPONSE_STYLE = "rpc"; - - private RRWsdlLocator mService = new RRWsdlLocator(); - private RRWsdlPortType mClient; - private Long mAccountExpiration; - - private AuthInfo mUserAuthorization; - - /** - * Creates a SOAP web service client for interaction with the radioreference.com server. - * - * @param username for a premium subscriber - * @param password for a premium subscriber - * @throws ServiceException if the client can't be created - * @throws IllegalArgumentException if either the username or password is null or empty - */ - public RadioReferenceService(String username, String password) throws ServiceException - { - mClient = mService.getRRWsdlPort(); - - setAuthorizationInformation(username, password); - } - - /** - * Sets new premium subscriber user credentials to authenticate to the server. - * @param username for a premium subscriber on radioreference.com - * @param password for a premium subscriber - */ - public void setAuthorizationInformation(String username, String password) throws IllegalArgumentException - { - if(username == null || username.isEmpty() || password == null || password.isEmpty()) - { - throw new IllegalArgumentException("Username [" + username + "] and/or password [" + password + - "] cannot be null or empty"); - } - - mUserAuthorization = new AuthInfo(username, password, SDRTRUNK_APP_KEY, RADIO_REFERENCE_API_VERSION, - SOAP_RPC_RESPONSE_STYLE); - } - - /** - * Indicates if the service has a non-null user authorization - */ - public void checkCredentials() throws IllegalArgumentException - { - if(mUserAuthorization == null) - { - throw new IllegalStateException("Authorization information (username/password) required"); - } - } - - /** - * Account expiration date - * - * @return expiration date in millis since epoch - * @throws AxisFault for remote server errors - * @throws IllegalStateException for null or empty login credentials - * @throws RemoteException for web service client errors - */ - public long getAccountExpirationDate() throws IllegalStateException, RemoteException - { - checkCredentials(); - - if(mAccountExpiration == null) - { - UserInfo userInfo = mClient.getUserData(mUserAuthorization); - - if(userInfo != null) - { - String expiration = userInfo.getSubExpireDate(); - - if(expiration != null) - { - try - { - mAccountExpiration = SDF.parse(expiration).getTime(); - } - catch(Exception e) - { - mLog.error("Couldn't parse account expiration date from web service response: " + expiration, e); - } - } - } - } - - return mAccountExpiration; - } - - /** - * Indicates if the radio reference user account is active (ie not expired) - * - * @throws IllegalStateException for null or empty login credentials - * @throws RemoteException for web service client errors - */ - public boolean isAccountActive() throws IllegalStateException, RemoteException - { - Long expiration = getAccountExpirationDate(); - - if(expiration != null) - { - return System.currentTimeMillis() < expiration; - } - - return false; - } - - public UserFeedBroadcast[] getUserFeedBroadcasts() throws IllegalArgumentException, RemoteException - { - checkCredentials(); - - return mClient.getUserFeedBroadcasts(mUserAuthorization); - } -}