Changes for qnx(photon) platform. They should not affect building/runtime other platforms.

Added EmbedDownload to manage the downloads and HeaderSniffer to be used in "Save Target As"
( look for "content-disposition" to provide a filename ).
Changes for handling the unknown mime types/downloading.


git-svn-id: svn://10.0.0.236/trunk@156302 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
amardare%qnx.com 2004-05-12 16:49:13 +00:00
parent 03a16944ac
commit ec32e992a7
13 changed files with 611 additions and 273 deletions

View File

@ -0,0 +1,155 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (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.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Adrian Mardare <amardare@qnx.com>
*
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "EmbedDownload.h"
EmbedDownload::EmbedDownload( PtMozillaWidget_t *aMoz, int aDownloadTicket, const char * aURL )
{
mMozillaWidget = aMoz;
mDownloadTicket = aDownloadTicket;
mURL = strdup( aURL );
mDone = PR_FALSE;
mLauncher = nsnull;
mPersist = nsnull;
/* insert d into aMoz->fDownload */
aMoz->fDownload = ( EmbedDownload ** ) realloc( aMoz->fDownload, ( aMoz->fDownloadCount + 1 ) * sizeof( EmbedDownload * ) );
if( aMoz->fDownload ) {
aMoz->fDownload[ aMoz->fDownloadCount ] = this;
aMoz->fDownloadCount++;
}
}
EmbedDownload::~EmbedDownload()
{
int i;
///* ATENTIE */ printf( "EmbedDownload destructor this=%p\n", this );
/* remove d from the mMoz->fDownload */
for( i=0; i<mMozillaWidget->fDownloadCount; i++ ) {
if( mMozillaWidget->fDownload[i] == this ) break;
}
if( i<mMozillaWidget->fDownloadCount ) {
int j;
for( j=i; j<mMozillaWidget->fDownloadCount-1; j++ )
mMozillaWidget->fDownload[j] = mMozillaWidget->fDownload[j+1];
mMozillaWidget->fDownloadCount--;
if( !mMozillaWidget->fDownloadCount ) {
free( mMozillaWidget->fDownload );
mMozillaWidget->fDownload = NULL;
}
if( mDone == PR_FALSE ) ReportDownload( Pt_WEB_DOWNLOAD_CANCEL, 0, 0, "" );
}
///* ATENTIE */ printf( "after remove fDownloadCount=%d\n", mMozillaWidget->fDownloadCount );
free( mURL );
}
EmbedDownload *FindDownload( PtMozillaWidget_t *moz, int download_ticket )
{
int i;
for( i=0; i<moz->fDownloadCount; i++ ) {
if( moz->fDownload[i]->mDownloadTicket == download_ticket ) return moz->fDownload[i];
}
return NULL;
}
void EmbedDownload::ReportDownload( int type, int current, int total, char *message )
{
PtCallbackInfo_t cbinfo;
PtWebDownloadCallback_t cb;
memset( &cbinfo, 0, sizeof( cbinfo ) );
cbinfo.reason = Pt_CB_MOZ_DOWNLOAD;
cbinfo.cbdata = &cb;
cb.download_ticket = mDownloadTicket;
cb.type = type;
cb.url = mURL;
cb.current = current;
cb.total = total;
cb.message = message;
if( type == Pt_WEB_DOWNLOAD_DONE ) mDone = PR_TRUE;
///* ATENTIE */ printf( "In EmbedDownload::ReportDownload type=%s\n",
//type==Pt_WEB_DOWNLOAD_CANCEL? "Pt_WEB_DOWNLOAD_CANCEL":
//type==Pt_WEB_DOWNLOAD_DONE? "Pt_WEB_DOWNLOAD_DONE":
//type==Pt_WEB_DOWNLOAD_PROGRESS? "Pt_WEB_DOWNLOAD_PROGRESS":"unknown");
PtInvokeCallbackList( mMozillaWidget->web_download_cb, (PtWidget_t *)mMozillaWidget, &cbinfo );
}
/* nsIWebProgressListener interface */
NS_IMPL_ISUPPORTS1(EmbedDownload, nsIWebProgressListener)
NS_IMETHODIMP EmbedDownload::OnProgressChange(nsIWebProgress *aProgress, nsIRequest *aRequest, PRInt32 curSelfProgress, PRInt32 maxSelfProgress, PRInt32 curTotalProgress, PRInt32 maxTotalProgress) {
///* ATENTIE */ printf("this=%p OnProgressChange curSelfProgress=%d maxSelfProgress=%d curTotalProgress=%d maxTotalProgress=%d\n",
//this, curSelfProgress, maxSelfProgress, curTotalProgress, maxTotalProgress );
ReportDownload( Pt_WEB_DOWNLOAD_PROGRESS, curSelfProgress, maxSelfProgress, "" );
return NS_OK;
}
NS_IMETHODIMP EmbedDownload::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 aStateFlags, nsresult aStatus) {
if( aStateFlags & STATE_STOP ) {
ReportDownload( Pt_WEB_DOWNLOAD_DONE, 0, 0, "" );
}
return NS_OK;
}
NS_IMETHODIMP EmbedDownload::OnLocationChange(nsIWebProgress* aWebProgress, nsIRequest* aRequest, nsIURI *location) {
return NS_OK;
}
NS_IMETHODIMP EmbedDownload::OnStatusChange(nsIWebProgress* aWebProgress, nsIRequest* aRequest, nsresult aStatus, const PRUnichar* aMessage) {
return NS_OK;
}
NS_IMETHODIMP EmbedDownload::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 state) {
return NS_OK;
}

