gecko/widget/xpwidgets/nsBaseClipboard.cpp
Mike de Boer 4ce1a976c3 Backed out 5 changesets (bug 326743)
Backed out changeset 55fba7bccaaf (bug 326743)
Backed out changeset f4ab79254dfb (bug 326743)
Backed out changeset c8151192e447 (bug 326743)
Backed out changeset 57ceb72568c6 (bug 326743)
Backed out changeset 3081b9770c33 (bug 326743)
2014-02-14 12:55:13 +01:00

126 lines
3.3 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsBaseClipboard.h"
#include "nsIClipboardOwner.h"
#include "nsCOMPtr.h"
#include "nsXPCOM.h"
#include "nsISupportsPrimitives.h"
nsBaseClipboard::nsBaseClipboard()
{
mClipboardOwner = nullptr;
mTransferable = nullptr;
mIgnoreEmptyNotification = false;
mEmptyingForSetData = false;
}
nsBaseClipboard::~nsBaseClipboard()
{
EmptyClipboard(kSelectionClipboard);
EmptyClipboard(kGlobalClipboard);
}
NS_IMPL_ISUPPORTS1(nsBaseClipboard, nsIClipboard)
/**
* Sets the transferable object
*
*/
NS_IMETHODIMP nsBaseClipboard::SetData(nsITransferable * aTransferable, nsIClipboardOwner * anOwner,
int32_t aWhichClipboard)
{
NS_ASSERTION ( aTransferable, "clipboard given a null transferable" );
if (aTransferable == mTransferable && anOwner == mClipboardOwner)
return NS_OK;
bool selectClipPresent;
SupportsSelectionClipboard(&selectClipPresent);
if ( !selectClipPresent && aWhichClipboard != kGlobalClipboard )
return NS_ERROR_FAILURE;
mEmptyingForSetData = true;
EmptyClipboard(aWhichClipboard);
mEmptyingForSetData = false;
mClipboardOwner = anOwner;
if ( anOwner )
NS_ADDREF(mClipboardOwner);
mTransferable = aTransferable;
nsresult rv = NS_ERROR_FAILURE;
if ( mTransferable ) {
NS_ADDREF(mTransferable);
if (!mPrivacyHandler) {
rv = NS_NewClipboardPrivacyHandler(getter_AddRefs(mPrivacyHandler));
NS_ENSURE_SUCCESS(rv, rv);
}
rv = mPrivacyHandler->PrepareDataForClipboard(mTransferable);
NS_ENSURE_SUCCESS(rv, rv);
rv = SetNativeClipboardData(aWhichClipboard);
}
return rv;
}
/**
* Gets the transferable object
*
*/
NS_IMETHODIMP nsBaseClipboard::GetData(nsITransferable * aTransferable, int32_t aWhichClipboard)
{
NS_ASSERTION ( aTransferable, "clipboard given a null transferable" );
bool selectClipPresent;
SupportsSelectionClipboard(&selectClipPresent);
if ( !selectClipPresent && aWhichClipboard != kGlobalClipboard )
return NS_ERROR_FAILURE;
if ( aTransferable )
return GetNativeClipboardData(aTransferable, aWhichClipboard);
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP nsBaseClipboard::EmptyClipboard(int32_t aWhichClipboard)
{
bool selectClipPresent;
SupportsSelectionClipboard(&selectClipPresent);
if ( !selectClipPresent && aWhichClipboard != kGlobalClipboard )
return NS_ERROR_FAILURE;
if (mIgnoreEmptyNotification)
return NS_OK;
if ( mClipboardOwner ) {
mClipboardOwner->LosingOwnership(mTransferable);
NS_RELEASE(mClipboardOwner);
}
NS_IF_RELEASE(mTransferable);
return NS_OK;
}
NS_IMETHODIMP
nsBaseClipboard::HasDataMatchingFlavors(const char** aFlavorList,
uint32_t aLength,
int32_t aWhichClipboard,
bool* outResult)
{
*outResult = true; // say we always do.
return NS_OK;
}
NS_IMETHODIMP
nsBaseClipboard::SupportsSelectionClipboard(bool* _retval)
{
*_retval = false; // we don't support the selection clipboard by default.
return NS_OK;
}