dmose%mozilla.org 0efb7c174c updated xPL license boilerplate to v1.1, a=chofmann@netscape.com,r=endico@mozilla.org
git-svn-id: svn://10.0.0.236/trunk@52910 18797224-902f-48f8-a5cc-f745e15eee43
1999-11-06 03:43:54 +00:00

324 lines
5.6 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):
*/
/*
*
* Implements Dynamically loadable module manipulation
*
* dp Suresh <dp@netscape.com>
*
*/
#include "wfDlm.h"
#include "libfont.h"
#ifdef XP_MAC
#include "probslet.h"
#else
#include "obsolete/probslet.h"
#endif
wfDlm::wfDlm(const char *fname, const char *str)
: m_state(0), m_filename(NULL), m_lib(NULL), m_dlmInterface(NULL)
{
if (str && *str)
{
reconstruct(str);
}
else
{
// New file.
m_filename = CopyString(fname);
if (sync() < 0)
{
// Some error with this file.
}
}
}
int wfDlm::status(void)
{
return(m_state);
}
char *
wfDlm::describe()
{
char *buf;
if (!m_filename || !*m_filename)
{
return (NULL);
}
// NO I18N REQUIRED FOR THESE STRINGS
buf = PR_smprintf("%s;%lld;%lu;", m_filename, m_modifyTime, m_fileSize);
return (buf);
}
int
wfDlm::reconstruct(const char *str)
{
char buf[1024]; // XXX this should be dynamic
if (!str || !*str)
{
// Error. No string to reconstruct from.
m_state = -1;
}
else
{
str = wf_scanToken(str, buf, sizeof(buf), ";", 1);
m_filename = CopyString(buf);
if (isEmpty(m_filename))
{
m_state = -1;
}
if (*str) str++;
str = wf_scanToken(str, buf, sizeof(buf), ";", 1);
if (*buf)
{
// XXX PRTime is 64 bit. This will result in data loss.
// XXX we will fix this once NSPR provides 64bit scanf
PRInt32 lo = atol(buf);
LL_I2L(m_modifyTime, lo);
}
WF_TRACEMSG(("NF: Modified time converted from string '%s' to %lld\n",
buf, m_modifyTime));
if (*str) str++;
str = wf_scanToken(str, buf, sizeof(buf), ";", 1);
if (*buf)
{
// XXX fileSize is uint32. This should be ok.
m_fileSize = atol(buf);
}
m_state = 1;
}
return (m_state);
}
wfDlm::~wfDlm()
{
finalize();
}
int wfDlm::finalize(void)
{
unload(1); // this will reset m_lib and m_dlmInterface
m_state = 0;
if (m_filename)
{
delete[] m_filename;
m_filename = NULL;
}
return (0);
}
//
// Implementation of public methods
//
const char *
wfDlm::filename()
{
return (m_filename);
}
int
wfDlm::isChanged()
{
PRFileInfo finfo;
if (m_state == 0)
sync();
if (m_state < 0)
return (m_state);
if (PR_GetFileInfo(m_filename, &finfo) == PR_FAILURE)
return (-1);
return (LL_NE(finfo.modifyTime, m_modifyTime) || finfo.size != m_fileSize);
}
int
wfDlm::sync(void)
{
PRFileInfo finfo;
if (!m_filename || !*m_filename ||
(PR_GetFileInfo(m_filename, &finfo) == PR_FAILURE))
{
m_state = -1;
return (m_state);
}
m_state = 1;
m_modifyTime = finfo.modifyTime;
m_fileSize = finfo.size;
return (0);
}
int wfDlm::load(void)
{
if (!m_lib)
{
#ifdef XP_MAC
const char *libPath = PR_GetLibraryPath();
char *libDir = CopyString(m_filename);
char *libName = strrchr(libDir, '/');
if (libName != NULL)
{
libName[1] = '\0';
PR_SetLibraryPath(libDir);
}
m_lib = PR_LoadLibrary(m_filename);
if (libName != NULL)
PR_SetLibraryPath(libPath);
delete[] libDir;
#else
m_lib = PR_LoadLibrary(m_filename);
#endif
if (!m_lib)
{
m_state = -2;
return (-1);
}
nfdlm_OBJECT_CREATE_PROC *proc =
(nfdlm_OBJECT_CREATE_PROC *)findSymbol("dlmFactory_Create");
if (!proc)
{
WF_TRACEMSG(("NF: dlm.load(%s) couldn't find symbol dlmFactory_Create. Skipping dlm.", filename()));
unload(1);
m_state = -2;
return (-1);
}
m_dlmInterface = (*proc)(NULL);
if (!m_dlmInterface)
{
WF_TRACEMSG(("NF: dlm.load(%s) Couldn't create m_dlmInterface object. Skipping dlm.", filename()));
unload();
m_state = -2;
return (-1);
}
else
{
WF_TRACEMSG(("NF: dlm.load(%s) successful.", filename()));
}
}
return (0);
}
FARPROC wfDlm::findSymbol(const char *symbol)
{
// Precondition
if (status() < 0)
{
return (NULL);
}
if (!m_lib && load() < 0)
{
return (NULL);
}
return (FARPROC)PR_FindSymbol(m_lib, symbol);
}
int wfDlm::unload(int force)
{
int ret = 0;
if (status() < 0)
{
return (-1);
}
if (m_lib)
{
// Check if the dlm wants to be unloaded
if (m_dlmInterface != NULL)
{
if (force || nfdlm_OnUnload(m_dlmInterface, NULL) >= 0)
{
nfdlm_release(m_dlmInterface, NULL);
m_dlmInterface = NULL;
}
}
if (m_dlmInterface == NULL)
{
ret = PR_UnloadLibrary(m_lib);
m_lib = NULL;
WF_TRACEMSG(("NF: dlm.unload(%s) returned %d.", filename(), ret));
}
}
return (ret);
}
struct nffp *
wfDlm::createDisplayerObject(struct nffbp *brokerDisplayerInterface)
{
if (!m_lib)
{
load();
}
if (status() < 0)
{
return (NULL);
}
struct nffp *fp =
(struct nffp *)nfdlm_CreateObject(m_dlmInterface, &nffp_ID,
(void **)&brokerDisplayerInterface, 1,
NULL);
return (fp);
}
//
// Static functions
//
int wfDlm::isEmpty(const char *filename)
{
PRFileInfo finfo;
int ret = 0;
if (!filename || !*filename ||
(PR_GetFileInfo(filename, &finfo) == PR_FAILURE) ||
finfo.size == 0)
{
ret = 1;
}
return (ret);
}