/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=2 et sw=2 tw=80: */ /****** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla 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/MPL/ * * 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 IPC External Helper App module. * * The Initial Developer of the Original Code is * Brian Crowder . * Portions created by the Initial Developer are Copyright (C) 2010 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * 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 MPL, 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 MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "ExternalHelperAppParent.h" #include "nsIContent.h" #include "nsIDocument.h" #include "nsCExternalHandlerService.h" #include "nsIExternalHelperAppService.h" #include "mozilla/dom/TabParent.h" #include "nsIBrowserDOMWindow.h" #include "nsStringStream.h" #include "mozilla/unused.h" namespace mozilla { namespace dom { NS_IMPL_ISUPPORTS_INHERITED2(ExternalHelperAppParent, nsHashPropertyBag, nsIRequest, nsIChannel) ExternalHelperAppParent::ExternalHelperAppParent( const IPC::URI& uri, const PRInt64& aContentLength) : mURI(uri) , mPending(PR_FALSE) , mLoadFlags(0) , mStatus(NS_OK) , mContentLength(aContentLength) { } void ExternalHelperAppParent::Init(TabParent *parent, const nsCString& aMimeContentType, const PRBool& aForceSave) { nsHashPropertyBag::Init(); NS_ASSERTION(parent, "must have a non-null TabParent"); nsCOMPtr frame = do_QueryInterface(parent->GetOwnerElement()); nsCOMPtr container = frame->GetOwnerDoc()->GetContainer(); nsCOMPtr ir = do_QueryInterface(container); nsCOMPtr helperAppService = do_GetService(NS_EXTERNALHELPERAPPSERVICE_CONTRACTID); NS_ASSERTION(helperAppService, "No Helper App Service!"); SetPropertyAsInt64(NS_CHANNEL_PROP_CONTENT_LENGTH, mContentLength); helperAppService->DoContent(aMimeContentType, this, ir, aForceSave, getter_AddRefs(mListener)); } bool ExternalHelperAppParent::RecvOnStartRequest() { mPending = PR_TRUE; mStatus = mListener->OnStartRequest(this, nsnull); return true; } bool ExternalHelperAppParent::RecvOnDataAvailable(const nsCString& data, const PRUint32& offset, const PRUint32& count) { if (NS_FAILED(mStatus)) return true; NS_ASSERTION(mPending, "must be pending!"); nsCOMPtr stringStream; nsresult rv = NS_NewByteInputStream(getter_AddRefs(stringStream), data.get(), count, NS_ASSIGNMENT_DEPEND); NS_ASSERTION(NS_SUCCEEDED(rv), "failed to create dependent string!"); mStatus = mListener->OnDataAvailable(this, nsnull, stringStream, offset, count); return true; } bool ExternalHelperAppParent::RecvOnStopRequest(const nsresult& code) { mPending = PR_FALSE; mListener->OnStopRequest(this, nsnull, (NS_SUCCEEDED(code) && NS_FAILED(mStatus)) ? mStatus : code); unused << Send__delete__(this); return true; } ExternalHelperAppParent::~ExternalHelperAppParent() { } // // nsIRequest implementation... // NS_IMETHODIMP ExternalHelperAppParent::GetName(nsACString& aResult) { mURI->GetAsciiSpec(aResult); return NS_OK; } NS_IMETHODIMP ExternalHelperAppParent::IsPending(PRBool *aResult) { *aResult = mPending; return NS_OK; } NS_IMETHODIMP ExternalHelperAppParent::GetStatus(nsresult *aResult) { *aResult = mStatus; return NS_OK; } NS_IMETHODIMP ExternalHelperAppParent::Cancel(nsresult aStatus) { mStatus = aStatus; unused << SendCancel(aStatus); return NS_OK; } NS_IMETHODIMP ExternalHelperAppParent::Suspend() { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP ExternalHelperAppParent::Resume() { return NS_ERROR_NOT_IMPLEMENTED; } // // nsIChannel implementation // NS_IMETHODIMP ExternalHelperAppParent::GetOriginalURI(nsIURI * *aURI) { NS_IF_ADDREF(*aURI = mURI); return NS_OK; } NS_IMETHODIMP ExternalHelperAppParent::SetOriginalURI(nsIURI *aURI) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP ExternalHelperAppParent::GetURI(nsIURI **aURI) { NS_IF_ADDREF(*aURI = mURI); return NS_OK; } NS_IMETHODIMP ExternalHelperAppParent::Open(nsIInputStream **aResult) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP ExternalHelperAppParent::AsyncOpen(nsIStreamListener *aListener, nsISupports *aContext) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP ExternalHelperAppParent::GetLoadFlags(nsLoadFlags *aLoadFlags) { *aLoadFlags = mLoadFlags; return NS_OK; } NS_IMETHODIMP ExternalHelperAppParent::SetLoadFlags(nsLoadFlags aLoadFlags) { mLoadFlags = aLoadFlags; return NS_OK; } NS_IMETHODIMP ExternalHelperAppParent::GetLoadGroup(nsILoadGroup* *aLoadGroup) { *aLoadGroup = nsnull; return NS_OK; } NS_IMETHODIMP ExternalHelperAppParent::SetLoadGroup(nsILoadGroup* aLoadGroup) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP ExternalHelperAppParent::GetOwner(nsISupports* *aOwner) { *aOwner = nsnull; return NS_OK; } NS_IMETHODIMP ExternalHelperAppParent::SetOwner(nsISupports* aOwner) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP ExternalHelperAppParent::GetNotificationCallbacks(nsIInterfaceRequestor* *aCallbacks) { *aCallbacks = nsnull; return NS_OK; } NS_IMETHODIMP ExternalHelperAppParent::SetNotificationCallbacks(nsIInterfaceRequestor* aCallbacks) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP ExternalHelperAppParent::GetSecurityInfo(nsISupports * *aSecurityInfo) { *aSecurityInfo = nsnull; return NS_OK; } NS_IMETHODIMP ExternalHelperAppParent::GetContentType(nsACString& aContentType) { aContentType.Truncate(); return NS_OK; } NS_IMETHODIMP ExternalHelperAppParent::SetContentType(const nsACString& aContentType) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP ExternalHelperAppParent::GetContentCharset(nsACString& aContentCharset) { aContentCharset.Truncate(); return NS_OK; } NS_IMETHODIMP ExternalHelperAppParent::SetContentCharset(const nsACString& aContentCharset) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP ExternalHelperAppParent::GetContentLength(PRInt32 *aContentLength) { if (mContentLength > PR_INT32_MAX || mContentLength < 0) *aContentLength = -1; else *aContentLength = (PRInt32)mContentLength; return NS_OK; } NS_IMETHODIMP ExternalHelperAppParent::SetContentLength(PRInt32 aContentLength) { mContentLength = aContentLength; return NS_OK; } } // namespace dom } // namespace mozilla