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);
- }
-}