Bug 637111 - [OS/2] eliminate copy to clipboard at shutdown; r=wuno

This commit is contained in:
Rich Walsh 2011-03-05 15:57:00 -05:00
parent 0ac527c26e
commit d96b9a47bd
2 changed files with 16 additions and 77 deletions

View File

@ -44,13 +44,14 @@
#include "nsPrimitiveHelpers.h"
#include "nsXPIDLString.h"
#include "prmem.h"
#include "nsIObserverService.h"
#include "nsIServiceManager.h"
#include "nsOS2Uni.h"
#include "nsClipboard.h"
#include "mozilla/Services.h"
inline ULONG RegisterClipboardFormat(PCSZ pcszFormat)
#define INCL_DOSERRORS
#define INCL_WIN
#include <os2.h>
inline PRUint32 RegisterClipboardFormat(PCSZ pcszFormat)
{
ATOM atom = WinFindAtom(WinQuerySystemAtomTable(), pcszFormat);
if (!atom) {
@ -72,20 +73,11 @@ nsClipboard::nsClipboard() : nsBaseClipboard()
RegisterClipboardFormat(kURLMime);
RegisterClipboardFormat(kNativeImageMime);
RegisterClipboardFormat(kNativeHTMLMime);
// Register for a shutdown notification so that we can flush data
// to the OS clipboard.
nsCOMPtr<nsIObserverService> observerService =
mozilla::services::GetObserverService();
if (observerService)
observerService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, PR_FALSE);
}
nsClipboard::~nsClipboard()
{}
NS_IMPL_ISUPPORTS_INHERITED1(nsClipboard, nsBaseClipboard, nsIObserver)
nsresult nsClipboard::SetNativeClipboardData(PRInt32 aWhichClipboard)
{
if (aWhichClipboard != kGlobalClipboard)
@ -110,7 +102,7 @@ nsresult nsClipboard::GetNativeClipboardData(nsITransferable *aTransferable, PRI
// Get some data from the clipboard
PRBool nsClipboard::GetClipboardData(const char *aFlavor)
{
ULONG ulFormatID = GetFormatID( aFlavor );
PRUint32 ulFormatID = GetFormatID(aFlavor);
PRBool found = GetClipboardDataByID( ulFormatID, aFlavor );
@ -129,13 +121,13 @@ PRBool nsClipboard::GetClipboardData(const char *aFlavor)
return found;
}
PRBool nsClipboard::GetClipboardDataByID(ULONG ulFormatID, const char *aFlavor)
PRBool nsClipboard::GetClipboardDataByID(PRUint32 aFormatID, const char *aFlavor)
{
PVOID pDataMem;
PRUint32 NumOfBytes;
PRBool TempBufAllocated = PR_FALSE;
PVOID pClipboardData = reinterpret_cast<PVOID>(WinQueryClipbrdData( 0, ulFormatID ));
PVOID pClipboardData = reinterpret_cast<PVOID>(WinQueryClipbrdData(0, aFormatID));
if (!pClipboardData)
return PR_FALSE;
@ -144,7 +136,7 @@ PRBool nsClipboard::GetClipboardDataByID(ULONG ulFormatID, const char *aFlavor)
{
pDataMem = pClipboardData;
if (ulFormatID == CF_TEXT) // CF_TEXT is one byte character set
if (aFormatID == CF_TEXT) // CF_TEXT is one byte character set
{
PRUint32 NumOfChars = strlen( static_cast<char*>(pDataMem) );
NumOfBytes = NumOfChars;
@ -178,7 +170,7 @@ PRBool nsClipboard::GetClipboardDataByID(ULONG ulFormatID, const char *aFlavor)
}
else // Assume rest of flavors are binary data
{
if (ulFormatID == CF_BITMAP)
if (aFormatID == CF_BITMAP)
{
if (!strcmp( aFlavor, kJPEGImageMime ))
{
@ -250,7 +242,7 @@ void nsClipboard::SetClipboardData(const char *aFlavor)
return;
}
ULONG ulFormatID = GetFormatID( aFlavor );
PRUint32 ulFormatID = GetFormatID(aFlavor);
if (strstr( aFlavor, "text/" )) // All text/.. flavors are null-terminated
{
@ -406,7 +398,7 @@ nsresult nsClipboard::DoClipboardAction(ClipboardAction aAction)
}
// get the format ID for a given mimetype
ULONG nsClipboard::GetFormatID(const char *aMimeStr)
PRUint32 nsClipboard::GetFormatID(const char *aMimeStr)
{
if (strcmp(aMimeStr, kTextMime) == 0)
return CF_TEXT;
@ -414,46 +406,6 @@ ULONG nsClipboard::GetFormatID(const char *aMimeStr)
return RegisterClipboardFormat(aMimeStr);
}
// nsIObserver
NS_IMETHODIMP
nsClipboard::Observe(nsISupports *aSubject, const char *aTopic,
const PRUnichar *aData)
{
// This will be called on shutdown.
// make sure we have a good transferable
if (!mTransferable)
return NS_ERROR_FAILURE;
if (WinOpenClipbrd(0/*hab*/)) {
WinEmptyClipbrd(0/*hab*/);
// get flavor list that includes all flavors that can be written (including ones
// obtained through conversion)
nsCOMPtr<nsISupportsArray> flavorList;
nsresult errCode = mTransferable->FlavorsTransferableCanExport(getter_AddRefs(flavorList));
if (NS_FAILED(errCode))
return NS_ERROR_FAILURE;
// Walk through flavors and put data on to clipboard
PRUint32 i;
PRUint32 cnt;
flavorList->Count(&cnt);
for (i = 0; i < cnt; i++) {
nsCOMPtr<nsISupports> genericFlavor;
flavorList->GetElementAt(i, getter_AddRefs(genericFlavor));
nsCOMPtr<nsISupportsCString> currentFlavor(do_QueryInterface(genericFlavor));
if (currentFlavor) {
nsXPIDLCString flavorStr;
currentFlavor->ToString(getter_Copies(flavorStr));
SetClipboardData(flavorStr);
}
}
WinCloseClipbrd(0/*hab*/);
}
return NS_OK;
}
NS_IMETHODIMP nsClipboard::HasDataMatchingFlavors(const char** aFlavorList,
PRUint32 aLength,
PRInt32 aWhichClipboard,
@ -465,7 +417,7 @@ NS_IMETHODIMP nsClipboard::HasDataMatchingFlavors(const char** aFlavorList,
for (PRUint32 i = 0; i < aLength; ++i) {
ULONG fmtInfo = 0;
ULONG format = GetFormatID(aFlavorList[i]);
PRUint32 format = GetFormatID(aFlavorList[i]);
if (WinQueryClipbrdFmtInfo(0/*hab*/, format, &fmtInfo)) {
*_retval = PR_TRUE;

View File

@ -39,12 +39,6 @@
#define _nsClipboard_h
#include "nsBaseClipboard.h"
#include "nsIObserver.h"
#define INCL_DOSERRORS
#define INCL_WIN
#include <os2.h>
class nsITransferable;
/**
@ -53,20 +47,13 @@ class nsITransferable;
struct FormatRecord;
class nsClipboard : public nsBaseClipboard,
public nsIObserver
class nsClipboard : public nsBaseClipboard
{
public:
nsClipboard();
virtual ~nsClipboard();
// nsISupports
NS_DECL_ISUPPORTS_INHERITED
// nsIObserver
NS_DECL_NSIOBSERVER
// nsIClipboard
NS_IMETHOD HasDataMatchingFlavors(const char** aFlavorList, PRUint32 aLength,
PRInt32 aWhichClipboard, PRBool *_retval);
@ -81,9 +68,9 @@ protected:
Write
};
ULONG GetFormatID(const char *aMimeStr);
PRUint32 GetFormatID(const char *aMimeStr);
PRBool GetClipboardData(const char *aFlavour);
PRBool GetClipboardDataByID(ULONG ulFormatID, const char *aFlavor);
PRBool GetClipboardDataByID(PRUint32 aFormatID, const char *aFlavor);
void SetClipboardData(const char *aFlavour);
nsresult DoClipboardAction(ClipboardAction aAction);
};