/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/

import javax.mail.*;
import javax.mail.internet.*;
import com.msoft.mail.provider.nntp.NNTPTransport;
import java.util.Properties;
import java.io.*;
import javax.activation.*;


public class Sender
{
	// Constructor params:
	private StatusWindow status = null;
	private OfficeAttachment attachments = null;
	private String replyto = "";
        private String subject = "";
        private String comment = "";
        private String hostname = "";
        private String newsgroup = "";
	private String statusLine = "";



	public Sender( StatusWindow sw, OfficeAttachment attach, String reply,
		       String sub, String com, String host, String group )
	{
		status = sw;
		attachments = attach;
                replyto = reply;
                subject = sub;
                comment = com;
                hostname = host;
                newsgroup = group;
	}



	public boolean sendMail()
	{
		int statusPos = 5;
		try
		{
			attachments.createTempDocs();
			// Property for any information
			Properties props = new Properties();

			// Create unique session (null is unused authenticator info)
			statusLine = "Creating unique session";
			status.setStatus( statusPos, statusLine ); // 5
			Session session = Session.getInstance( props, null );

			// Create message
			statusPos++; // 6
			statusLine = "Creating message";
			status.setStatus( statusPos, statusLine );
			MimeMessage message = new MimeMessage( session );
			message.setFrom( new InternetAddress( replyto ) );
			message.setSubject( subject );
			message.setText( comment );
			message.addHeader( "Newsgroups", newsgroup );

			// Buildup bodypart with text and attachments
			Multipart multipart = new MimeMultipart();

			BodyPart messageBodyPart = new MimeBodyPart();
			messageBodyPart.setText( comment );
			multipart.addBodyPart( messageBodyPart );

			statusPos++; // 7
			statusLine = "Adding attachment(s)";
			status.setStatus( statusPos, statusLine );
			File attachs[] = attachments.getAttachments();
			for(int i=0; i < attachs.length; i++ )
			{
				//System.out.println( "Adding file: " + attachs[i].getName() );
				messageBodyPart = new MimeBodyPart();
				DataSource filesource = new FileDataSource( attachs[i] );
				messageBodyPart.setDataHandler( new DataHandler( filesource ));
				messageBodyPart.setFileName( attachs[i].getName() );
				multipart.addBodyPart( messageBodyPart );
			}

			// Add multipart to mail
			message.setContent( multipart );

			// Create and send NNTP transport
			statusPos += 2; // 9
			statusLine = "Creating NNTP transport";
			status.setStatus( statusPos, statusLine );
			Transport transport = new NNTPTransport( session, new URLName( "news:" + newsgroup ));

			// Null parameters are for user name and password
			statusPos++; // 10
			statusLine = "Connecting to mail server";
			status.setStatus( statusPos, statusLine );
			transport.connect( hostname, null, null );

			statusPos++; // 11
			statusLine = "Sending message";
			status.setStatus( statusPos, statusLine );
			transport.sendMessage( message, message.getAllRecipients() );

			statusPos++; // 12
			statusLine = "Closing transport";
			status.setStatus( statusPos, statusLine );
			transport.close();

			// Clean up when finished
			attachments.removeTempDocs();

			return true;
		}
		catch( MessagingException me )
		{
			if( statusPos == 10 )
			{
				statusLine = "Error connecting (User authentication?)";
			}
			status.setStatus( statusPos, statusLine );
			System.out.println( "Error sending message: ");
			me.printStackTrace();
			return false;
		}

	}

}
