зеркало из https://github.com/mozilla/pjs.git
IDL-ifying nsITransferable, nsIDragService, nsIDragSession, nsIFormatConverter.
This commit is contained in:
Родитель
d08c3d748e
Коммит
edc17e7846
|
@ -50,6 +50,7 @@
|
|||
#include "nsIFormatConverter.h"
|
||||
#include "nsIContentIterator.h"
|
||||
#include "nsIContent.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
#include "nsLayoutCID.h"
|
||||
|
||||
// Drag & Drop, Clipboard Support
|
||||
|
@ -1296,20 +1297,16 @@ nsTextEditorDragListener::DragGesture(nsIDOMEvent* aDragEvent)
|
|||
nsresult
|
||||
nsTextEditorDragListener::DragEnter(nsIDOMEvent* aDragEvent)
|
||||
{
|
||||
nsIDragService* dragService;
|
||||
nsresult rv = nsServiceManager::GetService(kCDragServiceCID,
|
||||
nsIDragService::GetIID(),
|
||||
(nsISupports **)&dragService);
|
||||
if (NS_OK == rv) {
|
||||
nsresult rv;
|
||||
NS_WITH_SERVICE ( nsIDragService, dragService, kCDragServiceCID, &rv );
|
||||
if ( NS_SUCCEEDED(rv) ) {
|
||||
nsCOMPtr<nsIDragSession> dragSession(do_QueryInterface(dragService));
|
||||
|
||||
nsAutoString textFlavor(kTextMime);
|
||||
if (dragSession &&
|
||||
(NS_OK == dragSession->IsDataFlavorSupported(&textFlavor))) {
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
if ( dragSession ) {
|
||||
PRBool flavorSupported = PR_FALSE;
|
||||
dragSession->IsDataFlavorSupported(kTextMime, &flavorSupported);
|
||||
if ( flavorSupported )
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
}
|
||||
|
||||
nsServiceManager::ReleaseService(kCDragServiceCID, dragService);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
@ -1319,18 +1316,16 @@ nsTextEditorDragListener::DragEnter(nsIDOMEvent* aDragEvent)
|
|||
nsresult
|
||||
nsTextEditorDragListener::DragOver(nsIDOMEvent* aDragEvent)
|
||||
{
|
||||
nsIDragService* dragService;
|
||||
nsresult rv = nsServiceManager::GetService(kCDragServiceCID,
|
||||
nsIDragService::GetIID(),
|
||||
(nsISupports **)&dragService);
|
||||
if (NS_OK == rv) {
|
||||
nsresult rv;
|
||||
NS_WITH_SERVICE ( nsIDragService, dragService, kCDragServiceCID, &rv );
|
||||
if ( NS_SUCCEEDED(rv) ) {
|
||||
nsCOMPtr<nsIDragSession> dragSession(do_QueryInterface(dragService));
|
||||
nsAutoString textFlavor(kTextMime);
|
||||
if (dragSession && NS_OK == dragSession->IsDataFlavorSupported(&textFlavor)) {
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
if ( dragSession ) {
|
||||
PRBool flavorSupported = PR_FALSE;
|
||||
dragSession->IsDataFlavorSupported(kTextMime, &flavorSupported);
|
||||
if ( flavorSupported )
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
}
|
||||
|
||||
nsServiceManager::ReleaseService(kCDragServiceCID, dragService);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
@ -1348,9 +1343,6 @@ nsTextEditorDragListener::DragExit(nsIDOMEvent* aDragEvent)
|
|||
nsresult
|
||||
nsTextEditorDragListener::DragDrop(nsIDOMEvent* aMouseEvent)
|
||||
{
|
||||
// String for doing paste
|
||||
nsString stuffToPaste;
|
||||
|
||||
// Create drag service for getting state of drag
|
||||
nsIDragService* dragService;
|
||||
nsresult rv = nsServiceManager::GetService(kCDragServiceCID,
|
||||
|
@ -1370,8 +1362,7 @@ nsTextEditorDragListener::DragDrop(nsIDOMEvent* aMouseEvent)
|
|||
// Add the text Flavor to the transferable,
|
||||
// because that is the only type of data we are
|
||||
// looking for at the moment.
|
||||
nsAutoString textMime (kTextMime);
|
||||
trans->AddDataFlavor(&textMime);
|
||||
trans->AddDataFlavor(kTextMime);
|
||||
//trans->AddDataFlavor(mImageDataFlavor);
|
||||
|
||||
// Fill the transferable with data for each drag item in succession
|
||||
|
@ -1386,17 +1377,19 @@ nsTextEditorDragListener::DragDrop(nsIDOMEvent* aMouseEvent)
|
|||
|
||||
// Get the string data out of the transferable
|
||||
// Note: the transferable owns the pointer to the data
|
||||
char *str = 0;
|
||||
nsCOMPtr<nsISupports> genericDataObj;
|
||||
PRUint32 len;
|
||||
trans->GetAnyTransferData(&textMime, (void **)&str, &len);
|
||||
|
||||
char* whichFlavor;
|
||||
trans->GetAnyTransferData(&whichFlavor, getter_AddRefs(genericDataObj), &len);
|
||||
nsCOMPtr<nsISupportsString> textDataObj( do_QueryInterface(genericDataObj) );
|
||||
// If the string was not empty then paste it in
|
||||
if (str)
|
||||
if ( textDataObj )
|
||||
{
|
||||
char* text = nsnull;
|
||||
textDataObj->toString(&text);
|
||||
nsCOMPtr<nsIHTMLEditor> htmlEditor = do_QueryInterface(mEditor);
|
||||
stuffToPaste.SetString(str, len);
|
||||
if (htmlEditor)
|
||||
htmlEditor->InsertText(stuffToPaste);
|
||||
if ( htmlEditor && text )
|
||||
htmlEditor->InsertText(text);
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
}
|
||||
|
||||
|
|
|
@ -62,6 +62,7 @@
|
|||
#include "nsIImage.h"
|
||||
#include "nsAOLCiter.h"
|
||||
#include "nsInternetCiter.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
|
||||
// netwerk
|
||||
#include "nsIURI.h"
|
||||
|
@ -2787,23 +2788,26 @@ NS_IMETHODIMP nsHTMLEditor::PasteAsPlaintextQuotation()
|
|||
if (NS_SUCCEEDED(rv) && trans)
|
||||
{
|
||||
// We only handle plaintext pastes here
|
||||
nsAutoString flavor(kTextMime);
|
||||
trans->AddDataFlavor(&flavor);
|
||||
trans->AddDataFlavor(kTextMime);
|
||||
|
||||
// Get the Data from the clipboard
|
||||
// Get the Data from the clipboard
|
||||
clipboard->GetData(trans);
|
||||
|
||||
// Now we ask the transferable for the data
|
||||
// it still owns the data, we just have a pointer to it.
|
||||
// If it can't support a "text" output of the data the call will fail
|
||||
char *str = 0;
|
||||
PRUint32 len;
|
||||
rv = trans->GetTransferData(&flavor, (void **)&str, &len);
|
||||
if (NS_SUCCEEDED(rv) && str && len > 0)
|
||||
nsCOMPtr<nsISupports> genericDataObj;
|
||||
PRUint32 len = 0;
|
||||
rv = trans->GetTransferData(kTextMime, getter_AddRefs(genericDataObj), &len);
|
||||
if (NS_SUCCEEDED(rv) && genericDataObj && len > 0)
|
||||
{
|
||||
nsString stuffToPaste;
|
||||
stuffToPaste.SetString(str, len);
|
||||
rv = InsertAsPlaintextQuotation(stuffToPaste);
|
||||
nsCOMPtr<nsISupportsWString> dataObj ( do_QueryInterface(genericDataObj) );
|
||||
if ( dataObj ) {
|
||||
PRUnichar* textData = nsnull;
|
||||
dataObj->toString ( &textData );
|
||||
nsAutoString text ( textData );
|
||||
rv = InsertAsPlaintextQuotation(text);
|
||||
}
|
||||
}
|
||||
}
|
||||
nsServiceManager::ReleaseService(kCClipboardCID, clipboard);
|
||||
|
@ -2989,11 +2993,11 @@ NS_IMETHODIMP nsHTMLEditor::Paste()
|
|||
nsString stuffToPaste;
|
||||
|
||||
// Get Clipboard Service
|
||||
nsIClipboard* clipboard;
|
||||
nsresult rv = nsServiceManager::GetService(kCClipboardCID,
|
||||
nsIClipboard::GetIID(),
|
||||
(nsISupports **)&clipboard);
|
||||
|
||||
nsresult rv;
|
||||
NS_WITH_SERVICE ( nsIClipboard, clipboard, kCClipboardCID, &rv );
|
||||
if ( NS_FAILED(rv) )
|
||||
return rv;
|
||||
|
||||
// Create generic Transferable for getting the data
|
||||
nsCOMPtr<nsITransferable> trans;
|
||||
rv = nsComponentManager::CreateInstance(kCTransferableCID, nsnull,
|
||||
|
@ -3006,45 +3010,50 @@ NS_IMETHODIMP nsHTMLEditor::Paste()
|
|||
{
|
||||
// Create the desired DataFlavor for the type of data
|
||||
// we want to get out of the transferable
|
||||
nsAutoString imageFlavor(kJPEGImageMime);
|
||||
nsAutoString htmlFlavor(kHTMLMime);
|
||||
nsAutoString textFlavor(kTextMime);
|
||||
|
||||
if ((mFlags & eEditorPlaintextMask) == 0) // This should only happen in html editors, not plaintext
|
||||
{
|
||||
trans->AddDataFlavor(&imageFlavor);
|
||||
trans->AddDataFlavor(&htmlFlavor);
|
||||
trans->AddDataFlavor(kJPEGImageMime);
|
||||
trans->AddDataFlavor(kHTMLMime);
|
||||
}
|
||||
trans->AddDataFlavor(&textFlavor);
|
||||
trans->AddDataFlavor(kTextMime);
|
||||
|
||||
// Get the Data from the clipboard
|
||||
if (NS_SUCCEEDED(clipboard->GetData(trans)))
|
||||
{
|
||||
nsAutoString flavor;
|
||||
char * data;
|
||||
PRUint32 len;
|
||||
if (NS_SUCCEEDED(trans->GetAnyTransferData(&flavor, (void **)&data, &len)))
|
||||
char* bestFlavor = nsnull;
|
||||
nsCOMPtr<nsISupports> genericDataObj;
|
||||
PRUint32 len = 0;
|
||||
if ( NS_SUCCEEDED(trans->GetAnyTransferData(&bestFlavor, getter_AddRefs(genericDataObj), &len)) )
|
||||
{
|
||||
nsAutoString flavor ( bestFlavor ); // just so we can use flavor.Equals()
|
||||
#ifdef DEBUG_akkana
|
||||
printf("Got flavor [%s]\n", flavor.ToNewCString());
|
||||
printf("Got flavor [%s]\n", flavor);
|
||||
#endif
|
||||
if (flavor.Equals(htmlFlavor))
|
||||
if (flavor.Equals(kHTMLMime))
|
||||
{
|
||||
if (data && len > 0) // stuffToPaste is ready for insertion into the content
|
||||
nsCOMPtr<nsISupportsWString> textDataObj ( do_QueryInterface(genericDataObj) );
|
||||
if (textDataObj && len > 0)
|
||||
{
|
||||
stuffToPaste.SetString((PRUnichar *)data, len/2);
|
||||
PRUnichar* text = nsnull;
|
||||
textDataObj->toString ( &text );
|
||||
nsAutoString stuffToPaste;
|
||||
stuffToPaste.SetString ( text, len / 2 );
|
||||
rv = InsertHTML(stuffToPaste);
|
||||
}
|
||||
}
|
||||
else if (flavor.Equals(textFlavor))
|
||||
else if (flavor.Equals(kTextMime))
|
||||
{
|
||||
if (data && len > 0) // stuffToPaste is ready for insertion into the content
|
||||
nsCOMPtr<nsISupportsString> textDataObj ( do_QueryInterface(genericDataObj) );
|
||||
if (textDataObj && len > 0)
|
||||
{
|
||||
stuffToPaste.SetString(data, len);
|
||||
char* text = nsnull;
|
||||
textDataObj->toString ( &text );
|
||||
nsAutoString stuffToPaste;
|
||||
stuffToPaste.SetString ( text, len );
|
||||
rv = InsertText(stuffToPaste);
|
||||
}
|
||||
}
|
||||
else if (flavor.Equals(imageFlavor))
|
||||
else if (flavor.Equals(kJPEGImageMime))
|
||||
{
|
||||
// Insert Image code here
|
||||
printf("Don't know how to insert an image yet!\n");
|
||||
|
@ -3057,7 +3066,6 @@ NS_IMETHODIMP nsHTMLEditor::Paste()
|
|||
}
|
||||
}
|
||||
}
|
||||
nsServiceManager::ReleaseService(kCClipboardCID, clipboard);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
|
|
@ -62,6 +62,7 @@
|
|||
#include "nsIImage.h"
|
||||
#include "nsAOLCiter.h"
|
||||
#include "nsInternetCiter.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
|
||||
// netwerk
|
||||
#include "nsIURI.h"
|
||||
|
@ -2787,23 +2788,26 @@ NS_IMETHODIMP nsHTMLEditor::PasteAsPlaintextQuotation()
|
|||
if (NS_SUCCEEDED(rv) && trans)
|
||||
{
|
||||
// We only handle plaintext pastes here
|
||||
nsAutoString flavor(kTextMime);
|
||||
trans->AddDataFlavor(&flavor);
|
||||
trans->AddDataFlavor(kTextMime);
|
||||
|
||||
// Get the Data from the clipboard
|
||||
// Get the Data from the clipboard
|
||||
clipboard->GetData(trans);
|
||||
|
||||
// Now we ask the transferable for the data
|
||||
// it still owns the data, we just have a pointer to it.
|
||||
// If it can't support a "text" output of the data the call will fail
|
||||
char *str = 0;
|
||||
PRUint32 len;
|
||||
rv = trans->GetTransferData(&flavor, (void **)&str, &len);
|
||||
if (NS_SUCCEEDED(rv) && str && len > 0)
|
||||
nsCOMPtr<nsISupports> genericDataObj;
|
||||
PRUint32 len = 0;
|
||||
rv = trans->GetTransferData(kTextMime, getter_AddRefs(genericDataObj), &len);
|
||||
if (NS_SUCCEEDED(rv) && genericDataObj && len > 0)
|
||||
{
|
||||
nsString stuffToPaste;
|
||||
stuffToPaste.SetString(str, len);
|
||||
rv = InsertAsPlaintextQuotation(stuffToPaste);
|
||||
nsCOMPtr<nsISupportsWString> dataObj ( do_QueryInterface(genericDataObj) );
|
||||
if ( dataObj ) {
|
||||
PRUnichar* textData = nsnull;
|
||||
dataObj->toString ( &textData );
|
||||
nsAutoString text ( textData );
|
||||
rv = InsertAsPlaintextQuotation(text);
|
||||
}
|
||||
}
|
||||
}
|
||||
nsServiceManager::ReleaseService(kCClipboardCID, clipboard);
|
||||
|
@ -2989,11 +2993,11 @@ NS_IMETHODIMP nsHTMLEditor::Paste()
|
|||
nsString stuffToPaste;
|
||||
|
||||
// Get Clipboard Service
|
||||
nsIClipboard* clipboard;
|
||||
nsresult rv = nsServiceManager::GetService(kCClipboardCID,
|
||||
nsIClipboard::GetIID(),
|
||||
(nsISupports **)&clipboard);
|
||||
|
||||
nsresult rv;
|
||||
NS_WITH_SERVICE ( nsIClipboard, clipboard, kCClipboardCID, &rv );
|
||||
if ( NS_FAILED(rv) )
|
||||
return rv;
|
||||
|
||||
// Create generic Transferable for getting the data
|
||||
nsCOMPtr<nsITransferable> trans;
|
||||
rv = nsComponentManager::CreateInstance(kCTransferableCID, nsnull,
|
||||
|
@ -3006,45 +3010,50 @@ NS_IMETHODIMP nsHTMLEditor::Paste()
|
|||
{
|
||||
// Create the desired DataFlavor for the type of data
|
||||
// we want to get out of the transferable
|
||||
nsAutoString imageFlavor(kJPEGImageMime);
|
||||
nsAutoString htmlFlavor(kHTMLMime);
|
||||
nsAutoString textFlavor(kTextMime);
|
||||
|
||||
if ((mFlags & eEditorPlaintextMask) == 0) // This should only happen in html editors, not plaintext
|
||||
{
|
||||
trans->AddDataFlavor(&imageFlavor);
|
||||
trans->AddDataFlavor(&htmlFlavor);
|
||||
trans->AddDataFlavor(kJPEGImageMime);
|
||||
trans->AddDataFlavor(kHTMLMime);
|
||||
}
|
||||
trans->AddDataFlavor(&textFlavor);
|
||||
trans->AddDataFlavor(kTextMime);
|
||||
|
||||
// Get the Data from the clipboard
|
||||
if (NS_SUCCEEDED(clipboard->GetData(trans)))
|
||||
{
|
||||
nsAutoString flavor;
|
||||
char * data;
|
||||
PRUint32 len;
|
||||
if (NS_SUCCEEDED(trans->GetAnyTransferData(&flavor, (void **)&data, &len)))
|
||||
char* bestFlavor = nsnull;
|
||||
nsCOMPtr<nsISupports> genericDataObj;
|
||||
PRUint32 len = 0;
|
||||
if ( NS_SUCCEEDED(trans->GetAnyTransferData(&bestFlavor, getter_AddRefs(genericDataObj), &len)) )
|
||||
{
|
||||
nsAutoString flavor ( bestFlavor ); // just so we can use flavor.Equals()
|
||||
#ifdef DEBUG_akkana
|
||||
printf("Got flavor [%s]\n", flavor.ToNewCString());
|
||||
printf("Got flavor [%s]\n", flavor);
|
||||
#endif
|
||||
if (flavor.Equals(htmlFlavor))
|
||||
if (flavor.Equals(kHTMLMime))
|
||||
{
|
||||
if (data && len > 0) // stuffToPaste is ready for insertion into the content
|
||||
nsCOMPtr<nsISupportsWString> textDataObj ( do_QueryInterface(genericDataObj) );
|
||||
if (textDataObj && len > 0)
|
||||
{
|
||||
stuffToPaste.SetString((PRUnichar *)data, len/2);
|
||||
PRUnichar* text = nsnull;
|
||||
textDataObj->toString ( &text );
|
||||
nsAutoString stuffToPaste;
|
||||
stuffToPaste.SetString ( text, len / 2 );
|
||||
rv = InsertHTML(stuffToPaste);
|
||||
}
|
||||
}
|
||||
else if (flavor.Equals(textFlavor))
|
||||
else if (flavor.Equals(kTextMime))
|
||||
{
|
||||
if (data && len > 0) // stuffToPaste is ready for insertion into the content
|
||||
nsCOMPtr<nsISupportsString> textDataObj ( do_QueryInterface(genericDataObj) );
|
||||
if (textDataObj && len > 0)
|
||||
{
|
||||
stuffToPaste.SetString(data, len);
|
||||
char* text = nsnull;
|
||||
textDataObj->toString ( &text );
|
||||
nsAutoString stuffToPaste;
|
||||
stuffToPaste.SetString ( text, len );
|
||||
rv = InsertText(stuffToPaste);
|
||||
}
|
||||
}
|
||||
else if (flavor.Equals(imageFlavor))
|
||||
else if (flavor.Equals(kJPEGImageMime))
|
||||
{
|
||||
// Insert Image code here
|
||||
printf("Don't know how to insert an image yet!\n");
|
||||
|
@ -3057,7 +3066,6 @@ NS_IMETHODIMP nsHTMLEditor::Paste()
|
|||
}
|
||||
}
|
||||
}
|
||||
nsServiceManager::ReleaseService(kCClipboardCID, clipboard);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
#include "nsIFormatConverter.h"
|
||||
#include "nsIContentIterator.h"
|
||||
#include "nsIContent.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
#include "nsLayoutCID.h"
|
||||
|
||||
// Drag & Drop, Clipboard Support
|
||||
|
@ -1296,20 +1297,16 @@ nsTextEditorDragListener::DragGesture(nsIDOMEvent* aDragEvent)
|
|||
nsresult
|
||||
nsTextEditorDragListener::DragEnter(nsIDOMEvent* aDragEvent)
|
||||
{
|
||||
nsIDragService* dragService;
|
||||
nsresult rv = nsServiceManager::GetService(kCDragServiceCID,
|
||||
nsIDragService::GetIID(),
|
||||
(nsISupports **)&dragService);
|
||||
if (NS_OK == rv) {
|
||||
nsresult rv;
|
||||
NS_WITH_SERVICE ( nsIDragService, dragService, kCDragServiceCID, &rv );
|
||||
if ( NS_SUCCEEDED(rv) ) {
|
||||
nsCOMPtr<nsIDragSession> dragSession(do_QueryInterface(dragService));
|
||||
|
||||
nsAutoString textFlavor(kTextMime);
|
||||
if (dragSession &&
|
||||
(NS_OK == dragSession->IsDataFlavorSupported(&textFlavor))) {
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
if ( dragSession ) {
|
||||
PRBool flavorSupported = PR_FALSE;
|
||||
dragSession->IsDataFlavorSupported(kTextMime, &flavorSupported);
|
||||
if ( flavorSupported )
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
}
|
||||
|
||||
nsServiceManager::ReleaseService(kCDragServiceCID, dragService);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
@ -1319,18 +1316,16 @@ nsTextEditorDragListener::DragEnter(nsIDOMEvent* aDragEvent)
|
|||
nsresult
|
||||
nsTextEditorDragListener::DragOver(nsIDOMEvent* aDragEvent)
|
||||
{
|
||||
nsIDragService* dragService;
|
||||
nsresult rv = nsServiceManager::GetService(kCDragServiceCID,
|
||||
nsIDragService::GetIID(),
|
||||
(nsISupports **)&dragService);
|
||||
if (NS_OK == rv) {
|
||||
nsresult rv;
|
||||
NS_WITH_SERVICE ( nsIDragService, dragService, kCDragServiceCID, &rv );
|
||||
if ( NS_SUCCEEDED(rv) ) {
|
||||
nsCOMPtr<nsIDragSession> dragSession(do_QueryInterface(dragService));
|
||||
nsAutoString textFlavor(kTextMime);
|
||||
if (dragSession && NS_OK == dragSession->IsDataFlavorSupported(&textFlavor)) {
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
if ( dragSession ) {
|
||||
PRBool flavorSupported = PR_FALSE;
|
||||
dragSession->IsDataFlavorSupported(kTextMime, &flavorSupported);
|
||||
if ( flavorSupported )
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
}
|
||||
|
||||
nsServiceManager::ReleaseService(kCDragServiceCID, dragService);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
@ -1348,9 +1343,6 @@ nsTextEditorDragListener::DragExit(nsIDOMEvent* aDragEvent)
|
|||
nsresult
|
||||
nsTextEditorDragListener::DragDrop(nsIDOMEvent* aMouseEvent)
|
||||
{
|
||||
// String for doing paste
|
||||
nsString stuffToPaste;
|
||||
|
||||
// Create drag service for getting state of drag
|
||||
nsIDragService* dragService;
|
||||
nsresult rv = nsServiceManager::GetService(kCDragServiceCID,
|
||||
|
@ -1370,8 +1362,7 @@ nsTextEditorDragListener::DragDrop(nsIDOMEvent* aMouseEvent)
|
|||
// Add the text Flavor to the transferable,
|
||||
// because that is the only type of data we are
|
||||
// looking for at the moment.
|
||||
nsAutoString textMime (kTextMime);
|
||||
trans->AddDataFlavor(&textMime);
|
||||
trans->AddDataFlavor(kTextMime);
|
||||
//trans->AddDataFlavor(mImageDataFlavor);
|
||||
|
||||
// Fill the transferable with data for each drag item in succession
|
||||
|
@ -1386,17 +1377,19 @@ nsTextEditorDragListener::DragDrop(nsIDOMEvent* aMouseEvent)
|
|||
|
||||
// Get the string data out of the transferable
|
||||
// Note: the transferable owns the pointer to the data
|
||||
char *str = 0;
|
||||
nsCOMPtr<nsISupports> genericDataObj;
|
||||
PRUint32 len;
|
||||
trans->GetAnyTransferData(&textMime, (void **)&str, &len);
|
||||
|
||||
char* whichFlavor;
|
||||
trans->GetAnyTransferData(&whichFlavor, getter_AddRefs(genericDataObj), &len);
|
||||
nsCOMPtr<nsISupportsString> textDataObj( do_QueryInterface(genericDataObj) );
|
||||
// If the string was not empty then paste it in
|
||||
if (str)
|
||||
if ( textDataObj )
|
||||
{
|
||||
char* text = nsnull;
|
||||
textDataObj->toString(&text);
|
||||
nsCOMPtr<nsIHTMLEditor> htmlEditor = do_QueryInterface(mEditor);
|
||||
stuffToPaste.SetString(str, len);
|
||||
if (htmlEditor)
|
||||
htmlEditor->InsertText(stuffToPaste);
|
||||
if ( htmlEditor && text )
|
||||
htmlEditor->InsertText(text);
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
}
|
||||
|
||||
|
|
|
@ -60,6 +60,7 @@
|
|||
#include "nsIFrameSelection.h"
|
||||
#include "nsViewsCID.h"
|
||||
#include "nsIFrameManager.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
|
||||
// Drag & Drop, Clipboard
|
||||
#include "nsWidgetsCID.h"
|
||||
|
@ -1462,43 +1463,46 @@ PresShell::DoCopy()
|
|||
NS_IF_RELEASE(sel);
|
||||
|
||||
// Get the Clipboard
|
||||
nsIClipboard* clipboard;
|
||||
nsIClipboard* clipboard = nsnull;
|
||||
nsresult rv = nsServiceManager::GetService(kCClipboardCID,
|
||||
nsIClipboard::GetIID(),
|
||||
(nsISupports **)&clipboard);
|
||||
|
||||
if (NS_OK == rv) {
|
||||
|
||||
// Create a data flavor to tell the transferable
|
||||
// that it is about to receive XIF
|
||||
nsAutoString flavor(kXIFMime);
|
||||
|
||||
if ( clipboard ) {
|
||||
// Create a transferable for putting data on the Clipboard
|
||||
nsCOMPtr<nsITransferable> trans;
|
||||
rv = nsComponentManager::CreateInstance(kCTransferableCID, nsnull,
|
||||
nsITransferable::GetIID(),
|
||||
(void**) getter_AddRefs(trans));
|
||||
if (NS_OK == rv) {
|
||||
if ( trans ) {
|
||||
// The data on the clipboard will be in "XIF" format
|
||||
// so give the clipboard transferable a "XIFConverter" for
|
||||
// converting from XIF to other formats
|
||||
nsCOMPtr<nsIFormatConverter> xifConverter;
|
||||
rv = nsComponentManager::CreateInstance(kCXIFConverterCID, nsnull,
|
||||
nsIFormatConverter::GetIID(), (void**) getter_AddRefs(xifConverter));
|
||||
if (NS_OK == rv) {
|
||||
NS_GET_IID(nsIFormatConverter), getter_AddRefs(xifConverter));
|
||||
if ( xifConverter ) {
|
||||
// Add the XIF DataFlavor to the transferable
|
||||
// this tells the transferable that it can handle receiving the XIF format
|
||||
trans->AddDataFlavor(&flavor);
|
||||
trans->AddDataFlavor(kXIFMime);
|
||||
|
||||
// Add the converter for going from XIF to other formats
|
||||
trans->SetConverter(xifConverter);
|
||||
|
||||
// Now add the XIF data to the transferable
|
||||
// Now add the XIF data to the transferable, placing it into a nsISupportsWString object.
|
||||
// the transferable wants the number bytes for the data and since it is double byte
|
||||
// we multiply by 2
|
||||
trans->SetTransferData(&flavor, buffer.ToNewUnicode(), buffer.Length()*2);
|
||||
//trans->SetTransferData(&flavor, buffer.ToNewCString(), buffer.Length());
|
||||
|
||||
// we multiply by 2.
|
||||
nsCOMPtr<nsISupportsWString> dataWrapper;
|
||||
rv = nsComponentManager::CreateInstance(NS_SUPPORTS_WSTRING_PROGID, nsnull,
|
||||
NS_GET_IID(nsISupportsWString), getter_AddRefs(dataWrapper));
|
||||
if ( dataWrapper ) {
|
||||
dataWrapper->SetData ( NS_CONST_CAST(PRUnichar*,buffer.GetUnicode()) );
|
||||
// QI the data object an |nsISupports| so that when the transferable holds
|
||||
// onto it, it will addref the correct interface.
|
||||
nsCOMPtr<nsISupports> genericDataObj ( do_QueryInterface(dataWrapper) );
|
||||
trans->SetTransferData(kXIFMime, genericDataObj, buffer.Length()*2);
|
||||
}
|
||||
|
||||
// put the transferable on the clipboard
|
||||
clipboard->SetData(trans, nsnull);
|
||||
}
|
||||
|
|
|
@ -60,6 +60,7 @@
|
|||
#include "nsIFrameSelection.h"
|
||||
#include "nsViewsCID.h"
|
||||
#include "nsIFrameManager.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
|
||||
// Drag & Drop, Clipboard
|
||||
#include "nsWidgetsCID.h"
|
||||
|
@ -1462,43 +1463,46 @@ PresShell::DoCopy()
|
|||
NS_IF_RELEASE(sel);
|
||||
|
||||
// Get the Clipboard
|
||||
nsIClipboard* clipboard;
|
||||
nsIClipboard* clipboard = nsnull;
|
||||
nsresult rv = nsServiceManager::GetService(kCClipboardCID,
|
||||
nsIClipboard::GetIID(),
|
||||
(nsISupports **)&clipboard);
|
||||
|
||||
if (NS_OK == rv) {
|
||||
|
||||
// Create a data flavor to tell the transferable
|
||||
// that it is about to receive XIF
|
||||
nsAutoString flavor(kXIFMime);
|
||||
|
||||
if ( clipboard ) {
|
||||
// Create a transferable for putting data on the Clipboard
|
||||
nsCOMPtr<nsITransferable> trans;
|
||||
rv = nsComponentManager::CreateInstance(kCTransferableCID, nsnull,
|
||||
nsITransferable::GetIID(),
|
||||
(void**) getter_AddRefs(trans));
|
||||
if (NS_OK == rv) {
|
||||
if ( trans ) {
|
||||
// The data on the clipboard will be in "XIF" format
|
||||
// so give the clipboard transferable a "XIFConverter" for
|
||||
// converting from XIF to other formats
|
||||
nsCOMPtr<nsIFormatConverter> xifConverter;
|
||||
rv = nsComponentManager::CreateInstance(kCXIFConverterCID, nsnull,
|
||||
nsIFormatConverter::GetIID(), (void**) getter_AddRefs(xifConverter));
|
||||
if (NS_OK == rv) {
|
||||
NS_GET_IID(nsIFormatConverter), getter_AddRefs(xifConverter));
|
||||
if ( xifConverter ) {
|
||||
// Add the XIF DataFlavor to the transferable
|
||||
// this tells the transferable that it can handle receiving the XIF format
|
||||
trans->AddDataFlavor(&flavor);
|
||||
trans->AddDataFlavor(kXIFMime);
|
||||
|
||||
// Add the converter for going from XIF to other formats
|
||||
trans->SetConverter(xifConverter);
|
||||
|
||||
// Now add the XIF data to the transferable
|
||||
// Now add the XIF data to the transferable, placing it into a nsISupportsWString object.
|
||||
// the transferable wants the number bytes for the data and since it is double byte
|
||||
// we multiply by 2
|
||||
trans->SetTransferData(&flavor, buffer.ToNewUnicode(), buffer.Length()*2);
|
||||
//trans->SetTransferData(&flavor, buffer.ToNewCString(), buffer.Length());
|
||||
|
||||
// we multiply by 2.
|
||||
nsCOMPtr<nsISupportsWString> dataWrapper;
|
||||
rv = nsComponentManager::CreateInstance(NS_SUPPORTS_WSTRING_PROGID, nsnull,
|
||||
NS_GET_IID(nsISupportsWString), getter_AddRefs(dataWrapper));
|
||||
if ( dataWrapper ) {
|
||||
dataWrapper->SetData ( NS_CONST_CAST(PRUnichar*,buffer.GetUnicode()) );
|
||||
// QI the data object an |nsISupports| so that when the transferable holds
|
||||
// onto it, it will addref the correct interface.
|
||||
nsCOMPtr<nsISupports> genericDataObj ( do_QueryInterface(dataWrapper) );
|
||||
trans->SetTransferData(kXIFMime, genericDataObj, buffer.Length()*2);
|
||||
}
|
||||
|
||||
// put the transferable on the clipboard
|
||||
clipboard->SetData(trans, nsnull);
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include "nsIDOMElement.h"
|
||||
#include "nsXULAtoms.h"
|
||||
#include "nsIEventStateManager.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
|
||||
#include "nsISupportsArray.h"
|
||||
#include "nsIViewManager.h"
|
||||
|
@ -153,20 +154,17 @@ nsToolbarDragListener::DragGesture(nsIDOMEvent* aDragEvent)
|
|||
if (isLegalChild) {
|
||||
|
||||
// Start Drag
|
||||
nsIDragService* dragService;
|
||||
rv = nsServiceManager::GetService(kCDragServiceCID,
|
||||
nsIDragService::GetIID(),
|
||||
(nsISupports **)&dragService);
|
||||
if (NS_OK == rv) {
|
||||
NS_WITH_SERVICE ( nsIDragService, dragService, kCDragServiceCID, &rv );
|
||||
if ( NS_SUCCEEDED(rv) ) {
|
||||
// XXX NOTE!
|
||||
// Here you need to create a special transferable
|
||||
// for handling RDF nodes (instead of this text transferable)
|
||||
nsCOMPtr<nsITransferable> trans;
|
||||
rv = nsComponentManager::CreateInstance(kCTransferableCID, nsnull,
|
||||
nsITransferable::GetIID(), getter_AddRefs(trans));
|
||||
if (NS_OK == rv && trans) {
|
||||
nsString ddFlavor;
|
||||
nsString dragText;
|
||||
if ( trans ) {
|
||||
const char* ddFlavor;
|
||||
nsAutoString dragText;
|
||||
if (onChild) {
|
||||
ddFlavor = TOOLBARITEM_MIME;
|
||||
dragText = "toolbar item";
|
||||
|
@ -174,22 +172,35 @@ nsToolbarDragListener::DragGesture(nsIDOMEvent* aDragEvent)
|
|||
ddFlavor = TOOLBAR_MIME;
|
||||
dragText = "toolbar";
|
||||
}
|
||||
trans->AddDataFlavor(&ddFlavor);
|
||||
PRUint32 len = dragText.Length();
|
||||
trans->SetTransferData(&ddFlavor, dragText.ToNewCString(), len); // transferable consumes the data
|
||||
trans->AddDataFlavor(ddFlavor);
|
||||
PRUint32 len = dragText.Length() * 2; // len of unicode
|
||||
nsCOMPtr<nsISupportsWString> dataObj; // hack note: has to be wstring because not plain text flavor
|
||||
rv = nsComponentManager::CreateInstance(NS_SUPPORTS_WSTRING_PROGID, nsnull,
|
||||
NS_GET_IID(nsISupportsWString), getter_AddRefs(dataObj));
|
||||
if ( dataObj ) {
|
||||
PRUnichar* data = dragText.ToNewUnicode();
|
||||
dataObj->SetData ( data );
|
||||
// QI the data object an |nsISupports| so that when the transferable holds
|
||||
// onto it, it will addref the correct interface.
|
||||
nsCOMPtr<nsISupports> genericDataObj ( do_QueryInterface(dataObj) );
|
||||
trans->SetTransferData(ddFlavor, genericDataObj, len);
|
||||
|
||||
nsCOMPtr<nsISupportsArray> items;
|
||||
NS_NewISupportsArray(getter_AddRefs(items));
|
||||
if ( items ) {
|
||||
items->AppendElement(trans);
|
||||
dragService->InvokeDragSession(items, nsnull, nsIDragService::DRAGDROP_ACTION_COPY | nsIDragService::DRAGDROP_ACTION_MOVE);
|
||||
nsCOMPtr<nsISupportsArray> items;
|
||||
NS_NewISupportsArray(getter_AddRefs(items));
|
||||
if ( items ) {
|
||||
// QI the transferable to an |nsISupports| so that when the array holds
|
||||
// onto it, it will addref the correct interface.
|
||||
nsCOMPtr<nsISupports> genericTrans ( do_QueryInterface(trans) );
|
||||
items->AppendElement(genericTrans);
|
||||
dragService->InvokeDragSession(items, nsnull, nsIDragService::DRAGDROP_ACTION_COPY | nsIDragService::DRAGDROP_ACTION_MOVE);
|
||||
}
|
||||
delete [] data;
|
||||
}
|
||||
}
|
||||
nsServiceManager::ReleaseService(kCDragServiceCID, dragService);
|
||||
}
|
||||
} else { // when it is isn't a legal child then don't consume
|
||||
} else // when it is isn't a legal child then don't consume
|
||||
return NS_OK; // don't consume event
|
||||
}
|
||||
|
||||
rv = NS_ERROR_BASE; // consumes the event
|
||||
}
|
||||
return rv;
|
||||
|
@ -202,22 +213,25 @@ nsToolbarDragListener::DragEnter(nsIDOMEvent* aDragEvent)
|
|||
{
|
||||
mCurrentDropLoc = -1;
|
||||
|
||||
nsIDragService* dragService;
|
||||
nsresult rv = nsServiceManager::GetService(kCDragServiceCID,
|
||||
nsIDragService::GetIID(),
|
||||
(nsISupports **)&dragService);
|
||||
if (NS_OK == rv) {
|
||||
nsresult rv;
|
||||
NS_WITH_SERVICE ( nsIDragService, dragService, kCDragServiceCID, &rv );
|
||||
if ( NS_SUCCEEDED(rv) ) {
|
||||
nsCOMPtr<nsIDragSession> dragSession(do_QueryInterface(dragService));
|
||||
|
||||
nsAutoString toolbarItemFlavor(TOOLBARITEM_MIME);
|
||||
if (dragSession && (NS_OK == dragSession->IsDataFlavorSupported(&toolbarItemFlavor))) {
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
} else {
|
||||
rv = NS_ERROR_BASE; // don't consume event
|
||||
if ( dragSession ) {
|
||||
PRBool flavorSupported = PR_FALSE;
|
||||
dragSession->IsDataFlavorSupported ( TOOLBARITEM_MIME, &flavorSupported );
|
||||
if ( flavorSupported ) {
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
rv = NS_ERROR_BASE; // consume event
|
||||
}
|
||||
else
|
||||
rv = NS_OK; // don't consume event
|
||||
}
|
||||
|
||||
nsServiceManager::ReleaseService(kCDragServiceCID, dragService);
|
||||
}
|
||||
else
|
||||
rv = NS_OK;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
@ -350,33 +364,36 @@ nsToolbarDragListener::DragOver(nsIDOMEvent* aDragEvent)
|
|||
nsresult rv = nsServiceManager::GetService(kCDragServiceCID,
|
||||
nsIDragService::GetIID(),
|
||||
(nsISupports **)&dragService);
|
||||
if (NS_OK == rv) {
|
||||
if ( NS_SUCCEEDED(rv) ) {
|
||||
nsCOMPtr<nsIDragSession> dragSession(do_QueryInterface(dragService));
|
||||
nsAutoString toolbarItemFlavor(TOOLBARITEM_MIME);
|
||||
if (dragSession && NS_OK == dragSession->IsDataFlavorSupported(&toolbarItemFlavor)) {
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
if ( dragSession ) {
|
||||
PRBool flavorSupported = PR_FALSE;
|
||||
dragSession->IsDataFlavorSupported(TOOLBARITEM_MIME, &flavorSupported);
|
||||
if ( flavorSupported ) {
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
|
||||
// Check to see if the mouse is over an item
|
||||
nscoord xLoc;
|
||||
PRBool isLegalChild;
|
||||
IsOnToolbarItem(aDragEvent, xLoc, isLegalChild);
|
||||
// Check to see if the mouse is over an item
|
||||
nscoord xLoc;
|
||||
PRBool isLegalChild;
|
||||
IsOnToolbarItem(aDragEvent, xLoc, isLegalChild);
|
||||
|
||||
if (xLoc != mCurrentDropLoc) {
|
||||
mToolbar->SetDropfeedbackLocation(xLoc);
|
||||
if (xLoc != mCurrentDropLoc) {
|
||||
mToolbar->SetDropfeedbackLocation(xLoc);
|
||||
|
||||
// force the toolbar frame to redraw
|
||||
ForceDrawFrame(mToolbar);
|
||||
// force the toolbar frame to redraw
|
||||
ForceDrawFrame(mToolbar);
|
||||
|
||||
// cache the current drop location
|
||||
mCurrentDropLoc = xLoc;
|
||||
// cache the current drop location
|
||||
mCurrentDropLoc = xLoc;
|
||||
|
||||
rv = NS_ERROR_BASE; // means I am consuming the event
|
||||
}
|
||||
}
|
||||
rv = NS_ERROR_BASE; // means I am consuming the event
|
||||
}
|
||||
}
|
||||
}
|
||||
nsServiceManager::ReleaseService(kCDragServiceCID, dragService);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
rv = NS_OK; // don't consume event
|
||||
}
|
||||
|
||||
// NS_OK means event is NOT consumed
|
||||
return rv;
|
||||
|
@ -388,23 +405,22 @@ nsresult
|
|||
nsToolbarDragListener::DragExit(nsIDOMEvent* aDragEvent)
|
||||
{
|
||||
// now tell the drag session whether we can drop here
|
||||
nsIDragService* dragService;
|
||||
nsresult rv = nsServiceManager::GetService(kCDragServiceCID,
|
||||
nsIDragService::GetIID(),
|
||||
(nsISupports **)&dragService);
|
||||
if (NS_OK == rv) {
|
||||
nsresult rv;
|
||||
NS_WITH_SERVICE ( nsIDragService, dragService, kCDragServiceCID, &rv );
|
||||
if ( NS_SUCCEEDED(rv) ) {
|
||||
nsCOMPtr<nsIDragSession> dragSession(do_QueryInterface(dragService));
|
||||
nsAutoString toolbarItemFlavor(TOOLBARITEM_MIME);
|
||||
if (dragSession && NS_OK == dragSession->IsDataFlavorSupported(&toolbarItemFlavor)) {
|
||||
mToolbar->SetDropfeedbackLocation(-1); // clears drawing of marker
|
||||
ForceDrawFrame(mToolbar);
|
||||
rv = NS_ERROR_BASE; // consume event
|
||||
}
|
||||
|
||||
nsServiceManager::ReleaseService(kCDragServiceCID, dragService);
|
||||
} else {
|
||||
rv = NS_OK; // don't consume event
|
||||
if ( dragSession ) {
|
||||
PRBool flavorSupported = PR_FALSE;
|
||||
dragSession->IsDataFlavorSupported(TOOLBARITEM_MIME, &flavorSupported);
|
||||
if ( flavorSupported ) {
|
||||
mToolbar->SetDropfeedbackLocation(-1); // clears drawing of marker
|
||||
ForceDrawFrame(mToolbar);
|
||||
rv = NS_ERROR_BASE; // consume event
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
rv = NS_OK; // don't consume event
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
@ -422,9 +438,6 @@ nsToolbarDragListener::DragDrop(nsIDOMEvent* aMouseEvent)
|
|||
// that will be translated into some RDF form
|
||||
ForceDrawFrame(mToolbar);
|
||||
|
||||
// String for doing paste
|
||||
nsString stuffToPaste;
|
||||
|
||||
// Create drag service for getting state of drag
|
||||
nsIDragService* dragService;
|
||||
nsresult rv = nsServiceManager::GetService(kCDragServiceCID,
|
||||
|
@ -441,13 +454,10 @@ nsToolbarDragListener::DragDrop(nsIDOMEvent* aMouseEvent)
|
|||
nsITransferable::GetIID(),
|
||||
(void**) getter_AddRefs(trans));
|
||||
if ( NS_SUCCEEDED(rv) && trans ) {
|
||||
// Add the text Flavor to the transferable,
|
||||
// because that is the only type of data we are
|
||||
// looking for at the moment.
|
||||
nsAutoString toolbarItemMime (TOOLBARITEM_MIME);
|
||||
trans->AddDataFlavor(&toolbarItemMime);
|
||||
//trans->AddDataFlavor(mImageDataFlavor);
|
||||
|
||||
// Add the toolbar item flavor to the transferable,
|
||||
// because that is the only type of data we are looking for at the moment.
|
||||
trans->AddDataFlavor(TOOLBARITEM_MIME);
|
||||
|
||||
// Fill the transferable with data for each drag item in succession
|
||||
PRUint32 numItems = 0;
|
||||
if (NS_SUCCEEDED(dragSession->GetNumDropItems(&numItems))) {
|
||||
|
@ -458,26 +468,28 @@ nsToolbarDragListener::DragDrop(nsIDOMEvent* aMouseEvent)
|
|||
for (i=0;i<numItems;++i) {
|
||||
if (NS_SUCCEEDED(dragSession->GetData(trans, i))) {
|
||||
|
||||
// Get the string data out of the transferable
|
||||
// Note: the transferable owns the pointer to the data
|
||||
char *str = 0;
|
||||
// Get the string data out of the transferable. This obviously needs to be rewritten ;)
|
||||
PRUint32 len;
|
||||
trans->GetAnyTransferData(&toolbarItemMime, (void **)&str, &len);
|
||||
|
||||
// If the string was not empty then paste it in
|
||||
if (str) {
|
||||
char buf[256];
|
||||
strncpy(buf, str, len);
|
||||
buf[len] = 0;
|
||||
printf("Dropped: %s\n", buf);
|
||||
stuffToPaste.SetString(str, len);
|
||||
//mEditor->InsertText(stuffToPaste);
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
char* toolbarItemMime;
|
||||
nsCOMPtr<nsISupports> genericDataObj;
|
||||
trans->GetAnyTransferData(&toolbarItemMime, getter_AddRefs(genericDataObj), &len);
|
||||
if ( genericDataObj ) {
|
||||
nsCOMPtr<nsISupportsWString> dataObj ( do_QueryInterface(genericDataObj) );
|
||||
if ( dataObj ) {
|
||||
// If the string was not empty then paste it in
|
||||
PRUnichar* buf;
|
||||
dataObj->toString(&buf);
|
||||
if ( buf ) {
|
||||
nsAutoString converter(buf);
|
||||
char* lame = converter.ToNewCString();
|
||||
printf("Dropped Data: %s\n", lame);
|
||||
//XXX do real stuff here
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
delete [] lame;
|
||||
}
|
||||
delete [] buf;
|
||||
}
|
||||
}
|
||||
|
||||
// XXX This is where image support might go
|
||||
//void * data;
|
||||
//trans->GetTransferData(mImageDataFlavor, (void **)&data, &len);
|
||||
}
|
||||
} // foreach drag item
|
||||
|
||||
|
|
|
@ -50,6 +50,9 @@
|
|||
#include "nsIDOMDragListener.h"
|
||||
#include "nsIDOMEventReceiver.h"
|
||||
#include "nsIDOMEventListener.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
#include "nsISupportsArray.h"
|
||||
|
||||
|
||||
// Drag & Drop, Clipboard Support
|
||||
static NS_DEFINE_CID(kCDragServiceCID, NS_DRAGSERVICE_CID);
|
||||
|
@ -57,11 +60,6 @@ static NS_DEFINE_CID(kCTransferableCID, NS_TRANSFERABLE_CID);
|
|||
static NS_DEFINE_IID(kCDataFlavorCID, NS_DATAFLAVOR_CID);
|
||||
static NS_DEFINE_IID(kCXIFFormatConverterCID, NS_XIFFORMATCONVERTER_CID);
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kIDOMEventReceiverIID, NS_IDOMEVENTRECEIVER_IID);
|
||||
|
||||
#include "nsISupportsArray.h"
|
||||
|
||||
|
||||
NS_IMPL_ADDREF(nsToolboxFrame::DragListenerDelegate);
|
||||
NS_IMPL_RELEASE(nsToolboxFrame::DragListenerDelegate);
|
||||
|
@ -590,21 +588,6 @@ nsToolboxFrame :: HandleEvent ( nsIPresContext& aPresContext,
|
|||
OnMouseExit ( );
|
||||
break;
|
||||
|
||||
case NS_DRAGDROP_ENTER:
|
||||
// show drop feedback
|
||||
break;
|
||||
|
||||
case NS_DRAGDROP_OVER:
|
||||
break;
|
||||
|
||||
case NS_DRAGDROP_EXIT:
|
||||
// remove drop feedback
|
||||
break;
|
||||
|
||||
case NS_DRAGDROP_DROP:
|
||||
// do drop coolness stuff
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
|
@ -771,13 +754,16 @@ nsToolboxFrame::DragEnter(nsIDOMEvent* aDragEvent)
|
|||
nsresult rv = nsServiceManager::GetService(kCDragServiceCID,
|
||||
nsIDragService::GetIID(),
|
||||
(nsISupports **)&dragService);
|
||||
if (NS_OK == rv) {
|
||||
if ( NS_SUCCEEDED(rv) ) {
|
||||
nsCOMPtr<nsIDragSession> dragSession(do_QueryInterface(dragService));
|
||||
|
||||
nsAutoString toolbarFlavor(TOOLBAR_MIME);
|
||||
if (dragSession && (NS_OK == dragSession->IsDataFlavorSupported(&toolbarFlavor))) {
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
rv = NS_ERROR_BASE; // consume event
|
||||
if ( dragSession ) {
|
||||
PRBool flavorSupported = PR_FALSE;
|
||||
dragSession->IsDataFlavorSupported(TOOLBAR_MIME, &flavorSupported);
|
||||
if ( flavorSupported ) {
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
rv = NS_ERROR_BASE; // consume event
|
||||
}
|
||||
}
|
||||
|
||||
nsServiceManager::ReleaseService(kCDragServiceCID, dragService);
|
||||
|
@ -794,19 +780,20 @@ nsToolboxFrame::DragOver(nsIDOMEvent* aDragEvent)
|
|||
{
|
||||
// now tell the drag session whether we can drop here
|
||||
nsIDragService* dragService;
|
||||
nsresult rv = nsServiceManager::GetService(kCDragServiceCID,
|
||||
nsIDragService::GetIID(),
|
||||
(nsISupports **)&dragService);
|
||||
if (NS_OK == rv) {
|
||||
nsresult rv = nsServiceManager::GetService(kCDragServiceCID, nsIDragService::GetIID(),
|
||||
(nsISupports **)&dragService);
|
||||
if ( NS_SUCCEEDED(rv) ) {
|
||||
nsCOMPtr<nsIDragSession> dragSession(do_QueryInterface(dragService));
|
||||
nsAutoString toolbarFlavor(TOOLBAR_MIME);
|
||||
if (dragSession && NS_OK == dragSession->IsDataFlavorSupported(&toolbarFlavor)) {
|
||||
if ( dragSession ) {
|
||||
PRBool flavorSupported = PR_FALSE;
|
||||
dragSession->IsDataFlavorSupported(TOOLBAR_MIME, &flavorSupported);
|
||||
if ( flavorSupported ) {
|
||||
// Right here you need to figure out where the mouse is
|
||||
// and whether you can drop here
|
||||
|
||||
// Right here you need to figure out where the mouse is
|
||||
// and whether you can drop here
|
||||
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
rv = NS_ERROR_BASE; // consume event
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
rv = NS_ERROR_BASE; // consume event
|
||||
}
|
||||
}
|
||||
|
||||
nsServiceManager::ReleaseService(kCDragServiceCID, dragService);
|
||||
|
@ -830,9 +817,6 @@ nsToolboxFrame::DragExit(nsIDOMEvent* aDragEvent)
|
|||
nsresult
|
||||
nsToolboxFrame::DragDrop(nsIDOMEvent* aMouseEvent)
|
||||
{
|
||||
// String for doing paste
|
||||
nsString stuffToPaste;
|
||||
|
||||
// Create drag service for getting state of drag
|
||||
nsIDragService* dragService;
|
||||
nsresult rv = nsServiceManager::GetService(kCDragServiceCID,
|
||||
|
@ -849,12 +833,9 @@ nsToolboxFrame::DragDrop(nsIDOMEvent* aMouseEvent)
|
|||
nsITransferable::GetIID(),
|
||||
(void**) getter_AddRefs(trans));
|
||||
if ( NS_SUCCEEDED(rv) && trans ) {
|
||||
// Add the text Flavor to the transferable,
|
||||
// because that is the only type of data we are
|
||||
// Add the toolbar Flavor to the transferable, because that is the only type of data we are
|
||||
// looking for at the moment.
|
||||
nsAutoString toolbarMime (TOOLBAR_MIME);
|
||||
trans->AddDataFlavor(&toolbarMime);
|
||||
//trans->AddDataFlavor(mImageDataFlavor);
|
||||
trans->AddDataFlavor(TOOLBAR_MIME);
|
||||
|
||||
// Fill the transferable with data for each drag item in succession
|
||||
PRUint32 numItems = 0;
|
||||
|
@ -866,19 +847,18 @@ nsToolboxFrame::DragDrop(nsIDOMEvent* aMouseEvent)
|
|||
for (i=0;i<numItems;++i) {
|
||||
if (NS_SUCCEEDED(dragSession->GetData(trans, i))) {
|
||||
|
||||
// Get the string data out of the transferable
|
||||
// Note: the transferable owns the pointer to the data
|
||||
char *str = 0;
|
||||
// Get the string data out of the transferable as a nsISupportsString.
|
||||
nsCOMPtr<nsISupports> data;
|
||||
PRUint32 len;
|
||||
trans->GetAnyTransferData(&toolbarMime, (void **)&str, &len);
|
||||
char* whichFlavor;
|
||||
trans->GetAnyTransferData(&whichFlavor, getter_AddRefs(data), &len);
|
||||
nsCOMPtr<nsISupportsString> dataAsString ( do_QueryInterface(data) );
|
||||
|
||||
// If the string was not empty then paste it in
|
||||
if (str) {
|
||||
char buf[256];
|
||||
strncpy(buf, str, len);
|
||||
buf[len] = 0;
|
||||
printf("Dropped: %s\n", buf);
|
||||
stuffToPaste.SetString(str, len);
|
||||
// If the string was not empty then make it so.
|
||||
if ( dataAsString ) {
|
||||
char* stuffToPaste;
|
||||
dataAsString->toString ( &stuffToPaste );
|
||||
printf("Dropped: %s\n", stuffToPaste);
|
||||
dragSession->SetCanDrop(PR_TRUE);
|
||||
}
|
||||
}
|
||||
|
|
Двоичные данные
widget/macbuild/widgetIDL.mcp
Двоичные данные
widget/macbuild/widgetIDL.mcp
Двоичный файл не отображается.
|
@ -2,13 +2,8 @@
|
|||
# This is a list of local files which get copied to the mozilla:dist:widget directory
|
||||
#
|
||||
|
||||
nsIDragSessionMac.h
|
||||
nsIFormatConverter.h
|
||||
nsIClipboardOwner.h
|
||||
nsIClipboard.h
|
||||
nsITransferable.h
|
||||
nsIDragService.h
|
||||
nsIDragSession.h
|
||||
nsIDragSessionMac.h
|
||||
nsui.h
|
||||
nsIWidget.h
|
||||
|
|
|
@ -3,4 +3,8 @@
|
|||
#
|
||||
|
||||
nsIFileSpecWithUI.idl
|
||||
nsISound.idl
|
||||
nsISound.idl
|
||||
nsITransferable.idl
|
||||
nsIDragSession.idl
|
||||
nsIDragService.idl
|
||||
nsIFormatConverter.idl
|
|
@ -28,7 +28,6 @@ EXPORTS = \
|
|||
nsIFontSizeIterator.h \
|
||||
nsIFontNameIterator.h \
|
||||
nsIFontRetrieverService.h \
|
||||
nsIFileListTransferable.h \
|
||||
nsIMenuBar.h \
|
||||
nsIMenu.h \
|
||||
nsIMenuItem.h \
|
||||
|
@ -62,12 +61,7 @@ EXPORTS = \
|
|||
nsIPopUpMenu.h \
|
||||
nsIContentConnector.h \
|
||||
nsIClipboard.h \
|
||||
nsITransferable.h \
|
||||
nsIFileListTransferable.h \
|
||||
nsIDragService.h \
|
||||
nsIDragSession.h \
|
||||
nsIClipboardOwner.h \
|
||||
nsIFormatConverter.h \
|
||||
nsIFontNameIterator.h \
|
||||
nsIFontSizeIterator.h \
|
||||
nsIFontRetrieverService.h \
|
||||
|
@ -82,6 +76,10 @@ XPIDL_MODULE = widget
|
|||
XPIDLSRCS = \
|
||||
nsIFileSpecWithUI.idl \
|
||||
nsISound.idl \
|
||||
nsITransferable.idl \
|
||||
nsIDragSession.idl \
|
||||
nsIDragService.idl \
|
||||
nsIFormatConverter.idl \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/config.mk
|
||||
|
|
|
@ -25,20 +25,19 @@ XPIDL_MODULE=widget
|
|||
XPIDLSRCS = \
|
||||
.\nsIFileSpecWithUI.idl \
|
||||
.\nsISound.idl \
|
||||
.\nsITransferable.idl \
|
||||
.\nsIDragSession.idl \
|
||||
.\nsIDragService.idl \
|
||||
.\nsIFormatConverter.idl \
|
||||
$(NULL)
|
||||
|
||||
EXPORTS=nsui.h \
|
||||
nsIFontSizeIterator.h \
|
||||
nsIFontNameIterator.h \
|
||||
nsIFontRetrieverService.h \
|
||||
nsIFileListTransferable.h \
|
||||
nsIFormatConverter.h \
|
||||
nsIClipboardOwner.h \
|
||||
nsIClipboard.h \
|
||||
nsIFileWidget.h \
|
||||
nsITransferable.h \
|
||||
nsIDragService.h \
|
||||
nsIDragSession.h \
|
||||
nsIWidget.h \
|
||||
nsIButton.h \
|
||||
nsICheckButton.h \
|
||||
|
|
|
@ -1,298 +1,587 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#include "nsIFactory.h"
|
||||
#include "nsISupports.h"
|
||||
#include "nsdefs.h"
|
||||
#include "nsWidgetsCID.h"
|
||||
|
||||
#include "nsButton.h"
|
||||
#include "nsCheckButton.h"
|
||||
#include "nsComboBox.h"
|
||||
#include "nsFileWidget.h"
|
||||
#include "nsFileSpecWithUIImpl.h"
|
||||
#include "nsListBox.h"
|
||||
#include "nsLookAndFeel.h"
|
||||
#include "nsRadioButton.h"
|
||||
#include "nsScrollbar.h"
|
||||
#include "nsTextAreaWidget.h"
|
||||
#include "nsTextHelper.h"
|
||||
#include "nsTextWidget.h"
|
||||
#include "nsToolkit.h"
|
||||
#include "nsWindow.h"
|
||||
#include "nsLabel.h"
|
||||
#include "nsMenuBar.h"
|
||||
#include "nsMenu.h"
|
||||
#include "nsMenuItem.h"
|
||||
#include "nsContextMenu.h"
|
||||
#include "nsPopUpMenu.h"
|
||||
#include "nsAppShell.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsFontRetrieverService.h"
|
||||
#include "nsSound.h"
|
||||
|
||||
// Drag & Drop, Clipboard
|
||||
#include "nsClipboard.h"
|
||||
#include "nsTransferable.h"
|
||||
#include "nsXIFFormatConverter.h"
|
||||
#include "nsDragService.h"
|
||||
#include "nsFileListTransferable.h"
|
||||
|
||||
static NS_DEFINE_IID(kCWindow, NS_WINDOW_CID);
|
||||
static NS_DEFINE_IID(kCChild, NS_CHILD_CID);
|
||||
static NS_DEFINE_IID(kCButton, NS_BUTTON_CID);
|
||||
static NS_DEFINE_IID(kCCheckButton, NS_CHECKBUTTON_CID);
|
||||
static NS_DEFINE_IID(kCCombobox, NS_COMBOBOX_CID);
|
||||
static NS_DEFINE_IID(kCFileOpen, NS_FILEWIDGET_CID);
|
||||
static NS_DEFINE_IID(kCListbox, NS_LISTBOX_CID);
|
||||
static NS_DEFINE_IID(kCRadioButton, NS_RADIOBUTTON_CID);
|
||||
static NS_DEFINE_IID(kCHorzScrollbar, NS_HORZSCROLLBAR_CID);
|
||||
static NS_DEFINE_IID(kCVertScrollbar, NS_VERTSCROLLBAR_CID);
|
||||
static NS_DEFINE_IID(kCTextArea, NS_TEXTAREA_CID);
|
||||
static NS_DEFINE_IID(kCTextField, NS_TEXTFIELD_CID);
|
||||
static NS_DEFINE_IID(kCAppShell, NS_APPSHELL_CID);
|
||||
static NS_DEFINE_IID(kCToolkit, NS_TOOLKIT_CID);
|
||||
static NS_DEFINE_IID(kCLookAndFeel, NS_LOOKANDFEEL_CID);
|
||||
static NS_DEFINE_IID(kCLabel, NS_LABEL_CID);
|
||||
static NS_DEFINE_IID(kCMenuBar, NS_MENUBAR_CID);
|
||||
static NS_DEFINE_IID(kCMenu, NS_MENU_CID);
|
||||
static NS_DEFINE_IID(kCMenuItem, NS_MENUITEM_CID);
|
||||
static NS_DEFINE_IID(kCContextMenu, NS_CONTEXTMENU_CID);
|
||||
static NS_DEFINE_IID(kCPopUpMenu, NS_POPUPMENU_CID);
|
||||
static NS_DEFINE_IID(kCFontRetrieverService, NS_FONTRETRIEVERSERVICE_CID);
|
||||
|
||||
// Drag & Drop, Clipboard
|
||||
static NS_DEFINE_IID(kCDataObj, NS_DATAOBJ_CID);
|
||||
static NS_DEFINE_IID(kCClipboard, NS_CLIPBOARD_CID);
|
||||
static NS_DEFINE_IID(kCTransferable, NS_TRANSFERABLE_CID);
|
||||
static NS_DEFINE_IID(kCXIFFormatConverter, NS_XIFFORMATCONVERTER_CID);
|
||||
static NS_DEFINE_IID(kCDragService, NS_DRAGSERVICE_CID);
|
||||
static NS_DEFINE_IID(kCFileListTransferable, NS_FILELISTTRANSFERABLE_CID);
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID);
|
||||
|
||||
// Sound services (just Beep for now)
|
||||
static NS_DEFINE_CID(kCSound, NS_SOUND_CID);
|
||||
static NS_DEFINE_CID(kCFileSpecWithUI, NS_FILESPECWITHUI_CID);
|
||||
|
||||
class nsWidgetFactory : public nsIFactory
|
||||
{
|
||||
public:
|
||||
// nsISupports methods
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
// nsIFactory methods
|
||||
NS_IMETHOD CreateInstance(nsISupports *aOuter,
|
||||
const nsIID &aIID,
|
||||
void **aResult);
|
||||
|
||||
NS_IMETHOD LockFactory(PRBool aLock);
|
||||
|
||||
nsWidgetFactory(const nsCID &aClass);
|
||||
~nsWidgetFactory();
|
||||
|
||||
private:
|
||||
nsCID mClassID;
|
||||
};
|
||||
|
||||
NS_IMPL_ADDREF(nsWidgetFactory)
|
||||
NS_IMPL_RELEASE(nsWidgetFactory)
|
||||
|
||||
|
||||
nsWidgetFactory::nsWidgetFactory(const nsCID &aClass)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
mClassID = aClass;
|
||||
}
|
||||
|
||||
nsWidgetFactory::~nsWidgetFactory()
|
||||
{
|
||||
NS_ASSERTION(mRefCnt == 0, "Reference count not zero in destructor");
|
||||
}
|
||||
|
||||
nsresult nsWidgetFactory::QueryInterface(const nsIID &aIID,
|
||||
void **aResult)
|
||||
{
|
||||
if (aResult == NULL) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
// Always NULL result, in case of failure
|
||||
*aResult = NULL;
|
||||
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
*aResult = (void *)(nsISupports*)this;
|
||||
} else if (aIID.Equals(kIFactoryIID)) {
|
||||
*aResult = (void *)(nsIFactory*)this;
|
||||
}
|
||||
|
||||
if (*aResult == NULL) {
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
|
||||
NS_ADDREF_THIS(); // Increase reference count for caller
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
nsresult nsWidgetFactory::CreateInstance( nsISupports* aOuter,
|
||||
const nsIID &aIID,
|
||||
void **aResult)
|
||||
{
|
||||
if (aResult == NULL) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
*aResult = NULL;
|
||||
if (nsnull != aOuter) {
|
||||
return NS_ERROR_NO_AGGREGATION;
|
||||
}
|
||||
|
||||
nsISupports *inst = nsnull;
|
||||
if (mClassID.Equals(kCWindow)) {
|
||||
inst = (nsISupports*)new nsWindow();
|
||||
}
|
||||
else if (mClassID.Equals(kCChild)) {
|
||||
inst = (nsISupports*)new ChildWindow();
|
||||
}
|
||||
else if (mClassID.Equals(kCButton)) {
|
||||
inst = (nsISupports*)(nsWindow*)new nsButton();
|
||||
}
|
||||
else if (mClassID.Equals(kCCheckButton)) {
|
||||
inst = (nsISupports*)(nsWindow*)new nsCheckButton();
|
||||
}
|
||||
else if (mClassID.Equals(kCCombobox)) {
|
||||
inst = (nsISupports*)(nsWindow*)new nsComboBox();
|
||||
}
|
||||
else if (mClassID.Equals(kCRadioButton)) {
|
||||
inst = (nsISupports*)(nsWindow*)new nsRadioButton();
|
||||
}
|
||||
else if (mClassID.Equals(kCFileOpen)) {
|
||||
inst = (nsISupports*)new nsFileWidget();
|
||||
}
|
||||
else if (mClassID.Equals(kCListbox)) {
|
||||
inst = (nsISupports*)(nsWindow*)new nsListBox();
|
||||
}
|
||||
else if (mClassID.Equals(kCHorzScrollbar)) {
|
||||
inst = (nsISupports*)(nsWindow*)new nsScrollbar(PR_FALSE);
|
||||
}
|
||||
else if (mClassID.Equals(kCVertScrollbar)) {
|
||||
inst = (nsISupports*)(nsWindow*)new nsScrollbar(PR_TRUE);
|
||||
}
|
||||
else if (mClassID.Equals(kCTextArea)) {
|
||||
inst = (nsISupports*)(nsWindow*)new nsTextAreaWidget();
|
||||
}
|
||||
else if (mClassID.Equals(kCTextField)) {
|
||||
inst = (nsISupports*)(nsWindow*)new nsTextWidget();
|
||||
}
|
||||
else if (mClassID.Equals(kCAppShell)) {
|
||||
inst = (nsISupports*)new nsAppShell();
|
||||
}
|
||||
else if (mClassID.Equals(kCToolkit)) {
|
||||
inst = (nsISupports*)new nsToolkit();
|
||||
}
|
||||
else if (mClassID.Equals(kCLookAndFeel)) {
|
||||
inst = (nsISupports*)new nsLookAndFeel();
|
||||
}
|
||||
else if (mClassID.Equals(kCLabel)) {
|
||||
inst = (nsISupports*)(nsWindow*)new nsLabel();
|
||||
}
|
||||
else if (mClassID.Equals(kCMenuBar)) {
|
||||
inst = (nsISupports*)(nsIMenuBar*)new nsMenuBar();
|
||||
}
|
||||
else if (mClassID.Equals(kCMenu)) {
|
||||
inst = (nsISupports*)(nsIMenu*)new nsMenu();
|
||||
}
|
||||
else if (mClassID.Equals(kCMenuItem)) {
|
||||
inst = (nsISupports*)(nsIMenuItem*)new nsMenuItem();
|
||||
}
|
||||
else if (mClassID.Equals(kCContextMenu)) {
|
||||
inst = (nsISupports*)(nsIContextMenu*)new nsContextMenu();
|
||||
}
|
||||
else if (mClassID.Equals(kCPopUpMenu)) {
|
||||
inst = (nsISupports*)new nsPopUpMenu();
|
||||
}
|
||||
else if (mClassID.Equals(kCSound)) {
|
||||
nsISound* aSound = nsnull;
|
||||
NS_NewSound(&aSound);
|
||||
inst = (nsISupports*) aSound;
|
||||
}
|
||||
else if (mClassID.Equals(kCFileSpecWithUI))
|
||||
inst = (nsISupports*) (nsIFileSpecWithUI *) new nsFileSpecWithUIImpl;
|
||||
else if (mClassID.Equals(kCTransferable)) {
|
||||
inst = (nsISupports*)new nsTransferable();
|
||||
}
|
||||
else if (mClassID.Equals(kCXIFFormatConverter)) {
|
||||
inst = (nsISupports*)new nsXIFFormatConverter();
|
||||
}
|
||||
else if (mClassID.Equals(kCClipboard)) {
|
||||
inst = (nsISupports*)(nsBaseClipboard *)new nsClipboard();
|
||||
}
|
||||
else if (mClassID.Equals(kCDragService)) {
|
||||
inst = (nsISupports*)(nsIDragService *)new nsDragService();
|
||||
}
|
||||
else if (mClassID.Equals(kCFontRetrieverService)) {
|
||||
inst = (nsISupports*)(nsIFontRetrieverService *)new nsFontRetrieverService();
|
||||
}
|
||||
else if (mClassID.Equals(kCFileListTransferable)) {
|
||||
inst = (nsISupports*)(nsITransferable *)new nsFileListTransferable();
|
||||
}
|
||||
/* */
|
||||
|
||||
if (inst == NULL) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
nsresult res = inst->QueryInterface(aIID, aResult);
|
||||
|
||||
if (res != NS_OK) {
|
||||
// We didn't get the right interface, so clean up
|
||||
delete inst;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
nsresult nsWidgetFactory::LockFactory(PRBool aLock)
|
||||
{
|
||||
// Not implemented in simplest case.
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// return the proper factory to the caller
|
||||
extern "C" NS_WIDGET nsresult
|
||||
NSGetFactory(nsISupports* serviceMgr,
|
||||
const nsCID &aClass,
|
||||
const char *aClassName,
|
||||
const char *aProgID,
|
||||
nsIFactory **aFactory)
|
||||
{
|
||||
if (nsnull == aFactory) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
*aFactory = new nsWidgetFactory(aClass);
|
||||
|
||||
if (nsnull == aFactory) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
return (*aFactory)->QueryInterface(kIFactoryIID, (void**)aFactory);
|
||||
}
|
||||
|
||||
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
|
||||
*
|
||||
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
|
||||
* http://www.mozilla.org/NPL/
|
||||
|
||||
*
|
||||
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
|
||||
* for the specific language governing rights and limitations under the
|
||||
|
||||
* NPL.
|
||||
|
||||
*
|
||||
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
|
||||
* Reserved.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "nsIFactory.h"
|
||||
|
||||
#include "nsISupports.h"
|
||||
|
||||
#include "nsdefs.h"
|
||||
|
||||
#include "nsWidgetsCID.h"
|
||||
|
||||
|
||||
|
||||
#include "nsButton.h"
|
||||
|
||||
#include "nsCheckButton.h"
|
||||
|
||||
#include "nsComboBox.h"
|
||||
|
||||
#include "nsFileWidget.h"
|
||||
|
||||
#include "nsFileSpecWithUIImpl.h"
|
||||
|
||||
#include "nsListBox.h"
|
||||
|
||||
#include "nsLookAndFeel.h"
|
||||
|
||||
#include "nsRadioButton.h"
|
||||
|
||||
#include "nsScrollbar.h"
|
||||
|
||||
#include "nsTextAreaWidget.h"
|
||||
|
||||
#include "nsTextHelper.h"
|
||||
|
||||
#include "nsTextWidget.h"
|
||||
|
||||
#include "nsToolkit.h"
|
||||
|
||||
#include "nsWindow.h"
|
||||
|
||||
#include "nsLabel.h"
|
||||
|
||||
#include "nsMenuBar.h"
|
||||
|
||||
#include "nsMenu.h"
|
||||
|
||||
#include "nsMenuItem.h"
|
||||
|
||||
#include "nsContextMenu.h"
|
||||
|
||||
#include "nsPopUpMenu.h"
|
||||
|
||||
#include "nsAppShell.h"
|
||||
|
||||
#include "nsIServiceManager.h"
|
||||
|
||||
#include "nsFontRetrieverService.h"
|
||||
|
||||
#include "nsSound.h"
|
||||
|
||||
|
||||
|
||||
// Drag & Drop, Clipboard
|
||||
|
||||
#include "nsClipboard.h"
|
||||
|
||||
#include "nsTransferable.h"
|
||||
|
||||
#include "nsXIFFormatConverter.h"
|
||||
|
||||
#include "nsDragService.h"
|
||||
|
||||
|
||||
|
||||
static NS_DEFINE_IID(kCWindow, NS_WINDOW_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCChild, NS_CHILD_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCButton, NS_BUTTON_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCCheckButton, NS_CHECKBUTTON_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCCombobox, NS_COMBOBOX_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCFileOpen, NS_FILEWIDGET_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCListbox, NS_LISTBOX_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCRadioButton, NS_RADIOBUTTON_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCHorzScrollbar, NS_HORZSCROLLBAR_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCVertScrollbar, NS_VERTSCROLLBAR_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCTextArea, NS_TEXTAREA_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCTextField, NS_TEXTFIELD_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCAppShell, NS_APPSHELL_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCToolkit, NS_TOOLKIT_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCLookAndFeel, NS_LOOKANDFEEL_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCLabel, NS_LABEL_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCMenuBar, NS_MENUBAR_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCMenu, NS_MENU_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCMenuItem, NS_MENUITEM_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCContextMenu, NS_CONTEXTMENU_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCPopUpMenu, NS_POPUPMENU_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCFontRetrieverService, NS_FONTRETRIEVERSERVICE_CID);
|
||||
|
||||
|
||||
|
||||
// Drag & Drop, Clipboard
|
||||
|
||||
static NS_DEFINE_IID(kCDataObj, NS_DATAOBJ_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCClipboard, NS_CLIPBOARD_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCTransferable, NS_TRANSFERABLE_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCXIFFormatConverter, NS_XIFFORMATCONVERTER_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCDragService, NS_DRAGSERVICE_CID);
|
||||
|
||||
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
|
||||
static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID);
|
||||
|
||||
|
||||
|
||||
// Sound services (just Beep for now)
|
||||
|
||||
static NS_DEFINE_CID(kCSound, NS_SOUND_CID);
|
||||
|
||||
static NS_DEFINE_CID(kCFileSpecWithUI, NS_FILESPECWITHUI_CID);
|
||||
|
||||
|
||||
|
||||
class nsWidgetFactory : public nsIFactory
|
||||
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
// nsISupports methods
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
|
||||
|
||||
// nsIFactory methods
|
||||
|
||||
NS_IMETHOD CreateInstance(nsISupports *aOuter,
|
||||
|
||||
const nsIID &aIID,
|
||||
|
||||
void **aResult);
|
||||
|
||||
|
||||
|
||||
NS_IMETHOD LockFactory(PRBool aLock);
|
||||
|
||||
|
||||
|
||||
nsWidgetFactory(const nsCID &aClass);
|
||||
|
||||
~nsWidgetFactory();
|
||||
|
||||
|
||||
|
||||
private:
|
||||
|
||||
nsCID mClassID;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
NS_IMPL_ADDREF(nsWidgetFactory)
|
||||
|
||||
NS_IMPL_RELEASE(nsWidgetFactory)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
nsWidgetFactory::nsWidgetFactory(const nsCID &aClass)
|
||||
|
||||
{
|
||||
|
||||
NS_INIT_REFCNT();
|
||||
|
||||
mClassID = aClass;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
nsWidgetFactory::~nsWidgetFactory()
|
||||
|
||||
{
|
||||
|
||||
NS_ASSERTION(mRefCnt == 0, "Reference count not zero in destructor");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
nsresult nsWidgetFactory::QueryInterface(const nsIID &aIID,
|
||||
|
||||
void **aResult)
|
||||
|
||||
{
|
||||
|
||||
if (aResult == NULL) {
|
||||
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Always NULL result, in case of failure
|
||||
|
||||
*aResult = NULL;
|
||||
|
||||
|
||||
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
|
||||
*aResult = (void *)(nsISupports*)this;
|
||||
|
||||
} else if (aIID.Equals(kIFactoryIID)) {
|
||||
|
||||
*aResult = (void *)(nsIFactory*)this;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (*aResult == NULL) {
|
||||
|
||||
return NS_NOINTERFACE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_ADDREF_THIS(); // Increase reference count for caller
|
||||
|
||||
return NS_OK;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
nsresult nsWidgetFactory::CreateInstance( nsISupports* aOuter,
|
||||
|
||||
const nsIID &aIID,
|
||||
|
||||
void **aResult)
|
||||
|
||||
{
|
||||
|
||||
if (aResult == NULL) {
|
||||
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
}
|
||||
|
||||
*aResult = NULL;
|
||||
|
||||
if (nsnull != aOuter) {
|
||||
|
||||
return NS_ERROR_NO_AGGREGATION;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
nsISupports *inst = nsnull;
|
||||
|
||||
if (mClassID.Equals(kCWindow)) {
|
||||
|
||||
inst = (nsISupports*)new nsWindow();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCChild)) {
|
||||
|
||||
inst = (nsISupports*)new ChildWindow();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCButton)) {
|
||||
|
||||
inst = (nsISupports*)(nsWindow*)new nsButton();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCCheckButton)) {
|
||||
|
||||
inst = (nsISupports*)(nsWindow*)new nsCheckButton();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCCombobox)) {
|
||||
|
||||
inst = (nsISupports*)(nsWindow*)new nsComboBox();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCRadioButton)) {
|
||||
|
||||
inst = (nsISupports*)(nsWindow*)new nsRadioButton();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCFileOpen)) {
|
||||
|
||||
inst = (nsISupports*)new nsFileWidget();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCListbox)) {
|
||||
|
||||
inst = (nsISupports*)(nsWindow*)new nsListBox();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCHorzScrollbar)) {
|
||||
|
||||
inst = (nsISupports*)(nsWindow*)new nsScrollbar(PR_FALSE);
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCVertScrollbar)) {
|
||||
|
||||
inst = (nsISupports*)(nsWindow*)new nsScrollbar(PR_TRUE);
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCTextArea)) {
|
||||
|
||||
inst = (nsISupports*)(nsWindow*)new nsTextAreaWidget();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCTextField)) {
|
||||
|
||||
inst = (nsISupports*)(nsWindow*)new nsTextWidget();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCAppShell)) {
|
||||
|
||||
inst = (nsISupports*)new nsAppShell();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCToolkit)) {
|
||||
|
||||
inst = (nsISupports*)new nsToolkit();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCLookAndFeel)) {
|
||||
|
||||
inst = (nsISupports*)new nsLookAndFeel();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCLabel)) {
|
||||
|
||||
inst = (nsISupports*)(nsWindow*)new nsLabel();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCMenuBar)) {
|
||||
|
||||
inst = (nsISupports*)(nsIMenuBar*)new nsMenuBar();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCMenu)) {
|
||||
|
||||
inst = (nsISupports*)(nsIMenu*)new nsMenu();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCMenuItem)) {
|
||||
|
||||
inst = (nsISupports*)(nsIMenuItem*)new nsMenuItem();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCContextMenu)) {
|
||||
|
||||
inst = (nsISupports*)(nsIContextMenu*)new nsContextMenu();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCPopUpMenu)) {
|
||||
|
||||
inst = (nsISupports*)new nsPopUpMenu();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCSound)) {
|
||||
|
||||
nsISound* aSound = nsnull;
|
||||
|
||||
NS_NewSound(&aSound);
|
||||
|
||||
inst = (nsISupports*) aSound;
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCFileSpecWithUI))
|
||||
|
||||
inst = (nsISupports*) (nsIFileSpecWithUI *) new nsFileSpecWithUIImpl;
|
||||
|
||||
else if (mClassID.Equals(kCTransferable)) {
|
||||
|
||||
inst = (nsISupports*)new nsTransferable();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCXIFFormatConverter)) {
|
||||
|
||||
inst = (nsISupports*)new nsXIFFormatConverter();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCClipboard)) {
|
||||
|
||||
inst = (nsISupports*)(nsBaseClipboard *)new nsClipboard();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCDragService)) {
|
||||
|
||||
inst = (nsISupports*)(nsIDragService *)new nsDragService();
|
||||
|
||||
}
|
||||
|
||||
else if (mClassID.Equals(kCFontRetrieverService)) {
|
||||
|
||||
inst = (nsISupports*)(nsIFontRetrieverService *)new nsFontRetrieverService();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* */
|
||||
|
||||
|
||||
|
||||
if (inst == NULL) {
|
||||
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
nsresult res = inst->QueryInterface(aIID, aResult);
|
||||
|
||||
|
||||
|
||||
if (res != NS_OK) {
|
||||
|
||||
// We didn't get the right interface, so clean up
|
||||
|
||||
delete inst;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
return res;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
nsresult nsWidgetFactory::LockFactory(PRBool aLock)
|
||||
|
||||
{
|
||||
|
||||
// Not implemented in simplest case.
|
||||
|
||||
return NS_OK;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// return the proper factory to the caller
|
||||
|
||||
extern "C" NS_WIDGET nsresult
|
||||
|
||||
NSGetFactory(nsISupports* serviceMgr,
|
||||
|
||||
const nsCID &aClass,
|
||||
|
||||
const char *aClassName,
|
||||
|
||||
const char *aProgID,
|
||||
|
||||
nsIFactory **aFactory)
|
||||
|
||||
{
|
||||
|
||||
if (nsnull == aFactory) {
|
||||
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
*aFactory = new nsWidgetFactory(aClass);
|
||||
|
||||
|
||||
|
||||
if (nsnull == aFactory) {
|
||||
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
return (*aFactory)->QueryInterface(kIFactoryIID, (void**)aFactory);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include "nsISupportsArray.h"
|
||||
#include "nsIClipboardOwner.h"
|
||||
#include "nsITransferable.h" // kTextMime
|
||||
#include "nsISupportsPrimitives.h"
|
||||
|
||||
#include "nsIWidget.h"
|
||||
#include "nsIComponentManager.h"
|
||||
|
@ -274,24 +275,29 @@ NS_IMETHODIMP nsClipboard::SetNativeClipboardData()
|
|||
if (have_selection == 0)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
// 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;
|
||||
|
||||
nsString *df;
|
||||
int i = 0;
|
||||
nsVoidArray *dfList;
|
||||
// find out what types this data can be
|
||||
mTransferable->FlavorsTransferableCanExport(&dfList);
|
||||
|
||||
int cnt = dfList->Count();
|
||||
|
||||
for (i=0;i<cnt;i++)
|
||||
PRUint32 cnt;
|
||||
flavorList->Count(&cnt);
|
||||
for ( PRUint32 i=0; i<cnt; ++i )
|
||||
{
|
||||
df = (nsString *)dfList->ElementAt(i);
|
||||
if (nsnull != df) {
|
||||
gint format = GetFormat(*df);
|
||||
nsCOMPtr<nsISupports> genericFlavor;
|
||||
flavorList->GetElementAt ( i, getter_AddRefs(genericFlavor) );
|
||||
nsCOMPtr<nsISupportsString> currentFlavor ( do_QueryInterface(genericFlavor) );
|
||||
if ( currentFlavor ) {
|
||||
char* flavorStr;
|
||||
currentFlavor->toString(&flavorStr);
|
||||
gint format = GetFormat(flavorStr);
|
||||
|
||||
// add these types as selection targets
|
||||
RegisterFormat(format);
|
||||
|
||||
|
||||
delete [] flavorStr;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -529,8 +535,6 @@ PRBool nsClipboard::DoConvert(gint format)
|
|||
NS_IMETHODIMP
|
||||
nsClipboard::GetNativeClipboardData(nsITransferable * aTransferable)
|
||||
{
|
||||
nsString *df;
|
||||
int i = 0;
|
||||
|
||||
#ifdef DEBUG_CLIPBOARD
|
||||
printf("nsClipboard::GetNativeClipboardData()\n");
|
||||
|
@ -542,24 +546,34 @@ nsClipboard::GetNativeClipboardData(nsITransferable * aTransferable)
|
|||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
// Get the transferable list of data flavors
|
||||
nsVoidArray *dfList;
|
||||
aTransferable->FlavorsTransferableCanImport(&dfList);
|
||||
// get flavor list that includes all acceptable flavors (including ones obtained through
|
||||
// conversion)
|
||||
nsCOMPtr<nsISupportsArray> flavorList;
|
||||
nsresult errCode = aTransferable->FlavorsTransferableCanImport ( getter_AddRefs(flavorList) );
|
||||
if ( NS_FAILED(errCode) )
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
// Walk through flavors and see which flavor matches the one being pasted:
|
||||
int cnt = dfList->Count();
|
||||
PRUint32 cnt;
|
||||
flavorList->Count(&cnt);
|
||||
char* foundFlavor = nsnull;
|
||||
for ( int i = 0; i < cnt; ++i ) {
|
||||
nsCOMPtr<nsISupports> genericFlavor;
|
||||
flavorList->GetElementAt ( i, getter_AddRefs(genericFlavor) );
|
||||
nsCOMPtr<nsISupportsString> currentFlavor ( do_QueryInterface(genericFlavor) );
|
||||
if ( currentFlavor ) {
|
||||
char* flavorStr;
|
||||
currentFlavor->toString ( &flavorStr );
|
||||
gint format = GetFormat(flavorStr);
|
||||
|
||||
for (i=0;i<cnt;i++) {
|
||||
df = (nsString *)dfList->ElementAt(i);
|
||||
if (nsnull != df) {
|
||||
gint format = GetFormat(*df);
|
||||
|
||||
if (DoConvert(format))
|
||||
if (DoConvert(format)) {
|
||||
foundFlavor = flavorStr;
|
||||
break;
|
||||
}
|
||||
delete [] flavorStr;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef DEBUG_CLIPBOARD
|
||||
printf(" Got the callback: '%s', %d\n",
|
||||
mSelectionData.data, mSelectionData.length);
|
||||
|
@ -573,18 +587,23 @@ nsClipboard::GetNativeClipboardData(nsITransferable * aTransferable)
|
|||
// We just have to copy it to the transferable.
|
||||
//
|
||||
|
||||
|
||||
nsString *name = new nsString((const char*)gdk_atom_name(mSelectionData.type));
|
||||
|
||||
#if 0
|
||||
// pinkerton - we have the flavor already from above, so we don't need
|
||||
// to re-derrive it.
|
||||
nsString *name = new nsString((const char*)gdk_atom_name(mSelectionData.type));
|
||||
int format = GetFormat(*name);
|
||||
|
||||
df->SetString((const char*)gdk_atom_name(sSelTypes[format]));
|
||||
aTransferable->SetTransferData(df,
|
||||
mSelectionData.data,
|
||||
#endif
|
||||
|
||||
nsCOMPtr<nsISupports> genericDataWrapper;
|
||||
CreatePrimitiveForData ( foundFlavor, mSelectionData.data, mSelectionData.length, getter_AddRefs(genericDataWrapper) );
|
||||
aTransferable->SetTransferData(foundFlavor,
|
||||
genericDataWrapper,
|
||||
mSelectionData.length);
|
||||
|
||||
delete name;
|
||||
|
||||
//delete name;
|
||||
delete [] foundFlavor;
|
||||
|
||||
// transferable is now copying the data, so we can free it.
|
||||
// g_free(mSelectionData.data);
|
||||
mSelectionData.data = nsnull;
|
||||
|
@ -748,7 +767,7 @@ void nsClipboard::SelectionGetCB(GtkWidget *widget,
|
|||
g_print(" aInfo == %d -", aInfo);
|
||||
#endif
|
||||
|
||||
nsString dataFlavor;
|
||||
char* dataFlavor;
|
||||
|
||||
// switch aInfo (atom) to our enum
|
||||
int type = TARGET_NONE;
|
||||
|
@ -799,10 +818,11 @@ void nsClipboard::SelectionGetCB(GtkWidget *widget,
|
|||
#endif
|
||||
|
||||
// Get data out of transferable.
|
||||
rv = cb->mTransferable->GetTransferData(&dataFlavor,
|
||||
&clipboardData,
|
||||
nsCOMPtr<nsISupports> genericDataWrapper;
|
||||
rv = cb->mTransferable->GetTransferData(dataFlavor,
|
||||
getter_AddRefs(genericDataWrapper),
|
||||
&dataLength);
|
||||
|
||||
CreateDataFromPrimitive ( dataFlavor, genericDataWrapper, &clipboardData, dataLength );
|
||||
if (NS_SUCCEEDED(rv) && clipboardData && dataLength > 0) {
|
||||
size_t size = 1;
|
||||
// find the number of bytes in the data for the below thing
|
||||
|
@ -813,6 +833,7 @@ void nsClipboard::SelectionGetCB(GtkWidget *widget,
|
|||
aInfo, size*8,
|
||||
(unsigned char *)clipboardData,
|
||||
dataLength);
|
||||
delete [] clipboardData;
|
||||
}
|
||||
else
|
||||
printf("Transferable didn't support the data flavor\n");
|
||||
|
|
|
@ -37,13 +37,15 @@
|
|||
#include "nsMimeMapper.h"
|
||||
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsWidgetsCID.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
|
||||
#include <Scrap.h>
|
||||
|
||||
|
||||
NS_IMPL_ADDREF_INHERITED(nsClipboard, nsBaseClipboard)
|
||||
NS_IMPL_RELEASE_INHERITED(nsClipboard, nsBaseClipboard)
|
||||
//NS_IMPL_QUERY_INTERFACE1(nsClipboard, nsIClipboard)
|
||||
|
||||
|
||||
//
|
||||
// nsClipboard constructor
|
||||
|
@ -113,29 +115,37 @@ nsClipboard :: SetNativeClipboardData()
|
|||
|
||||
// get flavor list that includes all flavors that can be written (including ones
|
||||
// obtained through conversion)
|
||||
nsVoidArray * flavorList;
|
||||
errCode = mTransferable->FlavorsTransferableCanExport ( &flavorList );
|
||||
if ( errCode != NS_OK )
|
||||
nsCOMPtr<nsISupportsArray> flavorList;
|
||||
errCode = mTransferable->FlavorsTransferableCanExport ( getter_AddRefs(flavorList) );
|
||||
if ( NS_FAILED(errCode) )
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
// For each flavor present (either directly in the transferable or that its
|
||||
// converter knows about) put it on the clipboard. Luckily, GetTransferData()
|
||||
// handles conversions for us, so we really don't need to know if a conversion
|
||||
// is required or not.
|
||||
PRUint32 cnt = flavorList->Count();
|
||||
PRUint32 cnt;
|
||||
flavorList->Count(&cnt);
|
||||
for ( int i = 0; i < cnt; ++i ) {
|
||||
nsString * currentFlavor = (nsString *)flavorList->ElementAt(i);
|
||||
if ( nsnull != currentFlavor ) {
|
||||
nsCOMPtr<nsISupports> genericFlavor;
|
||||
flavorList->GetElementAt ( i, getter_AddRefs(genericFlavor) );
|
||||
nsCOMPtr<nsISupportsString> currentFlavor ( do_QueryInterface(genericFlavor) );
|
||||
if ( currentFlavor ) {
|
||||
char* flavorStr;
|
||||
currentFlavor->toString(&flavorStr);
|
||||
|
||||
// find MacOS flavor
|
||||
ResType macOSFlavor = theMapper.MapMimeTypeToMacOSType(*currentFlavor);
|
||||
ResType macOSFlavor = theMapper.MapMimeTypeToMacOSType(flavorStr);
|
||||
|
||||
// get data. This takes converters into account. We don't own the data
|
||||
// so make sure not to delete it.
|
||||
void* data = nsnull;
|
||||
PRUint32 dataSize = 0;
|
||||
errCode = mTransferable->GetTransferData ( currentFlavor, &data, &dataSize );
|
||||
nsCOMPtr<nsISupports> genericDataWrapper;
|
||||
errCode = mTransferable->GetTransferData ( flavorStr, getter_AddRefs(genericDataWrapper), &dataSize );
|
||||
CreateDataFromPrimitive ( flavorStr, genericDataWrapper, &data, dataSize );
|
||||
#ifdef NS_DEBUG
|
||||
if ( errCode != NS_OK ) printf("nsClipboard:: Error getting data from transferable\n");
|
||||
if ( NS_FAILED(errCode) ) printf("nsClipboard:: Error getting data from transferable\n");
|
||||
#endif
|
||||
|
||||
// stash on clipboard
|
||||
|
@ -144,9 +154,9 @@ nsClipboard :: SetNativeClipboardData()
|
|||
errCode = NS_ERROR_FAILURE;
|
||||
|
||||
delete [] data;
|
||||
delete [] flavorStr;
|
||||
}
|
||||
} // foreach flavor in transferable
|
||||
delete flavorList;
|
||||
|
||||
// write out the mapping data in a special flavor on the clipboard. |mappingLen|
|
||||
// includes the NULL terminator.
|
||||
|
@ -178,8 +188,8 @@ nsClipboard :: GetNativeClipboardData(nsITransferable * aTransferable)
|
|||
|
||||
// get flavor list that includes all acceptable flavors (including ones obtained through
|
||||
// conversion)
|
||||
nsVoidArray * flavorList;
|
||||
errCode = aTransferable->FlavorsTransferableCanImport ( &flavorList );
|
||||
nsCOMPtr<nsISupportsArray> flavorList;
|
||||
errCode = aTransferable->FlavorsTransferableCanImport ( getter_AddRefs(flavorList) );
|
||||
if ( NS_FAILED(errCode) )
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
|
@ -194,29 +204,38 @@ nsClipboard :: GetNativeClipboardData(nsITransferable * aTransferable)
|
|||
// Now walk down the list of flavors. When we find one that is actually on the
|
||||
// clipboard, copy out the data into the transferable in that format. SetTransferData()
|
||||
// implicitly handles conversions.
|
||||
PRUint32 cnt = flavorList->Count();
|
||||
PRUint32 cnt;
|
||||
flavorList->Count(&cnt);
|
||||
for ( int i = 0; i < cnt; ++i ) {
|
||||
nsString * currentFlavor = (nsString *)flavorList->ElementAt(i);
|
||||
if ( nsnull != currentFlavor ) {
|
||||
nsCOMPtr<nsISupports> genericFlavor;
|
||||
flavorList->GetElementAt ( i, getter_AddRefs(genericFlavor) );
|
||||
nsCOMPtr<nsISupportsString> currentFlavor ( do_QueryInterface(genericFlavor) );
|
||||
if ( currentFlavor ) {
|
||||
char* flavorStr;
|
||||
currentFlavor->toString ( &flavorStr );
|
||||
|
||||
// find MacOS flavor
|
||||
ResType macOSFlavor = theMapper.MapMimeTypeToMacOSType(*currentFlavor);
|
||||
ResType macOSFlavor = theMapper.MapMimeTypeToMacOSType(flavorStr);
|
||||
|
||||
char* clipboardData = nsnull;
|
||||
long dataSize = 0L;
|
||||
nsresult loadResult = GetDataOffClipboard ( macOSFlavor, &clipboardData, &dataSize );
|
||||
if ( NS_SUCCEEDED(loadResult) && clipboardData ) {
|
||||
// put it into the transferable
|
||||
errCode = aTransferable->SetTransferData ( currentFlavor, clipboardData, dataSize );
|
||||
nsCOMPtr<nsISupports> genericDataWrapper;
|
||||
CreatePrimitiveForData ( flavorStr, clipboardData, dataSize, getter_AddRefs(genericDataWrapper) );
|
||||
errCode = aTransferable->SetTransferData ( flavorStr, genericDataWrapper, dataSize );
|
||||
#ifdef NS_DEBUG
|
||||
if ( errCode != NS_OK ) printf("nsClipboard:: Error setting data into transferable\n");
|
||||
#endif
|
||||
|
||||
// we found one, get out of this loop!
|
||||
delete [] flavorStr;
|
||||
break;
|
||||
} // if flavor found on clipboard
|
||||
delete [] flavorStr;
|
||||
}
|
||||
} // foreach flavor
|
||||
delete flavorList;
|
||||
|
||||
return errCode;
|
||||
}
|
||||
|
|
|
@ -30,10 +30,11 @@
|
|||
#include "nsITransferable.h"
|
||||
#include "nsString.h"
|
||||
#include "nsMimeMapper.h"
|
||||
#include "nsWidgetsCID.h"
|
||||
#include "nsClipboard.h"
|
||||
#include "nsIRegion.h"
|
||||
#include "nsVoidArray.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
#include "nsCOMPtr.h"
|
||||
|
||||
|
||||
DragSendDataUPP nsDragService::sDragSendDataUPP = NewDragSendDataProc(DragSendDataProc);
|
||||
|
@ -196,19 +197,26 @@ nsDragService :: RegisterDragItemsAndFlavors ( nsISupportsArray * inArray )
|
|||
for ( int itemIndex = 0; itemIndex < numDragItems; ++itemIndex ) {
|
||||
nsMimeMapperMac theMapper;
|
||||
|
||||
// (assumes that the items were placed into the transferable as nsITranferable*'s, not
|
||||
// nsISupports*'s. Don't forget ElementAt() addRefs for us)
|
||||
nsCOMPtr<nsITransferable> currItem = dont_AddRef(NS_STATIC_CAST(nsITransferable*,inArray->ElementAt(itemIndex)));
|
||||
nsCOMPtr<nsISupports> genericItem;
|
||||
inArray->GetElementAt ( itemIndex, getter_AddRefs(genericItem) );
|
||||
nsCOMPtr<nsITransferable> currItem ( do_QueryInterface(genericItem) );
|
||||
if ( currItem ) {
|
||||
nsVoidArray* flavorList = nsnull;
|
||||
if ( NS_SUCCEEDED(currItem->FlavorsTransferableCanExport(&flavorList)) ) {
|
||||
for ( int flavorIndex = 0; flavorIndex < flavorList->Count(); ++flavorIndex ) {
|
||||
nsCOMPtr<nsISupportsArray> flavorList;
|
||||
if ( NS_SUCCEEDED(currItem->FlavorsTransferableCanExport(getter_AddRefs(flavorList))) ) {
|
||||
PRUint32 numFlavors;
|
||||
flavorList->Count ( &numFlavors );
|
||||
for ( int flavorIndex = 0; flavorIndex < numFlavors; ++flavorIndex ) {
|
||||
|
||||
nsString* currentFlavor = NS_STATIC_CAST(nsString*, (*flavorList)[flavorIndex]);
|
||||
if ( nsnull != currentFlavor ) {
|
||||
FlavorType macOSFlavor = theMapper.MapMimeTypeToMacOSType(*currentFlavor);
|
||||
nsCOMPtr<nsISupports> genericWrapper;
|
||||
flavorList->GetElementAt ( flavorIndex, getter_AddRefs(genericWrapper) );
|
||||
nsCOMPtr<nsISupportsString> currentFlavor ( do_QueryInterface(genericWrapper) );
|
||||
if ( currentFlavor ) {
|
||||
char* flavorStr = nsnull;
|
||||
currentFlavor->toString ( &flavorStr );
|
||||
FlavorType macOSFlavor = theMapper.MapMimeTypeToMacOSType(flavorStr);
|
||||
::AddDragItemFlavor ( mDragRef, itemIndex, macOSFlavor, NULL, 0, flags );
|
||||
}
|
||||
delete [] flavorStr;
|
||||
}
|
||||
|
||||
} // foreach flavor in item
|
||||
} // if valid flavor list
|
||||
|
@ -237,7 +245,7 @@ nsDragService :: RegisterDragItemsAndFlavors ( nsISupportsArray * inArray )
|
|||
// stop as soon as we find a match.
|
||||
//
|
||||
NS_IMETHODIMP
|
||||
nsDragService :: GetData (nsITransferable * aTransferable, PRUint32 aItemIndex)
|
||||
nsDragService :: GetData ( nsITransferable * aTransferable, PRUint32 aItemIndex )
|
||||
{
|
||||
nsresult errCode = NS_ERROR_FAILURE;
|
||||
|
||||
|
@ -246,11 +254,11 @@ nsDragService :: GetData (nsITransferable * aTransferable, PRUint32 aItemIndex)
|
|||
return NS_ERROR_INVALID_ARG;
|
||||
|
||||
// get flavor list that includes all acceptable flavors (including ones obtained through
|
||||
// conversion)
|
||||
nsVoidArray* flavorList;
|
||||
errCode = aTransferable->FlavorsTransferableCanImport ( &flavorList );
|
||||
if ( errCode != NS_OK )
|
||||
return NS_ERROR_FAILURE;
|
||||
// conversion). Flavors are nsISupportsStrings so that they can be seen from JS.
|
||||
nsCOMPtr<nsISupportsArray> flavorList;
|
||||
errCode = aTransferable->FlavorsTransferableCanImport ( getter_AddRefs(flavorList) );
|
||||
if ( NS_FAILED(errCode) )
|
||||
return errCode;
|
||||
|
||||
// get the data for the requested drag item. Remember that GetDragItemReferenceNumber()
|
||||
// is one-based NOT zero-based like |aItemIndex| is.
|
||||
|
@ -265,13 +273,18 @@ nsDragService :: GetData (nsITransferable * aTransferable, PRUint32 aItemIndex)
|
|||
// Now walk down the list of flavors. When we find one that is actually present,
|
||||
// copy out the data into the transferable in that format. SetTransferData()
|
||||
// implicitly handles conversions.
|
||||
PRUint32 cnt = flavorList->Count();
|
||||
PRUint32 cnt;
|
||||
flavorList->Count ( &cnt );
|
||||
for ( int i = 0; i < cnt; ++i ) {
|
||||
nsString * currentFlavor = NS_STATIC_CAST(nsString*, (*flavorList)[i]);
|
||||
if ( nsnull != currentFlavor ) {
|
||||
nsCOMPtr<nsISupports> genericWrapper;
|
||||
flavorList->GetElementAt ( i, getter_AddRefs(genericWrapper) );
|
||||
nsCOMPtr<nsISupportsString> currentFlavor ( do_QueryInterface(genericWrapper) );
|
||||
if ( currentFlavor ) {
|
||||
// find MacOS flavor
|
||||
FlavorType macOSFlavor = theMapper.MapMimeTypeToMacOSType(*currentFlavor);
|
||||
printf("looking for data in type %s, mac flavor %ld\n", currentFlavor->ToNewCString(), macOSFlavor);
|
||||
char* flavorStr;
|
||||
currentFlavor->toString ( &flavorStr );
|
||||
FlavorType macOSFlavor = theMapper.MapMimeTypeToMacOSType(flavorStr);
|
||||
printf("looking for data in type %s, mac flavor %ld\n", flavorStr, macOSFlavor);
|
||||
|
||||
// check if it is present in the current drag item.
|
||||
FlavorFlags unused;
|
||||
|
@ -297,11 +310,15 @@ printf("flavor data size is %ld\n", dataSize);
|
|||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
// put it into the transferable
|
||||
errCode = aTransferable->SetTransferData ( currentFlavor, dataBuff, dataSize );
|
||||
// put it into the transferable.
|
||||
nsCOMPtr<nsISupports> genericDataWrapper;
|
||||
CreatePrimitiveForData ( flavorStr, dataBuff, dataSize, getter_AddRefs(genericDataWrapper) );
|
||||
errCode = aTransferable->SetTransferData ( flavorStr, genericDataWrapper, dataSize );
|
||||
#ifdef NS_DEBUG
|
||||
if ( errCode != NS_OK ) printf("nsDragService:: Error setting data into transferable\n");
|
||||
#endif
|
||||
|
||||
delete [] dataBuff;
|
||||
}
|
||||
else {
|
||||
#ifdef NS_DEBUG
|
||||
|
@ -313,11 +330,11 @@ printf("flavor data size is %ld\n", dataSize);
|
|||
// we found one, get out of this loop!
|
||||
break;
|
||||
|
||||
} // if a flavor found
|
||||
}
|
||||
} // if a flavor found
|
||||
|
||||
delete [] flavorStr;
|
||||
}
|
||||
} // foreach flavor
|
||||
|
||||
delete flavorList;
|
||||
|
||||
return errCode;
|
||||
}
|
||||
|
@ -333,15 +350,18 @@ printf("flavor data size is %ld\n", dataSize);
|
|||
// ¥¥¥Êand index to this API
|
||||
//
|
||||
NS_IMETHODIMP
|
||||
nsDragService :: IsDataFlavorSupported(nsString * aDataFlavor)
|
||||
nsDragService :: IsDataFlavorSupported(const char *aDataFlavor, PRBool *_retval)
|
||||
{
|
||||
nsresult flavorSupported = NS_ERROR_FAILURE;
|
||||
if ( !_retval )
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
|
||||
*_retval = PR_FALSE;
|
||||
|
||||
// convert to 4 character MacOS type
|
||||
//¥¥¥ this is wrong because it doesn't take the mime mappings present in the
|
||||
//¥¥¥ drag item flavor into account. FIX ME!
|
||||
nsMimeMapperMac theMapper;
|
||||
FlavorType macFlavor = theMapper.MapMimeTypeToMacOSType(*aDataFlavor);
|
||||
FlavorType macFlavor = theMapper.MapMimeTypeToMacOSType(aDataFlavor);
|
||||
|
||||
// search through all drag items looking for something with this flavor. Recall
|
||||
// that drag item indices are 1-based.
|
||||
|
@ -356,10 +376,10 @@ nsDragService :: IsDataFlavorSupported(nsString * aDataFlavor)
|
|||
FlavorFlags ignored;
|
||||
char foundFlavor = ::GetFlavorFlags(mDragRef, currItem, macFlavor, &ignored) == noErr;
|
||||
if ( foundFlavor )
|
||||
flavorSupported = NS_OK;
|
||||
*_retval = PR_TRUE;
|
||||
} // for each item in drag
|
||||
|
||||
return flavorSupported;
|
||||
return NS_OK;
|
||||
|
||||
} // IsDataFlavorSupported
|
||||
|
||||
|
@ -452,19 +472,26 @@ nsDragService :: GetDataForFlavor ( nsISupportsArray* inDragItems, DragReference
|
|||
|
||||
// (assumes that the items were placed into the transferable as nsITranferable*'s, not
|
||||
// nsISupports*'s. Don't forget ElementAt() addRefs for us.)
|
||||
nsCOMPtr<nsITransferable> item = dont_AddRef(NS_STATIC_CAST(nsITransferable*,inDragItems->ElementAt(inItemIndex)));
|
||||
nsCOMPtr<nsISupports> genericItem;
|
||||
inDragItems->GetElementAt ( inItemIndex, getter_AddRefs(genericItem) );
|
||||
nsCOMPtr<nsITransferable> item ( do_QueryInterface(genericItem) );
|
||||
if ( item ) {
|
||||
nsString mimeFlavor;
|
||||
|
||||
// create a mime mapper to help us out based on data in a special flavor for this item.
|
||||
char* mappings = LookupMimeMappingsForItem(inDragRef, inItemIndex) ;
|
||||
nsMimeMapperMac theMapper ( mappings );
|
||||
theMapper.MapMacOSTypeToMimeType ( inFlavor, mimeFlavor );
|
||||
nsMimeMapperMac theMapper ( mappings );
|
||||
theMapper.MapMacOSTypeToMimeType ( inFlavor, mimeFlavor );
|
||||
delete [] mappings;
|
||||
|
||||
*outDataSize = 0;
|
||||
if ( NS_FAILED(item->GetTransferData(&mimeFlavor, outData, outDataSize)) )
|
||||
retVal = cantGetFlavorErr;
|
||||
char* mimeStr = mimeFlavor.ToNewCString();
|
||||
nsCOMPtr<nsISupports> data;
|
||||
if ( NS_SUCCEEDED(item->GetTransferData(mimeStr, getter_AddRefs(data), outDataSize)) )
|
||||
CreateDataFromPrimitive ( mimeStr, data, outData, *outDataSize );
|
||||
else
|
||||
retVal = cantGetFlavorErr;
|
||||
delete [] mimeStr;
|
||||
} // if valid item
|
||||
|
||||
return retVal;
|
||||
|
|
|
@ -52,7 +52,7 @@ public:
|
|||
|
||||
//nsIDragSession
|
||||
NS_IMETHOD GetData (nsITransferable * aTransferable, PRUint32 aItemIndex);
|
||||
NS_IMETHOD IsDataFlavorSupported(nsString * aDataFlavor);
|
||||
NS_IMETHOD IsDataFlavorSupported(const char *aDataFlavor, PRBool *_retval);
|
||||
NS_IMETHOD GetNumDropItems (PRUint32 * aNumItems);
|
||||
|
||||
//nsIDragSessionMac
|
||||
|
|
|
@ -27,6 +27,8 @@
|
|||
#include "nsString.h"
|
||||
#include "nsIFormatConverter.h"
|
||||
#include "nsITransferable.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
|
||||
#include "nsIWidget.h"
|
||||
#include "nsIComponentManager.h"
|
||||
|
@ -131,17 +133,22 @@ nsresult nsClipboard::SetupNativeDataObject(nsITransferable * aTransferable, IDa
|
|||
dObj->SetTransferable(aTransferable);
|
||||
|
||||
// Get the transferable list of data flavors
|
||||
nsVoidArray * dfList;
|
||||
aTransferable->FlavorsTransferableCanExport(&dfList);
|
||||
nsCOMPtr<nsISupportsArray> dfList;
|
||||
aTransferable->FlavorsTransferableCanExport(getter_AddRefs(dfList));
|
||||
|
||||
// Walk through flavors that contain data and register them
|
||||
// into the DataObj as supported flavors
|
||||
PRUint32 i;
|
||||
PRUint32 cnt = dfList->Count();
|
||||
PRUint32 cnt;
|
||||
dfList->Count(&cnt);
|
||||
for (i=0;i<cnt;i++) {
|
||||
nsString * df = (nsString *)dfList->ElementAt(i);
|
||||
if (nsnull != df) {
|
||||
UINT format = GetFormat(*df);
|
||||
nsCOMPtr<nsISupports> genericFlavor;
|
||||
dfList->GetElementAt ( i, getter_AddRefs(genericFlavor) );
|
||||
nsCOMPtr<nsISupportsString> currentFlavor ( do_QueryInterface(genericFlavor) );
|
||||
if ( currentFlavor ) {
|
||||
char* flavorStr;
|
||||
currentFlavor->toString(&flavorStr);
|
||||
UINT format = GetFormat(flavorStr);
|
||||
|
||||
// check here to see if we can the data back from global member
|
||||
// XXX need IStream support, or file support
|
||||
|
@ -150,11 +157,11 @@ nsresult nsClipboard::SetupNativeDataObject(nsITransferable * aTransferable, IDa
|
|||
|
||||
// Now tell the native IDataObject about both the DataFlavor and
|
||||
// the native data format
|
||||
dObj->AddDataFlavor(df, &fe);
|
||||
dObj->AddDataFlavor(flavorStr, &fe);
|
||||
|
||||
delete [] flavorStr;
|
||||
}
|
||||
}
|
||||
// Delete the data flavors list
|
||||
delete dfList;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
@ -508,24 +515,31 @@ nsresult nsClipboard::GetDataFromDataObject(IDataObject * aDataObject,
|
|||
nsIWidget * aWindow,
|
||||
nsITransferable * aTransferable)
|
||||
{
|
||||
// make sure we have a good transferable
|
||||
if ( !aTransferable )
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
|
||||
nsresult res = NS_ERROR_FAILURE;
|
||||
|
||||
// make sure we have a good transferable
|
||||
if (nsnull == aTransferable) {
|
||||
return res;
|
||||
}
|
||||
|
||||
// Get the transferable list of data flavors
|
||||
nsVoidArray * dfList;
|
||||
aTransferable->GetTransferDataFlavors(&dfList);
|
||||
// get flavor list that includes all flavors that can be written (including ones
|
||||
// obtained through conversion)
|
||||
nsCOMPtr<nsISupportsArray> flavorList;
|
||||
res = aTransferable->FlavorsTransferableCanImport ( getter_AddRefs(flavorList) );
|
||||
if ( NS_FAILED(res) )
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
// Walk through flavors and see which flavor is on the clipboard them on the native clipboard,
|
||||
PRUint32 i;
|
||||
PRUint32 cnt = dfList->Count();
|
||||
PRUint32 cnt;
|
||||
flavorList->Count(&cnt);
|
||||
for (i=0;i<cnt;i++) {
|
||||
nsString * df = (nsString *)dfList->ElementAt(i);
|
||||
if (nsnull != df) {
|
||||
UINT format = GetFormat(*df);
|
||||
nsCOMPtr<nsISupports> genericFlavor;
|
||||
flavorList->GetElementAt ( i, getter_AddRefs(genericFlavor) );
|
||||
nsCOMPtr<nsISupportsString> currentFlavor ( do_QueryInterface(genericFlavor) );
|
||||
if ( currentFlavor ) {
|
||||
char* flavorStr;
|
||||
currentFlavor->toString(&flavorStr);
|
||||
UINT format = GetFormat(flavorStr);
|
||||
|
||||
void * data;
|
||||
PRUint32 dataLen;
|
||||
|
@ -533,19 +547,24 @@ nsresult nsClipboard::GetDataFromDataObject(IDataObject * aDataObject,
|
|||
if (nsnull != aDataObject) {
|
||||
res = GetNativeDataOffClipboard(aDataObject, format, &data, &dataLen);
|
||||
if (NS_OK == res) {
|
||||
aTransferable->SetTransferData(df, data, dataLen);
|
||||
nsCOMPtr<nsISupports> genericDataWrapper;
|
||||
CreatePrimitiveForData ( flavorStr, data, dataLen, getter_AddRefs(genericDataWrapper) );
|
||||
aTransferable->SetTransferData(flavorStr, genericDataWrapper, dataLen);
|
||||
break;
|
||||
}
|
||||
} else if (nsnull != aWindow) {
|
||||
res = GetNativeDataOffClipboard(aWindow, format, &data, &dataLen);
|
||||
if (NS_OK == res) {
|
||||
aTransferable->SetTransferData(df, data, dataLen);
|
||||
nsCOMPtr<nsISupports> genericDataWrapper;
|
||||
CreatePrimitiveForData ( flavorStr, data, dataLen, getter_AddRefs(genericDataWrapper) );
|
||||
aTransferable->SetTransferData(flavorStr, genericDataWrapper, dataLen);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delete [] flavorStr;
|
||||
}
|
||||
}
|
||||
delete dfList;
|
||||
return res;
|
||||
|
||||
}
|
||||
|
@ -615,24 +634,34 @@ NS_IMETHODIMP nsClipboard::ForceDataToClipboard()
|
|||
::OpenClipboard(nativeWin);
|
||||
::EmptyClipboard();
|
||||
|
||||
// Get the transferable list of data flavors
|
||||
nsVoidArray * dfList;
|
||||
mTransferable->GetTransferDataFlavors(&dfList);
|
||||
// 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 see which flavor is on the native clipboard,
|
||||
PRUint32 i;
|
||||
PRUint32 cnt = dfList->Count();
|
||||
PRUint32 cnt;
|
||||
flavorList->Count(&cnt);
|
||||
for (i=0;i<cnt;i++) {
|
||||
nsString * df = (nsString *)dfList->ElementAt(i);
|
||||
if (nsnull != df) {
|
||||
UINT format = GetFormat(*df);
|
||||
nsCOMPtr<nsISupports> genericFlavor;
|
||||
flavorList->GetElementAt ( i, getter_AddRefs(genericFlavor) );
|
||||
nsCOMPtr<nsISupportsString> currentFlavor ( do_QueryInterface(genericFlavor) );
|
||||
if ( currentFlavor ) {
|
||||
char* flavorStr;
|
||||
currentFlavor->toString(&flavorStr);
|
||||
UINT format = GetFormat(flavorStr);
|
||||
|
||||
void * data;
|
||||
PRUint32 dataLen;
|
||||
PRUint32 dataLen = 0;
|
||||
|
||||
// Get the data as a bunch-o-bytes from the clipboard
|
||||
// this call hands back new memory with the contents copied into it
|
||||
mTransferable->GetTransferData(df, &data, &dataLen);
|
||||
nsCOMPtr<nsISupports> genericDataWrapper;
|
||||
mTransferable->GetTransferData(flavorStr, getter_AddRefs(genericDataWrapper), &dataLen);
|
||||
CreateDataFromPrimitive ( flavorStr, genericDataWrapper, &data, dataLen );
|
||||
|
||||
// now place it on the Clipboard
|
||||
if (nsnull != data) {
|
||||
|
@ -641,9 +670,10 @@ NS_IMETHODIMP nsClipboard::ForceDataToClipboard()
|
|||
|
||||
// Now, delete the memory that was created by the transferable
|
||||
delete [] data;
|
||||
delete [] flavorStr;
|
||||
}
|
||||
}
|
||||
delete dfList;
|
||||
|
||||
::CloseClipboard();
|
||||
|
||||
return NS_OK;
|
||||
|
|
|
@ -20,7 +20,10 @@
|
|||
#include "nsString.h"
|
||||
#include "nsVoidArray.h"
|
||||
#include "nsITransferable.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
#include "IENUMFE.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsIComponentManager.h"
|
||||
|
||||
#include "OLE2.h"
|
||||
#include "URLMON.h"
|
||||
|
@ -41,6 +44,12 @@ EXTERN_C GUID CDECL CLSID_nsDataObj =
|
|||
{ 0x1bba7640, 0xdf52, 0x11cf, { 0x82, 0x7b, 0, 0xa0, 0x24, 0x3a, 0xe5, 0x05 } };
|
||||
|
||||
|
||||
// I don't like having to define these here, but all this should be going away for a generic
|
||||
// mechanism at some point in the future.
|
||||
void CreateDataFromPrimitive ( const char* aFlavor, nsISupports* aPrimitive, void** aDataBuff, PRUint32 aDataLen ) ;
|
||||
void CreatePrimitiveForData ( const char* aFlavor, void* aDataBuff, PRUint32 aDataLen, nsISupports** aPrimitive ) ;
|
||||
|
||||
|
||||
/*
|
||||
* Class nsDataObj
|
||||
*/
|
||||
|
@ -326,14 +335,19 @@ HRESULT nsDataObj::GetDib(FORMATETC&, STGMEDIUM&)
|
|||
//-----------------------------------------------------
|
||||
HRESULT nsDataObj::GetText(nsString * aDF, FORMATETC& aFE, STGMEDIUM& aSTG)
|
||||
{
|
||||
char * data;
|
||||
void* data;
|
||||
PRUint32 len;
|
||||
|
||||
char* flavorStr = aDF->ToNewCString();
|
||||
|
||||
// NOTE: Transferable creates new memory, that needs to be deleted
|
||||
mTransferable->GetTransferData(aDF, (void **)&data, &len);
|
||||
// NOTE: CreateDataFromPrimitive creates new memory, that needs to be deleted
|
||||
nsCOMPtr<nsISupports> genericDataWrapper;
|
||||
mTransferable->GetTransferData(flavorStr, getter_AddRefs(genericDataWrapper), &len);
|
||||
if (0 == len) {
|
||||
return ResultFromScode(E_FAIL);
|
||||
}
|
||||
CreateDataFromPrimitive ( flavorStr, genericDataWrapper, &data, len );
|
||||
delete [] flavorStr;
|
||||
|
||||
HGLOBAL hGlobalMemory = NULL;
|
||||
PSTR pGlobalMemory = NULL;
|
||||
|
@ -375,7 +389,7 @@ HRESULT nsDataObj::GetText(nsString * aDF, FORMATETC& aFE, STGMEDIUM& aSTG)
|
|||
//PSTR pstr = pGlobalMemory;
|
||||
|
||||
// need to use memcpy here
|
||||
char* s = data;
|
||||
char* s = NS_REINTERPRET_CAST(char*, data);
|
||||
PRUint32 inx;
|
||||
for (inx=0; inx < len; inx++) {
|
||||
*pstr++ = *s++;
|
||||
|
@ -387,7 +401,7 @@ HRESULT nsDataObj::GetText(nsString * aDF, FORMATETC& aFE, STGMEDIUM& aSTG)
|
|||
|
||||
aSTG.hGlobal = hGlobalMemory;
|
||||
|
||||
// Now, delete the memory that was created by the transferable
|
||||
// Now, delete the memory that was created by CreateDataFromPrimitive
|
||||
delete [] data;
|
||||
|
||||
return ResultFromScode(S_OK);
|
||||
|
@ -449,13 +463,13 @@ CLSID nsDataObj::GetClassID() const
|
|||
//-----------------------------------------------------
|
||||
// Registers a the DataFlavor/FE pair
|
||||
//-----------------------------------------------------
|
||||
void nsDataObj::AddDataFlavor(nsString * aDataFlavor, LPFORMATETC aFE)
|
||||
void nsDataObj::AddDataFlavor(nsString & aDataFlavor, LPFORMATETC aFE)
|
||||
{
|
||||
// These two lists are the mapping to and from data flavors and FEs
|
||||
// Later, OLE will tell us it's needs a certain type of FORMATETC (text, unicode, etc)
|
||||
// so we will look up data flavor that corresponds to the FE
|
||||
// and then ask the transferable for that type of data
|
||||
mDataFlavors->AppendElement(new nsString(*aDataFlavor));
|
||||
mDataFlavors->AppendElement(new nsString(aDataFlavor));
|
||||
m_enumFE->AddFE(aFE);
|
||||
|
||||
}
|
||||
|
@ -476,3 +490,58 @@ void nsDataObj::SetTransferable(nsITransferable * aTransferable)
|
|||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//¥¥¥ skanky hack until i can correctly re-create primitives from native data. i know this code sucks,
|
||||
//¥¥¥ please forgive me.
|
||||
void
|
||||
CreatePrimitiveForData ( const char* aFlavor, void* aDataBuff, PRUint32 aDataLen, nsISupports** aPrimitive )
|
||||
{
|
||||
if ( !aPrimitive )
|
||||
return;
|
||||
|
||||
if ( strcmp(aFlavor,kTextMime) == 0 ) {
|
||||
nsCOMPtr<nsISupportsString> primitive;
|
||||
nsresult rv = nsComponentManager::CreateInstance(NS_SUPPORTS_STRING_PROGID, nsnull,
|
||||
NS_GET_IID(nsISupportsString), getter_AddRefs(primitive));
|
||||
if ( primitive ) {
|
||||
primitive->SetData ( (char*)aDataBuff );
|
||||
nsCOMPtr<nsISupports> genericPrimitive ( do_QueryInterface(primitive) );
|
||||
*aPrimitive = genericPrimitive;
|
||||
NS_ADDREF(*aPrimitive);
|
||||
}
|
||||
}
|
||||
else {
|
||||
nsCOMPtr<nsISupportsWString> primitive;
|
||||
nsresult rv = nsComponentManager::CreateInstance(NS_SUPPORTS_WSTRING_PROGID, nsnull,
|
||||
NS_GET_IID(nsISupportsWString), getter_AddRefs(primitive));
|
||||
if ( primitive ) {
|
||||
primitive->SetData ( (unsigned short*)aDataBuff );
|
||||
nsCOMPtr<nsISupports> genericPrimitive ( do_QueryInterface(primitive) );
|
||||
*aPrimitive = genericPrimitive;
|
||||
NS_ADDREF(*aPrimitive);
|
||||
}
|
||||
}
|
||||
|
||||
} // CreatePrimitiveForData
|
||||
|
||||
|
||||
void
|
||||
CreateDataFromPrimitive ( const char* aFlavor, nsISupports* aPrimitive, void** aDataBuff, PRUint32 aDataLen )
|
||||
{
|
||||
if ( !aDataBuff )
|
||||
return;
|
||||
|
||||
if ( strcmp(aFlavor,kTextMime) == 0 ) {
|
||||
nsCOMPtr<nsISupportsString> plainText ( do_QueryInterface(aPrimitive) );
|
||||
if ( plainText )
|
||||
plainText->GetData ( (char**)aDataBuff );
|
||||
}
|
||||
else {
|
||||
nsCOMPtr<nsISupportsWString> doubleByteText ( do_QueryInterface(aPrimitive) );
|
||||
if ( doubleByteText )
|
||||
doubleByteText->GetData ( (unsigned short**)aDataBuff );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -60,7 +60,7 @@ class nsDataObj : public IDataObject
|
|||
virtual HRESULT SetMetafilePict(FORMATETC& FE, STGMEDIUM& STM);
|
||||
|
||||
// support for clipboard
|
||||
void AddDataFlavor(nsString * aDataFlavor, LPFORMATETC aFE);
|
||||
void AddDataFlavor(nsString & aDataFlavor, LPFORMATETC aFE);
|
||||
void SetTransferable(nsITransferable * aTransferable);
|
||||
|
||||
virtual HRESULT GetText(nsString * aDF, FORMATETC& FE, STGMEDIUM& STM);
|
||||
|
|
|
@ -31,9 +31,6 @@
|
|||
#include "OLEIDL.H"
|
||||
|
||||
|
||||
static NS_DEFINE_IID(kIDragServiceIID, NS_IDRAGSERVICE_IID);
|
||||
static NS_DEFINE_IID(kIDragSessionIID, NS_IDRAGSESSION_IID);
|
||||
|
||||
NS_IMPL_ADDREF_INHERITED(nsDragService, nsBaseDragService)
|
||||
NS_IMPL_RELEASE_INHERITED(nsDragService, nsBaseDragService)
|
||||
|
||||
|
@ -62,12 +59,14 @@ nsDragService::~nsDragService()
|
|||
NS_IF_RELEASE(mDataObject);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param aIID The name of the class implementing the method
|
||||
* @param _classiiddef The name of the #define symbol that defines the IID
|
||||
* for the class (e.g. NS_ISUPPORTS_IID)
|
||||
*
|
||||
*/
|
||||
*/
|
||||
// clean me up! ;)
|
||||
nsresult nsDragService::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
||||
{
|
||||
|
||||
|
@ -80,13 +79,13 @@ nsresult nsDragService::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
if (aIID.Equals(kIDragServiceIID)) {
|
||||
if (aIID.Equals(NS_GET_IID(nsIDragService))) {
|
||||
*aInstancePtr = (void*) ((nsIDragService*)this);
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
if (aIID.Equals(kIDragSessionIID)) {
|
||||
if (aIID.Equals(NS_GET_IID(nsIDragSession))) {
|
||||
*aInstancePtr = (void*) ((nsIDragSession*)this);
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
|
@ -113,12 +112,14 @@ NS_IMETHODIMP nsDragService::InvokeDragSession (nsISupportsArray * anArrayTransf
|
|||
IDataObject * dataObj = nsnull;
|
||||
PRUint32 i;
|
||||
for (i=0;i<cnt;i++) {
|
||||
nsISupports * supports = anArrayTransferables->ElementAt(i);
|
||||
nsCOMPtr<nsISupports> supports;
|
||||
anArrayTransferables->GetElementAt(i, getter_AddRefs(supports));
|
||||
nsCOMPtr<nsITransferable> trans(do_QueryInterface(supports));
|
||||
NS_RELEASE(supports);
|
||||
nsClipboard::CreateNativeDataObject(trans, &dataObj);
|
||||
dataObjCollection->AddDataObject(dataObj);
|
||||
NS_IF_RELEASE(dataObj);
|
||||
if ( trans ) {
|
||||
nsClipboard::CreateNativeDataObject(trans, &dataObj);
|
||||
dataObjCollection->AddDataObject(dataObj);
|
||||
NS_IF_RELEASE(dataObj);
|
||||
}
|
||||
}
|
||||
|
||||
StartInvokingDragSession((IDataObject *)dataObjCollection, aActionType);
|
||||
|
@ -229,11 +230,10 @@ NS_IMETHODIMP nsDragService::SetIDataObject (IDataObject * aDataObj)
|
|||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
NS_IMETHODIMP nsDragService::IsDataFlavorSupported(nsString * aDataFlavor)
|
||||
NS_IMETHODIMP nsDragService::IsDataFlavorSupported(const char *aDataFlavor, PRBool *_retval)
|
||||
{
|
||||
if (nsnull == aDataFlavor || nsnull == mDataObject) {
|
||||
if ( !aDataFlavor || !mDataObject || !_retval )
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
// First check to see if the mDataObject is is Collection of IDataObjects
|
||||
UINT format = nsClipboard::GetFormat(MULTI_MIME);
|
||||
|
@ -243,7 +243,7 @@ NS_IMETHODIMP nsDragService::IsDataFlavorSupported(nsString * aDataFlavor)
|
|||
if (S_OK != mDataObject->QueryGetData(&fe)) {
|
||||
// Ok, so we have a single object
|
||||
// now check to see if has the correct data type
|
||||
format = nsClipboard::GetFormat(*aDataFlavor);
|
||||
format = nsClipboard::GetFormat(aDataFlavor);
|
||||
SET_FORMATETC(fe, format, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL | TYMED_FILE | TYMED_GDI);
|
||||
|
||||
if (S_OK == mDataObject->QueryGetData(&fe)) {
|
||||
|
@ -254,7 +254,7 @@ NS_IMETHODIMP nsDragService::IsDataFlavorSupported(nsString * aDataFlavor)
|
|||
}
|
||||
|
||||
// Set it up for the data flavor
|
||||
format = nsClipboard::GetFormat(*aDataFlavor);
|
||||
format = nsClipboard::GetFormat(aDataFlavor);
|
||||
SET_FORMATETC(fe, format, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL | TYMED_FILE | TYMED_GDI);
|
||||
|
||||
// Ok, now see if any one of the IDataObjects in the collection
|
||||
|
@ -275,10 +275,10 @@ NS_IMETHODIMP nsDragService::IsDataFlavorSupported(nsString * aDataFlavor)
|
|||
//-------------------------------------------------------------------------
|
||||
NS_IMETHODIMP nsDragService::GetCurrentSession (nsIDragSession ** aSession)
|
||||
{
|
||||
if (nsnull == aSession) {
|
||||
if ( !aSession )
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
*aSession = (nsIDragSession *)this;
|
||||
NS_ADDREF(this);
|
||||
NS_ADDREF(*aSession);
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ public:
|
|||
// nsIDragSession
|
||||
NS_IMETHOD GetData (nsITransferable * aTransferable, PRUint32 anItem);
|
||||
NS_IMETHOD GetNumDropItems (PRUint32 * aNumItems);
|
||||
NS_IMETHOD IsDataFlavorSupported(nsString * aDataFlavor);
|
||||
NS_IMETHOD IsDataFlavorSupported(const char *aDataFlavor, PRBool *_retval);
|
||||
|
||||
// native impl.
|
||||
NS_IMETHOD SetIDataObject (IDataObject * aDataObj);
|
||||
|
|
|
@ -34,7 +34,6 @@ CPPSRCS= \
|
|||
nsXIFFormatConverter.cpp \
|
||||
nsBaseDragService.cpp \
|
||||
nsBaseClipboard.cpp \
|
||||
nsFileListTransferable.cpp \
|
||||
nsFileSpecWithUIImpl.cpp \
|
||||
$(NULL)
|
||||
|
||||
|
|
|
@ -23,7 +23,6 @@ REQUIRES=xpcom gfxwin raptor dom js network netlib
|
|||
DEFINES =-D_IMPL_NS_WIDGET
|
||||
|
||||
CPPSRCS = \
|
||||
nsFileListTransferable.cpp \
|
||||
nsBaseDragService.cpp \
|
||||
nsBaseWidget.cpp \
|
||||
nsFileSpecWithUIImpl.cpp \
|
||||
|
@ -35,7 +34,6 @@ CPPSRCS = \
|
|||
MODULE=raptor
|
||||
|
||||
OBJS= \
|
||||
.\$(OBJDIR)\nsFileListTransferable.obj \
|
||||
.\$(OBJDIR)\nsBaseDragService.obj \
|
||||
.\$(OBJDIR)\nsBaseWidget.obj \
|
||||
.\$(OBJDIR)\nsFileSpecWithUIImpl.obj \
|
||||
|
|
|
@ -23,11 +23,9 @@
|
|||
|
||||
#include "nsIWidget.h"
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsWidgetsCID.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
|
||||
// interface definitions
|
||||
//static NS_DEFINE_IID(kIWidgetIID, NS_IWIDGET_IID);
|
||||
static NS_DEFINE_IID(kWindowCID, NS_WINDOW_CID);
|
||||
|
||||
NS_IMPL_ADDREF(nsBaseClipboard)
|
||||
NS_IMPL_RELEASE(nsBaseClipboard)
|
||||
|
@ -159,3 +157,58 @@ NS_IMETHODIMP nsBaseClipboard::ForceDataToClipboard()
|
|||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//¥¥¥ skanky hack until i can correctly re-create primitives from native data. i know this code sucks,
|
||||
//¥¥¥ please forgive me.
|
||||
void
|
||||
nsBaseClipboard :: CreatePrimitiveForData ( const char* aFlavor, void* aDataBuff, PRUint32 aDataLen, nsISupports** aPrimitive )
|
||||
{
|
||||
if ( !aPrimitive )
|
||||
return;
|
||||
|
||||
if ( strcmp(aFlavor,kTextMime) == 0 ) {
|
||||
nsCOMPtr<nsISupportsString> primitive;
|
||||
nsresult rv = nsComponentManager::CreateInstance(NS_SUPPORTS_STRING_PROGID, nsnull,
|
||||
NS_GET_IID(nsISupportsString), getter_AddRefs(primitive));
|
||||
if ( primitive ) {
|
||||
primitive->SetData ( (char*)aDataBuff );
|
||||
nsCOMPtr<nsISupports> genericPrimitive ( do_QueryInterface(primitive) );
|
||||
*aPrimitive = genericPrimitive;
|
||||
NS_ADDREF(*aPrimitive);
|
||||
}
|
||||
}
|
||||
else {
|
||||
nsCOMPtr<nsISupportsWString> primitive;
|
||||
nsresult rv = nsComponentManager::CreateInstance(NS_SUPPORTS_WSTRING_PROGID, nsnull,
|
||||
NS_GET_IID(nsISupportsWString), getter_AddRefs(primitive));
|
||||
if ( primitive ) {
|
||||
primitive->SetData ( (unsigned short*)aDataBuff );
|
||||
nsCOMPtr<nsISupports> genericPrimitive ( do_QueryInterface(primitive) );
|
||||
*aPrimitive = genericPrimitive;
|
||||
NS_ADDREF(*aPrimitive);
|
||||
}
|
||||
}
|
||||
|
||||
} // CreatePrimitiveForData
|
||||
|
||||
|
||||
void
|
||||
nsBaseClipboard :: CreateDataFromPrimitive ( const char* aFlavor, nsISupports* aPrimitive, void** aDataBuff, PRUint32 aDataLen )
|
||||
{
|
||||
if ( !aDataBuff )
|
||||
return;
|
||||
|
||||
if ( strcmp(aFlavor,kTextMime) == 0 ) {
|
||||
nsCOMPtr<nsISupportsString> plainText ( do_QueryInterface(aPrimitive) );
|
||||
if ( plainText )
|
||||
plainText->GetData ( (char**)aDataBuff );
|
||||
}
|
||||
else {
|
||||
nsCOMPtr<nsISupportsWString> doubleByteText ( do_QueryInterface(aPrimitive) );
|
||||
if ( doubleByteText )
|
||||
doubleByteText->GetData ( (unsigned short**)aDataBuff );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -54,6 +54,9 @@ protected:
|
|||
NS_IMETHOD SetNativeClipboardData() = 0;
|
||||
NS_IMETHOD GetNativeClipboardData(nsITransferable * aTransferable) = 0;
|
||||
|
||||
static void CreatePrimitiveForData ( const char* aFlavor, void* aDataBuff, PRUint32 aDataLen, nsISupports** aPrimitive );
|
||||
static void CreateDataFromPrimitive ( const char* aFlavor, nsISupports* aPrimitive, void** aDataBuff, PRUint32 aDataLen );
|
||||
|
||||
PRBool mIgnoreEmptyNotification;
|
||||
nsIClipboardOwner * mClipboardOwner;
|
||||
nsITransferable * mTransferable;
|
||||
|
|
|
@ -20,11 +20,12 @@
|
|||
#include "nsITransferable.h"
|
||||
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsWidgetsCID.h"
|
||||
#include "nsITransferable.h"
|
||||
#include "nsISupportsArray.h"
|
||||
#include "nsSize.h"
|
||||
#include "nsIRegion.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
#include "nsCOMPtr.h"
|
||||
|
||||
|
||||
NS_IMPL_ADDREF(nsBaseDragService)
|
||||
|
@ -147,7 +148,7 @@ NS_IMETHODIMP nsBaseDragService::GetData (nsITransferable * aTransferable, PRUin
|
|||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
NS_IMETHODIMP nsBaseDragService::IsDataFlavorSupported(nsString * aDataFlavor)
|
||||
NS_IMETHODIMP nsBaseDragService::IsDataFlavorSupported(const char *aDataFlavor, PRBool *_retval)
|
||||
{
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
@ -168,8 +169,8 @@ NS_IMETHODIMP nsBaseDragService::GetCurrentSession (nsIDragSession ** aSession)
|
|||
// "this" also implements a drag session, so say we are one but only if there
|
||||
// is currently a drag going on.
|
||||
if ( mDoingDrag ) {
|
||||
NS_ADDREF_THIS(); // addRef because we're a "getter"
|
||||
*aSession = this;
|
||||
NS_ADDREF(*aSession); // addRef because we're a "getter"
|
||||
}
|
||||
else
|
||||
*aSession = nsnull;
|
||||
|
@ -196,3 +197,57 @@ NS_IMETHODIMP nsBaseDragService::EndDragSession ()
|
|||
mDoingDrag = PR_FALSE;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//¥¥¥ skanky hack until i can correctly re-create primitives from native data. i know this code sucks,
|
||||
//¥¥¥ please forgive me.
|
||||
void
|
||||
nsBaseDragService :: CreatePrimitiveForData ( const char* aFlavor, void* aDataBuff, PRUint32 aDataLen, nsISupports** aPrimitive )
|
||||
{
|
||||
if ( !aPrimitive )
|
||||
return;
|
||||
|
||||
if ( strcmp(aFlavor,kTextMime) == 0 ) {
|
||||
nsCOMPtr<nsISupportsString> primitive;
|
||||
nsresult rv = nsComponentManager::CreateInstance(NS_SUPPORTS_STRING_PROGID, nsnull,
|
||||
NS_GET_IID(nsISupportsString), getter_AddRefs(primitive));
|
||||
if ( primitive ) {
|
||||
primitive->SetData ( (char*)aDataBuff );
|
||||
nsCOMPtr<nsISupports> genericPrimitive ( do_QueryInterface(primitive) );
|
||||
*aPrimitive = genericPrimitive;
|
||||
NS_ADDREF(*aPrimitive);
|
||||
}
|
||||
}
|
||||
else {
|
||||
nsCOMPtr<nsISupportsWString> primitive;
|
||||
nsresult rv = nsComponentManager::CreateInstance(NS_SUPPORTS_WSTRING_PROGID, nsnull,
|
||||
NS_GET_IID(nsISupportsWString), getter_AddRefs(primitive));
|
||||
if ( primitive ) {
|
||||
primitive->SetData ( (unsigned short*)aDataBuff );
|
||||
nsCOMPtr<nsISupports> genericPrimitive ( do_QueryInterface(primitive) );
|
||||
*aPrimitive = genericPrimitive;
|
||||
NS_ADDREF(*aPrimitive);
|
||||
}
|
||||
}
|
||||
|
||||
} // CreatePrimitiveForData
|
||||
|
||||
|
||||
void
|
||||
nsBaseDragService :: CreateDataFromPrimitive ( const char* aFlavor, nsISupports* aPrimitive, void** aDataBuff, PRUint32 aDataLen )
|
||||
{
|
||||
if ( !aDataBuff )
|
||||
return;
|
||||
|
||||
if ( strcmp(aFlavor,kTextMime) == 0 ) {
|
||||
nsCOMPtr<nsISupportsString> plainText ( do_QueryInterface(aPrimitive) );
|
||||
if ( plainText )
|
||||
plainText->GetData ( (char**)aDataBuff );
|
||||
}
|
||||
else {
|
||||
nsCOMPtr<nsISupportsWString> doubleByteText ( do_QueryInterface(aPrimitive) );
|
||||
if ( doubleByteText )
|
||||
doubleByteText->GetData ( (unsigned short**)aDataBuff );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include "nsIDragService.h"
|
||||
#include "nsIDragSession.h"
|
||||
#include "nsITransferable.h"
|
||||
#include "nsSize.h"
|
||||
#include "nsISupportsArray.h"
|
||||
#include "nsCOMPtr.h"
|
||||
|
||||
|
@ -58,10 +57,13 @@ public:
|
|||
|
||||
NS_IMETHOD GetData (nsITransferable * aTransferable, PRUint32 aItemIndex);
|
||||
NS_IMETHOD GetNumDropItems (PRUint32 * aNumItems);
|
||||
NS_IMETHOD IsDataFlavorSupported(nsString * aDataFlavor);
|
||||
NS_IMETHOD IsDataFlavorSupported(const char *aDataFlavor, PRBool *_retval);
|
||||
|
||||
protected:
|
||||
|
||||
static void CreatePrimitiveForData ( const char* aFlavor, void* aDataBuff, PRUint32 aDataLen, nsISupports** aPrimitive );
|
||||
static void CreateDataFromPrimitive ( const char* aFlavor, nsISupports* aPrimitive, void** aDataBuff, PRUint32 aDataLen );
|
||||
|
||||
nsCOMPtr<nsISupportsArray> mTransArray;
|
||||
PRBool mCanDrop;
|
||||
PRBool mDoingDrag;
|
||||
|
|
|
@ -16,14 +16,25 @@
|
|||
* Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
Notes to self:
|
||||
|
||||
- fix QI
|
||||
- should DataStruct.mFlavor be a string or a nsISupportsString internally? Would save
|
||||
on having to recreate it each time it is asked for externally. Would complicate things
|
||||
if this the list is used internally a lot
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#include "nsTransferable.h"
|
||||
#include "nsString.h"
|
||||
#include "nsWidgetsCID.h"
|
||||
#include "nsVoidArray.h"
|
||||
#include "nsIFormatConverter.h"
|
||||
#include "nsVoidArray.h"
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
|
||||
#include "nsIFileSpec.h"
|
||||
#include "nsIOutputStream.h"
|
||||
|
@ -33,110 +44,95 @@
|
|||
|
||||
NS_IMPL_ADDREF(nsTransferable)
|
||||
NS_IMPL_RELEASE(nsTransferable)
|
||||
// NS_IMPL_QUERY_INTERFACE1(nsITransferable)
|
||||
NS_IMPL_QUERY_INTERFACE(nsTransferable, NS_GET_IID(nsITransferable))
|
||||
|
||||
|
||||
// million bytes
|
||||
#define LARGE_DATASET_SIZE 1000000
|
||||
//#define LARGE_DATASET_SIZE 10
|
||||
|
||||
struct DataStruct {
|
||||
DataStruct (const nsString & aString)
|
||||
: mFlavor(aString), mData(nsnull), mDataLen(0), mCacheFileName(nsnull) { }
|
||||
|
||||
struct DataStruct
|
||||
{
|
||||
DataStruct ( const char* aFlavor )
|
||||
: mFlavor(aFlavor), mDataLen(0), mCacheFileName(nsnull) { }
|
||||
~DataStruct();
|
||||
|
||||
void SetData( char* aData, PRUint32 aDataLen );
|
||||
void GetData( char** aData, PRUint32 *aDataLen );
|
||||
void SetData( nsISupports* inData, PRUint32 inDataLen );
|
||||
void GetData( nsISupports** outData, PRUint32 *outDataLen );
|
||||
nsIFileSpec * GetFileSpec(const char * aFileName);
|
||||
PRBool IsDataAvilable() { return (nsnull != mData && mDataLen > 0) || (nsnull == mData && nsnull != mCacheFileName); }
|
||||
PRBool IsDataAvilable() { return (mData && mDataLen > 0) || (!mData && mCacheFileName); }
|
||||
nsString mFlavor;
|
||||
|
||||
protected:
|
||||
nsresult WriteCache(char* aData, PRUint32 aDataLen );
|
||||
nsresult ReadCache(char** aData, PRUint32* aDataLen );
|
||||
|
||||
nsresult WriteCache(nsISupports* aData, PRUint32 aDataLen );
|
||||
nsresult ReadCache(nsISupports** aData, PRUint32* aDataLen );
|
||||
|
||||
char * mData;
|
||||
nsCOMPtr<nsISupports> mData; // OWNER - some varient of primitive wrapper
|
||||
PRUint32 mDataLen;
|
||||
char * mCacheFileName;
|
||||
|
||||
};
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
DataStruct::~DataStruct()
|
||||
{
|
||||
if (mData)
|
||||
delete [] mData;
|
||||
|
||||
if (mCacheFileName) {
|
||||
delete [] mCacheFileName;
|
||||
delete [] mCacheFileName;
|
||||
//nsIFileSpec * cacheFile = GetFileSpec(mCacheFileName);
|
||||
//cacheFile->Remove();
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
void DataStruct::SetData ( char* aData, PRUint32 aDataLen )
|
||||
void
|
||||
DataStruct::SetData ( nsISupports* aData, PRUint32 aDataLen )
|
||||
{
|
||||
// check to see if we already have data and then delete it
|
||||
if ( mData ) {
|
||||
delete [] mData;
|
||||
mData = nsnull;
|
||||
}
|
||||
|
||||
// Now, check to see if we consider the data to be "too large"
|
||||
if (aDataLen > LARGE_DATASET_SIZE) {
|
||||
// if so, cache it to disk instead of memory
|
||||
if (NS_OK == WriteCache(aData, aDataLen)) {
|
||||
if ( NS_SUCCEEDED(WriteCache(aData, aDataLen)) ) {
|
||||
printf("->>>>>>>>>>>>>> Wrote Clipboard to cache file\n");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
printf("->>>>>>>>>>>>>> Write Clipboard to memory\n");
|
||||
}
|
||||
mData = aData;
|
||||
mDataLen = aDataLen;
|
||||
|
||||
mData = aData;
|
||||
mDataLen = aDataLen;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
void DataStruct::GetData ( char** aData, PRUint32 *aDataLen )
|
||||
{
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
void
|
||||
DataStruct::GetData ( nsISupports** aData, PRUint32 *aDataLen )
|
||||
{
|
||||
// check here to see if the data is cached on disk
|
||||
if (nsnull == mData && nsnull != mCacheFileName) {
|
||||
if ( !mData && mCacheFileName ) {
|
||||
// if so, read it in and pass it back
|
||||
// ReadCache creates memory and copies the data into it.
|
||||
if (NS_OK == ReadCache(aData, aDataLen)) {
|
||||
if ( NS_SUCCEEDED(ReadCache(aData, aDataLen)) ) {
|
||||
printf("->>>>>>>>>>>>>> Read Clipboard from cache file\n");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
printf("->>>>>>>>>>>>>> Read Clipboard from memory\n");
|
||||
}
|
||||
// OK, we create memory and copy the contents into it.
|
||||
char * data = new char[mDataLen];
|
||||
if (nsnull != mData && mDataLen > 0) {
|
||||
memcpy(data, mData, mDataLen);
|
||||
*aData = data;
|
||||
} else {
|
||||
// zeros it out
|
||||
*aData = nsnull;
|
||||
}
|
||||
|
||||
*aData = mData;
|
||||
NS_ADDREF(*aData);
|
||||
*aDataLen = mDataLen;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
nsIFileSpec * DataStruct::GetFileSpec(const char * aFileName)
|
||||
nsIFileSpec*
|
||||
DataStruct::GetFileSpec(const char * aFileName)
|
||||
{
|
||||
nsIFileSpec* cacheFile = nsnull;
|
||||
nsresult rv;
|
||||
// There is no locator component. Or perhaps there is a locator, but the
|
||||
// locator couldn't find where to put it. So put it in the cwd (NB, viewer comes here.)
|
||||
// #include nsIComponentManager.h
|
||||
rv = nsComponentManager::CreateInstance(
|
||||
(const char*)NS_FILESPEC_PROGID,
|
||||
(nsISupports*)nsnull,
|
||||
(const nsID&)nsCOMTypeInfo<nsIFileSpec>::GetIID(),
|
||||
(void**)&cacheFile);
|
||||
nsresult rv = nsComponentManager::CreateInstance( NS_FILESPEC_PROGID, nsnull, NS_GET_IID(nsIFileSpec),
|
||||
NS_REINTERPRET_CAST(void**,&cacheFile));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "ERROR: Could not make a Clipboard Cache file spec.");
|
||||
|
||||
// Get the system temp directory path
|
||||
|
@ -146,7 +142,7 @@ nsIFileSpec * DataStruct::GetFileSpec(const char * aFileName)
|
|||
// if the param aFileName contains a name we should use that
|
||||
// because the file probably already exists
|
||||
// otherwise create a unique name
|
||||
if (nsnull == aFileName) {
|
||||
if (!aFileName) {
|
||||
*sysCacheFile += "clipboardcache";
|
||||
sysCacheFile->MakeUnique();
|
||||
} else {
|
||||
|
@ -159,65 +155,68 @@ nsIFileSpec * DataStruct::GetFileSpec(const char * aFileName)
|
|||
// delete the temp for getting the system info
|
||||
delete sysCacheFile;
|
||||
|
||||
// return the nsIFileSpec
|
||||
// return the nsIFileSpec. The addref comes from CreateInstance()
|
||||
return cacheFile;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
nsresult DataStruct::WriteCache(char* aData, PRUint32 aDataLen)
|
||||
nsresult
|
||||
DataStruct::WriteCache(nsISupports* aData, PRUint32 aDataLen)
|
||||
{
|
||||
// Get a new path and file to the temp directory
|
||||
nsIFileSpec * cacheFile = GetFileSpec(mCacheFileName);
|
||||
if (nsnull != cacheFile) {
|
||||
nsCOMPtr<nsIFileSpec> cacheFile ( getter_AddRefs(GetFileSpec(mCacheFileName)) );
|
||||
if (cacheFile) {
|
||||
// remember the file name
|
||||
if (nsnull == mCacheFileName) {
|
||||
if (!mCacheFileName)
|
||||
cacheFile->GetLeafName(&mCacheFileName);
|
||||
}
|
||||
|
||||
// write out the contents of the clipboard
|
||||
// to the file
|
||||
PRUint32 bytes;
|
||||
nsIOutputStream * outStr;
|
||||
cacheFile->GetOutputStream(&outStr);
|
||||
outStr->Write(aData, aDataLen, &bytes);
|
||||
//PRUint32 bytes;
|
||||
nsCOMPtr<nsIOutputStream> outStr;
|
||||
cacheFile->GetOutputStream( getter_AddRefs(outStr) );
|
||||
|
||||
//XXX broken until i can stream/inflate these primitive objects.
|
||||
//outStr->Write(aData, aDataLen, &bytes);
|
||||
|
||||
// clean up
|
||||
NS_RELEASE(outStr);
|
||||
NS_RELEASE(cacheFile);
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
nsresult DataStruct::ReadCache(char** aData, PRUint32* aDataLen)
|
||||
nsresult
|
||||
DataStruct::ReadCache(nsISupports** aData, PRUint32* aDataLen)
|
||||
{
|
||||
// if we don't have a cache filename we are out of luck
|
||||
if (nsnull == mCacheFileName) {
|
||||
if (!mCacheFileName)
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
// get the path and file name
|
||||
nsIFileSpec * cacheFile = GetFileSpec(mCacheFileName);
|
||||
if (nsnull != cacheFile && Exists(cacheFile)) {
|
||||
nsCOMPtr<nsIFileSpec> cacheFile ( getter_AddRefs(GetFileSpec(mCacheFileName)) );
|
||||
if ( cacheFile && Exists(cacheFile)) {
|
||||
// get the size of the file
|
||||
PRUint32 fileSize;
|
||||
cacheFile->GetFileSize(&fileSize);
|
||||
|
||||
// create new memory for the large clipboard data
|
||||
char * data = new char[fileSize];
|
||||
|
||||
if ( !data )
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
// now read it all in
|
||||
nsIInputStream * inStr;
|
||||
cacheFile->GetInputStream(&inStr);
|
||||
nsCOMPtr<nsIInputStream> inStr;
|
||||
cacheFile->GetInputStream( getter_AddRefs(inStr) );
|
||||
nsresult rv = inStr->Read(data, fileSize, aDataLen);
|
||||
// clean up file & stream
|
||||
NS_RELEASE(inStr);
|
||||
NS_RELEASE(cacheFile);
|
||||
|
||||
// make sure we got all the data ok
|
||||
if (NS_OK == rv && *aDataLen == (PRUint32)fileSize) {
|
||||
if ( NS_SUCCEEDED(rv) && *aDataLen == (PRUint32)fileSize) {
|
||||
*aDataLen = fileSize;
|
||||
*aData = data;
|
||||
|
||||
//XXX broken until i can inflate primitive objects
|
||||
//*aData = data;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -226,16 +225,15 @@ nsresult DataStruct::ReadCache(char** aData, PRUint32* aDataLen)
|
|||
delete[] data;
|
||||
*aData = nsnull;
|
||||
*aDataLen = 0;
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
// this is necessary because we may have created
|
||||
// a proper cacheFile but it might not exist
|
||||
NS_IF_RELEASE(cacheFile);
|
||||
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
// Transferable constructor
|
||||
|
@ -244,7 +242,7 @@ nsresult DataStruct::ReadCache(char** aData, PRUint32* aDataLen)
|
|||
nsTransferable::nsTransferable()
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
mDataArray = new nsVoidArray();
|
||||
mDataArray = new nsVoidArray();
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
@ -257,113 +255,114 @@ nsTransferable::~nsTransferable()
|
|||
PRInt32 i;
|
||||
for (i=0;i<mDataArray->Count();i++) {
|
||||
DataStruct * data = (DataStruct *)mDataArray->ElementAt(i);
|
||||
if (data)
|
||||
delete data;
|
||||
delete data;
|
||||
}
|
||||
delete mDataArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param aIID The name of the class implementing the method
|
||||
* @param _classiiddef The name of the #define symbol that defines the IID
|
||||
* for the class (e.g. NS_ISUPPORTS_IID)
|
||||
*
|
||||
*/
|
||||
nsresult nsTransferable::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
||||
|
||||
//
|
||||
// GetTransferDataFlavors
|
||||
//
|
||||
// Returns a copy of the internal list of flavors. This does NOT take into
|
||||
// account any converter that may be registered. This list consists of
|
||||
// nsISupportsString objects so that the flavor list can be accessed from JS.
|
||||
//
|
||||
NS_IMETHODIMP
|
||||
nsTransferable :: GetTransferDataFlavors(nsISupportsArray ** aDataFlavorList)
|
||||
{
|
||||
if (!aDataFlavorList)
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
|
||||
if (NULL == aInstancePtr) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
nsresult rv = NS_NOINTERFACE;
|
||||
|
||||
if (aIID.Equals(nsCOMTypeInfo<nsITransferable>::GetIID())) {
|
||||
*aInstancePtr = (void*) ((nsITransferable*)this);
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
NS_NewISupportsArray ( aDataFlavorList );
|
||||
if ( *aDataFlavorList ) {
|
||||
for ( PRInt32 i=0; i<mDataArray->Count(); ++i ) {
|
||||
DataStruct * data = (DataStruct *)mDataArray->ElementAt(i);
|
||||
nsCOMPtr<nsISupportsString> flavorWrapper;
|
||||
rv = nsComponentManager::CreateInstance(NS_SUPPORTS_STRING_PROGID, nsnull,
|
||||
NS_GET_IID(nsISupportsString), getter_AddRefs(flavorWrapper));
|
||||
if ( flavorWrapper ) {
|
||||
char* tempBecauseNSStringIsLame = data->mFlavor.ToNewCString();
|
||||
flavorWrapper->SetData ( tempBecauseNSStringIsLame );
|
||||
nsCOMPtr<nsISupports> genericWrapper ( do_QueryInterface(flavorWrapper) );
|
||||
(*aDataFlavorList)->AppendElement( genericWrapper );
|
||||
delete [] tempBecauseNSStringIsLame;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
NS_IMETHODIMP nsTransferable::GetTransferDataFlavors(nsVoidArray ** aDataFlavorList)
|
||||
//
|
||||
// GetTransferData
|
||||
//
|
||||
// Returns the data of the requested flavor, obtained from either having the data on hand or
|
||||
// using a converter to get it. The data is wrapped in a nsISupports primitive so that it is
|
||||
// accessable from JS.
|
||||
//
|
||||
NS_IMETHODIMP
|
||||
nsTransferable :: GetTransferData(const char *aFlavor, nsISupports **aData, PRUint32 *aDataLen)
|
||||
{
|
||||
if (nsnull == aDataFlavorList) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsVoidArray * array = new nsVoidArray();
|
||||
if (nsnull != array) {
|
||||
PRInt32 i;
|
||||
for (i=0;i<mDataArray->Count();i++) {
|
||||
DataStruct * data = (DataStruct *)mDataArray->ElementAt(i);
|
||||
array->AppendElement(&data->mFlavor);
|
||||
}
|
||||
*aDataFlavorList = array;
|
||||
} else {
|
||||
aDataFlavorList = nsnull;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transferable owns the data (memory) and only gives the aData a copy of the pointer address to it.
|
||||
*
|
||||
*/
|
||||
NS_IMETHODIMP nsTransferable::GetTransferData(nsString * aDataFlavor, void ** aData, PRUint32 * aDataLen)
|
||||
{
|
||||
if (nsnull == aDataFlavor || nsnull == aData || nsnull == aDataLen) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
if ( !aFlavor || !aData ||!aDataLen )
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
|
||||
PRBool found = PR_FALSE;
|
||||
|
||||
// first look and see if the data is present in one of the intrinsic flavors
|
||||
PRInt32 i;
|
||||
for (i=0;i<mDataArray->Count();i++) {
|
||||
for ( i=0; i<mDataArray->Count(); ++i ) {
|
||||
DataStruct * data = (DataStruct *)mDataArray->ElementAt(i);
|
||||
if (aDataFlavor->Equals(data->mFlavor)) {
|
||||
data->GetData((char **)aData, aDataLen);
|
||||
if (nsnull != *aData && *aDataLen > 0) {
|
||||
return NS_OK;
|
||||
}
|
||||
if ( data->mFlavor.Equals(aFlavor) ) {
|
||||
data->GetData(aData, aDataLen);
|
||||
if (*aData && *aDataLen > 0)
|
||||
found = PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if ( mFormatConv ) {
|
||||
// if not, try using a format converter to get the requested flavor
|
||||
if ( !found && mFormatConv ) {
|
||||
for (i=0;i<mDataArray->Count();i++) {
|
||||
DataStruct * data = (DataStruct *)mDataArray->ElementAt(i);
|
||||
if (NS_OK == mFormatConv->CanConvert(&data->mFlavor, aDataFlavor)) {
|
||||
char * dataBytes;
|
||||
char* tempBecauseNSStringIsLame = data->mFlavor.ToNewCString();
|
||||
PRBool canConvert = PR_FALSE;
|
||||
mFormatConv->CanConvert(tempBecauseNSStringIsLame, aFlavor, &canConvert);
|
||||
if ( canConvert ) {
|
||||
nsCOMPtr<nsISupports> dataBytes;
|
||||
PRUint32 len;
|
||||
data->GetData(&dataBytes, &len);
|
||||
mFormatConv->Convert(&data->mFlavor, dataBytes, len, aDataFlavor, aData, aDataLen);
|
||||
return NS_OK;
|
||||
data->GetData(getter_AddRefs(dataBytes), &len);
|
||||
mFormatConv->Convert(tempBecauseNSStringIsLame, dataBytes, len, aFlavor, aData, aDataLen);
|
||||
found = PR_TRUE;
|
||||
}
|
||||
delete [] tempBecauseNSStringIsLame;
|
||||
}
|
||||
}
|
||||
return NS_ERROR_FAILURE;
|
||||
return found ? NS_OK : NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transferable owns the data (memory) and only gives the aData a copy of the pointer address to it.
|
||||
*
|
||||
*/
|
||||
NS_IMETHODIMP nsTransferable::GetAnyTransferData(nsString * aDataFlavor, void ** aData, PRUint32 * aDataLen)
|
||||
{
|
||||
if (nsnull == aDataFlavor || nsnull == aData || nsnull == aDataLen) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
PRInt32 i;
|
||||
for (i=0;i<mDataArray->Count();i++) {
|
||||
//
|
||||
// GetAnyTransferData
|
||||
//
|
||||
// Returns the data of the first flavor found. Caller is responsible for deleting the
|
||||
// flavor string.
|
||||
//
|
||||
NS_IMETHODIMP
|
||||
nsTransferable::GetAnyTransferData(char **aFlavor, nsISupports **aData, PRUint32 *aDataLen)
|
||||
{
|
||||
if ( !aFlavor || !aData || !aDataLen )
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
for ( PRInt32 i=0; i < mDataArray->Count(); ++i ) {
|
||||
DataStruct * data = (DataStruct *)mDataArray->ElementAt(i);
|
||||
if (data->IsDataAvilable()) {
|
||||
*aDataFlavor = data->mFlavor;
|
||||
data->GetData((char **)aData, aDataLen);
|
||||
*aFlavor = data->mFlavor.ToNewCString();
|
||||
data->GetData(aData, aDataLen);
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
@ -371,21 +370,22 @@ NS_IMETHODIMP nsTransferable::GetAnyTransferData(nsString * aDataFlavor, void **
|
|||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
/**
|
||||
* The transferable now owns the data (the memory pointing to it)
|
||||
*
|
||||
*/
|
||||
NS_IMETHODIMP nsTransferable::SetTransferData(nsString * aDataFlavor, void * aData, PRUint32 aDataLen)
|
||||
{
|
||||
if (nsnull == aDataFlavor) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
PRInt32 i;
|
||||
for (i=0;i<mDataArray->Count();i++) {
|
||||
//
|
||||
// SetTransferData
|
||||
//
|
||||
//
|
||||
//
|
||||
NS_IMETHODIMP
|
||||
nsTransferable::SetTransferData(const char *aFlavor, nsISupports *aData, PRUint32 aDataLen)
|
||||
{
|
||||
if ( !aFlavor )
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
for ( PRInt32 i=0; i<mDataArray->Count(); ++i ) {
|
||||
DataStruct * data = (DataStruct *)mDataArray->ElementAt(i);
|
||||
if (aDataFlavor->Equals(data->mFlavor)) {
|
||||
data->SetData ( NS_STATIC_CAST(char*,aData), aDataLen );
|
||||
if ( data->mFlavor.Equals(aFlavor) ) {
|
||||
data->SetData ( aData, aDataLen );
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
@ -393,66 +393,70 @@ NS_IMETHODIMP nsTransferable::SetTransferData(nsString * aDataFlavor, void * aDa
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
NS_IMETHODIMP nsTransferable::AddDataFlavor(nsString * aDataFlavor)
|
||||
{
|
||||
if (nsnull == aDataFlavor) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
//
|
||||
// AddDataFlavor
|
||||
//
|
||||
// Adds a data flavor to our list with no data. Error if it already exists.
|
||||
//
|
||||
NS_IMETHODIMP
|
||||
nsTransferable :: AddDataFlavor(const char *aDataFlavor)
|
||||
{
|
||||
// Do we have the data flavor already?
|
||||
PRInt32 i;
|
||||
for (i=0;i<mDataArray->Count();i++) {
|
||||
DataStruct * data = (DataStruct *)mDataArray->ElementAt(i);
|
||||
if (aDataFlavor->Equals(data->mFlavor)) {
|
||||
if ( data->mFlavor.Equals(aDataFlavor) )
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
// Create a new "slot" for the data
|
||||
DataStruct * data = new DataStruct ( *aDataFlavor ) ;
|
||||
DataStruct * data = new DataStruct ( aDataFlavor ) ;
|
||||
mDataArray->AppendElement((void *)data);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
NS_IMETHODIMP nsTransferable::RemoveDataFlavor(nsString * aDataFlavor)
|
||||
{
|
||||
if (nsnull == aDataFlavor) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
//
|
||||
// RemoveDataFlavor
|
||||
//
|
||||
// Removes a data flavor (and causes the data to be destroyed). Error if
|
||||
// the requested flavor is not present.
|
||||
//
|
||||
NS_IMETHODIMP
|
||||
nsTransferable::RemoveDataFlavor(const char *aDataFlavor)
|
||||
{
|
||||
// Do we have the data flavor already?
|
||||
PRInt32 i;
|
||||
for (i=0;i<mDataArray->Count();i++) {
|
||||
for ( PRInt32 i=0; i<mDataArray->Count(); ++i ) {
|
||||
DataStruct * data = (DataStruct *)mDataArray->ElementAt(i);
|
||||
if (aDataFlavor->Equals(data->mFlavor)) {
|
||||
if ( data->mFlavor.Equals(aDataFlavor) ) {
|
||||
mDataArray->RemoveElementAt(i);
|
||||
delete data;
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
NS_IMETHODIMP_(PRBool) nsTransferable::IsLargeDataSet()
|
||||
NS_IMETHODIMP
|
||||
nsTransferable::IsLargeDataSet(PRBool *_retval)
|
||||
{
|
||||
return PR_FALSE;
|
||||
if ( !_retval )
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
*_retval = PR_FALSE;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
|
@ -463,18 +467,22 @@ NS_IMETHODIMP nsTransferable::SetConverter(nsIFormatConverter * aConverter)
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
NS_IMETHODIMP nsTransferable::GetConverter(nsIFormatConverter ** aConverter)
|
||||
NS_IMETHODIMP nsTransferable::GetConverter(nsIFormatConverter * *aConverter)
|
||||
{
|
||||
if ( !aConverter )
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
if ( mFormatConv ) {
|
||||
*aConverter = mFormatConv;
|
||||
NS_ADDREF(*aConverter);
|
||||
} else {
|
||||
} else
|
||||
*aConverter = nsnull;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -486,28 +494,28 @@ NS_IMETHODIMP nsTransferable::GetConverter(nsIFormatConverter ** aConverter)
|
|||
// intrinsic knowledge or input data converters.
|
||||
//
|
||||
NS_IMETHODIMP
|
||||
nsTransferable :: FlavorsTransferableCanImport ( nsVoidArray** outFlavorList )
|
||||
nsTransferable :: FlavorsTransferableCanImport(nsISupportsArray **_retval)
|
||||
{
|
||||
if ( !outFlavorList )
|
||||
if ( !_retval )
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
|
||||
// Get the flavor list, and on to the end of it, append the list of flavors we
|
||||
// can also get to through a converter. This is so that we can just walk the list
|
||||
// in one go, looking for the desired flavor.
|
||||
GetTransferDataFlavors(outFlavorList); // addrefs
|
||||
GetTransferDataFlavors(_retval); // addrefs
|
||||
nsCOMPtr<nsIFormatConverter> converter;
|
||||
GetConverter(getter_AddRefs(converter));
|
||||
if ( converter ) {
|
||||
nsVoidArray * convertedList;
|
||||
converter->GetInputDataFlavors(&convertedList);
|
||||
if ( nsnull != convertedList ) {
|
||||
PRUint32 i;
|
||||
PRUint32 cnt = convertedList->Count();
|
||||
for (i=0;i<cnt;i++) {
|
||||
nsString * temp = (nsString *)convertedList->ElementAt(i);
|
||||
(*outFlavorList)->AppendElement(temp);
|
||||
nsCOMPtr<nsISupportsArray> convertedList;
|
||||
converter->GetInputDataFlavors(getter_AddRefs(convertedList));
|
||||
if ( convertedList ) {
|
||||
PRUint32 importListLen;
|
||||
convertedList->Count(&importListLen);
|
||||
for ( PRUint32 i=0; i < importListLen; ++i ) {
|
||||
nsCOMPtr<nsISupports> genericFlavor;
|
||||
convertedList->GetElementAt ( i, getter_AddRefs(genericFlavor) );
|
||||
(*_retval)->AppendElement(genericFlavor);
|
||||
} // foreach flavor that can be converted to
|
||||
delete convertedList;
|
||||
}
|
||||
} // if a converter exists
|
||||
|
||||
|
@ -523,26 +531,27 @@ nsTransferable :: FlavorsTransferableCanImport ( nsVoidArray** outFlavorList )
|
|||
// intrinsic knowledge or output data converters.
|
||||
//
|
||||
NS_IMETHODIMP
|
||||
nsTransferable :: FlavorsTransferableCanExport ( nsVoidArray** outFlavorList )
|
||||
nsTransferable :: FlavorsTransferableCanExport(nsISupportsArray **_retval)
|
||||
{
|
||||
if ( !outFlavorList )
|
||||
if ( !_retval )
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
|
||||
// Get the flavor list, and on to the end of it, append the list of flavors we
|
||||
// can also get to through a converter. This is so that we can just walk the list
|
||||
// in one go, looking for the desired flavor.
|
||||
GetTransferDataFlavors(outFlavorList); // addrefs
|
||||
GetTransferDataFlavors(_retval); // addrefs
|
||||
nsCOMPtr<nsIFormatConverter> converter;
|
||||
GetConverter(getter_AddRefs(converter));
|
||||
if ( converter ) {
|
||||
nsVoidArray * convertedList;
|
||||
converter->GetOutputDataFlavors(&convertedList);
|
||||
if ( nsnull != convertedList ) {
|
||||
PRUint32 i;
|
||||
PRUint32 cnt = convertedList->Count();
|
||||
for (i=0;i<cnt;i++) {
|
||||
nsString * temp = (nsString *)convertedList->ElementAt(i);
|
||||
(*outFlavorList)->AppendElement(temp); // this addref's for us
|
||||
nsCOMPtr<nsISupportsArray> convertedList;
|
||||
converter->GetOutputDataFlavors(getter_AddRefs(convertedList));
|
||||
PRUint32 importListLen;
|
||||
if ( convertedList ) {
|
||||
convertedList->Count(&importListLen);
|
||||
for ( PRUint32 i=0; i < importListLen; ++i ) {
|
||||
nsCOMPtr<nsISupports> genericFlavor;
|
||||
convertedList->GetElementAt ( i, getter_AddRefs(genericFlavor) );
|
||||
(*_retval)->AppendElement(genericFlavor);
|
||||
} // foreach flavor that can be converted to
|
||||
}
|
||||
} // if a converter exists
|
||||
|
|
|
@ -36,38 +36,31 @@ class nsVoidArray;
|
|||
|
||||
class nsTransferable : public nsITransferable
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
nsTransferable();
|
||||
virtual ~nsTransferable();
|
||||
|
||||
//nsISupports
|
||||
// nsISupports
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
|
||||
//nsITransferable
|
||||
NS_IMETHOD FlavorsTransferableCanExport ( nsVoidArray** outFlavorList ) ;
|
||||
NS_IMETHOD GetTransferDataFlavors(nsVoidArray ** aDataFlavorList);
|
||||
|
||||
// Transferable still owns |aData|. Do not delete it.
|
||||
NS_IMETHOD GetTransferData(nsString * aFlavor, void ** aData, PRUint32 * aDataLen);
|
||||
NS_IMETHOD GetAnyTransferData(nsString * aFlavor, void ** aData, PRUint32 * aDataLen);
|
||||
NS_IMETHOD_(PRBool) IsLargeDataSet();
|
||||
|
||||
NS_IMETHOD FlavorsTransferableCanImport ( nsVoidArray** outFlavorList ) ;
|
||||
|
||||
// Transferable consumes |aData|. Do not delete it.
|
||||
NS_IMETHOD SetTransferData(nsString * aFlavor, void * aData, PRUint32 aDataLen);
|
||||
|
||||
NS_IMETHOD AddDataFlavor(nsString * aDataFlavor);
|
||||
NS_IMETHOD RemoveDataFlavor(nsString * aDataFlavor);
|
||||
|
||||
// nsITransferable
|
||||
NS_IMETHOD FlavorsTransferableCanExport(nsISupportsArray **_retval) ;
|
||||
NS_IMETHOD GetTransferData(const char *aFlavor, nsISupports **aData, PRUint32 *aDataLen);
|
||||
NS_IMETHOD GetAnyTransferData(char **aFlavor, nsISupports **aData, PRUint32 *aDataLen);
|
||||
NS_IMETHOD IsLargeDataSet(PRBool *_retval);
|
||||
NS_IMETHOD FlavorsTransferableCanImport(nsISupportsArray **_retval) ;
|
||||
NS_IMETHOD SetTransferData(const char *aFlavor, nsISupports *aData, PRUint32 aDataLen);
|
||||
NS_IMETHOD AddDataFlavor(const char *aDataFlavor) ;
|
||||
NS_IMETHOD RemoveDataFlavor(const char *aDataFlavor) ;
|
||||
NS_IMETHOD GetConverter(nsIFormatConverter * *aConverter);
|
||||
NS_IMETHOD SetConverter(nsIFormatConverter * aConverter);
|
||||
NS_IMETHOD GetConverter(nsIFormatConverter ** aConverter);
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
// get flavors w/out converter
|
||||
NS_IMETHOD GetTransferDataFlavors(nsISupportsArray** aDataFlavorList);
|
||||
|
||||
nsVoidArray * mDataArray;
|
||||
nsCOMPtr<nsIFormatConverter> mFormatConv;
|
||||
|
||||
|
|
|
@ -17,11 +17,12 @@
|
|||
*/
|
||||
|
||||
#include "nsString.h"
|
||||
#include "nsWidgetsCID.h"
|
||||
#include "nsVoidArray.h"
|
||||
#include "nsISupportsArray.h"
|
||||
#include "nsRepository.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsISupportsPrimitives.h"
|
||||
|
||||
#include "nsITransferable.h" // for mime defs
|
||||
#include "nsITransferable.h" // for mime defs, this is BAD
|
||||
|
||||
|
||||
// These are temporary
|
||||
|
@ -44,15 +45,12 @@
|
|||
#include "nsWidgetsCID.h"
|
||||
#include "nsXIFFormatConverter.h"
|
||||
|
||||
static NS_DEFINE_IID(kIXIFFormatConverterIID, NS_IFORMATCONVERTER_IID);
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
//static NS_DEFINE_IID(kCXIFConverterCID, NS_XIFCONVERTER_CID);
|
||||
|
||||
static NS_DEFINE_IID(kCParserIID, NS_IPARSER_IID);
|
||||
static NS_DEFINE_IID(kCParserCID, NS_PARSER_IID);
|
||||
|
||||
NS_IMPL_ADDREF(nsXIFFormatConverter)
|
||||
NS_IMPL_RELEASE(nsXIFFormatConverter)
|
||||
NS_IMPL_QUERY_INTERFACE(nsXIFFormatConverter, NS_GET_IID(nsIFormatConverter))
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
//
|
||||
|
@ -73,69 +71,223 @@ nsXIFFormatConverter::~nsXIFFormatConverter()
|
|||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @param aIID The name of the class implementing the method
|
||||
* @param _classiiddef The name of the #define symbol that defines the IID
|
||||
* for the class (e.g. NS_ISUPPORTS_IID)
|
||||
*
|
||||
*/
|
||||
nsresult nsXIFFormatConverter::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
||||
|
||||
//
|
||||
// GetInputDataFlavors
|
||||
//
|
||||
// Creates a new list and returns the list of all the flavors this converter
|
||||
// knows how to import. In this case, it's just XIF.
|
||||
//
|
||||
// Flavors (strings) are wrapped in a primitive object so that JavaScript can
|
||||
// access them easily via XPConnect.
|
||||
//
|
||||
NS_IMETHODIMP
|
||||
nsXIFFormatConverter::GetInputDataFlavors(nsISupportsArray **_retval)
|
||||
{
|
||||
|
||||
if (NULL == aInstancePtr) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
nsresult rv = NS_NOINTERFACE;
|
||||
|
||||
if (aIID.Equals(kIXIFFormatConverterIID)) {
|
||||
*aInstancePtr = (void*) ((nsIFormatConverter*)this);
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
*aInstancePtr = (void*)(nsISupports*)this;
|
||||
NS_ADDREF_THIS();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
if ( !_retval )
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
|
||||
nsresult rv = NS_NewISupportsArray ( _retval ); // addrefs for us
|
||||
if ( NS_SUCCEEDED(rv) )
|
||||
rv = AddFlavorToList ( *_retval, kXIFMime );
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
} // GetInputDataFlavors
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
NS_IMETHODIMP nsXIFFormatConverter::GetInputDataFlavors(nsVoidArray ** aDataFlavorList)
|
||||
//
|
||||
// GetOutputDataFlavors
|
||||
//
|
||||
// Creates a new list and returns the list of all the flavors this converter
|
||||
// knows how to export (convert). In this case, it's all sorts of things that XIF can be
|
||||
// converted to.
|
||||
//
|
||||
// Flavors (strings) are wrapped in a primitive object so that JavaScript can
|
||||
// access them easily via XPConnect.
|
||||
//
|
||||
NS_IMETHODIMP
|
||||
nsXIFFormatConverter::GetOutputDataFlavors(nsISupportsArray **_retval)
|
||||
{
|
||||
nsVoidArray * array = new nsVoidArray();
|
||||
if (nsnull != array) {
|
||||
array->AppendElement(new nsString(kXIFMime));
|
||||
*aDataFlavorList = array;
|
||||
if ( !_retval )
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
|
||||
nsresult rv = NS_NewISupportsArray ( _retval ); // addrefs for us
|
||||
if ( NS_SUCCEEDED(rv) ) {
|
||||
rv = AddFlavorToList ( *_retval, kXIFMime );
|
||||
if ( NS_FAILED(rv) )
|
||||
return rv;
|
||||
rv = AddFlavorToList ( *_retval, kHTMLMime );
|
||||
if ( NS_FAILED(rv) )
|
||||
return rv;
|
||||
rv = AddFlavorToList ( *_retval, kUnicodeMime );
|
||||
if ( NS_FAILED(rv) )
|
||||
return rv;
|
||||
rv = AddFlavorToList ( *_retval, kTextMime );
|
||||
if ( NS_FAILED(rv) )
|
||||
return rv;
|
||||
rv = AddFlavorToList ( *_retval, kAOLMailMime );
|
||||
if ( NS_FAILED(rv) )
|
||||
return rv;
|
||||
}
|
||||
return rv;
|
||||
|
||||
} // GetOutputDataFlavors
|
||||
|
||||
|
||||
//
|
||||
// AddFlavorToList
|
||||
//
|
||||
// Convenience routine for adding a flavor wrapped in an nsISupportsString object
|
||||
// to a list
|
||||
//
|
||||
nsresult
|
||||
nsXIFFormatConverter :: AddFlavorToList ( nsISupportsArray* inList, const char* inFlavor )
|
||||
{
|
||||
nsCOMPtr<nsISupportsString> dataFlavor;
|
||||
nsresult rv = nsComponentManager::CreateInstance(NS_SUPPORTS_STRING_PROGID, nsnull,
|
||||
NS_GET_IID(nsISupportsString), getter_AddRefs(dataFlavor));
|
||||
if ( dataFlavor ) {
|
||||
dataFlavor->SetData ( NS_CONST_CAST(char*, inFlavor) );
|
||||
// add to list as an nsISupports so the correct interface gets the addref
|
||||
// in AppendElement()
|
||||
nsCOMPtr<nsISupports> genericFlavor ( do_QueryInterface(dataFlavor) );
|
||||
inList->AppendElement ( genericFlavor);
|
||||
}
|
||||
return rv;
|
||||
|
||||
} // AddFlavorToList
|
||||
|
||||
|
||||
//
|
||||
// CanConvert
|
||||
//
|
||||
// Determines if we support the given conversion. Currently, this method only
|
||||
// converts from XIF to others.
|
||||
//
|
||||
NS_IMETHODIMP
|
||||
nsXIFFormatConverter::CanConvert(const char *aFromDataFlavor, const char *aToDataFlavor, PRBool *_retval)
|
||||
{
|
||||
if ( !_retval )
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
|
||||
*_retval = PR_FALSE;
|
||||
nsAutoString fromFlavor ( aFromDataFlavor );
|
||||
if ( fromFlavor.Equals(kXIFMime) ) {
|
||||
nsAutoString toFlavor ( aToDataFlavor );
|
||||
if ( toFlavor.Equals(kTextMime) )
|
||||
*_retval = PR_TRUE;
|
||||
else if ( toFlavor.Equals(kHTMLMime) )
|
||||
*_retval = PR_TRUE;
|
||||
else if ( toFlavor.Equals(kUnicodeMime) )
|
||||
*_retval = PR_TRUE;
|
||||
else if ( toFlavor.Equals(kAOLMailMime) )
|
||||
*_retval = PR_TRUE;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
NS_IMETHODIMP nsXIFFormatConverter::GetOutputDataFlavors(nsVoidArray ** aDataFlavorList)
|
||||
} // CanConvert
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Convert
|
||||
//
|
||||
// Convert data from one flavor to another. The data is wrapped in primitive objects so that it is
|
||||
// accessable from JS. Currently, this only accepts XIF input, so anything else is invalid.
|
||||
//
|
||||
//XXX This method copies the data WAAAAY too many time for my liking. Grrrrrr. Mostly it's because
|
||||
//XXX we _must_ put things into nsStrings so that the parser will accept it. Lame lame lame lame. We
|
||||
//XXX also can't just get raw unicode out of the nsString, so we have to allocate heap to get
|
||||
//XXX unicode out of the string. Lame lame lame.
|
||||
//
|
||||
NS_IMETHODIMP
|
||||
nsXIFFormatConverter::Convert(const char *aFromDataFlavor, nsISupports *aFromData, PRUint32 aDataLen,
|
||||
const char *aToDataFlavor, nsISupports **aToData, PRUint32 *aDataToLen)
|
||||
{
|
||||
nsVoidArray * array = new nsVoidArray();
|
||||
if (nsnull != array) {
|
||||
array->AppendElement(new nsString(kXIFMime));
|
||||
array->AppendElement(new nsString(kHTMLMime));
|
||||
array->AppendElement(new nsString(kUnicodeMime));
|
||||
array->AppendElement(new nsString(kTextMime));
|
||||
array->AppendElement(new nsString(kAOLMailMime));
|
||||
*aDataFlavorList = array;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
if ( !aToData || !aDataToLen )
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
nsAutoString fromFlavor ( aFromDataFlavor );
|
||||
if ( fromFlavor.Equals(kXIFMime) ) {
|
||||
nsAutoString toFlavor ( aToDataFlavor );
|
||||
|
||||
// XIF on clipboard is going to always be double byte so it will be in a primitive
|
||||
// class of nsISupportsWString. Also, since the data is in two byte chunks the
|
||||
// length represents the length in 1-byte chars, so we need to divide by two.
|
||||
nsCOMPtr<nsISupportsWString> dataWrapper ( do_QueryInterface(aFromData) );
|
||||
if ( dataWrapper ) {
|
||||
PRUnichar* data = nsnull;
|
||||
dataWrapper->toString ( &data );
|
||||
if ( data ) {
|
||||
nsAutoString dataStr ( data );
|
||||
nsAutoString outStr;
|
||||
|
||||
if ( toFlavor.Equals(kTextMime) ) {
|
||||
if ( NS_SUCCEEDED(ConvertFromXIFToText(dataStr, outStr)) ) {
|
||||
nsCOMPtr<nsISupportsString> dataWrapper;
|
||||
nsComponentManager::CreateInstance(NS_SUPPORTS_STRING_PROGID, nsnull,
|
||||
NS_GET_IID(nsISupportsString), getter_AddRefs(dataWrapper) );
|
||||
if ( dataWrapper ) {
|
||||
char* holderBecauseNSStringIsLame = outStr.ToNewCString();
|
||||
dataWrapper->SetData ( holderBecauseNSStringIsLame );
|
||||
nsCOMPtr<nsISupports> genericDataWrapper ( do_QueryInterface(dataWrapper) );
|
||||
*aToData = genericDataWrapper;
|
||||
NS_ADDREF(*aToData);
|
||||
*aDataToLen = outStr.Length();
|
||||
delete [] holderBecauseNSStringIsLame;
|
||||
}
|
||||
}
|
||||
} // if plain text
|
||||
else if ( toFlavor.Equals(kHTMLMime) ) {
|
||||
if ( NS_SUCCEEDED(ConvertFromXIFToHTML(dataStr, outStr)) ) {
|
||||
nsCOMPtr<nsISupportsWString> dataWrapper;
|
||||
nsComponentManager::CreateInstance(NS_SUPPORTS_WSTRING_PROGID, nsnull,
|
||||
NS_GET_IID(nsISupportsWString), getter_AddRefs(dataWrapper) );
|
||||
if ( dataWrapper ) {
|
||||
PRUnichar* holderBecauseNSStringIsLame = outStr.ToNewUnicode();
|
||||
dataWrapper->SetData ( holderBecauseNSStringIsLame );
|
||||
nsCOMPtr<nsISupports> genericDataWrapper ( do_QueryInterface(dataWrapper) );
|
||||
*aToData = genericDataWrapper;
|
||||
NS_ADDREF(*aToData);
|
||||
*aDataToLen = outStr.Length() * 2;
|
||||
delete [] holderBecauseNSStringIsLame;
|
||||
}
|
||||
}
|
||||
} // else if HTML
|
||||
else if ( toFlavor.Equals(kAOLMailMime) ) {
|
||||
if ( NS_SUCCEEDED(ConvertFromXIFToAOLMail(dataStr, outStr)) ) {
|
||||
nsCOMPtr<nsISupportsWString> dataWrapper;
|
||||
nsComponentManager::CreateInstance(NS_SUPPORTS_WSTRING_PROGID, nsnull,
|
||||
NS_GET_IID(nsISupportsWString), getter_AddRefs(dataWrapper) );
|
||||
if ( dataWrapper ) {
|
||||
PRUnichar* holderBecauseNSStringIsLame = outStr.ToNewUnicode();
|
||||
dataWrapper->SetData ( holderBecauseNSStringIsLame );
|
||||
nsCOMPtr<nsISupports> genericDataWrapper ( do_QueryInterface(dataWrapper) );
|
||||
*aToData = genericDataWrapper;
|
||||
NS_ADDREF(*aToData);
|
||||
*aDataToLen = outStr.Length() * 2;
|
||||
delete [] holderBecauseNSStringIsLame;
|
||||
}
|
||||
}
|
||||
} // else if AOL mail
|
||||
else {
|
||||
*aToData = nsnull;
|
||||
*aDataToLen = 0;
|
||||
rv = NS_ERROR_FAILURE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // if we got xif mime
|
||||
else
|
||||
rv = NS_ERROR_FAILURE;
|
||||
|
||||
return rv;
|
||||
|
||||
} // Convert
|
||||
|
||||
|
||||
|
||||
|
@ -143,88 +295,21 @@ NS_IMETHODIMP nsXIFFormatConverter::GetOutputDataFlavors(nsVoidArray ** aDataFla
|
|||
*
|
||||
*
|
||||
*/
|
||||
NS_IMETHODIMP nsXIFFormatConverter::CanConvert(nsString * aFromDataFlavor, nsString * aToDataFlavor)
|
||||
{
|
||||
|
||||
// This method currently only converts from XIF to the others
|
||||
if (!aFromDataFlavor->Equals(kXIFMime)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
if (aToDataFlavor->Equals(kTextMime)) {
|
||||
return NS_OK;
|
||||
} else if (aToDataFlavor->Equals(kHTMLMime)) {
|
||||
return NS_OK;
|
||||
} else if (aToDataFlavor->Equals(kUnicodeMime)) {
|
||||
return NS_OK;
|
||||
} else if (aToDataFlavor->Equals(kAOLMailMime)) {
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
NS_IMETHODIMP nsXIFFormatConverter::Convert(nsString * aFromDataFlavor, void * aFromData, PRUint32 aDataLen,
|
||||
nsString * aToDataFlavor, void ** aToData, PRUint32 * aDataToLen)
|
||||
{
|
||||
|
||||
// This method currently only converts from XIF to the others
|
||||
|
||||
if (!aFromDataFlavor->Equals(kXIFMime)) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsAutoString text;
|
||||
nsAutoString srcText;
|
||||
|
||||
// XIF on clipboard is going to always be double byte
|
||||
// since the data is in two byte chunks the length represents
|
||||
// the length in single 8 bit chars, so we need to divide by two
|
||||
srcText.SetString((PRUnichar *)aFromData, aDataLen/2);
|
||||
|
||||
if (aToDataFlavor->Equals(kTextMime)) {
|
||||
if (NS_OK == ConvertFromXIFToText(srcText, text)) {
|
||||
*aToData = (void *)text.ToNewCString();
|
||||
*aDataToLen = text.Length();
|
||||
}
|
||||
} else if (aToDataFlavor->Equals(kHTMLMime) || aToDataFlavor->Equals(kUnicodeMime)) {
|
||||
if (NS_OK == ConvertFromXIFToHTML(srcText, text)) {
|
||||
*aToData = (void *)text.ToNewUnicode();
|
||||
*aDataToLen = text.Length()*2;
|
||||
}
|
||||
} else if (aToDataFlavor->Equals(kAOLMailMime)) {
|
||||
if (NS_OK == ConvertFromXIFToAOLMail(srcText, text)) {
|
||||
*aToData = (void *)text.ToNewCString();
|
||||
*aDataToLen = text.Length();
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
NS_IMETHODIMP nsXIFFormatConverter::ConvertFromXIFToText(const nsString & aFromStr, nsString & aToStr)
|
||||
NS_IMETHODIMP
|
||||
nsXIFFormatConverter::ConvertFromXIFToText(const nsString & aFromStr, nsString & aToStr)
|
||||
{
|
||||
aToStr = "";
|
||||
nsIParser* parser;
|
||||
nsresult rv = nsComponentManager::CreateInstance(kCParserCID,
|
||||
nsnull,
|
||||
kCParserIID,
|
||||
NS_GET_IID(nsIParser),
|
||||
(void **)&parser);
|
||||
if (NS_OK != rv)
|
||||
return rv;
|
||||
|
||||
nsIHTMLContentSink* sink = nsnull;
|
||||
|
||||
rv = NS_New_HTMLToTXT_SinkStream(&sink, &aToStr, 0);
|
||||
rv = NS_New_HTMLToTXT_SinkStream(&sink,&aToStr,0);
|
||||
|
||||
if (NS_OK == rv) {
|
||||
parser->SetContentSink(sink);
|
||||
|
@ -248,21 +333,22 @@ NS_IMETHODIMP nsXIFFormatConverter::ConvertFromXIFToText(const nsString & aFromS
|
|||
*
|
||||
*
|
||||
*/
|
||||
NS_IMETHODIMP nsXIFFormatConverter::ConvertFromXIFToHTML(const nsString & aFromStr, nsString & aToStr)
|
||||
NS_IMETHODIMP
|
||||
nsXIFFormatConverter::ConvertFromXIFToHTML(const nsString & aFromStr, nsString & aToStr)
|
||||
{
|
||||
aToStr = "";
|
||||
nsIParser* parser;
|
||||
|
||||
nsresult rv = nsComponentManager::CreateInstance(kCParserCID,
|
||||
nsnull,
|
||||
kCParserIID,
|
||||
NS_GET_IID(nsIParser),
|
||||
(void **)&parser);
|
||||
if (NS_OK != rv)
|
||||
return rv;
|
||||
|
||||
nsIHTMLContentSink* sink = nsnull;
|
||||
|
||||
rv = NS_New_HTML_ContentSinkStream(&sink, &aToStr, 0);
|
||||
rv = NS_New_HTML_ContentSinkStream(&sink,&aToStr,0);
|
||||
|
||||
if (NS_OK == rv) {
|
||||
parser->SetContentSink(sink);
|
||||
|
@ -285,7 +371,8 @@ NS_IMETHODIMP nsXIFFormatConverter::ConvertFromXIFToHTML(const nsString & aFromS
|
|||
*
|
||||
*
|
||||
*/
|
||||
NS_IMETHODIMP nsXIFFormatConverter::ConvertFromXIFToAOLMail(const nsString & aFromStr, nsString & aToStr)
|
||||
NS_IMETHODIMP
|
||||
nsXIFFormatConverter::ConvertFromXIFToAOLMail(const nsString & aFromStr, nsString & aToStr)
|
||||
{
|
||||
nsAutoString html;
|
||||
if (NS_OK == ConvertFromXIFToHTML(aFromStr, html)) {
|
||||
|
|
|
@ -24,30 +24,29 @@
|
|||
|
||||
class nsXIFFormatConverter : public nsIFormatConverter
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
nsXIFFormatConverter();
|
||||
virtual ~nsXIFFormatConverter();
|
||||
|
||||
//nsISupports
|
||||
// nsISupports
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
//nsIXIFConverter
|
||||
NS_IMETHOD GetInputDataFlavors(nsVoidArray ** aDataFlavorList);
|
||||
NS_IMETHOD GetOutputDataFlavors(nsVoidArray ** aDataFlavorList);
|
||||
|
||||
NS_IMETHOD CanConvert(nsString * aFromDataFlavor, nsString * aToDataFlavor);
|
||||
NS_IMETHOD Convert(nsString * aFromDataFlavor, void * aFromData, PRUint32 aDataLen,
|
||||
nsString * aToDataFlavor, void ** aToData, PRUint32 * aDataToLen);
|
||||
// nsIXIFConverter
|
||||
NS_IMETHOD GetInputDataFlavors(nsISupportsArray **_retval) ;
|
||||
NS_IMETHOD GetOutputDataFlavors(nsISupportsArray **_retval) ;
|
||||
NS_IMETHOD CanConvert(const char *aFromDataFlavor, const char *aToDataFlavor, PRBool *_retval) ;
|
||||
NS_IMETHOD Convert(const char *aFromDataFlavor, nsISupports *aFromData, PRUint32 aDataLen,
|
||||
const char *aToDataFlavor, nsISupports **aToData, PRUint32 *aDataToLen) ;
|
||||
|
||||
protected:
|
||||
|
||||
nsresult AddFlavorToList ( nsISupportsArray* inList, const char* inFlavor ) ;
|
||||
|
||||
NS_IMETHOD ConvertFromXIFToHTML(const nsString & aFromStr, nsString & aToStr);
|
||||
NS_IMETHOD ConvertFromXIFToText(const nsString & aFromStr, nsString & aToStr);
|
||||
NS_IMETHOD ConvertFromXIFToAOLMail(const nsString & aFromStr, nsString & aToStr);
|
||||
|
||||
//nsVoidArray * mDFList;
|
||||
|
||||
};
|
||||
|
||||
#endif // nsXIFFormatConverter_h__
|
||||
|
|
Загрузка…
Ссылка в новой задаче