mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-05 08:35:26 +00:00
138 lines
3.0 KiB
C++
138 lines
3.0 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.1 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is mozilla.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*/
|
|
|
|
#include "msg.h"
|
|
#include "msgbg.h"
|
|
#include "msgpane.h"
|
|
#include "msgurlq.h"
|
|
|
|
extern "C" {
|
|
extern int MK_OUT_OF_MEMORY;
|
|
}
|
|
|
|
msg_Background::msg_Background()
|
|
{
|
|
}
|
|
|
|
|
|
msg_Background::~msg_Background()
|
|
{
|
|
if (m_pane) Interrupt();
|
|
}
|
|
|
|
|
|
int
|
|
msg_Background::Begin(MSG_Pane* pane)
|
|
{
|
|
XP_ASSERT(!m_pane);
|
|
if (m_pane) return -1;
|
|
char* url = XP_STRDUP("mailbox:?background");
|
|
if (!url) return MK_OUT_OF_MEMORY;
|
|
m_urlstruct = NET_CreateURLStruct(url, NET_NORMAL_RELOAD);
|
|
if (!m_urlstruct) {
|
|
XP_FREE(url);
|
|
return MK_OUT_OF_MEMORY;
|
|
}
|
|
XP_FREE(url);
|
|
m_urlstruct->internal_url = TRUE;
|
|
m_pane = pane;
|
|
msg_InterruptContext(pane->GetContext(), TRUE);
|
|
XP_ASSERT(pane->GetCurrentBackgroundJob() == NULL);
|
|
pane->SetCurrentBackgroundJob(this);
|
|
MSG_UrlQueue::AddUrlToPane(m_urlstruct, msg_Background::PreExit_s, pane);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
void
|
|
msg_Background::Interrupt()
|
|
{
|
|
XP_ASSERT(m_pane);
|
|
if (m_pane) {
|
|
msg_InterruptContext(m_pane->GetContext(), FALSE);
|
|
XP_ASSERT(m_pane == NULL);
|
|
}
|
|
}
|
|
|
|
|
|
msg_Background*
|
|
msg_Background::FindBGObj(URL_Struct* urlstruct)
|
|
{
|
|
XP_ASSERT(urlstruct && urlstruct->msg_pane);
|
|
if (!urlstruct || !urlstruct->msg_pane) return NULL;
|
|
msg_Background* result = urlstruct->msg_pane->GetCurrentBackgroundJob();
|
|
// OK, I'm truly evil, but I'm using this as an empty url that goes through
|
|
// netlib once. so result will be null...
|
|
XP_ASSERT(!result || result->m_pane == urlstruct->msg_pane);
|
|
return result;
|
|
}
|
|
|
|
|
|
int
|
|
msg_Background::ProcessBackground(URL_Struct* urlstruct)
|
|
{
|
|
msg_Background* obj = FindBGObj(urlstruct);
|
|
if (obj) {
|
|
return obj->DoSomeWork();
|
|
}
|
|
return MK_CONNECTED;
|
|
}
|
|
|
|
|
|
|
|
void
|
|
msg_Background::PreExit_s(URL_Struct* urlstruct, int status,
|
|
MWContext* context)
|
|
{
|
|
msg_Background* obj = FindBGObj(urlstruct);
|
|
if (obj) {
|
|
obj->PreExit(urlstruct, status, context);
|
|
}
|
|
}
|
|
|
|
void
|
|
msg_Background::PreExit(URL_Struct* /*urlstruct*/, int status,
|
|
MWContext*)
|
|
{
|
|
XP_Bool deleteself = AllDone(status);
|
|
XP_ASSERT(m_pane);
|
|
if (m_pane) {
|
|
m_pane->SetCurrentBackgroundJob(NULL);
|
|
m_pane = NULL;
|
|
}
|
|
if (deleteself) delete this;
|
|
}
|
|
|
|
|
|
XP_Bool
|
|
msg_Background::AllDone(int /*status*/)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
XP_Bool
|
|
msg_Background::IsRunning()
|
|
{
|
|
return m_pane != NULL;
|
|
}
|