Mozilla/mozilla/cmd/xfe/src/ReadAttachDrag.cpp
ltabb 8ed5afe62c Free the lizard
git-svn-id: svn://10.0.0.236/trunk@10 18797224-902f-48f8-a5cc-f745e15eee43
1998-03-28 02:44:41 +00:00

216 lines
5.4 KiB
C++

/* -*- 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.
*/
/*
ReadAttachDrag.cpp -- class definitions for message attachment drag source
Created: Alastair Gourlay(SGI) c/o Dora Hsu<dora@netscape.com>, 26 Nov 1996
*/
// classes:
// XFE_ReadAttachDrag
//
#include <stdio.h>
#include <Xm/Xm.h>
#include "ReadAttachDrag.h"
#include "DesktopTypes.h"
extern void fe_SaveSynchronousURL(MWContext*,URL_Struct*,const char*);
// constructor
XFE_ReadAttachDrag::XFE_ReadAttachDrag(Widget w,XFE_ReadAttachPanel *attachPanel) : XFE_DragNetscape(w)
{
_attachPanel=attachPanel;
_dragDataURL=NULL;
_dragDataName=NULL;
_tmpDirectory=NULL;
_tmpFileName=NULL;
}
// destructor
XFE_ReadAttachDrag::~XFE_ReadAttachDrag()
{
}
// decide if this drag is interesting
int XFE_ReadAttachDrag::dragStart(int,int)
{
if (!_dragWidget || !XmIsPushButton(_dragWidget))
return FALSE;
// If drag widget is an AttachPanelItem, extract the URL
XtPointer userData;
XtVaGetValues(_dragWidget,XmNuserData,&userData,NULL);
XFE_AttachPanelItem *item=(XFE_AttachPanelItem*)userData;
if (item && item->data()) {
_attachPanel->selectItem(item);
_dragDataURL=XP_STRDUP(item->data());
if (item->dataLabel())
_dragDataName=XP_STRDUP(item->dataLabel());
else
_dragDataName=XP_STRDUP("noname");
setDragIconForType(item->dataType());
return TRUE;
}
return FALSE;
}
// specify types for this particular drag
void XFE_ReadAttachDrag::targets()
{
_numTargets=2;
_targets=new Atom[_numTargets];
_targets[0]=_XA_NETSCAPE_URL;
_targets[1]=XA_STRING;
setFileTarget(_XA_FILE_NAME);
}
// specify operations for this particular drag
void XFE_ReadAttachDrag::operations()
{
_operations=XmDROP_COPY;
}
// provide data for requested target from targets() list
char *XFE_ReadAttachDrag::getTargetData(Atom target)
{
// WARNING - data *must* be allocated with Xt malloc API, or Xt
// will spring a leak!
if (!_dragDataURL || !_dragDataName)
return NULL;
if (target==_XA_NETSCAPE_URL) {
// translate drag data to NetscapeURL format
XFE_URLDesktopType urlData;
urlData.createItemList(1);
urlData.url(0,_dragDataURL);
return (char*) XtNewString(urlData.getString());
}
if (target==_XA_FILE_NAME) {
// save url as appropriately named file in a tmp
// directory.
if ((_tmpDirectory=XFE_DesktopType::createTmpDirectory())==NULL)
return NULL;
_tmpFileName=new char[strlen(_tmpDirectory)+1+strlen(_dragDataName)+1];
sprintf(_tmpFileName,"%s/%s",_tmpDirectory,_dragDataName);
URL_Struct *urlStruct=NET_CreateURLStruct(_dragDataURL,NET_DONT_RELOAD);
if (urlStruct) {
lockFrame();
fe_SaveSynchronousURL(_attachPanel->context(),urlStruct,_tmpFileName);
unlockFrame();
}
// return file name
return (char*) XtNewString(_tmpFileName);
}
if (target==XA_STRING) {
// return the URL
return (char*) XtNewString(_dragDataURL);
}
return NULL;
}
void XFE_ReadAttachDrag::dragComplete()
{
if (_dragDataURL) {
XP_FREE(_dragDataURL);
_dragDataURL=NULL;
}
if (_dragDataName) {
XP_FREE(_dragDataName);
_dragDataName=NULL;
}
// if we created tmp files, delete them.
cleanupDataFiles();
}
// provide safe locking when saving to tmp file. Need to
// prevent clicking in thread window or message from interrupting
// save. Ideally fe_SaveSynchronousURL() would use its own
// context and not be interruptable.
void XFE_ReadAttachDrag::lockFrame()
{
Widget s=_widget;
while (s && !XtIsShell(s)) {
s=XtParent(s);
}
XtSetSensitive(s,FALSE);
CONTEXT_DATA (_attachPanel->context())->clicking_blocked = True;
fe_SetCursor (_attachPanel->context(), False);
}
void XFE_ReadAttachDrag::unlockFrame()
{
Widget s=_widget;
while (s && !XtIsShell(s)) {
s=XtParent(s);
}
XtSetSensitive(s,TRUE);
CONTEXT_DATA (_attachPanel->context())->clicking_blocked = False;
fe_SetCursor (_attachPanel->context(), False);
}
// remove tmp files and directory
// make sure that we only remove files that we created in /tmp/nsdndXXXXXX/
void XFE_ReadAttachDrag::cleanupDataFiles()
{
if (_tmpFileName) {
// delete tmp file
if (_tmpDirectory &&
strncmp(_tmpFileName,_tmpDirectory,strlen(_tmpDirectory))==0) {
unlink(_tmpFileName);
}
delete _tmpFileName;
_tmpFileName=NULL;
}
if (_tmpDirectory) {
// delete tmp directory
rmdir(_tmpDirectory);
free((void*)_tmpDirectory);
_tmpDirectory=NULL;
}
}