michael@0: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- michael@0: * michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "nsFilePickerProxy.h" michael@0: #include "nsComponentManagerUtils.h" michael@0: #include "nsNetUtil.h" michael@0: #include "nsIFile.h" michael@0: #include "nsDOMFile.h" michael@0: #include "mozilla/dom/TabChild.h" michael@0: #include "mozilla/dom/ipc/Blob.h" michael@0: michael@0: using namespace mozilla::dom; michael@0: michael@0: NS_IMPL_ISUPPORTS(nsFilePickerProxy, nsIFilePicker) michael@0: michael@0: nsFilePickerProxy::nsFilePickerProxy() michael@0: { michael@0: } michael@0: michael@0: nsFilePickerProxy::~nsFilePickerProxy() michael@0: { michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsFilePickerProxy::Init(nsIDOMWindow* aParent, const nsAString& aTitle, michael@0: int16_t aMode) michael@0: { michael@0: TabChild* tabChild = TabChild::GetFrom(aParent); michael@0: if (!tabChild) { michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: mMode = aMode; michael@0: michael@0: NS_ADDREF_THIS(); michael@0: tabChild->SendPFilePickerConstructor(this, nsString(aTitle), aMode); michael@0: return NS_OK; michael@0: } michael@0: michael@0: void michael@0: nsFilePickerProxy::InitNative(nsIWidget* aParent, const nsAString& aTitle) michael@0: { michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsFilePickerProxy::AppendFilter(const nsAString& aTitle, const nsAString& aFilter) michael@0: { michael@0: mFilterNames.AppendElement(aTitle); michael@0: mFilters.AppendElement(aFilter); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsFilePickerProxy::GetDefaultString(nsAString& aDefaultString) michael@0: { michael@0: aDefaultString = mDefault; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsFilePickerProxy::SetDefaultString(const nsAString& aDefaultString) michael@0: { michael@0: mDefault = aDefaultString; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsFilePickerProxy::GetDefaultExtension(nsAString& aDefaultExtension) michael@0: { michael@0: aDefaultExtension = mDefaultExtension; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsFilePickerProxy::SetDefaultExtension(const nsAString& aDefaultExtension) michael@0: { michael@0: mDefaultExtension = aDefaultExtension; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsFilePickerProxy::GetFilterIndex(int32_t* aFilterIndex) michael@0: { michael@0: *aFilterIndex = mSelectedType; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsFilePickerProxy::SetFilterIndex(int32_t aFilterIndex) michael@0: { michael@0: mSelectedType = aFilterIndex; michael@0: return NS_OK; michael@0: } michael@0: michael@0: /* readonly attribute nsIFile file; */ michael@0: NS_IMETHODIMP michael@0: nsFilePickerProxy::GetFile(nsIFile** aFile) michael@0: { michael@0: MOZ_ASSERT(false, "GetFile is unimplemented; use GetDomfile"); michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: /* readonly attribute nsIFileURL fileURL; */ michael@0: NS_IMETHODIMP michael@0: nsFilePickerProxy::GetFileURL(nsIURI** aFileURL) michael@0: { michael@0: MOZ_ASSERT(false, "GetFileURL is unimplemented; use GetDomfile"); michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: /* readonly attribute nsISimpleEnumerator files; */ michael@0: NS_IMETHODIMP michael@0: nsFilePickerProxy::GetFiles(nsISimpleEnumerator** aFiles) michael@0: { michael@0: MOZ_ASSERT(false, "GetFiles is unimplemented; use GetDomfiles"); michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsFilePickerProxy::Show(int16_t* aReturn) michael@0: { michael@0: MOZ_ASSERT(false, "Show is unimplemented; use Open"); michael@0: return NS_ERROR_NOT_IMPLEMENTED; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsFilePickerProxy::Open(nsIFilePickerShownCallback* aCallback) michael@0: { michael@0: mCallback = aCallback; michael@0: michael@0: SendOpen(mSelectedType, mAddToRecentDocs, mDefault, michael@0: mDefaultExtension, mFilters, mFilterNames); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: bool michael@0: nsFilePickerProxy::Recv__delete__(const MaybeInputFiles& aFiles, michael@0: const int16_t& aResult) michael@0: { michael@0: if (aFiles.type() == MaybeInputFiles::TInputFiles) { michael@0: const InfallibleTArray& files = aFiles.get_InputFiles().filesChild(); michael@0: for (uint32_t i = 0; i < files.Length(); ++i) { michael@0: BlobChild* actor = static_cast(files[i]); michael@0: nsCOMPtr blob = actor->GetBlob(); michael@0: nsCOMPtr file(do_QueryInterface(blob)); michael@0: NS_ENSURE_TRUE(file, true); michael@0: mDomfiles.AppendObject(file); michael@0: } michael@0: } michael@0: michael@0: if (mCallback) { michael@0: mCallback->Done(aResult); michael@0: mCallback = nullptr; michael@0: } michael@0: michael@0: return true; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsFilePickerProxy::GetDomfile(nsIDOMFile** aDomfile) michael@0: { michael@0: *aDomfile = nullptr; michael@0: if (mDomfiles.IsEmpty()) { michael@0: return NS_OK; michael@0: } michael@0: michael@0: MOZ_ASSERT(mDomfiles.Length() == 1); michael@0: nsCOMPtr domfile = mDomfiles[0]; michael@0: domfile.forget(aDomfile); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsFilePickerProxy::GetDomfiles(nsISimpleEnumerator** aDomfiles) michael@0: { michael@0: return NS_NewArrayEnumerator(aDomfiles, mDomfiles); michael@0: }