/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * The contents of this file are subject to the Netscape Public License
 * Version 1.0 (the "NPL"); you may not use this file except in
 * compliance with the NPL.  You may obtain a copy of the NPL at
 * http://www.mozilla.org/NPL/
 *
 * Software distributed under the NPL is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
 * for the specific language governing rights and limitations under the
 * NPL.
 *
 * The Initial Developer of this code under the NPL is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
 * Reserved.
 */

#ifndef nsMsgMailNewsUrl_h___
#define nsMsgMailNewsUrl_h___

#include "nscore.h"
#include "nsISupports.h"
#include "nsIUrlListener.h"
#include "nsIUrlListenerManager.h"
#include "nsIMsgStatusFeedback.h"
#include "nsCOMPtr.h"
#include "nsIMsgMailNewsUrl.h"
#include "nsIURL.h"

///////////////////////////////////////////////////////////////////////////////////
// Okay, I found that all of the mail and news url interfaces needed to support
// several common interfaces (in addition to those provided through nsIURI). 
// So I decided to group them all in this implementation so we don't have to
// duplicate the code.
//
//////////////////////////////////////////////////////////////////////////////////

class NS_MSG_BASE nsMsgMailNewsUrl : public nsIMsgMailNewsUrl
{
public:
	nsMsgMailNewsUrl();

	NS_DECL_ISUPPORTS

	// nsIMsgMailNewsUrl support

	///////////////////////////////////////////////////////////////////////////////
	// The idea is to allow the "application" (the part of the code which wants to 
	// run a url in order to perform some action) to register itself as a listener
	// on url. As a url listener, the app will be informed when the url begins to run
	// and when the url is finished. 
	////////////////////////////////////////////////////////////////////////////////
	NS_IMETHOD RegisterListener (nsIUrlListener * aUrlListener);
	NS_IMETHOD UnRegisterListener (nsIUrlListener * aUrlListener);

	/////////////////////////////////////////////////////////////////////////////// 
	// Getters and Setters for the nsMsgMailNewsUrl specific info....
	///////////////////////////////////////////////////////////////////////////////

	NS_IMETHOD SetErrorMessage (const char * errorMessage);
	// caller must free using PR_FREE
	NS_IMETHOD GetErrorMessage (char ** errorMessage);

	NS_IMETHOD SetStatusFeedback(nsIMsgStatusFeedback *aMsgFeedback);
	NS_IMETHOD GetStatusFeedback(nsIMsgStatusFeedback **aMsgFeedback);

	// This is just a stub implementation. It is the responsibility of derived
	// url classes to over-ride this method.
	NS_IMETHOD GetServer(nsIMsgIncomingServer ** aIncomingServer);

	// if you really want to know what the current state of the url is (running or not
	// running) you should look into becoming a urlListener...
	NS_IMETHOD SetUrlState(PRBool runningUrl, nsresult aStatusCode);
	NS_IMETHOD GetUrlState(PRBool *runningUrl);

	//////////////////////////////////////////////////////////////////////////////////
	// nsIURI support
	NS_IMETHOD GetSpec(char * *aSpec);
	NS_IMETHOD SetSpec(char * aSpec);

	/* attribute string Scheme; */
	NS_IMETHOD GetScheme(char * *aScheme);
	NS_IMETHOD SetScheme(char * aScheme);

	/* attribute string PreHost; */
	NS_IMETHOD GetPreHost(char * *aPreHost);
	NS_IMETHOD SetPreHost(char * aPreHost);

	/* attribute string Host; */
	NS_IMETHOD GetHost(char * *aHost);
	NS_IMETHOD SetHost(char * aHost);

	/* attribute long Port; */
	NS_IMETHOD GetPort(PRInt32 *aPort);
	NS_IMETHOD SetPort(PRInt32 aPort);

	/* attribute string Path; */
	NS_IMETHOD GetPath(char * *aPath);
	NS_IMETHOD SetPath(char * aPath);

	/* boolean Equals (in nsIURI other); */
	NS_IMETHOD Equals(nsIURI *other, PRBool *_retval);

	/* nsIURI Clone (); */
	NS_IMETHOD Clone(nsIURI **_retval);

	NS_IMETHOD SetRelativePath(const char *i_RelativePath);

	//////////////////////////////////////////////////////////////////////////////////
	// nsIURL support
	NS_IMETHOD GetDirectory(char * *aDirectory);
	NS_IMETHOD SetDirectory(char * aDirectory);

	/* attribute string FileName; */
	NS_IMETHOD GetFileName(char * *aFileName);
	NS_IMETHOD SetFileName(char * aFileName);

    /* attribute string Param; */
    NS_IMETHOD GetParam(char * *aParam);
    NS_IMETHOD SetParam(char * aParam);

	/* attribute string Query; */
	NS_IMETHOD GetQuery(char * *aQuery);
	NS_IMETHOD SetQuery(char * aQuery);

	/* attribute string Ref; */
	NS_IMETHOD GetRef(char * *aRef);
	NS_IMETHOD SetRef(char * aRef);

	NS_IMETHOD DirFile(char **o_DirFile);

protected:
	virtual ~nsMsgMailNewsUrl();

	// a helper function I needed from derived urls...
	virtual const char * GetUserName() = 0;

	nsCOMPtr<nsIURL> m_baseURL;
	nsCOMPtr<nsIMsgStatusFeedback> m_statusFeedback;
	char		*m_errorMessage;
	PRBool		m_runningUrl;

	// manager of all of current url listeners....
	nsCOMPtr<nsIUrlListenerManager> m_urlListeners;
};


#endif /* nsMsgMailNewsUrl_h___ */
