/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/


#ifndef __com_sun_star_ucb_RecipientInfo_idl__
#define __com_sun_star_ucb_RecipientInfo_idl__

#ifndef __com_sun_star_ucb_OutgoingMessageState_idl__
#include <com/sun/star/ucb/OutgoingMessageState.idl>
#endif


//=============================================================================

module com { module sun { module star { module ucb {

//=============================================================================
/** contains all information needed to send a message using one	send protocol.

	<p>To send one message via two different protocols, two RecipientInfos
	are needed - to send one message to different users with one protocol,
	one RecipientInfo can be used.
*/
published struct RecipientInfo
{
	//-------------------------------------------------------------------------
	/** the protocol to use for sending (i.e. "NNTP", "SMTP", "VIM").
	*/
	string ProtocolType;

	//-------------------------------------------------------------------------
	/** the current state of the message.
	*/
	com::sun::star::ucb::OutgoingMessageState State;

	//-------------------------------------------------------------------------
	/** the recipient(s) (e.g. e-mail address/es).

		<p>Multiple addresses are separated by commas.
	*/
	string To;

	//-------------------------------------------------------------------------
	/** the recipient(s) of a "carbon copy" (e.g. e-mail address/es).

		<p>Multiple addresses are separated by commas.
	*/
	string CC;

	//-------------------------------------------------------------------------
	/** the recipient(s) of "blind carbon copy" (e.g. e-mail address/es).

		<p>Multiple addresses are separated by commas.
	*/
	string BCC;

	//-------------------------------------------------------------------------
	/** the newsgroup(s) to which an article is be posted.

		<p>Multiple addresses are separated by commas.
	*/
	string Newsgroups;

	//-------------------------------------------------------------------------
	/** the name of the server to be used for sending the message.
	*/
	string Server;

	//-------------------------------------------------------------------------
	/** the user name to be used for authorizing on the send server.
	*/
	string Username;

	//-------------------------------------------------------------------------
	/** the password to be used for authorizing on the send server.
	*/
	string Password;

	//-------------------------------------------------------------------------
	/** the Post Office Path (VIM only).
	*/
	string VIMPostOfficePath;

	//-------------------------------------------------------------------------
	/** string representing the last error (generated by send server).
	*/
	string ProtocolErrorString;

	//-------------------------------------------------------------------------
	/** the number representing the last error (generated by send server).
	*/
	long ProtocolErrorNumber;

	//-------------------------------------------------------------------------
	/** the count of tries to send a message. This count is <code>1</code>
	    if the message was sent with the first try and increases with every
		unsuccessful retry.
	*/
	long SendTries;

};

//=============================================================================

}; }; }; };

#endif