View File

@ -0,0 +1,73 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (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.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Adrian Mardare <amardare@qnx.com>
*
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef EMBEDDOWNLOAD_EMB
#define EMBEDDOWNLOAD_EMB
#include "nsIWebProgressListener.h"
#include "nsIWebBrowserPersist.h"
#include "EmbedPrivate.h"
#include "PtMozilla.h"
/* download related */
class EmbedDownload : public nsIWebProgressListener
{
public:
EmbedDownload( PtMozillaWidget_t *aMoz, int aDownloadTicket, const char * aURL );
virtual ~EmbedDownload();
void ReportDownload( int type, int current, int total, char *message );
int mDownloadTicket;
nsIHelperAppLauncher *mLauncher; /* weak reference - either mLauncher or mPersist is set, but not both */
nsIWebBrowserPersist *mPersist; /* weak reference - either mLauncher or mPersist is set, but not both */
NS_DECL_ISUPPORTS
NS_DECL_NSIWEBPROGRESSLISTENER
private:
PtMozillaWidget_t *mMozillaWidget;
char *mURL;
PRBool mDone;
};
EmbedDownload *FindDownload( PtMozillaWidget_t *moz, int download_ticket );
#endif

View File

@ -23,11 +23,11 @@
#include <nsIDocShell.h>
#include <nsIURI.h>
#include <nsIWebProgress.h>
#include <nsIURIFixup.h>
#include <nsIDOMDocument.h>
#include <nsIDOMNodeList.h>
#include <nsISelection.h>
#include "nsReadableUtils.h"
#include "nsNetUtil.h"
#include "nsIWidget.h"
// for do_GetInterface
@ -57,7 +57,6 @@
#include <nsIWebBrowserSetup.h>
#include "nsIWebBrowserPrint.h"
#include "nsIClipboardCommands.h"
#include "docshell/nsCDefaultURIFixup.h"
// for the focus hacking we need to do
#include <nsIFocusController.h>
@ -216,8 +215,6 @@ EmbedPrivate::Setup()
// get a handle on the navigation object
mNavigation = do_QueryInterface(webBrowser);
mFixup = do_GetService(NS_URIFIXUP_CONTRACTID);
// Create our session history object and tell the navigation object
// to use it. We need to do this before we create the web browser
// window.
@ -324,7 +321,6 @@ EmbedPrivate::Destroy(void)
// release navigation
mNavigation = nsnull;
mFixup = nsnull;
//m_PrintSettings = nsnull;
@ -610,37 +606,6 @@ EmbedPrivate::SaveAs(char *fname, char *dirname)
return (1);
}
int
EmbedPrivate::SaveURI(char *aURI, char *fname)
{
/* ATENTIE it was */
#if 0
if (mWindow && mFixup)
{
nsIURI* uri;
mFixup->CreateFixupURI(nsDependentCString(aURI), 0, &(uri));
return (mWindow->SaveURI(uri, fname));
}
#endif
if (mWindow && mFixup)
{
nsIURI* uri;
mFixup->CreateFixupURI( NS_LITERAL_CSTRING(aURI), 0, &(uri));
return (mWindow->SaveURI(uri, fname));
}
return (1);
}
void
EmbedPrivate::CancelSaveURI()
{
if (mWindow)
mWindow->CancelSaveURI();
}
nsresult
EmbedPrivate::AppendToStream(const char *aData, PRInt32 aLen)
{

View File

@ -81,8 +81,6 @@ class EmbedPrivate {
void SelectAll (void);
void Clear (void);
int SaveAs(char *fname,char *dirname);
int SaveURI(char *uri, char *fname);
void CancelSaveURI();
void Print(PpPrintContext_t *pc);
PRBool CanGoBack();
PRBool CanGoForward();
@ -134,7 +132,6 @@ class EmbedPrivate {
nsCOMPtr<nsISupports> mPrintGuard;
nsCOMPtr<nsIWebNavigation> mNavigation;
nsCOMPtr<nsIURIFixup> mFixup;
nsCOMPtr<nsISHistory> mSessionHistory;
// our event receiver

View File

@ -206,31 +206,6 @@ EmbedWindow::SaveAs(char *fname, char *dirname)
return 0;
}
int
EmbedWindow::SaveURI(nsIURI *uri, char *fname)
{
PtMozillaWidget_t *w = (PtMozillaWidget_t *)(mOwner->mOwningWidget);
nsCOMPtr<nsIWebBrowserPersist> persist(do_QueryInterface(mWebBrowser));
if (persist)
{
nsCOMPtr<nsILocalFile> file;
NS_NewNativeLocalFile(nsDependentCString(fname), PR_TRUE, getter_AddRefs(file));
persist->SetProgressListener((nsIWebProgressListener*) w->EmbedRef->mProgress);
persist->SaveURI(uri, nsnull, nsnull, nsnull, nsnull, file);
return (0);
}
return 1;
}
void
EmbedWindow::CancelSaveURI()
{
nsCOMPtr<nsIWebBrowserPersist> persist(do_QueryInterface(mWebBrowser));
persist->SetProgressListener(nsnull);
persist->CancelSave();
}
NS_IMETHODIMP
EmbedWindow::GetWebBrowser(nsIWebBrowser **aWebBrowser)
{
@ -489,6 +464,7 @@ NS_IMETHODIMP
EmbedWindow::OnShowTooltip(PRInt32 aXCoords, PRInt32 aYCoords,
const PRUnichar *aTipText)
{
#if 0
nsAutoString tipText ( aTipText );
const char* tipString = ToNewCString(tipText), *font = "TextFont08";
PtArg_t args[10];
@ -537,6 +513,7 @@ EmbedWindow::OnShowTooltip(PRInt32 aXCoords, PRInt32 aYCoords,
nsMemory::Free( (void*)tipString );
#endif
return NS_OK;
}
@ -640,47 +617,49 @@ NS_IMETHODIMP EmbedWindow::OnShowContextMenu(PRUint32 aContextFlags, nsIDOMEvent
PtInvokeCallbackList(cb, (PtWidget_t *)moz, &cbinfo);
/* store the url we clicked on */
nsAutoString rightClickUrl;
if (aContextFlags & CONTEXT_IMAGE)
if( aContextFlags & CONTEXT_IMAGE )
{
/* store the url we clicked on */
nsAutoString rightClickUrl;
// Get the IMG SRC
nsresult rv = NS_OK;
nsCOMPtr<nsIDOMHTMLImageElement> imgElement(do_QueryInterface(aNode, &rv));
if (NS_FAILED(rv))
return NS_OK;
if(NS_FAILED(rv)) return NS_OK;
rv = imgElement->GetSrc(rightClickUrl);
if(NS_FAILED(rv))
{
if( moz->rightClickUrl )
free( moz->rightClickUrl );
moz->rightClickUrl = NULL;
return NS_OK;
}
if( moz->rightClickUrl_image ) free( moz->rightClickUrl_image );
if(NS_FAILED(rv)) moz->rightClickUrl_image = NULL;
else moz->rightClickUrl_image = ToNewCString(rightClickUrl);
}
else
if( aContextFlags & CONTEXT_LINK )
{
/* CONTEXT_IMAGE|CONTEXT_LINK is set for an <IMG> with an <A> as an ancestor */
if( aContextFlags & CONTEXT_IMAGE ) {
nsIDOMNode *parent;
aNode->GetParentNode( &parent );
if( parent ) aNode = parent;
}
/* store the url we clicked on */
nsAutoString rightClickUrl;
nsresult rv = NS_OK;
nsCOMPtr<nsIDOMHTMLAnchorElement> linkElement(do_QueryInterface(aNode, &rv));
if(NS_FAILED(rv))
return NS_OK;
if(NS_FAILED(rv)) return NS_OK;
// Note that this string is in UCS2 format
rv = linkElement->GetHref( rightClickUrl );
if(NS_FAILED(rv))
{
if( moz->rightClickUrl )
free( moz->rightClickUrl );
moz->rightClickUrl = NULL;
return NS_OK;
}
}
if( moz->rightClickUrl )
free( moz->rightClickUrl );
moz->rightClickUrl = ToNewCString(rightClickUrl);
if( moz->rightClickUrl_link ) free( moz->rightClickUrl_link );
if(NS_FAILED(rv)) moz->rightClickUrl_link = NULL;
else moz->rightClickUrl_link = ToNewCString(rightClickUrl);
}
return NS_OK;
}

View File

@ -63,8 +63,6 @@ class EmbedWindow : public nsIWebBrowserChrome,
nsresult CreateWindow (void);
void ReleaseChildren (void);
int SaveAs(char *fname,char *dirname);
int SaveURI(nsIURI *uri, char *fname);
void CancelSaveURI();
NS_DECL_ISUPPORTS

View File

@ -0,0 +1,164 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (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.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Adrian Mardare <amardare@qnx.com>
*
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsILocalFile.h"
#include "nsIChannel.h"
#include "nsIHttpChannel.h"
#include "nsIURL.h"
#include "necko/nsNetUtil.h"
#include "HeaderSniffer.h"
#include "EmbedDownload.h"
const char* const kPersistContractID = "@mozilla.org/embedding/browser/nsWebBrowserPersist;1";
HeaderSniffer::HeaderSniffer( nsIWebBrowserPersist* aPersist, PtMozillaWidget_t *aMoz, nsIURI* aURL, nsIFile* aFile )
: mPersist(aPersist)
, mTmpFile(aFile)
, mURL(aURL)
{
mMozillaWidget = aMoz;
}
HeaderSniffer::~HeaderSniffer( )
{
}
NS_IMPL_ISUPPORTS1(HeaderSniffer, nsIWebProgressListener)
/* nsIWebProgressListener interface */
NS_IMETHODIMP HeaderSniffer::OnProgressChange(nsIWebProgress *aProgress, nsIRequest *aRequest, PRInt32 curSelfProgress, PRInt32 maxSelfProgress, PRInt32 curTotalProgress, PRInt32 maxTotalProgress) {
return NS_OK;
}
NS_IMETHODIMP HeaderSniffer::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 aStateFlags, nsresult aStatus) {
if( aStateFlags & nsIWebProgressListener::STATE_START ) {
nsCOMPtr<nsIWebBrowserPersist> kungFuDeathGrip(mPersist); // be sure to keep it alive while we save
// since it owns us as a listener
nsCOMPtr<nsIWebProgressListener> kungFuSuicideGrip(this); // and keep ourselves alive
nsresult rv;
nsCOMPtr<nsIChannel> channel = do_QueryInterface(aRequest, &rv);
if (!channel) return rv;
nsCAutoString contentType, suggested_filename;
channel->GetContentType(contentType);
// Get the content-disposition if we're an HTTP channel.
nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(channel));
if (httpChannel) {
nsCAutoString contentDisposition;
nsresult rv = httpChannel->GetResponseHeader(nsCAutoString("content-disposition"), contentDisposition);
if( NS_SUCCEEDED(rv) && !contentDisposition.IsEmpty() ) {
PRInt32 index = contentDisposition.Find("filename=");
if( index >= 0 ) {
// Take the substring following the prefix.
index += 9;
contentDisposition.Right(suggested_filename, contentDisposition.Length() - index);
}
}
}
/* make the client display a file selection dialog */
PtCallbackInfo_t cbinfo;
PtWebUnknownWithNameCallback_t cb;
memset( &cbinfo, 0, sizeof( cbinfo ) );
cbinfo.reason = Pt_CB_MOZ_UNKNOWN;
cbinfo.cbdata = &cb;
cb.action = Pt_WEB_ACTION_OK;
cb.content_type = (char*)contentType.get();
nsCAutoString spec; mURL->GetSpec( spec );
cb.url = (char*)spec.get();
cb.content_length = strlen( cb.url );
cb.suggested_filename = (char*)suggested_filename.get();
PtInvokeCallbackList( mMozillaWidget->web_unknown_cb, (PtWidget_t *)mMozillaWidget, &cbinfo );
/* this will modal wait for a Pt_ARG_WEB_UNKNOWN_RESP, in mozserver */
/* cancel the initial save - we used it only to sniff the header */
mPersist->CancelSave();
/* remove the tmp file */
PRBool exists;
mTmpFile->Exists(&exists);
if(exists)
mTmpFile->Remove(PR_FALSE);
/* we have the result in mMozillaWidget->moz_unknown_ctrl */
if( mMozillaWidget->moz_unknown_ctrl->response == Pt_WEB_RESPONSE_OK ) {
/* start the actual save */
/* the user chosen filename is mMozillaWidget->moz_unknown_ctrl->filename */
nsCOMPtr<nsILocalFile> file(do_CreateInstance("@mozilla.org/file/local;1"));
NS_ENSURE_TRUE(file, NS_ERROR_FAILURE);
nsCString s ( mMozillaWidget->moz_unknown_ctrl->filename );
file->InitWithNativePath( s );
if( !file ) return NS_ERROR_FAILURE;
/* add this download to our list */
nsCAutoString spec;
mURL->GetSpec( spec );
nsCOMPtr<nsIWebBrowserPersist> webPersist(do_CreateInstance(kPersistContractID, &rv));
EmbedDownload *download = new EmbedDownload( mMozillaWidget, mMozillaWidget->moz_unknown_ctrl->download_ticket, spec.get() );
if( webPersist ) {
download->mPersist = webPersist;
webPersist->SetProgressListener( download );
webPersist->SaveURI( mURL, nsnull, nsnull, nsnull, nsnull, file );
}
}
}
return NS_OK;
}
NS_IMETHODIMP HeaderSniffer::OnLocationChange(nsIWebProgress* aWebProgress, nsIRequest* aRequest, nsIURI *location) {
return NS_OK;
}
NS_IMETHODIMP HeaderSniffer::OnStatusChange(nsIWebProgress* aWebProgress, nsIRequest* aRequest, nsresult aStatus, const PRUnichar* aMessage) {
return NS_OK;
}
NS_IMETHODIMP HeaderSniffer::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 state) {
return NS_OK;
}

View File

@ -0,0 +1,64 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (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.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Adrian Mardare <amardare@qnx.com>
*
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef HEADERSNIFFER_EMB
#define HEADERSNIFFER_EMB
#include "nsIWebProgressListener.h"
#include "nsIWebBrowserPersist.h"
#include "EmbedPrivate.h"
#include "PtMozilla.h"
class HeaderSniffer : public nsIWebProgressListener
{
public:
HeaderSniffer( nsIWebBrowserPersist* aPersist, PtMozillaWidget_t *aMoz, nsIURI* aURL, nsIFile* aFile );
virtual ~HeaderSniffer();
NS_DECL_ISUPPORTS
NS_DECL_NSIWEBPROGRESSLISTENER
private:
PtMozillaWidget_t *mMozillaWidget;
nsIWebBrowserPersist* mPersist; // Weak. It owns us as a listener.
nsCOMPtr<nsIFile> mTmpFile;
nsCOMPtr<nsIURI> mURL;
};
#endif

View File

@ -62,6 +62,8 @@ CPPSRCS = \
PtMozilla.cpp \
EmbedStream.cpp \
PromptService.cpp \
EmbedDownload.cpp \
HeaderSniffer.cpp \
nsUnknownContentTypeHandler.cpp
# Force applications to be built non-statically

View File

@ -69,6 +69,8 @@
#include "EmbedPrivate.h"
#include "EmbedWindow.h"
#include "EmbedDownload.h"
#include "HeaderSniffer.h"
#include "PromptService.h"
#include "PtMozilla.h"
@ -127,19 +129,6 @@ MozSetPreference(PtWidget_t *widget, int type, char *pref, void *data)
}
}
int MozSavePageAs(PtWidget_t *widget, char *fname, int type)
{
PtMozillaWidget_t *moz = (PtMozillaWidget_t *) widget;
char dirname[1024];
if (!fname || !widget) return -1;
sprintf( dirname, "%s.dir", fname );
moz->EmbedRef->SaveAs( fname, dirname );
return (0);
}
static void
MozLoadURL(PtMozillaWidget_t *moz, char *url)
{
@ -151,6 +140,43 @@ MozLoadURL(PtMozillaWidget_t *moz, char *url)
moz->EmbedRef->LoadCurrentURI();
}
/* watch for an Ph_EV_INFO event in order to detect an Ph_OFFSCREEN_INVALID */
static int EvInfo( PtWidget_t *widget, void *data, PtCallbackInfo_t *cbinfo )
{
if( cbinfo->event && cbinfo->event->type == Ph_EV_INFO && cbinfo->event->subtype == Ph_OFFSCREEN_INVALID ) {
PtMozillaWidget_t *moz = ( PtMozillaWidget_t * ) widget;
nsIPref *pref = moz->EmbedRef->GetPrefs();
PRBool displayInternalChange = PR_FALSE;
pref->GetBoolPref("browser.display.internaluse.graphics_changed", &displayInternalChange);
pref->SetBoolPref("browser.display.internaluse.graphics_changed", !displayInternalChange);
}
return Pt_CONTINUE;
}
const char* const kPersistContractID = "@mozilla.org/embedding/browser/nsWebBrowserPersist;1";
void MozSaveTarget( char *url, PtMozillaWidget_t *moz )
{
nsresult rv;
nsCOMPtr<nsIWebBrowserPersist> webPersist(do_CreateInstance(kPersistContractID, &rv));
if( !webPersist ) return;
nsCOMPtr<nsIURI> uri;
NS_NewURI( getter_AddRefs(uri), url );
/* create a temporary file */
char tmp_path[1024];
tmpnam( tmp_path );
nsCOMPtr<nsILocalFile> tmpFile;
NS_NewNativeLocalFile(nsDependentCString( tmp_path ), PR_TRUE, getter_AddRefs(tmpFile));
/* create a download object, use to sniff the headers for a location indication */
HeaderSniffer *sniffer = new HeaderSniffer( webPersist, moz, uri, tmpFile );
webPersist->SetProgressListener( sniffer );
webPersist->SaveURI( uri, nsnull, nsnull, nsnull, nsnull, tmpFile );
}
// defaults function, called on creation of a widget
static void
mozilla_defaults( PtWidget_t *widget )
@ -175,6 +201,8 @@ mozilla_defaults( PtWidget_t *widget )
Pt_BOTTOM_ANCHORED_TOP | Pt_RIGHT_ANCHORED_LEFT | Pt_ANCHORS_INVALID;
cntr->flags |= Pt_CHILD_GETTING_FOCUS;
PtAddEventHandler( widget, Ph_EV_INFO, EvInfo, NULL );
}
// widget destroy function
@ -344,6 +372,17 @@ mozilla_modify( PtWidget_t *widget, PtArg_t const *argt, PtResourceRec_t const *
finder->FindNext( &didFind );
break;
}
case Pt_MOZ_COMMAND_SAVEAS: {
PtWebClient2Command_t *wdata = ( PtWebClient2Command_t * ) argt->len;
char *dirname = ( char * ) calloc( 1, strlen( wdata->SaveasInfo.filename + 7 ) );
if( dirname ) {
sprintf( dirname, "%s_files", wdata->SaveasInfo.filename );
moz->EmbedRef->SaveAs( wdata->SaveasInfo.filename, dirname );
free( dirname );
}
break;
}
}
break;
@ -357,16 +396,19 @@ mozilla_modify( PtWidget_t *widget, PtArg_t const *argt, PtResourceRec_t const *
case Pt_ARG_MOZ_UNKNOWN_RESP: {
PtWebClient2UnknownData_t *unknown = ( PtWebClient2UnknownData_t * ) argt->value;
if( unknown->response == Pt_WEB_RESPONSE_CANCEL ) {
Download_t *d = FindDownload( moz, unknown->download_ticket );
d->mLauncher->Cancel();
RemoveDownload( moz, unknown->download_ticket );
EmbedDownload *d = FindDownload( moz, unknown->download_ticket );
if( d ) {
if( d->mLauncher ) d->mLauncher->Cancel(); /* this will also call the EmbedDownload destructor */
else if( d->mPersist ) d->mPersist->CancelSave(); /* this will also call the EmbedDownload destructor */
else delete d; /* just in case neither d->mLauncher or d->mPersist was set */
}
}
}
break;
case Pt_ARG_MOZ_DOWNLOAD:
{
moz->EmbedRef->SaveURI((char*)argt->value, (char*) argt->len);
MozSaveTarget( (char*)argt->value, moz );
}
break;
@ -454,11 +496,13 @@ mozilla_get_info( PtWidget_t *widget, PtArg_t const *argt, PtResourceRec_t const
mozilla_get_pref( widget, (char*)argt->len, (char*) argt->value );
break;
case Pt_ARG_MOZ_GET_CONTEXT:
if ( moz->rightClickUrl )
*(char**) argt->value = moz->rightClickUrl;
else
*(char*) argt->value = 0;
case Pt_ARG_MOZ_GET_CONTEXT: {
if( argt->len & Pt_MOZ_CONTEXT_LINK )
*(char**) argt->value = moz->rightClickUrl_link;
else if( argt->len & Pt_MOZ_CONTEXT_IMAGE )
*(char**) argt->value = moz->rightClickUrl_image;
else *(char**) argt->value = moz->rightClickUrl_link;
}
break;
case Pt_ARG_MOZ_ENCODING:
@ -967,7 +1011,7 @@ static int StartupEmbedding()
// Initialize XPCOM's module info table
NSGetStaticModuleInfo = ph_getModuleInfo;
#endif
rv = NS_InitEmbedding(nsnull, nsnull);
if( NS_FAILED( rv ) ) return -1;

View File

@ -46,6 +46,8 @@
extern PtWidgetClassRef_t *PtMozilla;
class EmbedDownload; /* forward declaration */
/* Resources */
#define Pt_ARG_MOZ_GET_URL Pt_RESOURCE( 104, 0 )
@ -284,9 +286,6 @@ typedef struct mozilla_print_status_t
#define Pt_MOZ_PREF_INT 3
#define Pt_MOZ_PREF_COLOR 4
void MozSetPreference(PtWidget_t *widget, int type, char *pref, void *data);
#define Pt_MOZ_SAVEAS_HTML 1
#define Pt_MOZ_SAVEAS_TEXT 2
int MozSavePageAs(PtWidget_t *widget, char *fname, int type);
// mozilla commands
enum
@ -297,7 +296,7 @@ enum
Pt_MOZ_COMMAND_SELECTALL,
Pt_MOZ_COMMAND_CLEAR,
Pt_MOZ_COMMAND_FIND,
Pt_MOZ_COMMAND_SAVEAS,
Pt_MOZ_COMMAND_SAVEAS
};
typedef struct {
@ -328,7 +327,7 @@ typedef struct Pt_mozilla_client_widget
char disable_exception_dlg, disable_new_windows, spare[2];
int fDownloadCount;
struct Download_ **fDownload;
EmbedDownload **fDownload;
/* text_zoom is the text zooming as set by the client ( 100 = 100% ) */
short int text_zoom;
@ -337,7 +336,8 @@ typedef struct Pt_mozilla_client_widget
to remember to set the zooming when the content is loaded */
short int actual_text_zoom;
char *rightClickUrl; /* keep the url the user clicked on, to provide it latter for Pt_ARG_WEB_GET_CONTEXT */
char *rightClickUrl_image; /* keep the url the user clicked on, to provide it latter for Pt_ARG_WEB_GET_CONTEXT */
char *rightClickUrl_link; /* keep the url the user clicked on, to provide it latter for Pt_ARG_WEB_GET_CONTEXT */
PtMozillaAuthCtrl_t *moz_auth_ctrl;
PtMozillaUnknownCtrl_t *moz_unknown_ctrl;

View File

@ -50,8 +50,6 @@
#include "EmbedPrivate.h"
#include "PtMozilla.h"
#include <photon/PtWebClient.h>
nsUnknownContentTypeHandler::nsUnknownContentTypeHandler( ) {
NS_INIT_ISUPPORTS();
///* ATENTIE */ printf( "In nsUnknownContentTypeHandler constructor\n" );
@ -59,12 +57,7 @@ nsUnknownContentTypeHandler::nsUnknownContentTypeHandler( ) {
nsUnknownContentTypeHandler::~nsUnknownContentTypeHandler( )
{
///* ATENTIE */ printf( "In destructor mURL=%s\n", mURL );
/* remove this download from our list */
RemoveDownload( mMozillaWidget, mDownloadTicket );
if( mURL ) free( mURL );
///* ATENTIE */ printf( "In nsUnknownContentTypeHandler destr\n" );
}
@ -83,8 +76,6 @@ NS_IMETHODIMP nsUnknownContentTypeHandler::PromptForSaveToFile( nsIHelperAppLaun
NS_ENSURE_ARG_POINTER(_retval);
*_retval = nsnull;
aLauncher->SetWebProgressListener( this );
/* try to get the PtMozillawidget_t* pointer form the aContext - use the fact the the WebBrowserContainer is
registering itself as nsIDocumentLoaderObserver ( SetDocLoaderObserver ) */
nsCOMPtr<nsIDOMWindow> domw( do_GetInterface( aWindowContext ) );
@ -93,8 +84,6 @@ NS_IMETHODIMP nsUnknownContentTypeHandler::PromptForSaveToFile( nsIHelperAppLaun
PtWidget_t *w = GetWebBrowser( parent );
PtMozillaWidget_t *moz = ( PtMozillaWidget_t * ) w;
mMozillaWidget = moz;
/* get the suggested filename */
NS_ConvertUCS2toUTF8 theUnicodeString( aDefaultFile );
const char *filename = theUnicodeString.get( );
@ -102,12 +91,10 @@ NS_IMETHODIMP nsUnknownContentTypeHandler::PromptForSaveToFile( nsIHelperAppLaun
/* get the url */
nsCOMPtr<nsIURI> aSourceUrl;
aLauncher->GetSource( getter_AddRefs(aSourceUrl) );
char *url;
const char *url;
nsCAutoString specString;
aSourceUrl->GetSpec(specString);
url = (char *) specString.get();
mURL = strdup( url );
url = specString.get();
/* get the mime type */
nsCOMPtr<nsIMIMEInfo> mimeInfo;
@ -124,7 +111,7 @@ NS_IMETHODIMP nsUnknownContentTypeHandler::PromptForSaveToFile( nsIHelperAppLaun
cbinfo.cbdata = &cb;
cb.action = Pt_WEB_ACTION_OK;
cb.content_type = mimeType;
cb.url = url;
cb.url = (char *)url;
cb.content_length = strlen( cb.url );
cb.suggested_filename = (char*)filename;
PtInvokeCallbackList( moz->web_unknown_cb, (PtWidget_t *)moz, &cbinfo );
@ -133,8 +120,6 @@ NS_IMETHODIMP nsUnknownContentTypeHandler::PromptForSaveToFile( nsIHelperAppLaun
/* we have the result in moz->moz_unknown_ctrl */
if( moz->moz_unknown_ctrl->response != Pt_WEB_RESPONSE_OK ) return NS_ERROR_ABORT;
mDownloadTicket = moz->moz_unknown_ctrl->download_ticket;
/* the user chosen filename is moz->moz_unknown_ctrl->filename */
nsCOMPtr<nsILocalFile> file(do_CreateInstance("@mozilla.org/file/local;1"));
NS_ENSURE_TRUE(file, NS_ERROR_FAILURE);
@ -147,7 +132,9 @@ NS_IMETHODIMP nsUnknownContentTypeHandler::PromptForSaveToFile( nsIHelperAppLaun
NS_ADDREF( *_retval );
/* add this download to our list */
AddDownload( mMozillaWidget, mDownloadTicket, aLauncher, this );
EmbedDownload *download = new EmbedDownload( moz, moz->moz_unknown_ctrl->download_ticket, url );
download->mLauncher = aLauncher;
aLauncher->SetWebProgressListener( download );
return NS_OK;
}
@ -180,119 +167,6 @@ PtWidget_t *nsUnknownContentTypeHandler::GetWebBrowser(nsIDOMWindow *aWindow)
return val;
}
/* nsIWebProgressListener interface */
/* void onProgressChange (in nsIWebProgress aProgress, in nsIRequest aRequest, in long curSelfProgress, in long maxSelfProgress, in long curTotalProgress, in long maxTotalProgress); */
NS_IMETHODIMP nsUnknownContentTypeHandler::OnProgressChange(nsIWebProgress *aProgress, nsIRequest *aRequest, PRInt32 curSelfProgress, PRInt32 maxSelfProgress, PRInt32 curTotalProgress, PRInt32 maxTotalProgress) {
///* ATENTIE */ printf("this=%p OnProgressChange curSelfProgress=%d maxSelfProgress=%d curTotalProgress=%d maxTotalProgress=%d\n",
//this, curSelfProgress, maxSelfProgress, curTotalProgress, maxTotalProgress );
ReportDownload( Pt_WEB_DOWNLOAD_PROGRESS, curSelfProgress, maxSelfProgress, "" );
return NS_OK;
}
NS_IMETHODIMP nsUnknownContentTypeHandler::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 aStateFlags, nsresult aStatus) {
if( aStateFlags & STATE_STOP ) {
ReportDownload( Pt_WEB_DOWNLOAD_DONE, 0, 0, "" );
}
return NS_OK;
}
NS_IMETHODIMP nsUnknownContentTypeHandler::OnLocationChange(nsIWebProgress* aWebProgress, nsIRequest* aRequest, nsIURI *location) {
return NS_OK;
}
NS_IMETHODIMP nsUnknownContentTypeHandler::OnStatusChange(nsIWebProgress* aWebProgress, nsIRequest* aRequest, nsresult aStatus, const PRUnichar* aMessage) {
return NS_OK;
}
NS_IMETHODIMP nsUnknownContentTypeHandler::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 state) {
return NS_OK;
}
NS_IMETHODIMP nsUnknownContentTypeHandler::ReportDownload( int type, int current, int total, char *message )
{
PtCallbackInfo_t cbinfo;
PtWebDownloadCallback_t cb;
memset( &cbinfo, 0, sizeof( cbinfo ) );
cbinfo.reason = Pt_CB_MOZ_DOWNLOAD;
cbinfo.cbdata = &cb;
cb.download_ticket = mDownloadTicket;
cb.type = type;
cb.url = mURL;
cb.current = current;
cb.total = total;
cb.message = message;
PtInvokeCallbackList( mMozillaWidget->web_download_cb, (PtWidget_t *)mMozillaWidget, &cbinfo );
return NS_OK;
}
void AddDownload( PtMozillaWidget_t *moz, int download_ticket, nsIHelperAppLauncher* aLauncher, nsUnknownContentTypeHandler *unknown )
{
Download_t *d;
d = ( Download_t * ) calloc( 1, sizeof( Download_t ) );
if( !d ) return;
d->download_ticket = download_ticket;
d->mLauncher = aLauncher;
NS_RELEASE( aLauncher );
d->unknown = unknown;
/* insert d into moz->fDownload */
moz->fDownload = ( Download_t ** ) realloc( moz->fDownload, ( moz->fDownloadCount + 1 ) * sizeof( Download_t * ) );
if( !moz->fDownload ) return;
moz->fDownload[ moz->fDownloadCount ] = d;
moz->fDownloadCount++;
}
void RemoveDownload( PtMozillaWidget_t *moz, int download_ticket )
{
int i;
/* remove d from the moz->fDownload */
for( i=0; i<moz->fDownloadCount; i++ ) {
if( moz->fDownload[i]->download_ticket == download_ticket ) break;
}
if( i<moz->fDownloadCount ) {
int j;
Download_t *d;
d = moz->fDownload[i];
for( j=i; j<moz->fDownloadCount-1; j++ )
moz->fDownload[j] = moz->fDownload[j+1];
moz->fDownloadCount--;
if( !moz->fDownloadCount ) {
free( moz->fDownload );
moz->fDownload = NULL;
}
d->unknown->ReportDownload( Pt_WEB_DOWNLOAD_CANCEL, 0, 0, "" );
free( d );
}
///* ATENTIE */ printf( "after remove fDownloadCount=%d\n", moz->fDownloadCount );
}
Download_t *FindDownload( PtMozillaWidget_t *moz, int download_ticket )
{
int i;
for( i=0; i<moz->fDownloadCount; i++ ) {
if( moz->fDownload[i]->download_ticket == download_ticket ) return moz->fDownload[i];
}
return NULL;
}
//#######################################################################################
#define className nsUnknownContentTypeHandler

View File

@ -1,19 +1,58 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Netscape Public License
* Version 1.1 (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.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Adrian Mardare <amardare@qnx.com>
*
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the NPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the NPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef NSUNKNOWNCONTENTTYPEHANDLER_EMB
#define NSUNKNOWNCONTENTTYPEHANDLER_EMB
#include "nsIHelperAppLauncherDialog.h"
#include "nsIExternalHelperAppService.h"
#include "nsIWebProgressListener.h"
#include "nsIWebBrowserPersist.h"
#include "nsWeakReference.h"
#include "nsIWindowWatcher.h"
#include "nsIEmbeddingSiteWindow.h"
#include "EmbedDownload.h"
#include "PtMozilla.h"
static NS_DEFINE_CID( kCID, NS_IHELPERAPPLAUNCHERDIALOG_IID );
class nsUnknownContentTypeHandler : public nsIHelperAppLauncherDialog, nsIWebProgressListener {
class nsUnknownContentTypeHandler : public nsIHelperAppLauncherDialog {
public:
@ -27,28 +66,12 @@ public:
// This class implements the nsIHelperAppLauncherDialog interface functions.
NS_DECL_NSIHELPERAPPLAUNCHERDIALOG
NS_DECL_NSIWEBPROGRESSLISTENER
NS_IMETHOD ReportDownload( int type, int current, int total, char *message );
private:
PtWidget_t* GetWebBrowser(nsIDOMWindow *aWindow);
PtMozillaWidget_t *mMozillaWidget;
char *mURL;
long mDownloadTicket;
}; // nsUnknownContentTypeHandler
int Init_nsUnknownContentTypeHandler_Factory( );
/* download related */
typedef struct Download_ {
int download_ticket;
nsCOMPtr<nsIHelperAppLauncher> mLauncher;
nsUnknownContentTypeHandler *unknown;
} Download_t;
void AddDownload( PtMozillaWidget_t *moz, int download_ticket, nsIHelperAppLauncher* aLauncher, nsUnknownContentTypeHandler *unknown );
void RemoveDownload( PtMozillaWidget_t *moz, int download_ticket );
Download_t *FindDownload( PtMozillaWidget_t *moz, int download_ticket );
#endif