From 289d0646e59c951b9f56bc9e7864588dfa1eefda Mon Sep 17 00:00:00 2001 From: "kin%netscape.com" Date: Wed, 21 Oct 1998 20:37:43 +0000 Subject: [PATCH] Fix for bug #329760: ENDER: Loading multi-part mime into Ender leaves tmp files around. Files touched: include/edt.h lib/layout/edtbuf.cpp lib/layout/edtlist.cpp lib/mailto/mprdecod.cpp --- include/edt.h | 1 + lib/layout/edtbuf.cpp | 5 +- lib/layout/edtlist.cpp | 646 ---------------------------------------- lib/mailto/mprdecod.cpp | 2 +- 4 files changed, 5 insertions(+), 649 deletions(-) diff --git a/include/edt.h b/include/edt.h index d4735d48e97..17863864b4a 100644 --- a/include/edt.h +++ b/include/edt.h @@ -1479,6 +1479,7 @@ void EDT_SetEmbeddedEditorData(MWContext *pContext, void *pData); #ifdef MOZ_ENDER_MIME XP_Bool EDT_URLOnSafeList(void *id, const char *url_str); int32 EDT_AddURLToSafeList(void *id, const char *url_str); +int32 EDT_AddTmpFileURLToSafeList(void *id, const char *url_str, const char *path); int32 EDT_RemoveURLFromSafeList(void *id, const char *url_str); int32 EDT_RemoveIDFromSafeList(void *id); int32 EDT_DestroySafeList(); diff --git a/lib/layout/edtbuf.cpp b/lib/layout/edtbuf.cpp index 59132e6d4ac..48420d7e449 100644 --- a/lib/layout/edtbuf.cpp +++ b/lib/layout/edtbuf.cpp @@ -10241,8 +10241,9 @@ void CEditBuffer::ReadMimeFromBuffer(XP_HUGE_CHAR_PTR pBuffer){ t_part = t_decoder.getPart(i); if (t_part) { - EDT_AddURLToSafeList(m_pEmbeddedData, - t_part->getUrlFileName()); + EDT_AddTmpFileURLToSafeList(m_pEmbeddedData, + t_part->getUrlFileName(), + t_part->getFileName()); } } } diff --git a/lib/layout/edtlist.cpp b/lib/layout/edtlist.cpp index 90a1d8933fe..e69de29bb2d 100644 --- a/lib/layout/edtlist.cpp +++ b/lib/layout/edtlist.cpp @@ -1,646 +0,0 @@ -/* -*- 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. - */ - -#if defined(ENDER) && defined(MOZ_ENDER_MIME) - -#ifdef DEBUG_kin -#define DEBUG_SAFE_LIST 1 -#endif /* DEBUG_kin */ - -#ifdef DEBUG_SAFE_LIST -#include -#endif /* DEBUG_SAFE_LIST */ - - -#include "editor.h" - -class LListElement -{ - LListElement *m_pPrev; - LListElement *m_pNext; - -protected: - void *m_pData; - -public: - - LListElement(void *data = 0) - : m_pPrev(0), m_pNext(0), m_pData(data) {} - - virtual ~LListElement(); - - int32 insertBefore(LListElement *ele); - int32 insertAfter(LListElement *ele); - - int32 unlink(); - - void *getData() { return m_pData; } - LListElement *getPrev() { return m_pPrev; } - LListElement *getNext() { return m_pNext; } - -#ifdef DEBUG_SAFE_LIST - virtual void print(); -#endif /* DEBUG_SAFE_LIST */ -}; - -class LList -{ - LListElement *m_pHead; - LListElement *m_pTail; - -public: - - LList() : m_pHead(0), m_pTail(0) {} - virtual ~LList(); - - LListElement *getHead() { return m_pHead; } - LListElement *getTail() { return m_pTail; } - - int32 insertAtHead(LListElement *ele); - int32 insertAtTail(LListElement *ele); - int32 insertBefore(LListElement *ele1, LListElement *ele2); - int32 insertAfter(LListElement *ele1, LListElement*ele2); - - XP_Bool isEmpty(); - - XP_Bool contains(LListElement *ele); - - int32 remove(LListElement *ele); - -#ifdef DEBUG_SAFE_LIST - virtual void print(); -#endif /* DEBUG_SAFE_LIST */ -}; - -class LListIterator -{ - LList *m_pList; - LListElement *m_pNextElement; - -public: - - LListIterator(LList *list = 0) : m_pList(list), m_pNextElement(0) { init(); } - - virtual int32 init() - { - if (!m_pList) - return 0; - - m_pNextElement = m_pList->getHead(); - - return 0; - } - - virtual LListElement *getNext() - { - LListElement *ele = m_pNextElement; - - if (m_pNextElement) - m_pNextElement = m_pNextElement->getNext(); - - return ele; - } -}; - -class SortedLList : public LList -{ -public: - - virtual int32 insert(LListElement *ele); - virtual int32 compare(LListElement *ele1, LListElement *ele2); -}; - -LListElement::~LListElement() -{ - // If we're destroying this element, make sure it's - // not on any list! - unlink(); -} - -// -// Insert ele before this -// -int32 -LListElement::insertBefore(LListElement *ele) -{ - if (!ele) - return -1; - - ele->m_pNext = this; - ele->m_pPrev = m_pPrev; - m_pPrev = ele; - - if (ele->m_pPrev) - ele->m_pPrev->m_pNext = ele; - - return 0; -} - -// -// Insert ele after this. -// -int32 -LListElement::insertAfter(LListElement *ele) -{ - if (!ele) - return -1; - - ele->m_pPrev = this; - ele->m_pNext = m_pNext; - m_pNext = ele; - - if (ele->m_pNext) - ele->m_pNext->m_pPrev = ele; - - return 0; -} - -// -// unlink this from it's list. -// -int32 -LListElement::unlink() -{ - if (m_pPrev) - m_pPrev->m_pNext = m_pNext; - - if (m_pNext) - m_pNext->m_pPrev = m_pPrev; - - m_pPrev = 0; - m_pNext = 0; - - return 0; -} - -#ifdef DEBUG_SAFE_LIST - -void -LListElement::print() -{ - fprintf(stdout, "this: 0x%.8x\n", this); - fprintf(stdout, " m_pData: 0x%.8x\n", m_pData); - fprintf(stdout, " m_pPrev: 0x%.8x\n", m_pPrev); - fprintf(stdout, " m_pNext: 0x%.8x\n", m_pNext); -} - -#endif /* DEBUG_SAFE_LIST */ - - -LList::~LList() -{ - LListElement *ele; - - while((ele = m_pHead)) - { - remove(ele); - delete ele; - } -} - -// -// Insert ele at the head of the list. -// -int32 -LList::insertAtHead(LListElement *ele) -{ - if (!ele) - return -1; - - if (!m_pHead) - { - m_pHead = m_pTail = ele; - return 0; - } - - m_pHead->insertBefore(ele); - m_pHead = ele; - - return 0; -} - -// -// Insert ele at the tail of the list. -// -int32 -LList::insertAtTail(LListElement *ele) -{ - if (!ele) - return -1; - - if (!m_pHead) - { - m_pHead = m_pTail = ele; - return 0; - } - - m_pTail->insertAfter(ele); - m_pTail = ele; - - return 0; -} - -// -// Insert ele2 before ele1 in the list. -// -int32 -LList::insertBefore(LListElement *ele1, LListElement *ele2) -{ - if (!ele1 || !ele2 || !contains(ele1)) - return -1; - - if (m_pHead == ele1) - { - insertAtHead(ele2); - return 0; - } - - ele1->insertBefore(ele2); - - return 0; -} - -// -// Insert ele2 after ele1 in the list. -// -int32 -LList::insertAfter(LListElement *ele1, LListElement *ele2) -{ - if (!ele1 || !ele2 || !contains(ele1)) - return -1; - - if (m_pTail == ele1) - { - insertAtTail(ele2); - return 0; - } - - ele1->insertAfter(ele2); - - return 0; -} - -// -// TRUE if the list contains no elements. -// -XP_Bool -LList::isEmpty() -{ - return !m_pHead; -} - -// -// TRUE if this contains ele. -// -XP_Bool -LList::contains(LListElement *ele) -{ - LListElement *e = m_pHead; - - if (!ele) - return FALSE; - - while (e) - { - if (e == ele) - return TRUE; - e = e->getNext(); - } - - return FALSE; -} - -// -// Remove ele from the list. -// -int32 -LList::remove(LListElement *ele) -{ - if (!ele || !contains(ele)) - return -1; - - if (!m_pHead) - return 0; - - if (ele == m_pHead) - m_pHead = ele->getNext(); - - if (ele == m_pTail) - m_pTail = ele->getPrev(); - - ele->unlink(); - - return 0; -} - -#ifdef DEBUG_SAFE_LIST - -void -LList::print() -{ - LListIterator li(this); - LListElement *ele; - - fprintf(stdout, "-------------------------------\n"); - fprintf(stdout, "HEAD: 0x%.8x\n", m_pHead); - fprintf(stdout, "TAIL: 0x%.8x\n", m_pTail); - - while ((ele = li.getNext())) - { - ele->print(); - fflush(stdout); - } -} - -#endif /* DEBUG_SAFE_LIST */ - -int32 -SortedLList::insert(LListElement *ele) -{ - LListIterator li(this); - LListElement *le; - - if (contains(ele)) - return 0; - - if (isEmpty()) - { - LList::insertAtHead(ele); - return 0; - } - - while ((le = li.getNext())) - { - if (compare(le, ele) >= 0) - return(LList::insertBefore(le, ele)); - } - - return(LList::insertAtTail(ele)); -} - -int32 -SortedLList::compare(LListElement *ele1, LListElement *ele2) -{ - if (ele1->getData() < ele2->getData()) - return -1; - else if (ele1->getData() > ele2->getData()) - return 1; - - return 0; -} - -class SafeListElement : public LListElement -{ -public: - void *m_pID; - int32 m_iRefCount; - - SafeListElement(void *id, const char *url_str) : LListElement() - { - if (url_str) - m_pData = (void *)XP_STRDUP(url_str); - - m_pID = id; - m_iRefCount = 1; - } - - ~SafeListElement() - { - if (m_pData) - XP_FREE(m_pData); - - m_pData = 0; - m_pID = 0; - } - - XP_Bool match(void *id, const char *url_str) - { - if (m_pID != id || (m_pData != (void *)url_str && (!url_str || !m_pData))) - return(FALSE); - - return(!XP_STRCMP((char *)m_pData, url_str)); - } - -#ifdef DEBUG_SAFE_LIST - void print() - { - fprintf(stdout, "this: 0x%.8x\n", this); - fprintf(stdout, " id: 0x%.8x\n", m_pID); - fprintf(stdout, " url_str: %s\n", (char *)m_pData); - fprintf(stdout, " count: %d\n", m_iRefCount); - fprintf(stdout, " prev: 0x%.8x\n", getPrev()); - fprintf(stdout, " next: 0x%.8x\n", getNext()); - } -#endif /* DEBUG_SAFE_LIST */ -}; - -class SafeList : public SortedLList -{ -public: - - virtual ~SafeList() - { - removeAll(); - } - - SafeListElement *find(void *id, const char *url_str) - { - LListIterator li(this); - SafeListElement *ele; - - while ((ele = (SafeListElement *)li.getNext())) - { - if (ele->match(id, url_str)) - return ele; - } - - return 0; - } - - int32 insert(void *id, const char *url_str) - { - SafeListElement *ele = find(id, url_str); - - if (ele) - { - ele->m_iRefCount++; - return 0; - } - - ele = new SafeListElement(id, url_str); - - if (!ele) - return -1; - - return SortedLList::insert((LListElement *)ele); - } - - int32 remove(void *id, const char *url_str) - { - SafeListElement *ele = find(id, url_str); - - if (!ele) - return 1; - - ele->m_iRefCount--; - - if (ele->m_iRefCount <= 0) - { - LList::remove((LListElement *)ele); - delete ele; - } - - return 0; - } - - int32 removeID(void *id) - { - LListIterator li(this); - SafeListElement *ele; - - while ((ele = (SafeListElement *)li.getNext())) - { - if (ele->m_pID == id) - { - LList::remove((LListElement *)ele); - delete ele; - } - } - - return 0; - } - - int32 removeAll() - { - LListIterator li(this); - LListElement *ele; - - while ((ele = li.getNext())) - { - LList::remove(ele); - delete ele; - } - - return 0; - } - - int32 compare(LListElement *ele1, LListElement *ele2) - { - SafeListElement *e1 = (SafeListElement *)ele1; - SafeListElement *e2 = (SafeListElement *)ele2; - - char *d1 = (char *)e1->getData(); - char *d2 = (char *)e2->getData(); - - if (e1->m_pID < e2->m_pID) - return -1; - else if (e1->m_pID > e2->m_pID) - return 1; - else if (!d1) - return -1; - else if (!d2) - return 1; - - return XP_STRCMP(d1, d2); - } -}; - -static SafeList *app_safe_list = 0; - -extern "C" XP_Bool -EDT_URLOnSafeList( void *id, const char *url_str ) -{ - return(app_safe_list && - app_safe_list->find(id, url_str) != 0); -} - -extern "C" int32 -EDT_AddURLToSafeList( void *id, const char *url_str ) -{ - int32 status = 0; - - if (!app_safe_list) - { - app_safe_list = new SafeList(); - if (!app_safe_list) - return -1; - } - - status = app_safe_list->insert(id, url_str); - -#ifdef DEBUG_SAFE_LIST - app_safe_list->print(); -#endif /* DEBUG_SAFE_LIST */ - - return status; -} - -extern "C" int32 -EDT_RemoveURLFromSafeList( void *id, const char *url_str ) -{ - int32 status = 0; - - if (!app_safe_list) - return 0; - - status = app_safe_list->remove(id, url_str); - -#ifdef DEBUG_SAFE_LIST - app_safe_list->print(); -#endif /* DEBUG_SAFE_LIST */ - - return status; -} - -extern "C" int32 -EDT_RemoveIDFromSafeList( void *id ) -{ - int32 status = 0; - - if (!app_safe_list) - return 0; - - status = app_safe_list->removeID(id); - -#ifdef DEBUG_SAFE_LIST - app_safe_list->print(); -#endif /* DEBUG_SAFE_LIST */ - - return status; -} - -extern "C" int32 -EDT_DestroySafeList() -{ - if (!app_safe_list) - return 0; - - delete app_safe_list; - app_safe_list = 0; - - return 0; -} - -extern "C" void * -EDT_GetIdFromContext(MWContext *pContext) -{ - GET_EDIT_BUF_OR_RETURN(pContext, pEditBuffer) 0; - return pEditBuffer->m_pEmbeddedData; -} - -#endif /* ENDER && MOZ_ENDER_MIME */ diff --git a/lib/mailto/mprdecod.cpp b/lib/mailto/mprdecod.cpp index 7205e7fb4cf..57eca0c7bb7 100644 --- a/lib/mailto/mprdecod.cpp +++ b/lib/mailto/mprdecod.cpp @@ -154,9 +154,9 @@ SimpleMultipartRelatedMimeDecoder::SimpleMultipartRelatedMimeDecoder(const char SimpleMultipartRelatedMimeDecoder::~SimpleMultipartRelatedMimeDecoder() { - clear_all(); if (m_pHeaderFileName) XP_FileRemove(m_pHeaderFileName,xpFileToPost); + clear_all(); }