001 package com.croftsoft.apps.agoracast.c2p;
002
003 import java.awt.*;
004 import java.awt.event.*;
005 import java.io.*;
006 import java.util.*;
007 import javax.swing.*;
008
009 import com.croftsoft.core.lang.NullArgumentException;
010 import com.croftsoft.core.net.news.NntpConstants;
011 import com.croftsoft.core.net.news.NntpLib;
012 import com.croftsoft.core.net.news.NntpSocket;
013 import com.croftsoft.core.net.news.UsenetMessage;
014 import com.croftsoft.core.text.DateFormatLib;
015 import com.croftsoft.core.util.log.Log;
016
017 /*********************************************************************
018 *
019 * <p />
020 *
021 * @version
022 * 2001-08-02
023 * @since
024 * 2001-07-30
025 * @author
026 * <a href="http://croftsoft.com/">David Wallace Croft</a>
027 *********************************************************************/
028
029 public final class AgoracastSendPanel
030 extends JPanel
031 implements ActionListener, Log, Runnable
032 //////////////////////////////////////////////////////////////////////
033 //////////////////////////////////////////////////////////////////////
034 {
035
036 private final AgoracastMediator agoracastMediator;
037
038 private final AgoracastPostPanel agoracastPostPanel;
039
040 private final JTextArea jTextArea;
041
042 private final JButton cancelButton;
043
044 //
045
046 private UsenetMessage usenetMessage;
047
048 private NntpSocket nntpSocket;
049
050 //////////////////////////////////////////////////////////////////////
051 //////////////////////////////////////////////////////////////////////
052
053 public AgoracastSendPanel (
054 AgoracastMediator agoracastMediator,
055 AgoracastPostPanel agoracastPostPanel )
056 //////////////////////////////////////////////////////////////////////
057 {
058 super ( new BorderLayout ( ), true ); // isDoubleBuffered
059
060 NullArgumentException.check (
061 this.agoracastMediator = agoracastMediator );
062
063 NullArgumentException.check (
064 this.agoracastPostPanel = agoracastPostPanel );
065
066 AgoracastLib.setColor ( this, agoracastMediator );
067
068 add ( new JScrollPane ( jTextArea = new JTextArea ( ) ),
069 BorderLayout.CENTER );
070
071 jTextArea.setEditable ( false );
072
073 jTextArea.setFont ( AgoracastConstants.LOG_FONT );
074
075 cancelButton = new JButton ( "Cancel" );
076
077 cancelButton.addActionListener ( this );
078
079 add ( cancelButton, BorderLayout.SOUTH );
080 }
081
082 //////////////////////////////////////////////////////////////////////
083 //////////////////////////////////////////////////////////////////////
084
085 public synchronized void send ( UsenetMessage usenetMessage )
086 //////////////////////////////////////////////////////////////////////
087 {
088 this.usenetMessage = usenetMessage;
089
090 new Thread ( this ).start ( );
091 }
092
093 public synchronized void run ( )
094 //////////////////////////////////////////////////////////////////////
095 {
096 jTextArea.setText (
097 DateFormatLib.toIsoDateFormat ( new Date ( ) )
098 + " Sending message..." );
099
100 cancelButton.setText ( "Cancel" );
101
102 try
103 {
104 post ( );
105 }
106 catch ( Throwable throwable )
107 {
108 record ( throwable );
109 }
110
111 cancelButton.setText ( "Done" );
112 }
113
114 public void actionPerformed ( ActionEvent actionEvent )
115 //////////////////////////////////////////////////////////////////////
116 {
117 if ( nntpSocket != null )
118 {
119 try
120 {
121 nntpSocket.close ( );
122 }
123 catch ( IOException ex )
124 {
125 }
126 }
127
128 agoracastPostPanel.cancel ( );
129 }
130
131 //////////////////////////////////////////////////////////////////////
132 //////////////////////////////////////////////////////////////////////
133
134 public synchronized void record ( String message )
135 //////////////////////////////////////////////////////////////////////
136 {
137 jTextArea.append ( '\n' + message );
138
139 trim ( );
140 }
141
142 public synchronized void record ( Throwable throwable )
143 //////////////////////////////////////////////////////////////////////
144 {
145 record ( '\n' + throwable.toString ( ) );
146 }
147
148
149 public synchronized void record (
150 String message, Throwable throwable )
151 //////////////////////////////////////////////////////////////////////
152 {
153 record ( '\n' + message + '\n' + throwable.toString ( ) );
154 }
155
156 //////////////////////////////////////////////////////////////////////
157 //////////////////////////////////////////////////////////////////////
158
159 private synchronized void trim ( )
160 //////////////////////////////////////////////////////////////////////
161 {
162 String text = jTextArea.getText ( );
163
164 int textLength = text.length ( );
165
166 if ( textLength > AgoracastConstants.LOG_TEXT_LENGTH_MAX )
167 {
168 jTextArea.setText ( text.substring (
169 textLength - AgoracastConstants.LOG_TEXT_LENGTH_MAX ) );
170 }
171 }
172
173 private synchronized void post ( )
174 throws IOException
175 //////////////////////////////////////////////////////////////////////
176 {
177 String nntpServer = agoracastMediator.getServer ( );
178
179 String responseCode = null;
180
181 try
182 {
183 nntpSocket = new NntpSocket ( nntpServer, this );
184
185 responseCode = nntpSocket.getResponseCode ( );
186
187 if ( !nntpSocket.getPostingAllowed ( ) )
188 {
189 throw new IOException ( responseCode );
190 }
191
192 responseCode = nntpSocket.command ( NntpConstants.COMMAND_POST );
193
194 if ( responseCode.startsWith ( "480" ) )
195 {
196 // 480 Authentication Required
197
198 AgoracastLib.authenticate ( nntpSocket, agoracastMediator );
199
200 // throws SecurityException if it fails
201
202 responseCode = nntpSocket.command ( NntpConstants.COMMAND_POST );
203 }
204
205 if ( !responseCode.startsWith ( "340" ) )
206 {
207 throw new IOException ( responseCode );
208 }
209
210 responseCode = nntpSocket.command ( usenetMessage.toString ( ) );
211
212 if ( !responseCode.startsWith ( "240" ) )
213 {
214 throw new IOException ( responseCode );
215 }
216
217 responseCode = nntpSocket.command_QUIT ( );
218 }
219 finally
220 {
221 if ( nntpSocket != null )
222 {
223 nntpSocket.close ( );
224 }
225 }
226 }
227
228 //////////////////////////////////////////////////////////////////////
229 //////////////////////////////////////////////////////////////////////
230 }