Compare commits
64 Commits
regalloc_c
...
MODULAR_NE
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c515100b8e | ||
|
|
fe0f4d855f | ||
|
|
3d4019f9c4 | ||
|
|
9d96048a4b | ||
|
|
ae5d3bac86 | ||
|
|
dd5a8c0dfa | ||
|
|
a5f43d2a13 | ||
|
|
897d60bb73 | ||
|
|
fd1359cac8 | ||
|
|
aa88ba7591 | ||
|
|
0c9f6e6d80 | ||
|
|
f635646933 | ||
|
|
74a41b1364 | ||
|
|
dddf36e52d | ||
|
|
42f1218f94 | ||
|
|
9369584965 | ||
|
|
644d7cd9c7 | ||
|
|
cac7b720c3 | ||
|
|
371d44de72 | ||
|
|
d5840939c7 | ||
|
|
2a50f93567 | ||
|
|
d2a75afae6 | ||
|
|
8f2a603835 | ||
|
|
d9babead55 | ||
|
|
daa26a48be | ||
|
|
be77d90b49 | ||
|
|
e2793376a7 | ||
|
|
6d54e5f6e3 | ||
|
|
b0db9a4acd | ||
|
|
a7a9a03946 | ||
|
|
5340ef2b1b | ||
|
|
1043bb4cc9 | ||
|
|
9cb908ce37 | ||
|
|
93cf7025ed | ||
|
|
42b35681a2 | ||
|
|
bd2471c41c | ||
|
|
3231691800 | ||
|
|
2bdd74e814 | ||
|
|
97b4b7a6d1 | ||
|
|
55369bada1 | ||
|
|
82ed1f72bb | ||
|
|
52d02fe072 | ||
|
|
11e91b2751 | ||
|
|
9c6ac35617 | ||
|
|
50054acba1 | ||
|
|
79a4c9490b | ||
|
|
c181b6d7f9 | ||
|
|
a5e5b98ad8 | ||
|
|
f453d81444 | ||
|
|
05cb725cfb | ||
|
|
46d5611628 | ||
|
|
d9a5e647f5 | ||
|
|
6c07a2ca66 | ||
|
|
3c5574eb6e | ||
|
|
fee6fe5171 | ||
|
|
46e818474a | ||
|
|
ac3fe4623e | ||
|
|
e5430a78e1 | ||
|
|
e8ecd3ec68 | ||
|
|
86e542aa90 | ||
|
|
35f45baaed | ||
|
|
e72757dc16 | ||
|
|
f7ac2222ef | ||
|
|
4099eb2ef3 |
3875
mozilla/cmd/winfe/fegui.cpp
Executable file
3875
mozilla/cmd/winfe/fegui.cpp
Executable file
File diff suppressed because it is too large
Load Diff
2031
mozilla/cmd/winfe/nsapp.cpp
Normal file
2031
mozilla/cmd/winfe/nsapp.cpp
Normal file
File diff suppressed because it is too large
Load Diff
123
mozilla/cmd/winfe/stdafx.h
Normal file
123
mozilla/cmd/winfe/stdafx.h
Normal file
@@ -0,0 +1,123 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef STDAFX_PCH
|
||||
#define STDAFX_PCH
|
||||
|
||||
#define OEMRESOURCE
|
||||
|
||||
#if defined(DEBUG_blythe)
|
||||
// Set up a flag specific to WFE developers in the client
|
||||
#define DEBUG_WFE
|
||||
#endif
|
||||
|
||||
/* Very windows specific includes.
|
||||
*/
|
||||
/* MFC, KFC, RUN DMC, whatever */
|
||||
#include <afxwin.h>
|
||||
#include <afxext.h>
|
||||
#include <afxpriv.h>
|
||||
#include <afxole.h>
|
||||
#include <afxdisp.h>
|
||||
#include <afxodlgs.h>
|
||||
#ifdef _WIN32
|
||||
#include <afxcmn.h>
|
||||
#endif
|
||||
|
||||
/* More XP than anything */
|
||||
#include "xp.h"
|
||||
#include "fe_proto.h"
|
||||
#include "fe_rgn.h"
|
||||
#include "libi18n.h"
|
||||
#include "xlate.h"
|
||||
#include "ntypes.h"
|
||||
#ifdef EDITOR
|
||||
#include "edttypes.h"
|
||||
#endif
|
||||
#include "xpassert.h"
|
||||
#include "lo_ele.h"
|
||||
#include "layers.h"
|
||||
|
||||
/* Standard C includes */
|
||||
#ifndef _WIN32
|
||||
#include <dos.h>
|
||||
#endif
|
||||
#include <malloc.h>
|
||||
#include <direct.h>
|
||||
#include <stdarg.h>
|
||||
#include <time.h>
|
||||
#include <io.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#ifdef DEBUG
|
||||
#include <assert.h>
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/* Very windows specific includes.
|
||||
*/
|
||||
/* WFE needs a layout file */
|
||||
extern "C" {
|
||||
#include "layout.h"
|
||||
}
|
||||
|
||||
/* Some common defines. */
|
||||
#ifndef _AFXDLL
|
||||
#define new DEBUG_NEW
|
||||
#endif
|
||||
|
||||
/* All front end forward declarations needed to compile. */
|
||||
#include "forward.h"
|
||||
|
||||
/* Front end Casting macros. */
|
||||
#include "cast.h"
|
||||
|
||||
/* General purpose utilities. */
|
||||
#include "feutil.h"
|
||||
|
||||
/* afxData/sysInfo */
|
||||
#include "sysinfo.h"
|
||||
|
||||
/* Some defines we like everywhere. */
|
||||
#include "resource.h"
|
||||
#include "defaults.h"
|
||||
|
||||
/* The application include and
|
||||
* Commonly used, rarely changed headers */
|
||||
#include "ncapiurl.h"
|
||||
#include "genedit.h"
|
||||
#include "genframe.h"
|
||||
#include "genview.h"
|
||||
#include "gendoc.h"
|
||||
#include "intlwin.h"
|
||||
#include "mozilla.h"
|
||||
#include "cxwin.h"
|
||||
#include "winproto.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#ifdef assert
|
||||
#undef assert
|
||||
#endif
|
||||
#define assert(x) ASSERT(x)
|
||||
#endif
|
||||
|
||||
#endif /* STDAFX_PCH */
|
||||
@@ -1,134 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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 "Fundamentals.h"
|
||||
#include "BitSet.h"
|
||||
|
||||
// Return the next bit after index set to true or -1 if none.
|
||||
//
|
||||
Int32 BitSet::nextOne(Int32 pos) const
|
||||
{
|
||||
++pos;
|
||||
|
||||
if (pos < 0 || Uint32(pos) >= universeSize)
|
||||
return -1;
|
||||
|
||||
Uint32 offset = getWordOffset(pos);
|
||||
Uint8 index = getBitOffset(pos);
|
||||
Word* ptr = &word[offset];
|
||||
Word currentWord = *ptr++ >> index;
|
||||
|
||||
if (currentWord != Word(0)) {
|
||||
while ((currentWord & Word(1)) == 0) {
|
||||
++index;
|
||||
currentWord >>= 1;
|
||||
}
|
||||
return (offset << nBitsInWordLog2) + index;
|
||||
}
|
||||
|
||||
Word* limit = &word[getSizeInWords(universeSize)];
|
||||
while (ptr < limit) {
|
||||
++offset;
|
||||
currentWord = *ptr++;
|
||||
if (currentWord != Word(0)) {
|
||||
index = 0;
|
||||
while ((currentWord & Word(1)) == 0) {
|
||||
++index;
|
||||
currentWord >>= 1;
|
||||
}
|
||||
return (offset << nBitsInWordLog2) + index;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Return the next bit after index set to false or -1 if none.
|
||||
//
|
||||
Int32 BitSet::nextZero(Int32 pos) const
|
||||
{
|
||||
++pos;
|
||||
|
||||
if (pos < 0 || Uint32(pos) >= universeSize)
|
||||
return -1;
|
||||
|
||||
Uint32 offset = getWordOffset(pos);
|
||||
Uint8 index = getBitOffset(pos);
|
||||
Word* ptr = &word[offset];
|
||||
Word currentWord = *ptr++ >> index;
|
||||
|
||||
if (currentWord != Word(~0)) {
|
||||
for (; index < nBitsInWord; ++index) {
|
||||
if ((currentWord & Word(1)) == 0) {
|
||||
Int32 ret = (offset << nBitsInWordLog2) + index;
|
||||
return (Uint32(ret) < universeSize) ? ret : -1;
|
||||
}
|
||||
currentWord >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
Word* limit = &word[getSizeInWords(universeSize)];
|
||||
while (ptr < limit) {
|
||||
++offset;
|
||||
currentWord = *ptr++;
|
||||
if (currentWord != Word(~0)) {
|
||||
for (index = 0; index < nBitsInWord; ++index) {
|
||||
if ((currentWord & Word(1)) == 0) {
|
||||
Int32 ret = (offset << nBitsInWordLog2) + index;
|
||||
return (Uint32(ret) < universeSize) ? ret : -1;
|
||||
}
|
||||
currentWord >>= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
|
||||
// Print the set.
|
||||
//
|
||||
void BitSet::printPretty(LogModuleObject log)
|
||||
{
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("[ "));
|
||||
|
||||
for (Int32 i = firstOne(); i != -1; i = nextOne(i)) {
|
||||
Int32 currentBit = i;
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("%d", currentBit));
|
||||
|
||||
Int32 nextBit = nextOne(currentBit);
|
||||
if (nextBit != currentBit + 1) {
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, (" "));
|
||||
continue;
|
||||
}
|
||||
|
||||
while ((nextBit != -1) && (nextBit == (currentBit + 1))) {
|
||||
currentBit = nextBit;
|
||||
nextBit = nextOne(nextBit);
|
||||
}
|
||||
|
||||
if (currentBit > (i+1))
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("-%d ", currentBit));
|
||||
else
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, (" %d ", currentBit));
|
||||
|
||||
i = currentBit;
|
||||
}
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("]\n"));
|
||||
}
|
||||
|
||||
#endif // DEBUG_LOG
|
||||
@@ -1,195 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _BITSET_H_
|
||||
#define _BITSET_H_
|
||||
|
||||
#include "Fundamentals.h"
|
||||
#include "LogModule.h"
|
||||
#include "Pool.h"
|
||||
#include <string.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// BitSet -
|
||||
|
||||
class BitSet
|
||||
{
|
||||
private:
|
||||
|
||||
#if (PR_BITS_PER_WORD == 64)
|
||||
typedef Uint64 Word;
|
||||
#elif (PR_BITS_PER_WORD == 32)
|
||||
typedef Uint32 Word;
|
||||
#endif
|
||||
|
||||
static const nBitsInWord = PR_BITS_PER_WORD;
|
||||
static const nBytesInWord = PR_BYTES_PER_WORD;
|
||||
static const nBitsInWordLog2 = PR_BITS_PER_WORD_LOG2;
|
||||
static const nBytesInWordLog2 = PR_BYTES_PER_WORD_LOG2;
|
||||
|
||||
// Return the number of Word need to store the universe.
|
||||
static Uint32 getSizeInWords(Uint32 sizeOfUniverse) {return (sizeOfUniverse + (nBitsInWord - 1)) >> nBitsInWordLog2;}
|
||||
// Return the given element offset in its containing Word.
|
||||
static Uint32 getBitOffset(Uint32 element) {return element & (nBitsInWord - 1);}
|
||||
// Return the Word offset for the given element int the universe.
|
||||
static Uint32 getWordOffset(Uint32 element) {return element >> nBitsInWordLog2;}
|
||||
// Return the mask for the given bit index.
|
||||
static Word getMask(Uint8 index) {return Word(1) << index;}
|
||||
|
||||
private:
|
||||
|
||||
Uint32 universeSize; // Size of the universe
|
||||
Word* word; // universe memory.
|
||||
|
||||
private:
|
||||
|
||||
// No copy constructor.
|
||||
BitSet(const BitSet&);
|
||||
|
||||
// Check if the given set's universe is of the same size than this universe.
|
||||
void checkUniverseCompatibility(const BitSet& set) const {assert(set.universeSize == universeSize);}
|
||||
// Check if pos is valid for this set's universe.
|
||||
void checkMember(Int32 pos) const {assert(pos >=0 && Uint32(pos) < universeSize);}
|
||||
|
||||
public:
|
||||
|
||||
// Create a bitset of universeSize bits.
|
||||
BitSet(Pool& pool, Uint32 universeSize) : universeSize(universeSize) {word = new(pool) Word[getSizeInWords(universeSize)]; clear();}
|
||||
|
||||
// Return the size of this bitset.
|
||||
Uint32 getSize() const {return universeSize;}
|
||||
|
||||
// Clear the bitset.
|
||||
void clear() {memset(word, 0x00, getSizeInWords(universeSize) << nBytesInWordLog2);}
|
||||
// Clear the bit at index.
|
||||
void clear(Uint32 index) {checkMember(index); word[getWordOffset(index)] &= ~getMask(index);}
|
||||
// Set the bitset.
|
||||
void set() {memset(word, 0xFF, getSizeInWords(universeSize) << nBytesInWordLog2);}
|
||||
// Set the bit at index.
|
||||
void set(Uint32 index) {checkMember(index); word[getWordOffset(index)] |= getMask(index);}
|
||||
// Return true if the bit at index is set.
|
||||
bool test(Uint32 index) const {checkMember(index); return (word[getWordOffset(index)] & getMask(index)) != 0;}
|
||||
// Union with the given bitset.
|
||||
inline void or(const BitSet& set);
|
||||
// Intersection with the given bitset.
|
||||
inline void and(const BitSet& set);
|
||||
// Difference with the given bitset.
|
||||
inline void difference(const BitSet& set);
|
||||
// Copy set.
|
||||
inline BitSet& operator = (const BitSet& set);
|
||||
// Return true if the bitset are identical.
|
||||
friend bool operator == (const BitSet& set1, const BitSet& set2);
|
||||
// Return true if the bitset are different.
|
||||
friend bool operator != (const BitSet& set1, const BitSet& set2);
|
||||
|
||||
// Logical operators.
|
||||
BitSet& operator |= (const BitSet& set) {or(set); return *this;}
|
||||
BitSet& operator &= (const BitSet& set) {and(set); return *this;}
|
||||
BitSet& operator -= (const BitSet& set) {difference(set); return *this;}
|
||||
|
||||
// Return the first bit at set to true or -1 if none.
|
||||
Int32 firstOne() const {return nextOne(-1);}
|
||||
// Return the next bit after index set to true or -1 if none.
|
||||
Int32 nextOne(Int32 pos) const;
|
||||
// Return the first bit at set to false or -1 if none.
|
||||
Int32 firstZero() const {return nextZero(-1);}
|
||||
// Return the next bit after index set to false or -1 if none.
|
||||
Int32 nextZero(Int32 pos) const;
|
||||
|
||||
// Iterator to conform with the set API.
|
||||
typedef Int32 iterator;
|
||||
// Return true if the walk is ordered.
|
||||
static bool isOrdered() {return true;}
|
||||
// Return the iterator for the first element of this set.
|
||||
iterator begin() const {return firstOne();}
|
||||
// Return the next iterator.
|
||||
iterator advance(iterator pos) const {return nextOne(pos);}
|
||||
// Return true if the iterator is at the end of the set.
|
||||
bool done(iterator pos) const {return pos == -1;}
|
||||
// Return the element corresponding to the given iterator.
|
||||
Uint32 get(iterator pos) const {return pos;}
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
// Print the set.
|
||||
void printPretty(LogModuleObject log);
|
||||
#endif // DEBUG_LOG
|
||||
};
|
||||
|
||||
// Union with the given bitset.
|
||||
//
|
||||
inline void BitSet::or(const BitSet& set)
|
||||
{
|
||||
checkUniverseCompatibility(set);
|
||||
Word* src = set.word;
|
||||
Word* dst = word;
|
||||
Word* limit = &src[getSizeInWords(universeSize)];
|
||||
|
||||
while (src < limit)
|
||||
*dst++ |= *src++;
|
||||
}
|
||||
|
||||
// Intersection with the given bitset.
|
||||
//
|
||||
inline void BitSet::and(const BitSet& set)
|
||||
{
|
||||
checkUniverseCompatibility(set);
|
||||
Word* src = set.word;
|
||||
Word* dst = word;
|
||||
Word* limit = &src[getSizeInWords(universeSize)];
|
||||
|
||||
while (src < limit)
|
||||
*dst++ &= *src++;
|
||||
}
|
||||
|
||||
// Difference with the given bitset.
|
||||
//
|
||||
inline void BitSet::difference(const BitSet& set)
|
||||
{
|
||||
checkUniverseCompatibility(set);
|
||||
Word* src = set.word;
|
||||
Word* dst = word;
|
||||
Word* limit = &src[getSizeInWords(universeSize)];
|
||||
|
||||
while (src < limit)
|
||||
*dst++ &= ~*src++;
|
||||
}
|
||||
|
||||
// Copy the given set into this set.
|
||||
//
|
||||
inline BitSet& BitSet::operator = (const BitSet& set)
|
||||
{
|
||||
checkUniverseCompatibility(set);
|
||||
if (this != &set)
|
||||
memcpy(word, set.word, getSizeInWords(universeSize) << nBytesInWordLog2);
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Return true if the given set is identical to this set.
|
||||
inline bool operator == (const BitSet& set1, const BitSet& set2)
|
||||
{
|
||||
set1.checkUniverseCompatibility(set2);
|
||||
|
||||
if (&set1 == &set2)
|
||||
return true;
|
||||
|
||||
return memcmp(set1.word, set2.word, BitSet::getSizeInWords(set1.universeSize) << BitSet::nBytesInWordLog2) == 0;
|
||||
}
|
||||
|
||||
inline bool operator != (const BitSet& set1, const BitSet& set2) {return !(set1 == set2);}
|
||||
|
||||
#endif // _BITSET_H
|
||||
@@ -1,159 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _COALESCING_H_
|
||||
#define _COALESCING_H_
|
||||
|
||||
#include "Fundamentals.h"
|
||||
#include "Pool.h"
|
||||
#include "RegisterPressure.h"
|
||||
#include "InterferenceGraph.h"
|
||||
#include "ControlGraph.h"
|
||||
#include "ControlNodes.h"
|
||||
#include "Instruction.h"
|
||||
#include "SparseSet.h"
|
||||
#include "RegisterAllocator.h"
|
||||
#include "RegisterAllocatorTools.h"
|
||||
|
||||
#if 1
|
||||
// Performing an ultra conservative coalescing meens that when we look at
|
||||
// candidates (source,destination) for coalescing we need to make sure
|
||||
// that the combined interference of the source and destination register
|
||||
// will not exceed the total number of register available for the register
|
||||
// class.
|
||||
#define ULTRA_CONSERVATIVE_COALESCING
|
||||
#else
|
||||
// If we are not doing an ultra conservative coalescing we have to make sure
|
||||
// that the total number of neighbor whose degree is greater than the total
|
||||
// number of register is not greater than the total number of register.
|
||||
#undef ULTRA_CONSERVATIVE_COALESCING
|
||||
#endif
|
||||
|
||||
template <class RegisterPressure>
|
||||
struct Coalescing
|
||||
{
|
||||
static bool coalesce(RegisterAllocator& registerAllocator);
|
||||
};
|
||||
|
||||
template <class RegisterPressure>
|
||||
bool Coalescing<RegisterPressure>::coalesce(RegisterAllocator& registerAllocator)
|
||||
{
|
||||
Pool& pool = registerAllocator.pool;
|
||||
|
||||
// Initialize the lookup table
|
||||
//
|
||||
Uint32 rangeCount = registerAllocator.rangeCount;
|
||||
RegisterName* newRange = new RegisterName[2 * rangeCount];
|
||||
RegisterName* coalescedRange = &newRange[rangeCount];
|
||||
RegisterName* name2range = registerAllocator.name2range;
|
||||
|
||||
init(coalescedRange, rangeCount);
|
||||
|
||||
SparseSet interferences(pool, rangeCount);
|
||||
InterferenceGraph<RegisterPressure>& iGraph = registerAllocator.iGraph;
|
||||
bool removedInstructions = false;
|
||||
|
||||
ControlGraph& controlGraph = registerAllocator.controlGraph;
|
||||
ControlNode** nodes = controlGraph.lndList;
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
|
||||
|
||||
// Walk the nodes in the loop nesting depth list.
|
||||
for (Int32 n = nNodes - 1; n >= 0; n--) {
|
||||
InstructionList& instructions = nodes[n]->getInstructions();
|
||||
|
||||
InstructionList::iterator it = instructions.begin();
|
||||
while (!instructions.done(it)) {
|
||||
Instruction& instruction = instructions.get(it);
|
||||
it = instructions.advance(it);
|
||||
|
||||
if ((instruction.getFlags() & ifCopy) != 0) {
|
||||
assert(instruction.getInstructionUseBegin() != instruction.getInstructionUseEnd() && instruction.getInstructionUseBegin()[0].isRegister());
|
||||
assert(instruction.getInstructionDefineBegin() != instruction.getInstructionDefineEnd() && instruction.getInstructionDefineBegin()[0].isRegister());
|
||||
|
||||
RegisterName source = findRoot(name2range[instruction.getInstructionUseBegin()[0].getRegisterName()], coalescedRange);
|
||||
RegisterName destination = findRoot(name2range[instruction.getInstructionDefineBegin()[0].getRegisterName()], coalescedRange);
|
||||
|
||||
if (source == destination) {
|
||||
instruction.remove();
|
||||
} else if (!iGraph.interfere(source, destination)) {
|
||||
InterferenceVector* sourceVector = iGraph.getInterferenceVector(source);
|
||||
InterferenceVector* destinationVector = iGraph.getInterferenceVector(destination);
|
||||
|
||||
#ifdef ULTRA_CONSERVATIVE_COALESCING
|
||||
interferences.clear();
|
||||
|
||||
InterferenceVector* vector;
|
||||
for (vector = sourceVector; vector != NULL; vector = vector->next) {
|
||||
RegisterName* neighbors = vector->neighbors;
|
||||
for (Uint32 i = 0; i < vector->count; i++)
|
||||
interferences.set(findRoot(neighbors[i], coalescedRange));
|
||||
}
|
||||
for (vector = destinationVector; vector != NULL; vector = vector->next) {
|
||||
RegisterName* neighbors = vector->neighbors;
|
||||
for (Uint32 i = 0; i < vector->count; i++)
|
||||
interferences.set(findRoot(neighbors[i], coalescedRange));
|
||||
}
|
||||
|
||||
Uint32 count = interferences.getSize();
|
||||
#else // ULTRA_CONSERVATIVE_COALESCING
|
||||
trespass("not implemented");
|
||||
Uint32 count = 0;
|
||||
#endif // ULTRA_CONSERVATIVE_COALESCING
|
||||
|
||||
if (count < 6 /* FIX: should get the number from the class */) {
|
||||
// Update the interferences vector.
|
||||
if (sourceVector == NULL) {
|
||||
iGraph.setInterferenceVector(source, destinationVector);
|
||||
sourceVector = destinationVector;
|
||||
} else if (destinationVector == NULL)
|
||||
iGraph.setInterferenceVector(destination, sourceVector);
|
||||
else {
|
||||
InterferenceVector* last = NULL;
|
||||
for (InterferenceVector* v = sourceVector; v != NULL; v = v->next)
|
||||
last = v;
|
||||
assert(last);
|
||||
last->next = destinationVector;
|
||||
iGraph.setInterferenceVector(destination, sourceVector);
|
||||
}
|
||||
// Update the interference matrix.
|
||||
for (InterferenceVector* v = sourceVector; v != NULL; v = v->next) {
|
||||
RegisterName* neighbors = v->neighbors;
|
||||
for (Uint32 i = 0; i < v->count; i++) {
|
||||
RegisterName neighbor = findRoot(neighbors[i], coalescedRange);
|
||||
iGraph.setInterference(neighbor, source);
|
||||
iGraph.setInterference(neighbor, destination);
|
||||
}
|
||||
}
|
||||
|
||||
instruction.remove();
|
||||
coalescedRange[source] = destination;
|
||||
removedInstructions = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
registerAllocator.rangeCount = compress(registerAllocator.name2range, coalescedRange, registerAllocator.nameCount, rangeCount);
|
||||
delete newRange;
|
||||
|
||||
return removedInstructions;
|
||||
}
|
||||
|
||||
#endif // _COALESCING_H_
|
||||
@@ -1,283 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef NEW_LAURENTM_CODE
|
||||
|
||||
#include "Coloring.h"
|
||||
#include "VirtualRegister.h"
|
||||
#include "FastBitSet.h"
|
||||
#include "FastBitMatrix.h"
|
||||
#include "CpuInfo.h"
|
||||
|
||||
bool Coloring::
|
||||
assignRegisters(FastBitMatrix& interferenceMatrix)
|
||||
{
|
||||
PRUint32 *stackPtr = new(pool) PRUint32[vRegManager.count()];
|
||||
|
||||
return select(interferenceMatrix, stackPtr, simplify(interferenceMatrix, stackPtr));
|
||||
}
|
||||
|
||||
PRInt32 Coloring::
|
||||
getLowestSpillCostRegister(FastBitSet& bitset)
|
||||
{
|
||||
PRInt32 lowest = bitset.firstOne();
|
||||
if (lowest != -1)
|
||||
{
|
||||
Flt32 cost = vRegManager.getVirtualRegister(lowest).spillInfo.spillCost;
|
||||
for (PRInt32 r = bitset.nextOne(lowest); r != -1; r = bitset.nextOne(r))
|
||||
{
|
||||
VirtualRegister& vReg = vRegManager.getVirtualRegister(r);
|
||||
if (!vReg.spillInfo.infiniteSpillCost && (vReg.spillInfo.spillCost < cost))
|
||||
{
|
||||
cost = vReg.spillInfo.spillCost;
|
||||
lowest = r;
|
||||
}
|
||||
}
|
||||
}
|
||||
return lowest;
|
||||
}
|
||||
|
||||
PRUint32* Coloring::
|
||||
simplify(FastBitMatrix interferenceMatrix, PRUint32* stackPtr)
|
||||
{
|
||||
// first we construct the sets low and high. low contains all nodes of degree
|
||||
// inferior to the number of register available on the processor. All the
|
||||
// nodes with an high degree and a finite spill cost are placed in high.
|
||||
// Nodes of high degree and infinite spill cost are not included in either sets.
|
||||
|
||||
PRUint32 nRegisters = vRegManager.count();
|
||||
FastBitSet low(pool, nRegisters);
|
||||
FastBitSet high(pool, nRegisters);
|
||||
FastBitSet stack(pool, nRegisters);
|
||||
|
||||
for (VirtualRegisterManager::iterator i = vRegManager.begin(); !vRegManager.done(i); i = vRegManager.advance(i))
|
||||
{
|
||||
VirtualRegister& vReg = vRegManager.getVirtualRegister(i);
|
||||
|
||||
if (vReg.getClass() == vrcStackSlot)
|
||||
{
|
||||
stack.set(i);
|
||||
vReg.colorRegister(nRegisters);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (vReg.colorInfo.interferenceDegree < NUMBER_OF_REGISTERS)
|
||||
low.set(i);
|
||||
else // if (!vReg.spillInfo.infiniteSpillCost)
|
||||
high.set(i);
|
||||
|
||||
// Set coloring info.
|
||||
vReg.spillInfo.willSpill = false;
|
||||
|
||||
switch(vReg.getClass())
|
||||
{
|
||||
case vrcInteger:
|
||||
vReg.colorRegister(LAST_GREGISTER + 1);
|
||||
break;
|
||||
case vrcFloatingPoint:
|
||||
case vrcFixedPoint:
|
||||
vReg.colorRegister(LAST_FPREGISTER + 1);
|
||||
break;
|
||||
default:
|
||||
PR_ASSERT(false); // Cannot happen.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// push the stack registers
|
||||
PRInt32 j;
|
||||
for (j = stack.firstOne(); j != -1; j = stack.nextOne(j))
|
||||
*stackPtr++ = j;
|
||||
|
||||
// simplify
|
||||
while (true)
|
||||
{
|
||||
PRInt32 r;
|
||||
while ((r = getLowestSpillCostRegister(low)) != -1)
|
||||
{
|
||||
VirtualRegister& vReg = vRegManager.getVirtualRegister(r);
|
||||
|
||||
/* update low and high */
|
||||
FastBitSet inter(interferenceMatrix.getRow(r), nRegisters);
|
||||
for (j = inter.firstOne(); j != -1; j = inter.nextOne(j))
|
||||
{
|
||||
VirtualRegister& neighbor = vRegManager.getVirtualRegister(j);
|
||||
// if the new interference degree of one of his neighbor becomes
|
||||
// NUMBER_OF_REGISTERS - 1 then it is added to the set 'low'.
|
||||
|
||||
PRUint32 maxInterference = 0;
|
||||
switch (neighbor.getClass())
|
||||
{
|
||||
case vrcInteger:
|
||||
maxInterference = NUMBER_OF_GREGISTERS;
|
||||
break;
|
||||
case vrcFloatingPoint:
|
||||
case vrcFixedPoint:
|
||||
maxInterference = NUMBER_OF_FPREGISTERS;
|
||||
break;
|
||||
default:
|
||||
PR_ASSERT(false);
|
||||
}
|
||||
if ((vRegManager.getVirtualRegister(j).colorInfo.interferenceDegree-- == maxInterference))
|
||||
{
|
||||
high.clear(j);
|
||||
low.set(j);
|
||||
}
|
||||
vReg.colorInfo.interferenceDegree--;
|
||||
interferenceMatrix.clear(r, j);
|
||||
interferenceMatrix.clear(j, r);
|
||||
}
|
||||
low.clear(r);
|
||||
|
||||
// Push this register.
|
||||
*stackPtr++ = r;
|
||||
}
|
||||
if ((r = getLowestSpillCostRegister(high)) != -1)
|
||||
{
|
||||
high.clear(r);
|
||||
low.set(r);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
return stackPtr;
|
||||
}
|
||||
|
||||
bool Coloring::
|
||||
select(FastBitMatrix& interferenceMatrix, PRUint32* stackBase, PRUint32* stackPtr)
|
||||
{
|
||||
PRUint32 nRegisters = vRegManager.count();
|
||||
FastBitSet usedRegisters(NUMBER_OF_REGISTERS + 1); // usedRegisters if used for both GR & FPR.
|
||||
FastBitSet preColoredRegisters(NUMBER_OF_REGISTERS + 1);
|
||||
FastBitSet usedStack(nRegisters + 1);
|
||||
bool success = true;
|
||||
Int32 lastUsedSSR = -1;
|
||||
|
||||
// select
|
||||
while (stackPtr != stackBase)
|
||||
{
|
||||
// Pop one register.
|
||||
PRUint32 r = *--stackPtr;
|
||||
VirtualRegister& vReg = vRegManager.getVirtualRegister(r);
|
||||
|
||||
FastBitSet neighbors(interferenceMatrix.getRow(r), nRegisters);
|
||||
|
||||
if (vReg.getClass() == vrcStackSlot)
|
||||
// Stack slots coloring.
|
||||
{
|
||||
usedStack.clear();
|
||||
|
||||
for (PRInt32 i = neighbors.firstOne(); i != -1; i = neighbors.nextOne(i))
|
||||
usedStack.set(vRegManager.getVirtualRegister(i).getColor());
|
||||
|
||||
Int32 color = usedStack.firstZero();
|
||||
vReg.colorRegister(color);
|
||||
if (color > lastUsedSSR)
|
||||
lastUsedSSR = color;
|
||||
}
|
||||
else
|
||||
// Integer & Floating point register coloring.
|
||||
{
|
||||
usedRegisters.clear();
|
||||
preColoredRegisters.clear();
|
||||
|
||||
for (PRInt32 i = neighbors.firstOne(); i != -1; i = neighbors.nextOne(i))
|
||||
{
|
||||
VirtualRegister& nvReg = vRegManager.getVirtualRegister(i);
|
||||
usedRegisters.set(nvReg.getColor());
|
||||
if (nvReg.isPreColored())
|
||||
preColoredRegisters.set(nvReg.getPreColor());
|
||||
}
|
||||
if (vReg.hasSpecialInterference)
|
||||
usedRegisters |= vReg.specialInterference;
|
||||
|
||||
PRInt8 c = -1;
|
||||
PRInt8 maxColor = 0;
|
||||
PRInt8 firstColor = 0;
|
||||
switch (vReg.getClass())
|
||||
{
|
||||
case vrcInteger:
|
||||
firstColor = FIRST_GREGISTER;
|
||||
maxColor = LAST_GREGISTER;
|
||||
break;
|
||||
case vrcFloatingPoint:
|
||||
case vrcFixedPoint:
|
||||
firstColor = FIRST_FPREGISTER;
|
||||
maxColor = LAST_FPREGISTER;
|
||||
break;
|
||||
default:
|
||||
PR_ASSERT(false);
|
||||
}
|
||||
|
||||
if (vReg.isPreColored())
|
||||
{
|
||||
c = vReg.getPreColor();
|
||||
if (usedRegisters.test(c))
|
||||
c = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (c = usedRegisters.nextZero(firstColor - 1); (c >= 0) && (c <= maxColor) && (preColoredRegisters.test(c));
|
||||
c = usedRegisters.nextZero(c)) {}
|
||||
}
|
||||
|
||||
if ((c >= 0) && (c <= maxColor))
|
||||
{
|
||||
vReg.colorRegister(c);
|
||||
}
|
||||
else
|
||||
{
|
||||
VirtualRegister& stackRegister = vRegManager.newVirtualRegister(vrcStackSlot);
|
||||
vReg.equivalentRegister[vrcStackSlot] = &stackRegister;
|
||||
vReg.spillInfo.willSpill = true;
|
||||
success = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
if (success)
|
||||
{
|
||||
for (VirtualRegisterManager::iterator i = vRegManager.begin(); !vRegManager.done(i); i = vRegManager.advance(i))
|
||||
{
|
||||
VirtualRegister& vReg = vRegManager.getVirtualRegister(i);
|
||||
switch (vReg.getClass())
|
||||
{
|
||||
case vrcInteger:
|
||||
if (vReg.getColor() > LAST_GREGISTER)
|
||||
PR_ASSERT(false);
|
||||
break;
|
||||
case vrcFloatingPoint:
|
||||
case vrcFixedPoint:
|
||||
#if NUMBER_OF_FPREGISTERS != 0
|
||||
if (vReg.getColor() > LAST_FPREGISTER)
|
||||
PR_ASSERT(false);
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
vRegManager.nUsedStackSlots = lastUsedSSR + 1;
|
||||
return success;
|
||||
}
|
||||
#endif // NEW_LAURENTM_CODE
|
||||
@@ -1,284 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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 "Fundamentals.h"
|
||||
#include "ControlGraph.h"
|
||||
#include "ControlNodes.h"
|
||||
#include "Instruction.h"
|
||||
#include "RegisterAllocator.h"
|
||||
#include "VirtualRegister.h"
|
||||
#include "InterferenceGraph.h"
|
||||
#include "SparseSet.h"
|
||||
#include "Spilling.h"
|
||||
#include "Splits.h"
|
||||
|
||||
UT_EXTERN_LOG_MODULE(RegAlloc);
|
||||
|
||||
template <class RegisterPressure>
|
||||
class Coloring
|
||||
{
|
||||
private:
|
||||
static RegisterName* simplify(RegisterAllocator& registerAllocator, RegisterName* coloringStack);
|
||||
static bool select(RegisterAllocator& registerAllocator, RegisterName* coloringStack, RegisterName* coloringStackPtr);
|
||||
|
||||
public:
|
||||
static bool color(RegisterAllocator& registerAllocator);
|
||||
static void finalColoring(RegisterAllocator& registerAllocator);
|
||||
};
|
||||
|
||||
|
||||
template <class RegisterPressure>
|
||||
void Coloring<RegisterPressure>::finalColoring(RegisterAllocator& registerAllocator)
|
||||
{
|
||||
RegisterName* color = registerAllocator.color;
|
||||
RegisterName* name2range = registerAllocator.name2range;
|
||||
|
||||
ControlGraph& controlGraph = registerAllocator.controlGraph;
|
||||
ControlNode** nodes = controlGraph.dfsList;
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
|
||||
for (Uint32 n = 0; n < nNodes; n++) {
|
||||
InstructionList& instructions = nodes[n]->getInstructions();
|
||||
|
||||
for (InstructionList::iterator i = instructions.begin(); !instructions.done(i); i = instructions.advance(i)) {
|
||||
Instruction& instruction = instructions.get(i);
|
||||
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
for (InstructionUse* usePtr = instruction.getInstructionUseBegin(); usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister()) {
|
||||
usePtr->setRegisterName(color[name2range[usePtr->getRegisterName()]]);
|
||||
#ifdef DEBUG
|
||||
RegisterID rid = usePtr->getRegisterID();
|
||||
setColoredRegister(rid);
|
||||
usePtr->setRegisterID(rid);
|
||||
#endif // DEBUG
|
||||
}
|
||||
|
||||
InstructionDefine* defineEnd = instruction.getInstructionDefineEnd();
|
||||
for (InstructionDefine* definePtr = instruction.getInstructionDefineBegin(); definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister()) {
|
||||
definePtr->setRegisterName(color[name2range[definePtr->getRegisterName()]]);
|
||||
#ifdef DEBUG
|
||||
RegisterID rid = definePtr->getRegisterID();
|
||||
setColoredRegister(rid);
|
||||
definePtr->setRegisterID(rid);
|
||||
#endif // DEBUG
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <class RegisterPressure>
|
||||
bool Coloring<RegisterPressure>::select(RegisterAllocator& registerAllocator, RegisterName* coloringStack, RegisterName* coloringStackPtr)
|
||||
{
|
||||
Uint32 rangeCount = registerAllocator.rangeCount;
|
||||
RegisterName* color = new RegisterName[rangeCount];
|
||||
registerAllocator.color = color;
|
||||
|
||||
for (Uint32 r = 1; r < rangeCount; r++)
|
||||
color[r] = RegisterName(6); // FIX;
|
||||
|
||||
// Color the preColored registers.
|
||||
//
|
||||
VirtualRegisterManager& vrManager = registerAllocator.vrManager;
|
||||
RegisterName* name2range = registerAllocator.name2range;
|
||||
PreColoredRegister* machineEnd = vrManager.getMachineRegistersEnd();
|
||||
for (PreColoredRegister* machinePtr = vrManager.getMachineRegistersBegin(); machinePtr < machineEnd; machinePtr++)
|
||||
if (machinePtr->id != invalidID) {
|
||||
color[name2range[getName(machinePtr->id)]] = machinePtr->color;
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("\twill preColor range %d as %d\n", name2range[getName(machinePtr->id)], machinePtr->color));
|
||||
}
|
||||
|
||||
SpillCost* cost = registerAllocator.spillCost;
|
||||
Pool& pool = registerAllocator.pool;
|
||||
SparseSet& spill = *new(pool) SparseSet(pool, rangeCount);
|
||||
registerAllocator.willSpill = &spill;
|
||||
SparseSet neighborColors(pool, 6); // FIX
|
||||
InterferenceGraph<RegisterPressure>& iGraph = registerAllocator.iGraph;
|
||||
|
||||
bool coloringFailed = false;
|
||||
while (coloringStackPtr > coloringStack) {
|
||||
RegisterName range = *--coloringStackPtr;
|
||||
|
||||
if (!cost[range].infinite && cost[range].cost < 0) {
|
||||
coloringFailed = true;
|
||||
spill.set(range);
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("\tfailed to color %d, will spill.\n", range));
|
||||
} else {
|
||||
neighborColors.clear();
|
||||
|
||||
for (InterferenceVector* vector = iGraph.getInterferenceVector(range); vector != NULL; vector = vector->next)
|
||||
for (Int32 i = vector->count - 1; i >= 0; --i) {
|
||||
RegisterName neighborColor = color[vector->neighbors[i]];
|
||||
if (neighborColor < 6) // FIX
|
||||
neighborColors.set(neighborColor);
|
||||
}
|
||||
|
||||
if (neighborColors.getSize() == 6) { // FIX
|
||||
coloringFailed = true;
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("\tfailed to color %d, ", range));
|
||||
|
||||
if (!Splits<RegisterPressure>::findSplit(registerAllocator, color, range)) {
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("will spill.\n"));
|
||||
spill.set(range);
|
||||
} else
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("will split.\n"));
|
||||
} else {
|
||||
for (Uint32 i = 0; i < 6; i++) // FIX
|
||||
if (!neighborColors.test(i)) {
|
||||
fprintf(stdout, "\twill color %d as %d\n", range, i);
|
||||
color[range] = RegisterName(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
if (coloringFailed) {
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("Coloring failed:\n"));
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("\twill spill: "));
|
||||
spill.printPretty(UT_LOG_MODULE(RegAlloc));
|
||||
} else {
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("Coloring succeeded:\n"));
|
||||
for (Uint32 i = 1; i < rangeCount; i++)
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("\trange %d colored as %d\n", i, color[i]));
|
||||
}
|
||||
#endif
|
||||
|
||||
return !coloringFailed;
|
||||
}
|
||||
|
||||
template <class RegisterPressure>
|
||||
RegisterName* Coloring<RegisterPressure>::simplify(RegisterAllocator& registerAllocator, RegisterName* coloringStack)
|
||||
{
|
||||
InterferenceGraph<RegisterPressure>& iGraph = registerAllocator.iGraph;
|
||||
SpillCost* spillCost = registerAllocator.spillCost;
|
||||
Uint32 rangeCount = registerAllocator.rangeCount;
|
||||
|
||||
Uint32* degree = new Uint32[rangeCount];
|
||||
for (RegisterName i = RegisterName(1); i < rangeCount; i = RegisterName(i + 1)) {
|
||||
InterferenceVector* vector = iGraph.getInterferenceVector(i);
|
||||
degree[i] = (vector != NULL) ? vector->count : 0;
|
||||
}
|
||||
|
||||
Pool& pool = registerAllocator.pool;
|
||||
SparseSet low(pool, rangeCount);
|
||||
SparseSet high(pool, rangeCount);
|
||||
SparseSet highInfinite(pool, rangeCount);
|
||||
SparseSet preColored(pool, rangeCount);
|
||||
|
||||
// Get the precolored registers.
|
||||
//
|
||||
VirtualRegisterManager& vrManager = registerAllocator.vrManager;
|
||||
RegisterName* name2range = registerAllocator.name2range;
|
||||
PreColoredRegister* machineEnd = vrManager.getMachineRegistersEnd();
|
||||
for (PreColoredRegister* machinePtr = vrManager.getMachineRegistersBegin(); machinePtr < machineEnd; machinePtr++)
|
||||
if (machinePtr->id != invalidID)
|
||||
preColored.set(name2range[getName(machinePtr->id)]);
|
||||
|
||||
// Insert the live ranges in the sets.
|
||||
//
|
||||
for (Uint32 range = 1; range < rangeCount; range++)
|
||||
if (!preColored.test(range))
|
||||
if (degree[range] < 6) // FIX
|
||||
low.set(range);
|
||||
else if (!spillCost[range].infinite)
|
||||
high.set(range);
|
||||
else
|
||||
highInfinite.set(range);
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("Coloring sets:\n\tlow = "));
|
||||
low.printPretty(UT_LOG_MODULE(RegAlloc));
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("\thigh = "));
|
||||
high.printPretty(UT_LOG_MODULE(RegAlloc));
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("\thighInfinite = "));
|
||||
highInfinite.printPretty(UT_LOG_MODULE(RegAlloc));
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("\tpreColored = "));
|
||||
preColored.printPretty(UT_LOG_MODULE(RegAlloc));
|
||||
#endif // DEBUG_LOG
|
||||
|
||||
RegisterName* coloringStackPtr = coloringStack;
|
||||
|
||||
while (low.getSize() != 0 || high.getSize() != 0) {
|
||||
while (low.getSize() != 0) {
|
||||
RegisterName range = RegisterName(low.getOne());
|
||||
low.clear(range);
|
||||
*coloringStackPtr++ = range;
|
||||
|
||||
for (InterferenceVector* vector = iGraph.getInterferenceVector(range); vector != NULL; vector = vector->next)
|
||||
for (Int32 i = (vector->count - 1); i >= 0; --i) {
|
||||
RegisterName neighbor = vector->neighbors[i];
|
||||
degree[neighbor]--;
|
||||
|
||||
if (degree[neighbor] < 6) // FIX
|
||||
if (high.test(neighbor)) {
|
||||
high.clear(neighbor);
|
||||
low.set(neighbor);
|
||||
} else if (highInfinite.test(neighbor)) {
|
||||
highInfinite.clear(neighbor);
|
||||
low.set(neighbor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (high.getSize() != 0) {
|
||||
RegisterName best = RegisterName(high.getOne());
|
||||
double bestCost = spillCost[best].cost;
|
||||
double bestDegree = degree[best];
|
||||
|
||||
// Choose the next best candidate.
|
||||
//
|
||||
for (SparseSet::iterator i = high.begin(); !high.done(i); i = high.advance(i)) {
|
||||
RegisterName range = RegisterName(high.get(i));
|
||||
double thisCost = spillCost[range].cost;
|
||||
double thisDegree = degree[range];
|
||||
|
||||
if (thisCost * bestDegree < bestCost * thisDegree) {
|
||||
best = range;
|
||||
bestCost = thisCost;
|
||||
bestDegree = thisDegree;
|
||||
}
|
||||
}
|
||||
|
||||
high.clear(best);
|
||||
low.set(best);
|
||||
}
|
||||
}
|
||||
assert(highInfinite.getSize() == 0);
|
||||
|
||||
delete degree;
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("Coloring stack:\n\t"));
|
||||
for (RegisterName* sp = coloringStack; sp < coloringStackPtr; ++sp)
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("%d ", *sp));
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("\n"));
|
||||
#endif // DEBUG_LOG
|
||||
|
||||
return coloringStackPtr;
|
||||
}
|
||||
|
||||
|
||||
template <class RegisterPressure>
|
||||
bool Coloring<RegisterPressure>::color(RegisterAllocator& registerAllocator)
|
||||
{
|
||||
RegisterName* coloringStack = new RegisterName[registerAllocator.rangeCount];
|
||||
return select(registerAllocator, coloringStack, simplify(registerAllocator, coloringStack));
|
||||
}
|
||||
@@ -1,212 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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 "Fundamentals.h"
|
||||
#include <string.h>
|
||||
#include "ControlGraph.h"
|
||||
#include "ControlNodes.h"
|
||||
|
||||
#include "DominatorGraph.h"
|
||||
|
||||
DominatorGraph::DominatorGraph(ControlGraph& controlGraph) : controlGraph(controlGraph)
|
||||
{
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
|
||||
GtoV = new Uint32[nNodes + 1];
|
||||
VtoG = new Uint32[nNodes + 1];
|
||||
|
||||
Uint32 v = 1;
|
||||
for (Uint32 n = 0; n < nNodes; n++) {
|
||||
VtoG[v] = n;
|
||||
GtoV[n] = v++;
|
||||
}
|
||||
|
||||
// Initialize all the 1-based arrays.
|
||||
//
|
||||
parent = new Uint32[v];
|
||||
semi = new Uint32[v];
|
||||
vertex = new Uint32[v];
|
||||
label = new Uint32[v];
|
||||
size = new Uint32[v];
|
||||
ancestor = new Uint32[v];
|
||||
child = new Uint32[v];
|
||||
dom = new Uint32[v];
|
||||
bucket = new DGLinkedList*[v];
|
||||
|
||||
memset(semi, '\0', v * sizeof(Uint32));
|
||||
memset(bucket, '\0', v * sizeof(DGLinkedList*));
|
||||
|
||||
vCount = v;
|
||||
|
||||
build();
|
||||
|
||||
delete parent;
|
||||
delete semi;
|
||||
delete vertex;
|
||||
delete label;
|
||||
delete size;
|
||||
delete ancestor;
|
||||
delete child;
|
||||
delete dom;
|
||||
delete bucket;
|
||||
}
|
||||
|
||||
Uint32 DominatorGraph::DFS(Uint32 vx, Uint32 n)
|
||||
{
|
||||
semi[vx] = ++n;
|
||||
vertex[n] = label[vx] = vx;
|
||||
ancestor[vx] = child[vx] = 0;
|
||||
size[vx] = 1;
|
||||
|
||||
|
||||
ControlNode& node = *controlGraph.dfsList[VtoG[vx]];
|
||||
ControlEdge* successorEnd = node.getSuccessorsEnd();
|
||||
for (ControlEdge* successorPtr = node.getSuccessorsBegin(); successorPtr < successorEnd; successorPtr++) {
|
||||
Uint32 w = GtoV[successorPtr->getTarget().dfsNum];
|
||||
if (semi[w] == 0) {
|
||||
parent[w] = vx;
|
||||
n = DFS(w, n);
|
||||
}
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
void DominatorGraph::LINK(Uint32 vx, Uint32 w)
|
||||
{
|
||||
Uint32 s = w;
|
||||
|
||||
while (semi[label[w]] < semi[label[child[s]]]) {
|
||||
if (size[s] + size[child[child[s]]] >= (size[child[s]] << 1)) {
|
||||
ancestor[child[s]] = s;
|
||||
child[s] = child[child[s]];
|
||||
} else {
|
||||
size[child[s]] = size[s];
|
||||
s = ancestor[s] = child[s];
|
||||
}
|
||||
}
|
||||
label[s] = label[w];
|
||||
size[vx] += size[w];
|
||||
if(size[vx] < (size[w] << 1)) {
|
||||
Uint32 t = s;
|
||||
s = child[vx];
|
||||
child[vx] = t;
|
||||
}
|
||||
while( s != 0 ) {
|
||||
ancestor[s] = vx;
|
||||
s = child[s];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void DominatorGraph::COMPRESS(Uint32 vx)
|
||||
{
|
||||
if(ancestor[ancestor[vx]] != 0) {
|
||||
COMPRESS(ancestor[vx]);
|
||||
if(semi[label[ancestor[vx]]] < semi[label[vx]])
|
||||
label[vx] = label[ancestor[vx]];
|
||||
ancestor[vx] = ancestor[ancestor[vx]];
|
||||
}
|
||||
}
|
||||
|
||||
Uint32 DominatorGraph::EVAL(Uint32 vx)
|
||||
{
|
||||
if(ancestor[vx] == 0)
|
||||
return label[vx];
|
||||
COMPRESS(vx);
|
||||
return (semi[label[ancestor[vx]]] >= semi[label[vx]]) ? label[vx] : label[ancestor[vx]];
|
||||
}
|
||||
|
||||
void DominatorGraph::build()
|
||||
{
|
||||
Uint32 n = DFS(GtoV[0], 0);
|
||||
size[0] = label[0] = semi[0];
|
||||
|
||||
for (Uint32 i = n; i >= 2; i--) {
|
||||
Uint32 w = vertex[i];
|
||||
|
||||
ControlNode& node = *controlGraph.dfsList[VtoG[w]];
|
||||
const DoublyLinkedList<ControlEdge>& predecessors = node.getPredecessors();
|
||||
for (DoublyLinkedList<ControlEdge>::iterator p = predecessors.begin(); !predecessors.done(p); p = predecessors.advance(p)) {
|
||||
Uint32 vx = GtoV[predecessors.get(p).getSource().dfsNum];
|
||||
Uint32 u = EVAL(vx);
|
||||
|
||||
if(semi[u] < semi[w])
|
||||
semi[w] = semi[u];
|
||||
}
|
||||
|
||||
DGLinkedList* elem = new DGLinkedList();
|
||||
elem->next = bucket[vertex[semi[w]]];
|
||||
elem->index = w;
|
||||
bucket[vertex[semi[w]]] = elem;
|
||||
|
||||
LINK(parent[w], w);
|
||||
|
||||
elem = bucket[parent[w]];
|
||||
while(elem != NULL) {
|
||||
Uint32 vx = elem->index;
|
||||
Uint32 u = EVAL(vx);
|
||||
dom[vx] = (semi[u] < semi[vx]) ? u : parent[w];
|
||||
elem = elem->next;
|
||||
}
|
||||
}
|
||||
|
||||
memset(size, '\0', n * sizeof(Uint32));
|
||||
Pool& pool = controlGraph.pool;
|
||||
nodes = new(pool) DGNode[n];
|
||||
|
||||
for(Uint32 j = 2; j <= n; j++) {
|
||||
Uint32 w = vertex[j];
|
||||
Uint32 d = dom[w];
|
||||
if(d != vertex[semi[w]]) {
|
||||
d = dom[d];
|
||||
dom[w] = d;
|
||||
}
|
||||
size[d]++;
|
||||
}
|
||||
dom[GtoV[0]] = 0;
|
||||
|
||||
for (Uint32 k = 1; k <= n; k++) {
|
||||
DGNode& node = nodes[VtoG[k]];
|
||||
Uint32 count = size[k];
|
||||
node.successorsEnd = node.successorsBegin = (count) ? new(pool) Uint32[count] : (Uint32*) 0;
|
||||
}
|
||||
|
||||
for (Uint32 l = 2; l <= n; l++)
|
||||
*(nodes[VtoG[dom[l]]].successorsEnd)++ = VtoG[l];
|
||||
}
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
void DominatorGraph::printPretty(LogModuleObject log)
|
||||
{
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("Dominator Graph:\n"));
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
for (Uint32 i = 0; i < nNodes; i++) {
|
||||
DGNode& node = nodes[i];
|
||||
if (node.successorsBegin != node.successorsEnd) {
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("\tN%d dominates ", i));
|
||||
for (Uint32* successorsPtr = node.successorsBegin; successorsPtr < node.successorsEnd; successorsPtr++)
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("N%d ", *successorsPtr));
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("\n"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // DEBUG_LOG
|
||||
|
||||
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _DOMINATOR_GRAPH_H_
|
||||
#define _DOMINATOR_GRAPH_H_
|
||||
|
||||
#include "LogModule.h"
|
||||
|
||||
class ControlGraph;
|
||||
|
||||
struct DGNode
|
||||
{
|
||||
Uint32* successorsBegin;
|
||||
Uint32* successorsEnd;
|
||||
};
|
||||
|
||||
struct DGLinkedList
|
||||
{
|
||||
DGLinkedList* next;
|
||||
Uint32 index;
|
||||
};
|
||||
|
||||
class DominatorGraph
|
||||
{
|
||||
private:
|
||||
|
||||
ControlGraph& controlGraph;
|
||||
|
||||
Uint32 vCount;
|
||||
|
||||
Uint32* VtoG;
|
||||
Uint32* GtoV;
|
||||
Uint32* parent;
|
||||
Uint32* semi;
|
||||
Uint32* vertex;
|
||||
Uint32* label;
|
||||
Uint32* size;
|
||||
Uint32* ancestor;
|
||||
Uint32* child;
|
||||
Uint32* dom;
|
||||
DGLinkedList** bucket;
|
||||
DGNode* nodes;
|
||||
|
||||
private:
|
||||
|
||||
void build();
|
||||
|
||||
Uint32 DFS(Uint32 vx, Uint32 n);
|
||||
void LINK(Uint32 vx, Uint32 w);
|
||||
void COMPRESS(Uint32 vx);
|
||||
Uint32 EVAL(Uint32 vx);
|
||||
|
||||
public:
|
||||
|
||||
DominatorGraph(ControlGraph& controlGraph);
|
||||
|
||||
Uint32* getSuccessorsBegin(Uint32 n) const {return nodes[n].successorsBegin;}
|
||||
Uint32* getSuccessorsEnd(Uint32 n) const {return nodes[n].successorsEnd;}
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
void printPretty(LogModuleObject log);
|
||||
#endif // DEBUG_LOG
|
||||
};
|
||||
|
||||
#endif // _DOMINATOR_GRAPH_H_
|
||||
@@ -1,97 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _HASH_SET_H_
|
||||
#define _HASH_SET_H_
|
||||
|
||||
#include "Fundamentals.h"
|
||||
#include "Pool.h"
|
||||
#include <string.h>
|
||||
|
||||
struct HashSetElement
|
||||
{
|
||||
Uint32 index;
|
||||
HashSetElement* next;
|
||||
};
|
||||
|
||||
class HashSet
|
||||
{
|
||||
private:
|
||||
|
||||
static const hashSize = 64;
|
||||
|
||||
// Return the hash code for the given element index.
|
||||
static Uint32 getHashCode(Uint32 index) {return index & (hashSize - 1);} // Could be better !
|
||||
|
||||
private:
|
||||
|
||||
Pool& allocationPool;
|
||||
HashSetElement** bucket;
|
||||
HashSetElement* free;
|
||||
|
||||
private:
|
||||
|
||||
// No copy constructor.
|
||||
HashSet(const HashSet&);
|
||||
// No copy operator.
|
||||
void operator = (const HashSet&);
|
||||
|
||||
public:
|
||||
|
||||
// Create a new HashSet.
|
||||
inline HashSet(Pool& pool, Uint32 universeSize);
|
||||
|
||||
// Clear the hashset.
|
||||
void clear();
|
||||
// Clear the element for the given index.
|
||||
void clear(Uint32 index);
|
||||
// Set the element for the given index.
|
||||
void set(Uint32 index);
|
||||
// Return true if the element at index is a member.
|
||||
bool test(Uint32 index) const;
|
||||
// Union with the given hashset.
|
||||
inline void or(const HashSet& set);
|
||||
// Intersection with the given hashset.
|
||||
inline void and(const HashSet& set);
|
||||
// Difference with the given hashset.
|
||||
inline void difference(const HashSet& set);
|
||||
|
||||
// Logical operators.
|
||||
HashSet& operator |= (const HashSet& set) {or(set); return *this;}
|
||||
HashSet& operator &= (const HashSet& set) {and(set); return *this;}
|
||||
HashSet& operator -= (const HashSet& set) {difference(set); return *this;}
|
||||
|
||||
// Iterator to conform with the set API.
|
||||
typedef HashSetElement* iterator;
|
||||
// Return the iterator for the first element of this set.
|
||||
iterator begin() const;
|
||||
// Return the next iterator.
|
||||
iterator advance(iterator pos) const;
|
||||
// Return true if the iterator is at the end of the set.
|
||||
bool done(iterator pos) const {return pos == NULL;}
|
||||
};
|
||||
|
||||
|
||||
inline HashSet::HashSet(Pool& pool, Uint32 /*universeSize*/)
|
||||
: allocationPool(pool), free(NULL)
|
||||
{
|
||||
bucket = new(pool) HashSetElement*[hashSize];
|
||||
memset(bucket, '\0', sizeof(HashSetElement*));
|
||||
}
|
||||
|
||||
#endif // _HASH_SET_H_
|
||||
@@ -1,213 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _INDEXED_POOL_H_
|
||||
#define _INDEXED_POOL_H_
|
||||
|
||||
#include "Fundamentals.h"
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// IndexedPool<IndexedObjectSubclass> is an indexed pool of objects. The
|
||||
// template parameter 'IndexedObjectSubclass' must be a subclass of the struct
|
||||
// IndexedObject.
|
||||
//
|
||||
// When the indexed pool is ask to allocate and initialize a new object (using
|
||||
// the operator new(anIndexedPool) it will zero the memory used to store the
|
||||
// object and initialize the field 'index' of this object to its position in
|
||||
// the pool.
|
||||
//
|
||||
// An object allocated by the indexed pool can be freed by calling the method
|
||||
// IndexedPool::release(IndexedElement& objectIndex).
|
||||
//
|
||||
// example:
|
||||
//
|
||||
// IndexedPool<IndexedElement> elementPool;
|
||||
//
|
||||
// IndexedElement& element1 = *new(elementPool) IndexedElement();
|
||||
// IndexedElement& element2 = *new(elementPool) IndexedElement();
|
||||
//
|
||||
// indexedPool.release(element1);
|
||||
// IndexedElement& element3 = *new(elementPool) IndexedElement();
|
||||
//
|
||||
// At this point element1 is no longer a valid object, element2 is at
|
||||
// index 2 and element3 is at index 1.
|
||||
//
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// IndexedObject -
|
||||
//
|
||||
|
||||
template<class Object>
|
||||
struct IndexedObject
|
||||
{
|
||||
Uint32 index; // Index in the pool.
|
||||
Object* next; // Used to link IndexedObject together.
|
||||
|
||||
Uint32 getIndex() {return index;}
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// IndexedPool<IndexedObject> -
|
||||
//
|
||||
|
||||
template <class IndexedObject>
|
||||
class IndexedPool
|
||||
{
|
||||
private:
|
||||
|
||||
static const blockSize = 4; // Size of one block.
|
||||
|
||||
Uint32 nBlocks; // Number of blocks in the pool.
|
||||
IndexedObject** block; // Array of block pointers.
|
||||
IndexedObject* freeObjects; // Chained list of free IndexedObjects.
|
||||
Uint32 nextIndex; // Index of the next free object in the last block.
|
||||
|
||||
private:
|
||||
|
||||
void allocateAnotherBlock();
|
||||
IndexedObject& newObject();
|
||||
|
||||
public:
|
||||
|
||||
IndexedPool() : nBlocks(0), block(NULL), freeObjects(NULL), nextIndex(1) {}
|
||||
~IndexedPool();
|
||||
|
||||
IndexedObject& get(Uint32 index) const;
|
||||
void release(IndexedObject& object);
|
||||
|
||||
void setSize(Uint32 size) {assert(size < nextIndex); nextIndex = size;}
|
||||
|
||||
// Return the universe size.
|
||||
Uint32 getSize() {return nextIndex;}
|
||||
|
||||
friend void* operator new(size_t, IndexedPool<IndexedObject>& pool); // Needs to call newObject().
|
||||
};
|
||||
|
||||
// Free all the memory allocated for this object.
|
||||
//
|
||||
template <class IndexedObject>
|
||||
IndexedPool<IndexedObject>::~IndexedPool()
|
||||
{
|
||||
for (Uint32 n = 0; n < nBlocks; n++)
|
||||
free(&((IndexedObject **) &block[n][n*blockSize])[-(n + 1)]);
|
||||
}
|
||||
|
||||
// Release the given. This object will be iserted in the chained
|
||||
// list of free IndexedObjects. To minimize the fragmentation the chained list
|
||||
// is ordered by ascending indexes.
|
||||
//
|
||||
template <class IndexedObject>
|
||||
void IndexedPool<IndexedObject>::release(IndexedObject& object)
|
||||
{
|
||||
Uint32 index = object.index;
|
||||
IndexedObject* list = freeObjects;
|
||||
|
||||
assert(&object == &get(index)); // Make sure that object is owned by this pool.
|
||||
|
||||
if (list == NULL) { // The list is empty.
|
||||
freeObjects = &object;
|
||||
object.next = NULL;
|
||||
} else { // The list contains at least 1 element.
|
||||
if (index < list->index) { // insert as first element.
|
||||
freeObjects = &object;
|
||||
object.next = list;
|
||||
} else { // Find this object's place.
|
||||
while ((list->next) != NULL && (list->next->index < index))
|
||||
list = list->next;
|
||||
|
||||
object.next = list->next;
|
||||
list->next = &object;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
// Sanity check to be sure that the list is correctly ordered.
|
||||
for (IndexedObject* obj = freeObjects; obj != NULL; obj = obj->next)
|
||||
if (obj->next != NULL)
|
||||
assert(obj->index < obj->next->index);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Create a new block of IndexedObjects. We will allocate the memory to
|
||||
// store IndexedPool::blockSize IndexedObject and the new Array of block
|
||||
// pointers.
|
||||
// The newly created IndexedObjects will not be initialized.
|
||||
//
|
||||
template <class IndexedObject>
|
||||
void IndexedPool<IndexedObject>::allocateAnotherBlock()
|
||||
{
|
||||
void* memory = (void *) malloc((nBlocks + 1) * sizeof(Uint32) + blockSize * sizeof(IndexedObject));
|
||||
|
||||
memcpy(memory, block, nBlocks * sizeof(Uint32));
|
||||
|
||||
block = (IndexedObject **) memory;
|
||||
IndexedObject* objects = (IndexedObject *) &block[nBlocks + 1];
|
||||
|
||||
block[nBlocks] = &objects[-(nBlocks * blockSize)];
|
||||
nBlocks++;
|
||||
}
|
||||
|
||||
// Return the IndexedObject at the position 'index' in the pool.
|
||||
//
|
||||
template <class IndexedObject>
|
||||
IndexedObject& IndexedPool<IndexedObject>::get(Uint32 index) const
|
||||
{
|
||||
Uint32 blockIndex = index / blockSize;
|
||||
assert(blockIndex < nBlocks);
|
||||
|
||||
return block[blockIndex][index];
|
||||
}
|
||||
|
||||
// Return the reference of an unused object in the pool.
|
||||
//
|
||||
template <class IndexedObject>
|
||||
IndexedObject& IndexedPool<IndexedObject>::newObject()
|
||||
{
|
||||
if (freeObjects != NULL) {
|
||||
IndexedObject& newObject = *freeObjects;
|
||||
freeObjects = newObject.next;
|
||||
return newObject;
|
||||
}
|
||||
|
||||
Uint32 nextIndex = this->nextIndex++;
|
||||
Uint32 blockIndex = nextIndex / blockSize;
|
||||
|
||||
while (blockIndex >= nBlocks)
|
||||
allocateAnotherBlock();
|
||||
|
||||
IndexedObject& newObject = block[blockIndex][nextIndex];
|
||||
newObject.index = nextIndex;
|
||||
|
||||
return newObject;
|
||||
}
|
||||
|
||||
// Return the address of the next unsused object in the given
|
||||
// indexed pool. The field index of the newly allocated object
|
||||
// will be initialized to the corresponding index of this object
|
||||
// in the pool.
|
||||
//
|
||||
template <class IndexedObject>
|
||||
void* operator new(size_t size, IndexedPool<IndexedObject>& pool)
|
||||
{
|
||||
assert(size == sizeof(IndexedObject));
|
||||
return (void *) &pool.newObject();
|
||||
}
|
||||
|
||||
#endif // _INDEXED_POOL_H_
|
||||
@@ -1,258 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _INTERFERENCE_GRAPH_H_
|
||||
#define _INTERFERENCE_GRAPH_H_
|
||||
|
||||
#include "Fundamentals.h"
|
||||
#include "ControlGraph.h"
|
||||
#include "Primitives.h"
|
||||
#include "Instruction.h"
|
||||
#include "VirtualRegister.h"
|
||||
#include "RegisterPressure.h"
|
||||
#include "SparseSet.h"
|
||||
#include <string.h>
|
||||
|
||||
struct InterferenceVector
|
||||
{
|
||||
Uint32 count;
|
||||
InterferenceVector* next;
|
||||
RegisterName* neighbors;
|
||||
|
||||
InterferenceVector() : count(0), next(NULL) {}
|
||||
};
|
||||
|
||||
class RegisterAllocator;
|
||||
|
||||
template <class RegisterPressure>
|
||||
class InterferenceGraph
|
||||
{
|
||||
private:
|
||||
|
||||
RegisterAllocator& registerAllocator;
|
||||
|
||||
RegisterPressure::Set* interferences;
|
||||
InterferenceVector** vector;
|
||||
Uint32* offset;
|
||||
Uint32 rangeCount;
|
||||
|
||||
private:
|
||||
|
||||
// No copy constructor.
|
||||
InterferenceGraph(const InterferenceGraph&);
|
||||
// No copy operator.
|
||||
void operator = (const InterferenceGraph&);
|
||||
|
||||
// Check if reg is a member of the universe.
|
||||
void checkMember(RegisterName name) {assert(name < rangeCount);}
|
||||
// Return the edge index for the interference between name1 and name2.
|
||||
Uint32 getEdgeIndex(RegisterName name1, RegisterName name2);
|
||||
|
||||
public:
|
||||
InterferenceGraph(RegisterAllocator& registerAllocator) : registerAllocator(registerAllocator) {}
|
||||
|
||||
// Calculate the interferences.
|
||||
void build();
|
||||
// Return true if reg1 and reg2 interfere.
|
||||
bool interfere(RegisterName name1, RegisterName name2);
|
||||
// Return the interference vector for the given register or NULL if there is none.
|
||||
InterferenceVector* getInterferenceVector(RegisterName name) {return vector[name];}
|
||||
// Set the interference between name1 and name2.
|
||||
void setInterference(RegisterName name1, RegisterName name2);
|
||||
// Set the interference vector for the given register.
|
||||
void setInterferenceVector(RegisterName name, InterferenceVector* v) {vector[name] = v;}
|
||||
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
// Print the interferences.
|
||||
void printPretty(LogModuleObject log);
|
||||
#endif // DEBUG_LOG
|
||||
};
|
||||
|
||||
template <class RegisterPressure>
|
||||
void InterferenceGraph<RegisterPressure>::build()
|
||||
{
|
||||
Pool& pool = registerAllocator.pool;
|
||||
Uint32 rangeCount = registerAllocator.rangeCount;
|
||||
this->rangeCount = rangeCount;
|
||||
|
||||
// Initialize the structures.
|
||||
//
|
||||
offset = new(pool) Uint32[rangeCount + 1];
|
||||
vector = new(pool) InterferenceVector*[rangeCount];
|
||||
memset(vector, '\0', sizeof(InterferenceVector*) * rangeCount);
|
||||
|
||||
Uint32 o = 0;
|
||||
offset[0] = 0;
|
||||
for (Uint32 i = 1; i <= rangeCount; ++i) {
|
||||
offset[i] = o;
|
||||
o += i;
|
||||
}
|
||||
|
||||
interferences = new(pool) RegisterPressure::Set(pool, (rangeCount * rangeCount) / 2);
|
||||
|
||||
ControlGraph& controlGraph = registerAllocator.controlGraph;
|
||||
ControlNode** nodes = controlGraph.dfsList;
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
|
||||
RegisterName* name2range = registerAllocator.name2range;
|
||||
LivenessInfo<RegisterPressure> liveness = Liveness<RegisterPressure>::analysis(controlGraph, rangeCount, name2range);
|
||||
registerAllocator.liveness = liveness;
|
||||
SparseSet currentLive(pool, rangeCount);
|
||||
|
||||
for (Uint32 n = 0; n < nNodes; n++) {
|
||||
ControlNode& node = *nodes[n];
|
||||
currentLive = liveness.liveOut[n];
|
||||
|
||||
InstructionList& instructions = node.getInstructions();
|
||||
for (InstructionList::iterator i = instructions.end(); !instructions.done(i); i = instructions.retreat(i)) {
|
||||
Instruction& instruction = instructions.get(i);
|
||||
|
||||
InstructionUse* useBegin = instruction.getInstructionUseBegin();
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
InstructionUse* usePtr;
|
||||
InstructionDefine* defineBegin = instruction.getInstructionDefineBegin();
|
||||
InstructionDefine* defineEnd = instruction.getInstructionDefineEnd();
|
||||
InstructionDefine* definePtr;
|
||||
|
||||
// Handle the copy instruction to avoid unnecessary interference between the 2 registers.
|
||||
if ((instruction.getFlags() & ifCopy) != 0) {
|
||||
assert(useBegin != useEnd && useBegin[0].isRegister());
|
||||
currentLive.clear(name2range[useBegin[0].getRegisterName()]);
|
||||
}
|
||||
|
||||
// Create the interferences.
|
||||
for (definePtr = defineBegin; definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister()) {
|
||||
RegisterName define = name2range[definePtr->getRegisterName()];
|
||||
|
||||
for (SparseSet::iterator e = currentLive.begin(); !currentLive.done(e); e = currentLive.advance(e)) {
|
||||
RegisterName live = RegisterName(currentLive.get(e));
|
||||
|
||||
if ((live != define) && !interfere(live, define) && registerAllocator.canInterfere(live, define)) {
|
||||
|
||||
if (vector[define] == NULL)
|
||||
vector[define] = new(pool) InterferenceVector();
|
||||
vector[define]->count++;
|
||||
|
||||
if (vector[live] == NULL)
|
||||
vector[live] = new(pool) InterferenceVector();
|
||||
vector[live]->count++;
|
||||
|
||||
setInterference(live, define);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Now update the liveness.
|
||||
//
|
||||
for (definePtr = defineBegin; definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister())
|
||||
currentLive.clear(name2range[definePtr->getRegisterName()]);
|
||||
|
||||
for (usePtr = useBegin; usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister())
|
||||
currentLive.set(name2range[usePtr->getRegisterName()]);
|
||||
}
|
||||
}
|
||||
|
||||
// Allocate the memory to store the interferences.
|
||||
//
|
||||
for (Uint32 e = 0; e < rangeCount; e++)
|
||||
if (vector[e] != NULL) {
|
||||
InterferenceVector& v = *vector[e];
|
||||
v.neighbors = new(pool) RegisterName[v.count];
|
||||
v.count = 0;
|
||||
}
|
||||
|
||||
// Initialize the edges.
|
||||
//
|
||||
if (RegisterPressure::Set::isOrdered()) {
|
||||
RegisterName name1 = RegisterName(0);
|
||||
|
||||
for (RegisterPressure::Set::iterator i = interferences->begin(); !interferences->done(i); i = interferences->advance(i)) {
|
||||
Uint32 interferenceIndex = interferences->get(i);
|
||||
|
||||
while(interferenceIndex >= offset[name1 + 1])
|
||||
name1 = RegisterName(name1 + 1);
|
||||
|
||||
assert((interferenceIndex >= offset[name1]) && (interferenceIndex < offset[name1 + 1]));
|
||||
|
||||
RegisterName name2 = RegisterName(interferenceIndex - offset[name1]);
|
||||
|
||||
assert(interfere(name1, name2));
|
||||
|
||||
InterferenceVector& vector1 = *vector[name1];
|
||||
vector1.neighbors[vector1.count++] = name2;
|
||||
|
||||
InterferenceVector& vector2 = *vector[name2];
|
||||
vector2.neighbors[vector2.count++] = name1;
|
||||
}
|
||||
} else {
|
||||
trespass("not Implemented"); // FIX: need one more pass to initialize the vectors.
|
||||
}
|
||||
}
|
||||
|
||||
template <class RegisterPressure>
|
||||
Uint32 InterferenceGraph<RegisterPressure>::getEdgeIndex(RegisterName name1, RegisterName name2)
|
||||
{
|
||||
checkMember(name1); checkMember(name2);
|
||||
assert(name1 != name2); // This is not possible.
|
||||
return (name1 < name2) ? offset[name2] + name1 : offset[name1] + name2;
|
||||
}
|
||||
|
||||
template <class RegisterPressure>
|
||||
void InterferenceGraph<RegisterPressure>::setInterference(RegisterName name1, RegisterName name2)
|
||||
{
|
||||
interferences->set(getEdgeIndex(name1, name2));
|
||||
}
|
||||
|
||||
template <class RegisterPressure>
|
||||
bool InterferenceGraph<RegisterPressure>::interfere(RegisterName name1, RegisterName name2)
|
||||
{
|
||||
return interferences->test(getEdgeIndex(name1, name2));
|
||||
}
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
template <class RegisterPressure>
|
||||
void InterferenceGraph<RegisterPressure>::printPretty(LogModuleObject log)
|
||||
{
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("Interference Vectors:\n"));
|
||||
for (Uint32 i = 1; i < rangeCount; i++) {
|
||||
if (vector[i] != NULL) {
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("\tvr%d: (", i));
|
||||
for (InterferenceVector* v = vector[i]; v != NULL; v = v->next)
|
||||
for (Uint32 j = 0; j < v->count; j++) {
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("%d", v->neighbors[j]));
|
||||
if (v->next != NULL || j != (v->count - 1))
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, (","));
|
||||
}
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, (")\n"));
|
||||
}
|
||||
}
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("Interference Matrix:\n"));
|
||||
for (RegisterName name1 = RegisterName(1); name1 < rangeCount; name1 = RegisterName(name1 + 1)) {
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("\t%d:\t", name1));
|
||||
for (RegisterName name2 = RegisterName(1); name2 < rangeCount; name2 = RegisterName(name2 + 1))
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("%c", ((name1 != name2) && interfere(name1, name2)) ? '1' : '0'));
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("\n"));
|
||||
}
|
||||
}
|
||||
#endif // DEBUG_LOG
|
||||
|
||||
#endif // _INTERFERENCE_GRAPH_H_
|
||||
@@ -1,87 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _LIVE_RANGE_H_
|
||||
#define _LIVE_RANGE_H_
|
||||
|
||||
#include "Fundamentals.h"
|
||||
#include "ControlGraph.h"
|
||||
#include "ControlNodes.h"
|
||||
#include "Primitives.h"
|
||||
#include "Instruction.h"
|
||||
#include "RegisterAllocator.h"
|
||||
#include "RegisterAllocatorTools.h"
|
||||
|
||||
template <class RegisterPressure>
|
||||
struct LiveRange
|
||||
{
|
||||
static void build(RegisterAllocator& registerAllocator);
|
||||
};
|
||||
|
||||
template <class RegisterPressure>
|
||||
void LiveRange<RegisterPressure>::build(RegisterAllocator& registerAllocator)
|
||||
{
|
||||
// Intialize the lookup table.
|
||||
//
|
||||
Uint32 nameCount = registerAllocator.nameCount;
|
||||
RegisterName* nameTable = new(registerAllocator.pool) RegisterName[2*nameCount];
|
||||
RegisterName* rangeName = &nameTable[nameCount];
|
||||
|
||||
init(rangeName, nameCount);
|
||||
|
||||
// Walk the graph.
|
||||
//
|
||||
ControlGraph& controlGraph = registerAllocator.controlGraph;
|
||||
ControlNode** nodes = controlGraph.dfsList;
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
|
||||
SparseSet destination(registerAllocator.pool, nameCount);
|
||||
|
||||
for (Uint32 n = 0; n < nNodes; n++) {
|
||||
InstructionList& phiNodes = nodes[n]->getPhiNodeInstructions();
|
||||
|
||||
destination.clear();
|
||||
for (InstructionList::iterator i = phiNodes.begin(); !phiNodes.done(i); i = phiNodes.advance(i)) {
|
||||
Instruction& phiNode = phiNodes.get(i);
|
||||
assert(phiNode.getInstructionDefineBegin() != phiNode.getInstructionDefineEnd() && phiNode.getInstructionDefineBegin()[0].isRegister());
|
||||
destination.set(findRoot(phiNode.getInstructionDefineBegin()[0].getRegisterName(), rangeName));
|
||||
}
|
||||
|
||||
for (InstructionList::iterator p = phiNodes.begin(); !phiNodes.done(p); p = phiNodes.advance(p)) {
|
||||
Instruction& phiNode = phiNodes.get(p);
|
||||
|
||||
assert(phiNode.getInstructionDefineBegin() != phiNode.getInstructionDefineEnd() && phiNode.getInstructionDefineBegin()[0].isRegister());
|
||||
RegisterName destinationName = phiNode.getInstructionDefineBegin()[0].getRegisterName();
|
||||
RegisterName destinationRoot = findRoot(destinationName, rangeName);
|
||||
|
||||
InstructionUse* useEnd = phiNode.getInstructionUseEnd();
|
||||
for (InstructionUse* usePtr = phiNode.getInstructionUseBegin(); usePtr < useEnd; usePtr++) {
|
||||
assert(usePtr->isRegister());
|
||||
RegisterName sourceName = usePtr->getRegisterName();
|
||||
RegisterName sourceRoot = findRoot(sourceName, rangeName);
|
||||
|
||||
if (sourceRoot != destinationRoot && !destination.test(sourceRoot))
|
||||
rangeName[sourceRoot] = destinationRoot;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
registerAllocator.rangeCount = compress(registerAllocator.name2range, rangeName, nameCount, nameCount);
|
||||
}
|
||||
|
||||
#endif // _LIVE_RANGE_H_
|
||||
@@ -1,163 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _LIVE_RANGE_GRAPH_
|
||||
#define _LIVE_RANGE_GRAPH_
|
||||
|
||||
#include "Fundamentals.h"
|
||||
#include "Pool.h"
|
||||
#include "ControlGraph.h"
|
||||
#include "ControlNodes.h"
|
||||
#include "Instruction.h"
|
||||
#include "RegisterTypes.h"
|
||||
|
||||
class RegisterAllocator;
|
||||
|
||||
template <class RegisterPressure>
|
||||
class LiveRangeGraph
|
||||
{
|
||||
private:
|
||||
|
||||
RegisterAllocator& registerAllocator;
|
||||
|
||||
RegisterPressure::Set* edges;
|
||||
Uint32 rangeCount;
|
||||
|
||||
public:
|
||||
//
|
||||
//
|
||||
LiveRangeGraph(RegisterAllocator& registerAllocator) : registerAllocator(registerAllocator) {}
|
||||
|
||||
//
|
||||
//
|
||||
void build();
|
||||
|
||||
//
|
||||
//
|
||||
void addEdge(RegisterName name1, RegisterName name2);
|
||||
|
||||
//
|
||||
//
|
||||
bool haveEdge(RegisterName name1, RegisterName name2);
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
//
|
||||
//
|
||||
void printPretty(LogModuleObject log);
|
||||
#endif // DEBUG_LOG
|
||||
};
|
||||
|
||||
template <class RegisterPressure>
|
||||
void LiveRangeGraph<RegisterPressure>::build()
|
||||
{
|
||||
Pool& pool = registerAllocator.pool;
|
||||
Uint32 rangeCount = registerAllocator.rangeCount;
|
||||
this->rangeCount = rangeCount;
|
||||
|
||||
edges = new(pool) RegisterPressure::Set(pool, rangeCount * rangeCount);
|
||||
|
||||
ControlGraph& controlGraph = registerAllocator.controlGraph;
|
||||
ControlNode** nodes = controlGraph.dfsList;
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
|
||||
RegisterName* name2range = registerAllocator.name2range;
|
||||
LivenessInfo<RegisterPressure>& liveness = registerAllocator.liveness;
|
||||
SparseSet currentLive(pool, rangeCount);
|
||||
|
||||
for (Uint32 n = 0; n < nNodes; n++) {
|
||||
ControlNode& node = *nodes[n];
|
||||
currentLive = liveness.liveOut[n];
|
||||
|
||||
InstructionList& instructions = node.getInstructions();
|
||||
for (InstructionList::iterator i = instructions.end(); !instructions.done(i); i = instructions.retreat(i)) {
|
||||
Instruction& instruction = instructions.get(i);
|
||||
|
||||
InstructionUse* useBegin = instruction.getInstructionUseBegin();
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
InstructionUse* usePtr;
|
||||
InstructionDefine* defineBegin = instruction.getInstructionDefineBegin();
|
||||
InstructionDefine* defineEnd = instruction.getInstructionDefineEnd();
|
||||
InstructionDefine* definePtr;
|
||||
|
||||
if ((instruction.getFlags() & ifCopy) != 0) {
|
||||
assert(useBegin != useEnd && useBegin[0].isRegister());
|
||||
currentLive.clear(name2range[useBegin[0].getRegisterName()]);
|
||||
}
|
||||
|
||||
for (definePtr = defineBegin; definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister()) {
|
||||
RegisterName define = name2range[definePtr->getRegisterName()];
|
||||
|
||||
for (SparseSet::iterator l = currentLive.begin(); !currentLive.done(l); l = currentLive.advance(l)) {
|
||||
RegisterName live = RegisterName(currentLive.get(l));
|
||||
if (define != live && registerAllocator.canInterfere(define, live))
|
||||
addEdge(define, live);
|
||||
}
|
||||
}
|
||||
|
||||
for (definePtr = defineBegin; definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister())
|
||||
currentLive.clear(name2range[definePtr->getRegisterName()]);
|
||||
|
||||
for (usePtr = useBegin; usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister())
|
||||
currentLive.set(name2range[usePtr->getRegisterName()]);
|
||||
|
||||
for (usePtr = useBegin; usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister()) {
|
||||
RegisterName use = name2range[usePtr->getRegisterName()];
|
||||
|
||||
for (SparseSet::iterator l = currentLive.begin(); !currentLive.done(l); l = currentLive.advance(l)) {
|
||||
RegisterName live = RegisterName(currentLive.get(l));
|
||||
if (use != live && registerAllocator.canInterfere(use, live))
|
||||
addEdge(use, live);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <class RegisterPressure>
|
||||
void LiveRangeGraph<RegisterPressure>::addEdge(RegisterName name1, RegisterName name2)
|
||||
{
|
||||
assert(name1 != name2);
|
||||
edges->set(name1 * rangeCount + name2);
|
||||
}
|
||||
|
||||
template <class RegisterPressure>
|
||||
bool LiveRangeGraph<RegisterPressure>::haveEdge(RegisterName name1, RegisterName name2)
|
||||
{
|
||||
assert(name1 != name2);
|
||||
return edges->test(name1 * rangeCount + name2);
|
||||
}
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
template <class RegisterPressure>
|
||||
void LiveRangeGraph<RegisterPressure>::printPretty(LogModuleObject log)
|
||||
{
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("Live ranges graph:\n"));
|
||||
for (RegisterName name1 = RegisterName(1); name1 < rangeCount; name1 = RegisterName(name1 + 1)) {
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("\t%d:\t", name1));
|
||||
for (RegisterName name2 = RegisterName(1); name2 < rangeCount; name2 = RegisterName(name2 + 1))
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("%c", ((name1 != name2) && haveEdge(name1, name2)) ? '1' : '0'));
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("\n"));
|
||||
}
|
||||
}
|
||||
#endif // DEBUG_LOG
|
||||
|
||||
#endif // _LIVE_RANGE_GRAPH_
|
||||
@@ -1,301 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _LIVENESS_H_
|
||||
#define _LIVENESS_H_
|
||||
|
||||
#include "Fundamentals.h"
|
||||
#include "ControlGraph.h"
|
||||
#include "ControlNodes.h"
|
||||
#include "Instruction.h"
|
||||
#include "RegisterTypes.h"
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// LivenessInfo -
|
||||
|
||||
template <class RegisterPressure>
|
||||
struct LivenessInfo
|
||||
{
|
||||
RegisterPressure::Set* liveIn;
|
||||
RegisterPressure::Set* liveOut;
|
||||
DEBUG_LOG_ONLY(Uint32 size);
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
void printPretty(LogModuleObject log);
|
||||
#endif // DEBUG_LOG
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Liveness
|
||||
//
|
||||
// The liveness is defined by the following data-flow equations:
|
||||
//
|
||||
// LiveIn(n) = LocalLive(n) U (LiveOut(n) - Killed(n)).
|
||||
// LiveOut(n) = U LiveIn(s) (s a successor of n).
|
||||
//
|
||||
// where LocalLive(n) is the set of used registers in the block n, Killed(n)
|
||||
// is the set of defined registers in the block n, LiveIn(n) is the set of
|
||||
// live registers at the begining of the block n and LiveOut(n) is the set
|
||||
// of live registers at the end of the block n.
|
||||
//
|
||||
//
|
||||
// We will compute the liveness analysis in two stages:
|
||||
//
|
||||
// 1- Build LocalLive(n) (wich is an approximation of LiveIn(n)) and Killed(n)
|
||||
// for each block n.
|
||||
// 2- Perform a backward data-flow analysis to propagate the liveness information
|
||||
// through the entire control-flow graph.
|
||||
//
|
||||
|
||||
template <class RegisterPressure>
|
||||
struct Liveness
|
||||
{
|
||||
static LivenessInfo<RegisterPressure> analysis(ControlGraph& controlGraph, Uint32 rangeCount, const RegisterName* name2range);
|
||||
static LivenessInfo<RegisterPressure> analysis(ControlGraph& controlGraph, Uint32 nameCount);
|
||||
};
|
||||
|
||||
template <class RegisterPressure>
|
||||
LivenessInfo<RegisterPressure> Liveness<RegisterPressure>::analysis(ControlGraph& controlGraph, Uint32 rangeCount, const RegisterName* name2range)
|
||||
{
|
||||
Pool& pool = controlGraph.pool;
|
||||
ControlNode** nodes = controlGraph.dfsList;
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
|
||||
// Allocate the temporary sets.
|
||||
RegisterPressure::Set* killed = new(pool) RegisterPressure::Set[nNodes](pool, rangeCount);
|
||||
|
||||
// Allocate the globals sets.
|
||||
RegisterPressure::Set* liveIn = new(pool) RegisterPressure::Set[nNodes](pool, rangeCount);
|
||||
RegisterPressure::Set* liveOut = new(pool) RegisterPressure::Set[nNodes](pool, rangeCount);
|
||||
|
||||
// First stage of the liveness analysis: Compute the sets LocalLive(stored in LiveIn) and Killed.
|
||||
//
|
||||
for (Uint32 n = 0; n < (nNodes - 1); n++) {
|
||||
ControlNode& node = *nodes[n];
|
||||
|
||||
RegisterPressure::Set& currentLocalLive = liveIn[n];
|
||||
RegisterPressure::Set& currentKilled = killed[n];
|
||||
|
||||
// Find the instructions contributions to the sets LocalLive and Killed.
|
||||
//
|
||||
InstructionList& instructions = node.getInstructions();
|
||||
for (InstructionList::iterator i = instructions.begin(); !instructions.done(i); i = instructions.advance(i)) {
|
||||
Instruction& instruction = instructions.get(i);
|
||||
|
||||
// If a VirtualRegister is 'used' before being 'defined' then we add it to set LocalLive.
|
||||
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
for (InstructionUse* usePtr = instruction.getInstructionUseBegin(); usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister()) {
|
||||
Uint32 index = name2range[usePtr->getRegisterName()];
|
||||
|
||||
if (!currentKilled.test(index))
|
||||
currentLocalLive.set(index);
|
||||
}
|
||||
|
||||
// If a Virtualregister is 'defined' then we add it to the set Killed.
|
||||
InstructionDefine* defineEnd = instruction.getInstructionDefineEnd();
|
||||
for (InstructionDefine* definePtr = instruction.getInstructionDefineBegin(); definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister())
|
||||
currentKilled.set(name2range[definePtr->getRegisterName()]);
|
||||
}
|
||||
}
|
||||
|
||||
// Second stage of the liveness analysis: We propagate the LiveIn & LiveOut through the entire
|
||||
// control-flow graph.
|
||||
//
|
||||
RegisterPressure::Set temp(pool, rangeCount);
|
||||
|
||||
bool changed;
|
||||
do {
|
||||
changed = false;
|
||||
|
||||
// For all nodes is this graph except the endNode.
|
||||
for (Int32 n = (nNodes - 2); n >= 0; n--) {
|
||||
ControlNode& node = *nodes[n];
|
||||
|
||||
RegisterPressure::Set& currentLiveIn = liveIn[n];
|
||||
RegisterPressure::Set& currentLiveOut = liveOut[n];
|
||||
|
||||
// Compute temp = Union of LiveIn(s) (s a successor of this node) | usedByPhiNodes(n).
|
||||
// temp will be the new LiveOut(n).
|
||||
Uint32 nSuccessors = node.nSuccessors();
|
||||
if (nSuccessors != 0) {
|
||||
temp = liveIn[node.nthSuccessor(0).getTarget().dfsNum];
|
||||
for (Uint32 s = 1; s < nSuccessors; s++)
|
||||
temp |= liveIn[node.nthSuccessor(s).getTarget().dfsNum];
|
||||
} else
|
||||
temp.clear();
|
||||
|
||||
// If temp and LiveOut(n) differ then set LiveOut(n) = temp and recalculate the
|
||||
// new LiveIn(n).
|
||||
if (currentLiveOut != temp) {
|
||||
currentLiveOut = temp;
|
||||
temp -= killed[n]; // FIX: could be optimized with one call to unionDiff !
|
||||
temp |= currentLiveIn;
|
||||
|
||||
if (currentLiveIn != temp) {
|
||||
currentLiveIn = temp;
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} while(changed);
|
||||
|
||||
LivenessInfo<RegisterPressure> liveness;
|
||||
liveness.liveIn = liveIn;
|
||||
liveness.liveOut = liveOut;
|
||||
DEBUG_LOG_ONLY(liveness.size = nNodes);
|
||||
return liveness;
|
||||
}
|
||||
|
||||
template <class RegisterPressure>
|
||||
LivenessInfo<RegisterPressure> Liveness<RegisterPressure>::analysis(ControlGraph& controlGraph, Uint32 nameCount)
|
||||
{
|
||||
Pool& pool = controlGraph.pool;
|
||||
ControlNode** nodes = controlGraph.dfsList;
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
|
||||
// Allocate the temporary sets.
|
||||
RegisterPressure::Set* killed = new(pool) RegisterPressure::Set[nNodes](pool, nameCount);
|
||||
RegisterPressure::Set* usedByPhiNodes = NULL;
|
||||
|
||||
// Allocate the globals sets.
|
||||
RegisterPressure::Set* liveIn = new(pool) RegisterPressure::Set[nNodes](pool, nameCount);
|
||||
RegisterPressure::Set* liveOut = new(pool) RegisterPressure::Set[nNodes](pool, nameCount);
|
||||
|
||||
// First stage of the liveness analysis: Compute the sets LocalLive(stored in LiveIn) and Killed.
|
||||
//
|
||||
for (Uint32 n = 0; n < (nNodes - 1); n++) {
|
||||
ControlNode& node = *nodes[n];
|
||||
|
||||
RegisterPressure::Set& currentLocalLive = liveIn[n];
|
||||
RegisterPressure::Set& currentKilled = killed[n];
|
||||
|
||||
InstructionList& phiNodes = node.getPhiNodeInstructions();
|
||||
|
||||
if ((usedByPhiNodes == NULL) && !phiNodes.empty())
|
||||
usedByPhiNodes = new(pool) RegisterPressure::Set[nNodes](pool, nameCount);
|
||||
|
||||
for (InstructionList::iterator p = phiNodes.begin(); !phiNodes.done(p); p = phiNodes.advance(p)) {
|
||||
Instruction& phiNode = phiNodes.get(p);
|
||||
|
||||
InstructionDefine& define = phiNode.getInstructionDefineBegin()[0];
|
||||
currentKilled.set(define.getRegisterName());
|
||||
|
||||
typedef DoublyLinkedList<ControlEdge> ControlEdgeList;
|
||||
const ControlEdgeList& predecessors = node.getPredecessors();
|
||||
ControlEdgeList::iterator p = predecessors.begin();
|
||||
InstructionUse* useEnd = phiNode.getInstructionUseEnd();
|
||||
for (InstructionUse* usePtr = phiNode.getInstructionUseBegin(); usePtr < useEnd; usePtr++, p = predecessors.advance(p))
|
||||
if (usePtr->isRegister())
|
||||
usedByPhiNodes[predecessors.get(p).getSource().dfsNum].set(usePtr->getRegisterName());
|
||||
}
|
||||
|
||||
// Find the instructions contributions to the sets LocalLive and Killed.
|
||||
//
|
||||
InstructionList& instructions = node.getInstructions();
|
||||
for (InstructionList::iterator i = instructions.begin(); !instructions.done(i); i = instructions.advance(i)) {
|
||||
Instruction& instruction = instructions.get(i);
|
||||
|
||||
// If a VirtualRegister is 'used' before being 'defined' then we add it to set LocalLive.
|
||||
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
for (InstructionUse* usePtr = instruction.getInstructionUseBegin(); usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister()) {
|
||||
Uint32 index = usePtr->getRegisterName();
|
||||
|
||||
if (!currentKilled.test(index))
|
||||
currentLocalLive.set(index);
|
||||
}
|
||||
|
||||
// If a Virtualregister is 'defined' then we add it to the set Killed.
|
||||
InstructionDefine* defineEnd = instruction.getInstructionDefineEnd();
|
||||
for (InstructionDefine* definePtr = instruction.getInstructionDefineBegin(); definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister())
|
||||
currentKilled.set(definePtr->getRegisterName());
|
||||
}
|
||||
}
|
||||
|
||||
// Second stage of the liveness analysis: We propagate the LiveIn & LiveOut through the entire
|
||||
// control-flow graph.
|
||||
//
|
||||
RegisterPressure::Set temp(pool, nameCount);
|
||||
|
||||
bool changed;
|
||||
do {
|
||||
changed = false;
|
||||
|
||||
// For all nodes is this graph except the endNode.
|
||||
for (Int32 n = (nNodes - 2); n >= 0; n--) {
|
||||
ControlNode& node = *nodes[n];
|
||||
|
||||
RegisterPressure::Set& currentLiveIn = liveIn[n];
|
||||
RegisterPressure::Set& currentLiveOut = liveOut[n];
|
||||
|
||||
// Compute temp = Union of LiveIn(s) (s a successor of this node) | usedByPhiNodes(n).
|
||||
// temp will be the new LiveOut(n).
|
||||
Uint32 nSuccessors = node.nSuccessors();
|
||||
if (nSuccessors != 0) {
|
||||
temp = liveIn[node.nthSuccessor(0).getTarget().dfsNum];
|
||||
for (Uint32 s = 1; s < nSuccessors; s++)
|
||||
temp |= liveIn[node.nthSuccessor(s).getTarget().dfsNum];
|
||||
} else
|
||||
temp.clear();
|
||||
|
||||
// Insert the phiNodes contribution.
|
||||
if (usedByPhiNodes != NULL)
|
||||
temp |= usedByPhiNodes[n];
|
||||
|
||||
// If temp and LiveOut(n) differ then set LiveOut(n) = temp and recalculate the
|
||||
// new LiveIn(n).
|
||||
if (currentLiveOut != temp) {
|
||||
currentLiveOut = temp;
|
||||
temp -= killed[n]; // FIX: could be optimized with one call to unionDiff !
|
||||
temp |= currentLiveIn;
|
||||
|
||||
if (currentLiveIn != temp) {
|
||||
currentLiveIn = temp;
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} while(changed);
|
||||
|
||||
LivenessInfo<RegisterPressure> liveness;
|
||||
liveness.liveIn = liveIn;
|
||||
liveness.liveOut = liveOut;
|
||||
DEBUG_LOG_ONLY(liveness.size = nNodes);
|
||||
return liveness;
|
||||
}
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
template <class RegisterPressure>
|
||||
void LivenessInfo<RegisterPressure>::printPretty(LogModuleObject log)
|
||||
{
|
||||
for (Uint32 n = 0; n < size; n++) {
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("Node N%d:\n\tliveIn = ", n));
|
||||
liveIn[n].printPretty(log);
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("\tliveOut = "));
|
||||
liveOut[n].printPretty(log);
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("\n"));
|
||||
}
|
||||
}
|
||||
#endif // DEBUG_LOG
|
||||
|
||||
#endif // _LIVENESS_H_
|
||||
@@ -1,40 +0,0 @@
|
||||
#! gmake
|
||||
|
||||
DEPTH = ../..
|
||||
|
||||
MODULE_NAME = RegisterAllocator
|
||||
|
||||
include $(DEPTH)/config/config.mk
|
||||
|
||||
INCLUDES += \
|
||||
-I$(DEPTH)/Utilities/General \
|
||||
-I$(DEPTH)/Utilities/zlib \
|
||||
-I$(DEPTH)/Runtime/ClassReader \
|
||||
-I$(DEPTH)/Runtime/NativeMethods \
|
||||
-I$(DEPTH)/Runtime/System \
|
||||
-I$(DEPTH)/Runtime/ClassInfo \
|
||||
-I$(DEPTH)/Runtime/FileReader \
|
||||
-I$(DEPTH)/Compiler/PrimitiveGraph \
|
||||
-I$(DEPTH)/Compiler/FrontEnd \
|
||||
-I$(DEPTH)/Compiler/Optimizer \
|
||||
-I$(DEPTH)/Compiler/CodeGenerator \
|
||||
-I$(DEPTH)/Compiler/CodeGenerator/md \
|
||||
-I$(DEPTH)/Compiler/CodeGenerator/md/$(CPU_ARCH) \
|
||||
-I$(DEPTH)/Compiler/RegisterAllocator \
|
||||
-I$(DEPTH)/Driver/StandAloneJava \
|
||||
-I$(DEPTH)/Debugger \
|
||||
$(NULL)
|
||||
|
||||
CXXSRCS = \
|
||||
RegisterAllocator.cpp \
|
||||
RegisterAllocatorTools.cpp \
|
||||
DominatorGraph.cpp \
|
||||
VirtualRegister.cpp \
|
||||
BitSet.cpp \
|
||||
SparseSet.cpp \
|
||||
$(NULL)
|
||||
|
||||
|
||||
include $(DEPTH)/config/rules.mk
|
||||
|
||||
libs:: $(MODULE)
|
||||
@@ -1,392 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _PHI_NODE_REMOVER_H_
|
||||
#define _PHI_NODE_REMOVER_H_
|
||||
|
||||
#include "Fundamentals.h"
|
||||
#include "Pool.h"
|
||||
#include "ControlGraph.h"
|
||||
#include "DominatorGraph.h"
|
||||
#include "VirtualRegister.h"
|
||||
#include "RegisterPressure.h"
|
||||
#include "Liveness.h"
|
||||
#include "Instruction.h"
|
||||
#include "InstructionEmitter.h"
|
||||
#include "SparseSet.h"
|
||||
#include <string.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// RegisterNameNode -
|
||||
|
||||
struct RegisterNameNode
|
||||
{
|
||||
RegisterNameNode* next;
|
||||
RegisterName newName;
|
||||
Uint32 nextPushed;
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// CopyData -
|
||||
|
||||
struct CopyData
|
||||
{
|
||||
RegisterName source;
|
||||
RegisterClassKind classKind;
|
||||
Uint32 useCount;
|
||||
bool isLiveOut;
|
||||
RegisterName sourceNameToUse;
|
||||
RegisterName temporaryName;
|
||||
RegisterNameNode* newName;
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// PhiNodeRemover<RegisterPressure> -
|
||||
|
||||
template <class RegisterPressure>
|
||||
struct PhiNodeRemover
|
||||
{
|
||||
// Replace the phi nodes by copy instructions.
|
||||
static void replacePhiNodes(ControlGraph& controlGraph, VirtualRegisterManager& vrManager, InstructionEmitter& emitter);
|
||||
};
|
||||
|
||||
// Split some of the critical edges and return true if there are still some
|
||||
// in the graph after that.
|
||||
//
|
||||
static bool splitCriticalEdges(ControlGraph& /*cg*/)
|
||||
{
|
||||
// FIX: not implemented.
|
||||
return true;
|
||||
}
|
||||
|
||||
inline void pushName(Pool& pool, RegisterNameNode** stack, SparseSet& pushed, Uint32* nodeListPointer, RegisterName oldName, RegisterName newName)
|
||||
{
|
||||
RegisterNameNode& newNode = *new(pool) RegisterNameNode();
|
||||
|
||||
if (pushed.test(oldName))
|
||||
(*stack)->newName = newName;
|
||||
else {
|
||||
newNode.newName = newName;
|
||||
newNode.nextPushed = *nodeListPointer;
|
||||
*nodeListPointer = oldName;
|
||||
newNode.next = *stack;
|
||||
*stack = &newNode;
|
||||
pushed.set(oldName);
|
||||
}
|
||||
}
|
||||
|
||||
template <class RegisterPressure>
|
||||
void PhiNodeRemover<RegisterPressure>::replacePhiNodes(ControlGraph& controlGraph, VirtualRegisterManager& vrManager, InstructionEmitter& emitter)
|
||||
{
|
||||
Pool& pool = controlGraph.pool;
|
||||
ControlNode** nodes = controlGraph.dfsList;
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
|
||||
// Initialize the local variables.
|
||||
//
|
||||
|
||||
// When we insert the copies we will also need to create new VirtualRegisters for
|
||||
// the insertion of temporaries. The maximum number of temporary register will not
|
||||
// exceed the number of phiNodes in the primitive graph.
|
||||
Uint32 nameCount = vrManager.getSize();
|
||||
Uint32 maxNameCount = nameCount;
|
||||
for (Uint32 n = 0; n < nNodes; n++)
|
||||
maxNameCount += nodes[n]->getPhiNodes().length();
|
||||
|
||||
// If the CFG contains some critical edges (backward edge which source has more than one
|
||||
// outgoing edge and destination has more than one incomimg edge) then we need the liveness
|
||||
// information to be able to insert temporary copies.
|
||||
RegisterPressure::Set* liveOut = NULL;
|
||||
if (splitCriticalEdges(controlGraph))
|
||||
liveOut = Liveness<LowRegisterPressure>::analysis(controlGraph, nameCount).liveOut;
|
||||
|
||||
DominatorGraph dGraph(controlGraph);
|
||||
|
||||
SparseSet pushed(pool, maxNameCount);
|
||||
SparseSet destinationList(pool, maxNameCount);
|
||||
SparseSet workList(pool, maxNameCount);
|
||||
|
||||
CopyData* copyStats = new(pool) CopyData[maxNameCount];
|
||||
memset(copyStats, '\0', maxNameCount*sizeof(CopyData));
|
||||
|
||||
struct NodeStack {
|
||||
Uint32* next;
|
||||
Uint32* limit;
|
||||
Uint32 pushedList;
|
||||
};
|
||||
|
||||
// Allocate the node stack and initialize the node stack pointer.
|
||||
NodeStack* nodeStack = new(pool) NodeStack[nNodes + 1];
|
||||
NodeStack* nodeStackPtr = nodeStack;
|
||||
|
||||
// We start by the begin node.
|
||||
Uint32 startNode = 0;
|
||||
Uint32* next = &startNode;
|
||||
Uint32* limit = &startNode + 1;
|
||||
|
||||
while (true) {
|
||||
|
||||
if (next == limit) {
|
||||
// If there are no more node in the sibling, we have to pop the current
|
||||
// frame from the stack and update the copyStats of the pushed nodes.
|
||||
//
|
||||
if (nodeStackPtr == nodeStack)
|
||||
// We are at the bottom of the stack and there are no more nodes
|
||||
// to look at. We are done !
|
||||
break;
|
||||
|
||||
--nodeStackPtr;
|
||||
// We are done with all the children of this node in the dominator tree.
|
||||
// We need to update the copy information of all the new names pushed
|
||||
// during the walk over this node.
|
||||
Uint32 pushedList = nodeStackPtr->pushedList;
|
||||
while (pushedList != 0) {
|
||||
Uint32 nextName = copyStats[pushedList].newName->nextPushed;
|
||||
copyStats[pushedList].newName = copyStats[pushedList].newName->next;
|
||||
pushedList = nextName;
|
||||
}
|
||||
|
||||
// restore the previous frame.
|
||||
next = nodeStackPtr->next;
|
||||
limit = nodeStackPtr->limit;
|
||||
} else {
|
||||
Uint32 currentNode = *next++;
|
||||
Uint32 pushedList = 0;
|
||||
|
||||
|
||||
// Initialize the sets.
|
||||
pushed.clear();
|
||||
destinationList.clear();
|
||||
|
||||
// STEP1:
|
||||
// Walk the instruction list and to replace all the instruction uses with their new name.
|
||||
// If the instruction is a phi node and its defined register is alive at the end of this
|
||||
// block then we push the defined register into the stack.
|
||||
//
|
||||
ControlNode& node = *nodes[currentNode];
|
||||
RegisterPressure::Set* currentLiveOut = (liveOut != NULL) ? &liveOut[currentNode] : (RegisterPressure::Set*) 0;
|
||||
|
||||
InstructionList& phiNodes = node.getPhiNodeInstructions();
|
||||
for (InstructionList::iterator p = phiNodes.begin(); !phiNodes.done(p); p = phiNodes.advance(p)) {
|
||||
Instruction& phiNode = phiNodes.get(p);
|
||||
|
||||
InstructionUse* useEnd = phiNode.getInstructionUseEnd();
|
||||
for (InstructionUse* usePtr = phiNode.getInstructionUseBegin(); usePtr < useEnd; usePtr++) {
|
||||
assert(usePtr->isRegister());
|
||||
RegisterName name = usePtr->getRegisterName();
|
||||
|
||||
if (copyStats[name].newName != NULL && copyStats[name].newName->newName != name)
|
||||
usePtr->setRegisterName(copyStats[name].newName->newName);
|
||||
}
|
||||
|
||||
if (currentLiveOut != NULL) {
|
||||
// This is a phi node and we have to push its defined name if it is live
|
||||
// at the end of the node. We only need to do this if the CFG has critical edges.
|
||||
assert(phiNode.getInstructionDefineBegin() != phiNode.getInstructionDefineEnd() && phiNode.getInstructionDefineBegin()[0].isRegister());
|
||||
RegisterName name = phiNode.getInstructionDefineBegin()[0].getRegisterName();
|
||||
|
||||
if (currentLiveOut->test(name))
|
||||
pushName(pool, &(copyStats[name].newName), pushed, &pushedList, name, name);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
InstructionList& instructions = node.getInstructions();
|
||||
for (InstructionList::iterator i = instructions.begin(); !instructions.done(i); i = instructions.advance(i)) {
|
||||
Instruction& instruction = instructions.get(i);
|
||||
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
for (InstructionUse* usePtr = instruction.getInstructionUseBegin(); usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister()) {
|
||||
RegisterName name = usePtr->getRegisterName();
|
||||
|
||||
if (copyStats[name].newName != NULL && copyStats[name].newName->newName != name)
|
||||
usePtr->setRegisterName(copyStats[name].newName->newName);
|
||||
}
|
||||
}
|
||||
|
||||
// STEP2:
|
||||
// Look at this node's successors' phiNodes. We keep track of the number of time
|
||||
// a VR will be used by another copy instruction and insert each definition into the
|
||||
// destinationList. This is the only pass over this node's successors as we will
|
||||
// get all the information we need in the CopyData structures.
|
||||
//
|
||||
ControlEdge* successorEdgeEnd = node.getSuccessorsEnd();
|
||||
for (ControlEdge* successorEdgePtr = node.getSuccessorsBegin(); successorEdgePtr < successorEdgeEnd; successorEdgePtr++) {
|
||||
Uint32 useIndex = successorEdgePtr->getIndex();
|
||||
ControlNode& successor = successorEdgePtr->getTarget();
|
||||
|
||||
// Look at its phi nodes. The phi nodes are at the top of the instruction list. We exit
|
||||
// as soon as we find an instruction which is not a phi node
|
||||
InstructionList& phiNodes = successor.getPhiNodeInstructions();
|
||||
for (InstructionList::iterator p = phiNodes.begin(); !phiNodes.done(p); p = phiNodes.advance(p)) {
|
||||
Instruction& phiNode = phiNodes.get(p);
|
||||
|
||||
assert((phiNode.getInstructionUseBegin() + useIndex) < phiNode.getInstructionUseEnd());
|
||||
assert(phiNode.getInstructionDefineBegin() != phiNode.getInstructionDefineEnd());
|
||||
|
||||
InstructionUse& source = phiNode.getInstructionUseBegin()[useIndex];
|
||||
InstructionDefine& destination = phiNode.getInstructionDefineBegin()[0];
|
||||
|
||||
assert(source.isRegister() && destination.isRegister());
|
||||
|
||||
RegisterName sourceName = source.getRegisterName();
|
||||
RegisterName destinationName = destination.getRegisterName();
|
||||
|
||||
// Get the correct name for the source.
|
||||
if (copyStats[sourceName].newName != NULL)
|
||||
sourceName = copyStats[sourceName].newName->newName;
|
||||
|
||||
// Update the CopyData structures.
|
||||
if ((sourceName != rnInvalid) && (sourceName != destinationName)) {
|
||||
copyStats[destinationName].source = sourceName;
|
||||
copyStats[destinationName].classKind = destination.getRegisterClass();
|
||||
copyStats[destinationName].isLiveOut = (currentLiveOut != NULL) ? currentLiveOut->test(destinationName) : false;
|
||||
copyStats[destinationName].sourceNameToUse = destinationName;
|
||||
copyStats[sourceName].sourceNameToUse = sourceName;
|
||||
copyStats[sourceName].useCount++;
|
||||
destinationList.set(destinationName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// STEP3:
|
||||
// Insert into the worklist only the destination registers that will be not used in
|
||||
// another copy instruction in this block.
|
||||
//
|
||||
assert(workList.getSize() == 0);
|
||||
for (SparseSet::iterator d = destinationList.begin(); !destinationList.done(d); d = destinationList.advance(d)) {
|
||||
Uint32 dest = destinationList.get(d);
|
||||
if (copyStats[dest].useCount == 0)
|
||||
workList.set(dest);
|
||||
}
|
||||
|
||||
// STEP4:
|
||||
// Insert the copy instructions.
|
||||
//
|
||||
Uint32 destinationListSize = destinationList.getSize();
|
||||
InstructionList::iterator endOfTheNode = instructions.end();
|
||||
|
||||
// Find the right place to insert the copy instructions.
|
||||
if (destinationListSize != 0)
|
||||
while (instructions.get(endOfTheNode).getFlags() & ifControl)
|
||||
endOfTheNode = instructions.retreat(endOfTheNode);
|
||||
|
||||
while (destinationListSize != 0) {
|
||||
while(workList.getSize()) {
|
||||
RegisterName destinationName = RegisterName(workList.getOne());
|
||||
RegisterName sourceName = copyStats[destinationName].source;
|
||||
|
||||
workList.clear(destinationName);
|
||||
if (copyStats[destinationName].isLiveOut && !copyStats[destinationName].temporaryName) {
|
||||
// Lost copy problem.
|
||||
copyStats[destinationName].isLiveOut = false;
|
||||
|
||||
RegisterName sourceName = destinationName;
|
||||
RegisterClassKind classKind = copyStats[sourceName].classKind;
|
||||
RegisterName destinationName = getName(vrManager.newVirtualRegister(classKind));
|
||||
assert(destinationName < maxNameCount);
|
||||
|
||||
copyStats[destinationName].classKind = classKind;
|
||||
copyStats[sourceName].useCount = 0;
|
||||
|
||||
// We need to insert a copy to a temporary register to keep the
|
||||
// source register valid at the end of the node defining it.
|
||||
// This copy will be inserted right after the phi node defining it.
|
||||
RegisterName from = copyStats[sourceName].sourceNameToUse;
|
||||
Instruction* definingPhiNode = vrManager.getVirtualRegister(from).getDefiningInstruction();
|
||||
assert(definingPhiNode && (definingPhiNode->getFlags() & ifPhiNode) != 0);
|
||||
|
||||
RegisterID fromID = buildRegisterID(from, classKind);
|
||||
RegisterID toID = buildRegisterID(destinationName, classKind);
|
||||
Instruction& copy = emitter.newCopy(*definingPhiNode->getPrimitive(), fromID, toID);
|
||||
vrManager.getVirtualRegister(destinationName).setDefiningInstruction(copy);
|
||||
definingPhiNode->getPrimitive()->getContainer()->getInstructions().addFirst(copy);
|
||||
|
||||
copyStats[sourceName].temporaryName = destinationName;
|
||||
copyStats[sourceName].sourceNameToUse = destinationName;
|
||||
pushName(pool, &(copyStats[sourceName].newName), pushed, &pushedList, sourceName, destinationName);
|
||||
}
|
||||
|
||||
// Insert the copy instruction at the end of the current node.
|
||||
RegisterName from = copyStats[sourceName].sourceNameToUse;
|
||||
|
||||
RegisterClassKind classKind = copyStats[destinationName].classKind;
|
||||
RegisterID fromID = buildRegisterID(from, classKind);
|
||||
RegisterID toID = buildRegisterID(destinationName, classKind);
|
||||
Instruction& copy = emitter.newCopy(*vrManager.getVirtualRegister(from).getDefiningInstruction()->getPrimitive(), fromID, toID);
|
||||
instructions.insertAfter(copy, endOfTheNode);
|
||||
endOfTheNode = instructions.advance(endOfTheNode);
|
||||
|
||||
copyStats[sourceName].useCount = 0;
|
||||
if (destinationList.test(sourceName) && copyStats[sourceName].isLiveOut)
|
||||
pushName(pool, &(copyStats[sourceName].newName), pushed, &pushedList, sourceName, destinationName);
|
||||
copyStats[sourceName].isLiveOut = false;
|
||||
copyStats[sourceName].sourceNameToUse = destinationName;
|
||||
|
||||
if (destinationList.test(sourceName))
|
||||
workList.set(sourceName);
|
||||
destinationList.clear(destinationName);
|
||||
}
|
||||
|
||||
destinationListSize = destinationList.getSize();
|
||||
if (destinationListSize != 0) {
|
||||
RegisterName sourceName = RegisterName(destinationList.getOne());
|
||||
RegisterName destinationName;
|
||||
|
||||
if (!copyStats[sourceName].temporaryName) {
|
||||
// Cycle problem.
|
||||
RegisterClassKind classKind = copyStats[sourceName].classKind;
|
||||
destinationName = getName(vrManager.newVirtualRegister(classKind));
|
||||
assert(destinationName < maxNameCount);
|
||||
|
||||
copyStats[destinationName].classKind = classKind;
|
||||
copyStats[sourceName].temporaryName = destinationName;
|
||||
|
||||
// Insert the copy instruction at the end of the current node.
|
||||
RegisterName from = copyStats[sourceName].sourceNameToUse;
|
||||
|
||||
RegisterID fromID = buildRegisterID(from, classKind);
|
||||
RegisterID toID = buildRegisterID(destinationName, classKind);
|
||||
Instruction& copy = emitter.newCopy(*vrManager.getVirtualRegister(from).getDefiningInstruction()->getPrimitive(), fromID, toID);
|
||||
vrManager.getVirtualRegister(destinationName).setDefiningInstruction(copy);
|
||||
instructions.insertAfter(copy, endOfTheNode);
|
||||
endOfTheNode = instructions.advance(endOfTheNode);
|
||||
} else
|
||||
destinationName = copyStats[sourceName].temporaryName;
|
||||
|
||||
copyStats[sourceName].useCount = 0;
|
||||
copyStats[sourceName].isLiveOut = false;
|
||||
copyStats[sourceName].sourceNameToUse = destinationName;
|
||||
pushName(pool, &(copyStats[sourceName].newName), pushed, &pushedList, sourceName, destinationName);
|
||||
|
||||
workList.set(sourceName);
|
||||
}
|
||||
}
|
||||
|
||||
nodeStackPtr->pushedList = pushedList;
|
||||
nodeStackPtr->next = next;
|
||||
nodeStackPtr->limit = limit;
|
||||
++nodeStackPtr;
|
||||
next = dGraph.getSuccessorsBegin(currentNode);
|
||||
limit = dGraph.getSuccessorsEnd(currentNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // _PHI_NODE_REMOVER_H_
|
||||
@@ -1,155 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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 "Fundamentals.h"
|
||||
#include "LogModule.h"
|
||||
#include "RegisterAllocator.h"
|
||||
#include "RegisterPressure.h"
|
||||
#include "RegisterAllocatorTools.h"
|
||||
#include "PhiNodeRemover.h"
|
||||
#include "LiveRange.h"
|
||||
#include "Liveness.h"
|
||||
#include "InterferenceGraph.h"
|
||||
#include "LiveRangeGraph.h"
|
||||
#include "Coalescing.h"
|
||||
#include "Spilling.h"
|
||||
#include "Coloring.h"
|
||||
#include "Splits.h"
|
||||
|
||||
class Pool;
|
||||
class ControlGraph;
|
||||
class VirtualRegisterManager;
|
||||
class InstructionEmitter;
|
||||
|
||||
UT_DEFINE_LOG_MODULE(RegAlloc);
|
||||
|
||||
void RegisterAllocator::allocateRegisters(Pool& pool, ControlGraph& controlGraph, VirtualRegisterManager& vrManager, InstructionEmitter& emitter)
|
||||
{
|
||||
// Insert the phi node instructions. We want to do this to have a single defined register per instruction.
|
||||
// If we keep the PhiNode (as a DataNode) and a PhiNode is of DoubleWordKind then we have to execute
|
||||
// some special code for the high word annotation.
|
||||
//
|
||||
RegisterAllocatorTools::insertPhiNodeInstructions(controlGraph, emitter);
|
||||
|
||||
// Perform some tests on the instruction graph.
|
||||
//
|
||||
DEBUG_ONLY(RegisterAllocatorTools::testTheInstructionGraph(controlGraph, vrManager));
|
||||
|
||||
// Replace the phi node instructions by their equivalent copy instructions.
|
||||
//
|
||||
PhiNodeRemover<LowRegisterPressure>::replacePhiNodes(controlGraph, vrManager, emitter);
|
||||
|
||||
// Do the register allocation.
|
||||
//
|
||||
RegisterAllocator registerAllocator(pool, controlGraph, vrManager, emitter);
|
||||
registerAllocator.doGraphColoring();
|
||||
}
|
||||
|
||||
void RegisterAllocator::doGraphColoring()
|
||||
{
|
||||
// Initialize the liverange map.
|
||||
//
|
||||
initLiveRanges();
|
||||
|
||||
// Build the live ranges. We do this to compress the number of RegisterNames
|
||||
// used in the insterference graph.
|
||||
//
|
||||
LiveRange<LowRegisterPressure>::build(*this);
|
||||
|
||||
// Remove unnecessary copies.
|
||||
//
|
||||
RegisterAllocatorTools::removeUnnecessaryCopies(*this);
|
||||
|
||||
for (Uint8 loop = 0; loop < 10; loop++) {
|
||||
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("********* RegisterAllocator loop %d *********\n", loop));
|
||||
|
||||
while(true) {
|
||||
// Build the interference graph.
|
||||
//
|
||||
iGraph.build();
|
||||
|
||||
// Coalesce the copy instructions.
|
||||
//
|
||||
if (!Coalescing<LowRegisterPressure>::coalesce(*this))
|
||||
break;
|
||||
}
|
||||
|
||||
// Print the interference graph.
|
||||
//
|
||||
DEBUG_LOG_ONLY(iGraph.printPretty(UT_LOG_MODULE(RegAlloc)));
|
||||
|
||||
// Calculate the spill costs.
|
||||
//
|
||||
Spilling<LowRegisterPressure>::calculateSpillCosts(*this);
|
||||
DEBUG_LOG_ONLY(RegisterAllocatorTools::printSpillCosts(*this));
|
||||
|
||||
// Calculate the split costs.
|
||||
//
|
||||
Splits<LowRegisterPressure>::calculateSplitCosts(*this);
|
||||
DEBUG_LOG_ONLY(RegisterAllocatorTools::printSplitCosts(*this));
|
||||
|
||||
// Build the live range graph.
|
||||
//
|
||||
lGraph.build();
|
||||
DEBUG_LOG_ONLY(lGraph.printPretty(UT_LOG_MODULE(RegAlloc)));
|
||||
|
||||
// Color the graph. If it succeeds then we're done with the
|
||||
// register allocation.
|
||||
//
|
||||
if (Coloring<LowRegisterPressure>::color(*this)) {
|
||||
// Write the final colors in the instruction graph.
|
||||
//
|
||||
Coloring<LowRegisterPressure>::finalColoring(*this);
|
||||
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("********** RegisterAllocator done **********\n"));
|
||||
DEBUG_LOG_ONLY(RegisterAllocatorTools::printInstructions(*this));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// We need to spill some registers.
|
||||
//
|
||||
Spilling<LowRegisterPressure>::insertSpillCode(*this);
|
||||
|
||||
// Insert the split instructions.
|
||||
//
|
||||
Splits<LowRegisterPressure>::insertSplitCode(*this);
|
||||
|
||||
// Update the live ranges.
|
||||
//
|
||||
// FIX
|
||||
}
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
RegisterAllocatorTools::updateInstructionGraph(*this);
|
||||
RegisterAllocatorTools::printInstructions(*this);
|
||||
#endif
|
||||
fprintf(stderr, "!!! Coloring failed after 10 loops !!!\n");
|
||||
abort();
|
||||
}
|
||||
|
||||
void RegisterAllocator::initLiveRanges()
|
||||
{
|
||||
Uint32 count = this->nameCount;
|
||||
RegisterName* name2range = new(pool) RegisterName[nameCount];
|
||||
for (RegisterName r = RegisterName(1); r < count; r = RegisterName(r + 1))
|
||||
name2range[r] = r;
|
||||
this->name2range = name2range;
|
||||
rangeCount = count;
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _REGISTER_ALLOCATOR_H_
|
||||
#define _REGISTER_ALLOCATOR_H_
|
||||
|
||||
class Pool;
|
||||
class ControlGraph;
|
||||
class InstructionEmitter;
|
||||
struct SpillCost;
|
||||
struct SplitCost;
|
||||
|
||||
#include "Liveness.h"
|
||||
#include "VirtualRegister.h"
|
||||
#include "RegisterPressure.h" // This should included by Backend.cpp
|
||||
#include "InterferenceGraph.h"
|
||||
#include "LiveRangeGraph.h"
|
||||
|
||||
//template <class RegisterPressure>
|
||||
class RegisterAllocator
|
||||
{
|
||||
public:
|
||||
|
||||
Pool& pool; //
|
||||
ControlGraph& controlGraph; //
|
||||
VirtualRegisterManager& vrManager; //
|
||||
InstructionEmitter& emitter; //
|
||||
|
||||
RegisterName* name2range; //
|
||||
RegisterName* color; //
|
||||
SpillCost* spillCost; //
|
||||
SparseSet* willSpill; //
|
||||
SplitCost* splitCost; //
|
||||
NameLinkedList** splitAround; //
|
||||
InterferenceGraph<LowRegisterPressure> iGraph; //
|
||||
LiveRangeGraph<LowRegisterPressure> lGraph; //
|
||||
LivenessInfo<LowRegisterPressure> liveness; //
|
||||
Uint32 nameCount; //
|
||||
Uint32 rangeCount; //
|
||||
bool splitFound; //
|
||||
|
||||
private:
|
||||
|
||||
//
|
||||
//
|
||||
void doGraphColoring();
|
||||
|
||||
public:
|
||||
|
||||
//
|
||||
//
|
||||
inline RegisterAllocator(Pool& pool, ControlGraph& controlGraph, VirtualRegisterManager& vrManager, InstructionEmitter& emitter);
|
||||
|
||||
//
|
||||
//
|
||||
bool canInterfere(RegisterName /*name1*/, RegisterName /*name2*/) const {return true;}
|
||||
|
||||
//
|
||||
//
|
||||
void initLiveRanges();
|
||||
|
||||
//
|
||||
//
|
||||
static void allocateRegisters(Pool& pool, ControlGraph& controlGraph, VirtualRegisterManager& vrManager, InstructionEmitter& emitter);
|
||||
};
|
||||
|
||||
//
|
||||
//
|
||||
inline RegisterAllocator::RegisterAllocator(Pool& pool, ControlGraph& controlGraph, VirtualRegisterManager& vrManager, InstructionEmitter& emitter)
|
||||
: pool(pool), controlGraph(controlGraph), vrManager(vrManager), emitter(emitter), iGraph(*this), lGraph(*this), nameCount(vrManager.getSize()) {}
|
||||
|
||||
#endif // _REGISTER_ALLOCATOR_H_
|
||||
|
||||
@@ -1,355 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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 "Fundamentals.h"
|
||||
#include "LogModule.h"
|
||||
#include "RegisterAllocatorTools.h"
|
||||
#include "Pool.h"
|
||||
#include "ControlGraph.h"
|
||||
#include "ControlNodes.h"
|
||||
#include "Primitives.h"
|
||||
#include "InstructionEmitter.h"
|
||||
#include "Instruction.h"
|
||||
#include "RegisterAllocator.h"
|
||||
#include "Spilling.h"
|
||||
#include "Splits.h"
|
||||
#include "BitSet.h"
|
||||
|
||||
UT_EXTERN_LOG_MODULE(RegAlloc);
|
||||
|
||||
#ifdef DEBUG
|
||||
void RegisterAllocatorTools::testTheInstructionGraph(ControlGraph& controlGraph, VirtualRegisterManager& vrManager)
|
||||
{
|
||||
// Test the declared VirtualRegisters. The register allocator tries to condense the register universe.
|
||||
// Any gap in the VirtualRegister names will be a loss of efficiency !!!!
|
||||
|
||||
Uint32 nameCount = vrManager.getSize();
|
||||
BitSet registerSeen(controlGraph.pool, nameCount);
|
||||
|
||||
ControlNode** nodes = controlGraph.dfsList;
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
|
||||
for (Uint32 n = 0; n < nNodes; n++) {
|
||||
|
||||
InstructionList& instructions = nodes[n]->getInstructions();
|
||||
for (InstructionList::iterator i = instructions.begin(); !instructions.done(i); i = instructions.advance(i)) {
|
||||
Instruction& instruction = instructions.get(i);
|
||||
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
for (InstructionUse* usePtr = instruction.getInstructionUseBegin(); usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister())
|
||||
registerSeen.set(usePtr->getRegisterName());
|
||||
|
||||
InstructionDefine* defineEnd = instruction.getInstructionDefineEnd();
|
||||
for (InstructionDefine* definePtr = instruction.getInstructionDefineBegin(); definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister())
|
||||
registerSeen.set(definePtr->getRegisterName());
|
||||
}
|
||||
|
||||
InstructionList& phiNodes = nodes[n]->getPhiNodeInstructions();
|
||||
for (InstructionList::iterator p = phiNodes.begin(); !phiNodes.done(p); p = phiNodes.advance(p)) {
|
||||
Instruction& instruction = phiNodes.get(p);
|
||||
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
for (InstructionUse* usePtr = instruction.getInstructionUseBegin(); usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister())
|
||||
registerSeen.set(usePtr->getRegisterName());
|
||||
|
||||
InstructionDefine* defineEnd = instruction.getInstructionDefineEnd();
|
||||
for (InstructionDefine* definePtr = instruction.getInstructionDefineBegin(); definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister())
|
||||
registerSeen.set(definePtr->getRegisterName());
|
||||
}
|
||||
}
|
||||
|
||||
bool renameRegisters = false;
|
||||
for (BitSet::iterator i = registerSeen.nextZero(0); !registerSeen.done(i); i = registerSeen.nextZero(i)) {
|
||||
renameRegisters = true;
|
||||
fprintf(stderr,
|
||||
"WARNING: The VirtualRegister vr%d has been allocated during CodeGeneration but\n"
|
||||
" is never used nor defined by any instruction in the instruction graph\n"
|
||||
" PLEASE FIX \n",
|
||||
i);
|
||||
}
|
||||
if (renameRegisters) {
|
||||
Instruction** definingInstruction = new Instruction*[nameCount];
|
||||
memset(definingInstruction, '\0', nameCount * sizeof(Instruction*));
|
||||
RegisterName* newName = new RegisterName[nameCount];
|
||||
memset(newName, '\0', nameCount * sizeof(RegisterName));
|
||||
RegisterName nextName = RegisterName(1);
|
||||
|
||||
for (Uint32 n = 0; n < nNodes; n++) {
|
||||
|
||||
InstructionList& instructions = nodes[n]->getInstructions();
|
||||
for (InstructionList::iterator i = instructions.begin(); !instructions.done(i); i = instructions.advance(i)) {
|
||||
Instruction& instruction = instructions.get(i);
|
||||
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
for (InstructionUse* usePtr = instruction.getInstructionUseBegin(); usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister()) {
|
||||
RegisterName name = usePtr->getRegisterName();
|
||||
if (newName[name] == rnInvalid) {
|
||||
newName[name] = nextName;
|
||||
definingInstruction[nextName] = vrManager.getVirtualRegister(name).getDefiningInstruction();
|
||||
nextName = RegisterName(nextName + 1);
|
||||
}
|
||||
usePtr->setRegisterName(newName[name]);
|
||||
}
|
||||
|
||||
InstructionDefine* defineEnd = instruction.getInstructionDefineEnd();
|
||||
for (InstructionDefine* definePtr = instruction.getInstructionDefineBegin(); definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister()) {
|
||||
RegisterName name = definePtr->getRegisterName();
|
||||
if (newName[name] == rnInvalid) {
|
||||
newName[name] = nextName;
|
||||
definingInstruction[nextName] = vrManager.getVirtualRegister(name).getDefiningInstruction();
|
||||
nextName = RegisterName(nextName + 1);
|
||||
}
|
||||
definePtr->setRegisterName(newName[name]);
|
||||
}
|
||||
}
|
||||
|
||||
InstructionList& phiNodes = nodes[n]->getPhiNodeInstructions();
|
||||
for (InstructionList::iterator p = phiNodes.begin(); !phiNodes.done(p); p = phiNodes.advance(p)) {
|
||||
Instruction& instruction = phiNodes.get(p);
|
||||
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
for (InstructionUse* usePtr = instruction.getInstructionUseBegin(); usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister()) {
|
||||
RegisterName name = usePtr->getRegisterName();
|
||||
if (newName[name] == rnInvalid) {
|
||||
newName[name] = nextName;
|
||||
definingInstruction[nextName] = vrManager.getVirtualRegister(name).getDefiningInstruction();
|
||||
nextName = RegisterName(nextName + 1);
|
||||
}
|
||||
usePtr->setRegisterName(newName[name]);
|
||||
}
|
||||
|
||||
InstructionDefine* defineEnd = instruction.getInstructionDefineEnd();
|
||||
for (InstructionDefine* definePtr = instruction.getInstructionDefineBegin(); definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister()) {
|
||||
RegisterName name = definePtr->getRegisterName();
|
||||
if (newName[name] == rnInvalid) {
|
||||
newName[name] = nextName;
|
||||
definingInstruction[nextName] = vrManager.getVirtualRegister(name).getDefiningInstruction();
|
||||
nextName = RegisterName(nextName + 1);
|
||||
}
|
||||
definePtr->setRegisterName(newName[name]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vrManager.setSize(nextName);
|
||||
|
||||
for (RegisterName r = RegisterName(1); r < nextName; r = RegisterName(r + 1))
|
||||
vrManager.getVirtualRegister(r).definingInstruction = definingInstruction[r];
|
||||
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("RegisterMap:\n"));
|
||||
for (Uint32 i = 1; i < nameCount; i++)
|
||||
if (newName[i] != 0)
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("\tvr%d becomes vr%d.\n", i, newName[i]));
|
||||
else
|
||||
UT_OBJECTLOG(UT_LOG_MODULE(RegAlloc), PR_LOG_ALWAYS, ("\tvr%d is dead.\n", i));
|
||||
|
||||
|
||||
delete newName;
|
||||
delete definingInstruction;
|
||||
}
|
||||
|
||||
}
|
||||
#endif // DEBUG
|
||||
|
||||
void RegisterAllocatorTools::removeUnnecessaryCopies(RegisterAllocator& registerAllocator)
|
||||
{
|
||||
ControlGraph& controlGraph = registerAllocator.controlGraph;
|
||||
ControlNode** nodes = controlGraph.dfsList;
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
RegisterName* name2range = registerAllocator.name2range;
|
||||
|
||||
for (Uint32 n = 0; n < nNodes; n++) {
|
||||
InstructionList& instructions = nodes[n]->getInstructions();
|
||||
for (InstructionList::iterator i = instructions.begin(); !instructions.done(i);) {
|
||||
Instruction& instruction = instructions.get(i);
|
||||
i = instructions.advance(i);
|
||||
|
||||
if (instruction.getFlags() & ifCopy) {
|
||||
assert(instruction.getInstructionUseBegin() != instruction.getInstructionUseEnd() && instruction.getInstructionUseBegin()[0].isRegister());
|
||||
assert(instruction.getInstructionDefineBegin() != instruction.getInstructionDefineEnd() && instruction.getInstructionDefineBegin()[0].isRegister());
|
||||
|
||||
RegisterName source = name2range[instruction.getInstructionUseBegin()[0].getRegisterName()];
|
||||
RegisterName destination = name2range[instruction.getInstructionDefineBegin()[0].getRegisterName()];
|
||||
|
||||
if (source == destination)
|
||||
instruction.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void RegisterAllocatorTools::updateInstructionGraph(RegisterAllocator& registerAllocator)
|
||||
{
|
||||
ControlGraph& controlGraph = registerAllocator.controlGraph;
|
||||
ControlNode** nodes = controlGraph.dfsList;
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
RegisterName* name2range = registerAllocator.name2range;
|
||||
|
||||
for (Uint32 n = 0; n < nNodes; n++) {
|
||||
InstructionList& instructions = nodes[n]->getInstructions();
|
||||
for (InstructionList::iterator i = instructions.begin(); !instructions.done(i); i = instructions.advance(i)) {
|
||||
Instruction& instruction = instructions.get(i);
|
||||
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
for (InstructionUse* usePtr = instruction.getInstructionUseBegin(); usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister())
|
||||
usePtr->setRegisterName(name2range[usePtr->getRegisterName()]);
|
||||
|
||||
InstructionDefine* defineEnd = instruction.getInstructionDefineEnd();
|
||||
for (InstructionDefine* definePtr = instruction.getInstructionDefineBegin(); definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister())
|
||||
definePtr->setRegisterName(name2range[definePtr->getRegisterName()]);
|
||||
}
|
||||
|
||||
InstructionList& phiNodes = nodes[n]->getPhiNodeInstructions();
|
||||
for (InstructionList::iterator p = phiNodes.begin(); !phiNodes.done(p); p = phiNodes.advance(p)) {
|
||||
Instruction& instruction = phiNodes.get(p);
|
||||
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
for (InstructionUse* usePtr = instruction.getInstructionUseBegin(); usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister())
|
||||
usePtr->setRegisterName(name2range[usePtr->getRegisterName()]);
|
||||
|
||||
InstructionDefine* defineEnd = instruction.getInstructionDefineEnd();
|
||||
for (InstructionDefine* definePtr = instruction.getInstructionDefineBegin(); definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister())
|
||||
definePtr->setRegisterName(name2range[definePtr->getRegisterName()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void RegisterAllocatorTools::insertPhiNodeInstructions(ControlGraph& controlGraph, InstructionEmitter& emitter)
|
||||
{
|
||||
Pool& pool = controlGraph.pool;
|
||||
ControlNode** nodes = controlGraph.dfsList;
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
|
||||
for (Uint32 n = 0; n < nNodes; n++) {
|
||||
ControlNode& node = *nodes[n];
|
||||
DoublyLinkedList<PhiNode>& phiNodes = node.getPhiNodes();
|
||||
|
||||
if (!phiNodes.empty()) {
|
||||
|
||||
// Set the index of the incoming edges.
|
||||
Uint32 index = 0;
|
||||
const DoublyLinkedList<ControlEdge>& predecessors = node.getPredecessors();
|
||||
for (DoublyLinkedList<ControlEdge>::iterator p = predecessors.begin(); !predecessors.done(p); p = predecessors.advance(p))
|
||||
predecessors.get(p).setIndex(index++);
|
||||
|
||||
// Insert the phi node instruction in the instruction list.
|
||||
for (DoublyLinkedList<PhiNode>::iterator i = phiNodes.begin(); !phiNodes.done(i); i = phiNodes.advance(i)) {
|
||||
PhiNode& phiNode = phiNodes.get(i);
|
||||
ValueKind kind = phiNode.getKind();
|
||||
|
||||
if (!isStorableKind(kind))
|
||||
continue;
|
||||
|
||||
RegisterClassKind classKind = rckGeneral; // FIX: get class kind from phi node kind.
|
||||
Uint32 nInputs = phiNode.nInputs();
|
||||
|
||||
PhiNodeInstruction& phiNodeInstruction = *new(pool) PhiNodeInstruction(&phiNode, pool, nInputs);
|
||||
|
||||
emitter.defineProducer(phiNode, phiNodeInstruction, 0, classKind, drLow);
|
||||
for (Uint32 whichInput = 0; whichInput < nInputs; whichInput++)
|
||||
emitter.useProducer(phiNode.nthInputVariable(whichInput), phiNodeInstruction, whichInput, classKind, drLow);
|
||||
|
||||
node.addPhiNodeInstruction(phiNodeInstruction);
|
||||
|
||||
if (isDoublewordKind(kind)) {
|
||||
PhiNodeInstruction& phiNodeInstruction = *new(pool) PhiNodeInstruction(&phiNode, pool, nInputs);
|
||||
|
||||
emitter.defineProducer(phiNode, phiNodeInstruction, 0, classKind, drHigh);
|
||||
for (Uint32 whichInput = 0; whichInput < nInputs; whichInput++)
|
||||
emitter.useProducer(phiNode.nthInputVariable(whichInput), phiNodeInstruction, whichInput, classKind, drHigh);
|
||||
|
||||
node.addPhiNodeInstruction(phiNodeInstruction);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
|
||||
void RegisterAllocatorTools::printSpillCosts(RegisterAllocator& registerAllocator)
|
||||
{
|
||||
LogModuleObject log = UT_LOG_MODULE(RegAlloc);
|
||||
Uint32 rangeCount = registerAllocator.rangeCount;
|
||||
SpillCost* cost = registerAllocator.spillCost;
|
||||
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("Spill costs:\n"));
|
||||
for (Uint32 i = 1; i < rangeCount; i++) {
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("\trange %d : ", i));
|
||||
if (cost[i].infinite)
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("infinite\n"));
|
||||
else
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("%f\n", cost[i].cost));
|
||||
}
|
||||
}
|
||||
|
||||
void RegisterAllocatorTools::printSplitCosts(RegisterAllocator& registerAllocator)
|
||||
{
|
||||
LogModuleObject log = UT_LOG_MODULE(RegAlloc);
|
||||
Uint32 rangeCount = registerAllocator.rangeCount;
|
||||
SplitCost* cost = registerAllocator.splitCost;
|
||||
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("Split costs:\n"));
|
||||
for (Uint32 i = 1; i < rangeCount; i++) {
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("\trange %d : loads = %f stores = %f\n", i, cost[i].loads, cost[i].stores));
|
||||
}
|
||||
}
|
||||
|
||||
void RegisterAllocatorTools::printInstructions(RegisterAllocator& registerAllocator)
|
||||
{
|
||||
LogModuleObject log = UT_LOG_MODULE(RegAlloc);
|
||||
ControlNode** nodes = registerAllocator.controlGraph.dfsList;
|
||||
Uint32 nNodes = registerAllocator.controlGraph.nNodes;
|
||||
|
||||
for (Uint32 n = 0; n < nNodes; n++) {
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("N%d:\n", n));
|
||||
|
||||
InstructionList& phiNodes = nodes[n]->getPhiNodeInstructions();
|
||||
InstructionList& instructions = nodes[n]->getInstructions();
|
||||
|
||||
if (!phiNodes.empty()) {
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, (" PhiNodes:\n", n));
|
||||
for(InstructionList::iterator i = phiNodes.begin(); !phiNodes.done(i); i = phiNodes.advance(i)) {
|
||||
phiNodes.get(i).printPretty(log);
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("\n"));
|
||||
}
|
||||
if (!instructions.empty())
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, (" Instructions:\n", n));
|
||||
}
|
||||
|
||||
for(InstructionList::iterator i = instructions.begin(); !instructions.done(i); i = instructions.advance(i)) {
|
||||
instructions.get(i).printPretty(log);
|
||||
UT_OBJECTLOG(log, PR_LOG_ALWAYS, ("\n"));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif // DEBUG_LOG
|
||||
@@ -1,117 +0,0 @@
|
||||
// -*- mode:C++; tab-width:4; truncate-lines:t -*-
|
||||
//
|
||||
// CONFIDENTIAL AND PROPRIETARY SOURCE CODE OF
|
||||
// NETSCAPE COMMUNICATIONS CORPORATION
|
||||
// Copyright © 1996, 1997 Netscape Communications Corporation. All Rights
|
||||
// Reserved. Use of this Source Code is subject to the terms of the
|
||||
// applicable license agreement from Netscape Communications Corporation.
|
||||
// The copyright notice(s) in this Source Code does not indicate actual or
|
||||
// intended publication of this Source Code.
|
||||
//
|
||||
// $Id: RegisterAllocatorTools.h,v 1.1.2.1 1999-03-02 16:12:05 fur%netscape.com Exp $
|
||||
//
|
||||
|
||||
#ifndef _REGISTER_ALLOCATOR_TOOLS_H_
|
||||
#define _REGISTER_ALLOCATOR_TOOLS_H_
|
||||
|
||||
#include "LogModule.h"
|
||||
#include "RegisterTypes.h"
|
||||
#include <string.h>
|
||||
|
||||
class RegisterAllocator;
|
||||
class ControlGraph;
|
||||
class InstructionEmitter;
|
||||
class VirtualRegisterManager;
|
||||
|
||||
struct RegisterAllocatorTools
|
||||
{
|
||||
//
|
||||
//
|
||||
static void insertPhiNodeInstructions(ControlGraph& controlGraph, InstructionEmitter& emitter);
|
||||
|
||||
//
|
||||
//
|
||||
static void updateInstructionGraph(RegisterAllocator& registerAllocator);
|
||||
|
||||
//
|
||||
//
|
||||
static void removeUnnecessaryCopies(RegisterAllocator& registerAllocator);
|
||||
|
||||
#ifdef DEBUG
|
||||
//
|
||||
//
|
||||
static void testTheInstructionGraph(ControlGraph& controlGraph, VirtualRegisterManager& vrManager);
|
||||
#endif // DEBUG
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
//
|
||||
//
|
||||
static void printInstructions(RegisterAllocator& registerAllocator);
|
||||
|
||||
//
|
||||
//
|
||||
static void printSpillCosts(RegisterAllocator& registerAllocator);
|
||||
|
||||
//
|
||||
//
|
||||
static void printSplitCosts(RegisterAllocator& registerAllocator);
|
||||
#endif // DEBUG_LOG
|
||||
};
|
||||
|
||||
//
|
||||
// FIX: this should go in a class (LookupTable ?)
|
||||
//
|
||||
|
||||
inline RegisterName findRoot(RegisterName name, RegisterName* table)
|
||||
{
|
||||
RegisterName* stack = table;
|
||||
RegisterName* stackPtr = stack;
|
||||
|
||||
RegisterName newName;
|
||||
while((newName = table[name]) != name) {
|
||||
*--stackPtr = name;
|
||||
name = newName;
|
||||
}
|
||||
|
||||
while (stackPtr != stack)
|
||||
table[*stackPtr++] = name;
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
inline void init(RegisterName* table, Uint32 nameCount)
|
||||
{
|
||||
for (RegisterName r = RegisterName(0); r < nameCount; r = RegisterName(r + 1))
|
||||
table[r] = r;
|
||||
}
|
||||
|
||||
inline Uint32 compress(RegisterName* name2range, RegisterName* table, Uint32 nameCount, Uint32 tableSize)
|
||||
{
|
||||
RegisterName* liveRange = new RegisterName[tableSize];
|
||||
memset(liveRange, '\0', tableSize * sizeof(RegisterName));
|
||||
|
||||
// Update the lookup table.
|
||||
for (RegisterName r = RegisterName(1); r < tableSize; r = RegisterName(r + 1))
|
||||
findRoot(r, table);
|
||||
|
||||
// Count the liveranges.
|
||||
Uint32 liveRangeCount = 1;
|
||||
for (RegisterName s = RegisterName(1); s < tableSize; s = RegisterName(s + 1))
|
||||
if (table[s] == s)
|
||||
liveRange[s] = RegisterName(liveRangeCount++);
|
||||
|
||||
for (RegisterName t = RegisterName(1); t < nameCount; t = RegisterName(t + 1))
|
||||
name2range[t] = liveRange[table[name2range[t]]];
|
||||
|
||||
return liveRangeCount;
|
||||
}
|
||||
|
||||
inline double doLog10(Uint32 power)
|
||||
{
|
||||
double log = 1.0;
|
||||
while (power--)
|
||||
log *= 10.0;
|
||||
return log;
|
||||
}
|
||||
|
||||
#endif // _REGISTER_ALLOCATOR_TOOLS_H_
|
||||
@@ -1,104 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _REGISTER_TYPES_H_
|
||||
#define _REGISTER_TYPES_H_
|
||||
|
||||
#include "Fundamentals.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// RegisterName -
|
||||
//
|
||||
|
||||
enum RegisterName {
|
||||
rnInvalid = 0,
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// RegisterClassKind -
|
||||
//
|
||||
|
||||
enum RegisterClassKind {
|
||||
rckInvalid = 0,
|
||||
rckGeneral,
|
||||
rckStackSlot,
|
||||
|
||||
nRegisterClassKind
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// RegisterID -
|
||||
//
|
||||
|
||||
enum RegisterID {
|
||||
invalidID = 0
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// RegisterKind -
|
||||
//
|
||||
|
||||
enum RegisterKind {
|
||||
rkCallerSave = 0,
|
||||
rkCalleeSave,
|
||||
};
|
||||
|
||||
struct NameLinkedList {
|
||||
RegisterName name;
|
||||
NameLinkedList* next;
|
||||
};
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
const registerNameMask = 0x03ffffff;
|
||||
const coloredRegisterMask = 0x04000000;
|
||||
const machineRegisterMask = 0x08000000;
|
||||
const registerClassMask = 0xf0000000;
|
||||
|
||||
const registerNameShift = 0;
|
||||
const coloredRegisterShift = 26;
|
||||
const machineRegisterShift = 27;
|
||||
const registerClassShift = 28;
|
||||
|
||||
#else // DEBUG
|
||||
|
||||
const registerNameMask = 0x0fffffff;
|
||||
const registerClassMask = 0xf0000000;
|
||||
|
||||
const registerNameShift = 0;
|
||||
const registerClassShift = 28;
|
||||
|
||||
#endif // DEBUG
|
||||
|
||||
|
||||
inline RegisterClassKind getClass(RegisterID registerID) {return RegisterClassKind((registerID & registerClassMask) >> registerClassShift);}
|
||||
inline RegisterName getName(RegisterID registerID) {return RegisterName((registerID & registerNameMask) >> registerNameShift);}
|
||||
inline void setClass(RegisterID& registerID, RegisterClassKind classKind) {registerID = RegisterID((registerID & ~registerClassMask) | ((classKind << registerClassShift) & registerClassMask));}
|
||||
inline void setName(RegisterID& registerID, RegisterName name) {assert((name & ~registerNameMask) == 0); registerID = RegisterID((registerID & ~registerNameMask) | ((name << registerNameShift) & registerNameMask));}
|
||||
inline RegisterID buildRegisterID(RegisterName name, RegisterClassKind classKind) {return RegisterID(((classKind << registerClassShift) & registerClassMask) | ((name << registerNameShift) & registerNameMask));}
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
inline bool isMachineRegister(RegisterID rid) {return (rid & machineRegisterMask) != 0;}
|
||||
inline void setMachineRegister(RegisterID& rid) {rid = RegisterID(rid | machineRegisterMask);}
|
||||
inline bool isColoredRegister(RegisterID rid) {return (rid & coloredRegisterMask) != 0;}
|
||||
inline void setColoredRegister(RegisterID& rid) {rid = RegisterID(rid | coloredRegisterMask);}
|
||||
|
||||
#endif // DEBUG
|
||||
|
||||
#endif // _REGISTER_TYPES_H_
|
||||
@@ -1,168 +0,0 @@
|
||||
// -*- mode:C++; tab-width:4; truncate-lines:t -*-
|
||||
//
|
||||
// CONFIDENTIAL AND PROPRIETARY SOURCE CODE OF
|
||||
// NETSCAPE COMMUNICATIONS CORPORATION
|
||||
// Copyright © 1996, 1997 Netscape Communications Corporation. All Rights
|
||||
// Reserved. Use of this Source Code is subject to the terms of the
|
||||
// applicable license agreement from Netscape Communications Corporation.
|
||||
// The copyright notice(s) in this Source Code does not indicate actual or
|
||||
// intended publication of this Source Code.
|
||||
//
|
||||
// $Id: SparseSet.h,v 1.1.2.1 1999-03-02 16:12:07 fur%netscape.com Exp $
|
||||
//
|
||||
|
||||
#ifndef _SPARSE_SET_H_
|
||||
#define _SPARSE_SET_H_
|
||||
|
||||
#include "Fundamentals.h"
|
||||
#include "Pool.h"
|
||||
#include "LogModule.h"
|
||||
#include "BitSet.h"
|
||||
|
||||
class SparseSet
|
||||
{
|
||||
private:
|
||||
|
||||
struct Node {
|
||||
Uint32 element;
|
||||
Uint32 stackIndex;
|
||||
};
|
||||
|
||||
Node* node;
|
||||
Uint32 count;
|
||||
Uint32 universeSize;
|
||||
|
||||
private:
|
||||
|
||||
// No copy constructor.
|
||||
SparseSet(const SparseSet&);
|
||||
|
||||
// Check if the given set's universe is of the same size than this universe.
|
||||
void checkUniverseCompatibility(const SparseSet& set) const {assert(set.universeSize == universeSize);}
|
||||
// Check if pos is valid for this set's universe.
|
||||
void checkMember(Int32 pos) const {assert(pos >=0 && Uint32(pos) < universeSize);}
|
||||
|
||||
public:
|
||||
|
||||
SparseSet(Pool& pool, Uint32 universeSize) : universeSize(universeSize) {node = new(pool) Node[universeSize]; clear();}
|
||||
|
||||
// Clear the sparse set.
|
||||
void clear() {count = 0;}
|
||||
// Clear the element at index.
|
||||
inline void clear(Uint32 index);
|
||||
// Set the element at index.
|
||||
inline void set(Uint32 index);
|
||||
// Return true if the element at index is set.
|
||||
inline bool test(Uint32 index) const;
|
||||
// Union with the given sparse set.
|
||||
inline void or(const SparseSet& set);
|
||||
// Intersection with the given sparse set.
|
||||
inline void and(const SparseSet& set);
|
||||
// Difference with the given sparse set.
|
||||
inline void difference(const SparseSet& set);
|
||||
// Copy set.
|
||||
inline SparseSet& operator = (const SparseSet& set);
|
||||
inline SparseSet& operator = (const BitSet& set);
|
||||
// Return true if the sparse sets are identical.
|
||||
friend bool operator == (const SparseSet& set1, const SparseSet& set2);
|
||||
// Return true if the sparse sets are different.
|
||||
friend bool operator != (const SparseSet& set1, const SparseSet& set2);
|
||||
|
||||
// Logical operators.
|
||||
SparseSet& operator |= (const SparseSet& set) {or(set); return *this;}
|
||||
SparseSet& operator &= (const SparseSet& set) {and(set); return *this;}
|
||||
SparseSet& operator -= (const SparseSet& set) {difference(set); return *this;}
|
||||
|
||||
// Iterator to conform with the set API.
|
||||
typedef Int32 iterator;
|
||||
// Return the iterator for the first element of this set.
|
||||
iterator begin() const {return count - 1;}
|
||||
// Return the next iterator.
|
||||
iterator advance(iterator pos) const {return --pos;}
|
||||
// Return true if the iterator is at the end of the set.
|
||||
bool done(iterator pos) const {return pos < 0;}
|
||||
// Return the element for the given iterator;
|
||||
Uint32 get(iterator pos) const {return node[pos].element;}
|
||||
// Return one element of this set.
|
||||
Uint32 getOne() const {assert(count > 0); return node[0].element;}
|
||||
// Return the size of this set.
|
||||
Uint32 getSize() const {return count;}
|
||||
|
||||
#ifdef DEBUG_LOG
|
||||
// Print the set.
|
||||
void printPretty(LogModuleObject log);
|
||||
#endif // DEBUG_LOG
|
||||
};
|
||||
|
||||
inline void SparseSet::clear(Uint32 element)
|
||||
{
|
||||
checkMember(element);
|
||||
Uint32 count = this->count;
|
||||
Node* node = this->node;
|
||||
|
||||
Uint32 stackIndex = node[element].stackIndex;
|
||||
|
||||
if ((stackIndex < count) && (node[stackIndex].element == element)) {
|
||||
Uint32 stackTop = node[count - 1].element;
|
||||
|
||||
node[stackIndex].element = stackTop;
|
||||
node[stackTop].stackIndex = stackIndex;
|
||||
this->count = count - 1;
|
||||
}
|
||||
}
|
||||
|
||||
inline void SparseSet::set(Uint32 element)
|
||||
{
|
||||
checkMember(element);
|
||||
Uint32 count = this->count;
|
||||
Node* node = this->node;
|
||||
|
||||
Uint32 stackIndex = node[element].stackIndex;
|
||||
|
||||
if ((stackIndex >= count) || (node[stackIndex].element != element)) {
|
||||
node[count].element = element;
|
||||
node[element].stackIndex = count;
|
||||
this->count = count + 1;
|
||||
}
|
||||
}
|
||||
|
||||
inline bool SparseSet::test(Uint32 element) const
|
||||
{
|
||||
checkMember(element);
|
||||
Node* node = this->node;
|
||||
|
||||
Uint32 stackIndex = node[element].stackIndex;
|
||||
return ((stackIndex < count) && (node[stackIndex].element == element));
|
||||
}
|
||||
|
||||
inline SparseSet& SparseSet::operator = (const SparseSet& set)
|
||||
{
|
||||
checkUniverseCompatibility(set);
|
||||
Uint32 sourceCount = set.getSize();
|
||||
Node* node = this->node;
|
||||
|
||||
memcpy(node, set.node, sourceCount * sizeof(Node));
|
||||
|
||||
for (Uint32 i = 0; i < sourceCount; i++) {
|
||||
Uint32 element = node[i].element;
|
||||
node[element].stackIndex = i;
|
||||
}
|
||||
|
||||
count = sourceCount;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
inline SparseSet& SparseSet::operator = (const BitSet& set)
|
||||
{
|
||||
// FIX: there's room for optimization here.
|
||||
assert(universeSize == set.getSize());
|
||||
|
||||
clear();
|
||||
for (Int32 i = set.firstOne(); i != -1; i = set.nextOne(i))
|
||||
this->set(i);
|
||||
return *this;
|
||||
}
|
||||
|
||||
#endif // _SPARSE_SET_H_
|
||||
@@ -1,270 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef NEW_LAURENTM_CODE
|
||||
#define INCLUDE_EMITTER
|
||||
#include "CpuInfo.h"
|
||||
#include "Fundamentals.h"
|
||||
#include "ControlNodes.h"
|
||||
#include "Instruction.h"
|
||||
#include "InstructionEmitter.h"
|
||||
#include "Spilling.h"
|
||||
|
||||
|
||||
void Spilling::
|
||||
insertSpillCode(ControlNode** dfsList, Uint32 nNodes)
|
||||
{
|
||||
PRUint32 nVirtualRegisters = vRegManager.count();
|
||||
FastBitSet currentLive(vRegManager.pool, nVirtualRegisters);
|
||||
FastBitSet usedInThisInstruction(vRegManager.pool, nVirtualRegisters);
|
||||
RegisterFifo grNeedLoad(nVirtualRegisters);
|
||||
RegisterFifo fpNeedLoad(nVirtualRegisters);
|
||||
|
||||
for (PRInt32 n = nNodes - 1; n >= 0; n--)
|
||||
{
|
||||
PR_ASSERT(grNeedLoad.empty() & fpNeedLoad.empty());
|
||||
ControlNode& node = *dfsList[n];
|
||||
|
||||
currentLive = node.liveAtEnd;
|
||||
|
||||
PRUint32 nGeneralAlive = 0;
|
||||
PRUint32 nFloatingPointAlive = 0;
|
||||
|
||||
// Get the number of registers alive at the end of this node.
|
||||
for (PRInt32 j = currentLive.firstOne(); j != -1; j = currentLive.nextOne(j))
|
||||
{
|
||||
VirtualRegister& vReg = vRegManager.getVirtualRegister(j);
|
||||
if (vReg.spillInfo.willSpill)
|
||||
{
|
||||
currentLive.clear(j);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (vReg.getClass())
|
||||
{
|
||||
case vrcInteger:
|
||||
nGeneralAlive++;
|
||||
break;
|
||||
case vrcFloatingPoint:
|
||||
case vrcFixedPoint:
|
||||
nFloatingPointAlive++;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if(node.dfsNum == 8) printf("\n________Begin Node %d________\n", node.dfsNum);
|
||||
|
||||
InstructionList& instructions = node.getInstructions();
|
||||
for (InstructionList::iterator i = instructions.end(); !instructions.done(i); i = instructions.retreat(i))
|
||||
{
|
||||
Instruction& instruction = instructions.get(i);
|
||||
InstructionUse* useBegin = instruction.getInstructionUseBegin();
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
InstructionUse* usePtr;
|
||||
InstructionDefine* defBegin = instruction.getInstructionDefineBegin();
|
||||
InstructionDefine* defEnd = instruction.getInstructionDefineEnd();
|
||||
InstructionDefine* defPtr;
|
||||
|
||||
// if(node.dfsNum == 8) { printf("\n");
|
||||
// instruction.printPretty(stdout);
|
||||
// printf("\n"); }
|
||||
|
||||
// Handle definitions
|
||||
for (defPtr = defBegin; defPtr < defEnd; defPtr++)
|
||||
if (defPtr->isVirtualRegister())
|
||||
{
|
||||
VirtualRegister& vReg = defPtr->getVirtualRegister();
|
||||
currentLive.clear(vReg.getRegisterIndex());
|
||||
switch (vReg.getClass())
|
||||
{
|
||||
case vrcInteger:
|
||||
nGeneralAlive--;
|
||||
break;
|
||||
case vrcFloatingPoint:
|
||||
case vrcFixedPoint:
|
||||
nFloatingPointAlive--;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Check for deaths
|
||||
for (usePtr = useBegin; usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isVirtualRegister())
|
||||
{
|
||||
VirtualRegister& vReg = usePtr->getVirtualRegister();
|
||||
if (!currentLive.test(vReg.getRegisterIndex()))
|
||||
// This is the last use of this register.
|
||||
{
|
||||
currentLive.set(vReg.getRegisterIndex());
|
||||
switch (vReg.getClass())
|
||||
{
|
||||
case vrcInteger:
|
||||
nGeneralAlive++;
|
||||
while (/*(nGeneralAlive > NUMBER_OF_GREGISTERS) &&*/ !grNeedLoad.empty())
|
||||
{
|
||||
PRUint32 toLoad = grNeedLoad.get();
|
||||
currentLive.clear(toLoad);
|
||||
nGeneralAlive--;
|
||||
|
||||
VirtualRegister& nReg = vRegManager.getVirtualRegister(toLoad);
|
||||
Instruction& lastUsingInstruction = *nReg.spillInfo.lastUsingInstruction;
|
||||
emitter.emitLoadAfter(*lastUsingInstruction.getPrimitive(), lastUsingInstruction.getLinks().prev,
|
||||
nReg.getAlias(), *nReg.equivalentRegister[vrcStackSlot]);
|
||||
nReg.releaseSelf();
|
||||
}
|
||||
break;
|
||||
case vrcFloatingPoint:
|
||||
case vrcFixedPoint:
|
||||
nFloatingPointAlive++;
|
||||
while (/*(nFloatingPointAlive > NUMBER_OF_FPREGISTERS) &&*/ !fpNeedLoad.empty())
|
||||
{
|
||||
PRUint32 toLoad = fpNeedLoad.get();
|
||||
currentLive.clear(toLoad);
|
||||
nFloatingPointAlive--;
|
||||
|
||||
VirtualRegister& nReg = vRegManager.getVirtualRegister(toLoad);
|
||||
Instruction& lastUsingInstruction = *nReg.spillInfo.lastUsingInstruction;
|
||||
emitter.emitLoadAfter(*lastUsingInstruction.getPrimitive(), lastUsingInstruction.getLinks().prev,
|
||||
nReg.getAlias(), *nReg.equivalentRegister[vrcStackSlot]);
|
||||
nReg.releaseSelf();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Handle uses
|
||||
for (usePtr = useBegin; usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isVirtualRegister())
|
||||
{
|
||||
VirtualRegister& vReg = usePtr->getVirtualRegister();
|
||||
PRUint32 registerIndex = vReg.getRegisterIndex();
|
||||
|
||||
if (vReg.spillInfo.willSpill) {
|
||||
#if defined(GENERATE_FOR_X86)
|
||||
if (!instruction.switchUseToSpill((usePtr - useBegin), *vReg.equivalentRegister[vrcStackSlot]))
|
||||
#endif
|
||||
{
|
||||
switch (vReg.getClass())
|
||||
{
|
||||
case vrcInteger:
|
||||
if (!grNeedLoad.test(registerIndex))
|
||||
{
|
||||
grNeedLoad.put(registerIndex);
|
||||
VirtualRegister& alias = vRegManager.newVirtualRegister(vrcInteger);
|
||||
if (vReg.isPreColored())
|
||||
alias.preColorRegister(vReg.getPreColor());
|
||||
/* if (vReg.hasSpecialInterference) {
|
||||
alias.specialInterference.sizeTo(NUMBER_OF_REGISTERS);
|
||||
alias.specialInterference = vReg.specialInterference;
|
||||
alias.hasSpecialInterference = true;
|
||||
} */
|
||||
vReg.setAlias(alias);
|
||||
vReg.retainSelf();
|
||||
}
|
||||
break;
|
||||
case vrcFloatingPoint:
|
||||
case vrcFixedPoint:
|
||||
if (!fpNeedLoad.test(registerIndex))
|
||||
{
|
||||
fpNeedLoad.put(registerIndex);
|
||||
VirtualRegister& alias = vRegManager.newVirtualRegister(vReg.getClass());
|
||||
if (vReg.isPreColored())
|
||||
alias.preColorRegister(vReg.getPreColor());
|
||||
/*if (vReg.hasSpecialInterference) {
|
||||
alias.specialInterference.sizeTo(NUMBER_OF_REGISTERS);
|
||||
alias.specialInterference = vReg.specialInterference;
|
||||
alias.hasSpecialInterference = true;
|
||||
} */
|
||||
vReg.setAlias(alias);
|
||||
vReg.retainSelf();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
usePtr->getVirtualRegisterPtr().initialize(vReg.getAlias());
|
||||
usedInThisInstruction.set(registerIndex);
|
||||
vReg.spillInfo.lastUsingInstruction = &instruction;
|
||||
}
|
||||
currentLive.clear(registerIndex);
|
||||
} else { // will not spill
|
||||
currentLive.set(registerIndex);
|
||||
}
|
||||
}
|
||||
|
||||
// Handle definitions
|
||||
for (defPtr = defBegin; defPtr < defEnd; defPtr++)
|
||||
if (defPtr->isVirtualRegister())
|
||||
{
|
||||
VirtualRegister& vReg = defPtr->getVirtualRegister();
|
||||
|
||||
if (vReg.spillInfo.willSpill)
|
||||
#if defined(GENERATE_FOR_X86)
|
||||
if (!instruction.switchDefineToSpill((defPtr - defBegin), *vReg.equivalentRegister[vrcStackSlot]))
|
||||
#endif
|
||||
{
|
||||
if (usedInThisInstruction.test(vReg.getRegisterIndex()))
|
||||
// this virtualRegister was used in this instruction and is also defined. We need to move
|
||||
// this virtual register to its alias first and then save it to memory.
|
||||
{
|
||||
emitter.emitStoreAfter(*instruction.getPrimitive(), &instruction.getLinks(),
|
||||
vReg.getAlias(), *vReg.equivalentRegister[vrcStackSlot]);
|
||||
defPtr->getVirtualRegisterPtr().initialize(vReg.getAlias());
|
||||
}
|
||||
else
|
||||
{
|
||||
emitter.emitStoreAfter(*instruction.getPrimitive(), &instruction.getLinks(),
|
||||
vReg, *vReg.equivalentRegister[vrcStackSlot]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
while (!grNeedLoad.empty())
|
||||
{
|
||||
PRUint32 nl = grNeedLoad.get();
|
||||
VirtualRegister& nlReg = vRegManager.getVirtualRegister(nl);
|
||||
Instruction& lastUse = *nlReg.spillInfo.lastUsingInstruction;
|
||||
|
||||
emitter.emitLoadAfter(*lastUse.getPrimitive(), lastUse.getLinks().prev,
|
||||
nlReg.getAlias(), *nlReg.equivalentRegister[vrcStackSlot]);
|
||||
nlReg.releaseSelf();
|
||||
}
|
||||
while (!fpNeedLoad.empty())
|
||||
{
|
||||
PRUint32 nl = fpNeedLoad.get();
|
||||
VirtualRegister& nlReg = vRegManager.getVirtualRegister(nl);
|
||||
Instruction& lastUse = *nlReg.spillInfo.lastUsingInstruction;
|
||||
|
||||
emitter.emitLoadAfter(*lastUse.getPrimitive(), lastUse.getLinks().prev,
|
||||
nlReg.getAlias(), *nlReg.equivalentRegister[vrcStackSlot]);
|
||||
nlReg.releaseSelf();
|
||||
}
|
||||
|
||||
// if(node.dfsNum == 8) printf("\n________End Node %d________\n", node.dfsNum);
|
||||
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -1,269 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _SPILLING_H_
|
||||
#define _SPILLING_H_
|
||||
|
||||
#include "Fundamentals.h"
|
||||
#include <string.h>
|
||||
#include "RegisterAllocator.h"
|
||||
#include "RegisterAllocatorTools.h"
|
||||
#include "ControlGraph.h"
|
||||
#include "ControlNodes.h"
|
||||
#include "Instruction.h"
|
||||
#include "SparseSet.h"
|
||||
|
||||
template <class RegisterPressure>
|
||||
class Spilling
|
||||
{
|
||||
private:
|
||||
static void insertStoreAfter(Instruction& instruction, RegisterName name);
|
||||
static void insertLoadBefore(Instruction& instruction, RegisterName name);
|
||||
|
||||
public:
|
||||
static void calculateSpillCosts(RegisterAllocator& registerAllocator);
|
||||
static void insertSpillCode(RegisterAllocator& registerAllocator);
|
||||
};
|
||||
|
||||
struct SpillCost
|
||||
{
|
||||
double loads;
|
||||
double stores;
|
||||
double copies;
|
||||
double cost;
|
||||
bool infinite;
|
||||
};
|
||||
|
||||
template <class RegisterPressure>
|
||||
void Spilling<RegisterPressure>::insertSpillCode(RegisterAllocator& registerAllocator)
|
||||
{
|
||||
Uint32 rangeCount = registerAllocator.rangeCount;
|
||||
RegisterName* name2range = registerAllocator.name2range;
|
||||
|
||||
Pool& pool = registerAllocator.pool;
|
||||
SparseSet currentLive(pool, rangeCount);
|
||||
SparseSet needLoad(pool, rangeCount);
|
||||
SparseSet mustSpill(pool, rangeCount);
|
||||
SparseSet& willSpill = *registerAllocator.willSpill;
|
||||
|
||||
ControlGraph& controlGraph = registerAllocator.controlGraph;
|
||||
RegisterPressure::Set* liveOut = registerAllocator.liveness.liveOut;
|
||||
ControlNode** nodes = controlGraph.dfsList;
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
|
||||
for (Uint32 n = 0; n < nNodes; n++) {
|
||||
|
||||
needLoad.clear();
|
||||
currentLive = liveOut[n];
|
||||
mustSpill = currentLive;
|
||||
|
||||
InstructionList& instructions = nodes[n]->getInstructions();
|
||||
for (InstructionList::iterator i = instructions.end(); !instructions.done(i);) {
|
||||
Instruction& instruction = instructions.get(i);
|
||||
i = instructions.retreat(i);
|
||||
|
||||
InstructionUse* useBegin = instruction.getInstructionUseBegin();
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
InstructionUse* usePtr;
|
||||
InstructionDefine* defineBegin = instruction.getInstructionDefineBegin();
|
||||
InstructionDefine* defineEnd = instruction.getInstructionDefineEnd();
|
||||
InstructionDefine* definePtr;
|
||||
|
||||
bool foundLiveDefine = false;
|
||||
for (definePtr = defineBegin; definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister()) {
|
||||
if (currentLive.test(name2range[definePtr->getRegisterName()])) {
|
||||
foundLiveDefine = true;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
foundLiveDefine = true;
|
||||
break;
|
||||
}
|
||||
if (defineBegin != defineEnd && !foundLiveDefine) {
|
||||
fprintf(stderr, "!!! Removed instruction because it was only defining unused registers !!!\n");
|
||||
instruction.remove();
|
||||
}
|
||||
|
||||
for (definePtr = defineBegin; definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister()) {
|
||||
RegisterName range = name2range[definePtr->getRegisterName()];
|
||||
#ifdef DEBUG
|
||||
if (needLoad.test(range))
|
||||
if (!mustSpill.test(range) && registerAllocator.spillCost[range].infinite && willSpill.test(range)) {
|
||||
fprintf(stderr, "Tried to spill a register with infinite spill cost\n");
|
||||
abort();
|
||||
}
|
||||
#endif // DEBUG
|
||||
if (willSpill.test(range))
|
||||
insertStoreAfter(instruction, range);
|
||||
|
||||
needLoad.clear(range);
|
||||
}
|
||||
|
||||
if (instruction.getFlags() & ifCopy)
|
||||
for (usePtr = useBegin; usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister()) {
|
||||
RegisterName range = name2range[usePtr->getRegisterName()];
|
||||
if (!currentLive.test(range))
|
||||
for (SparseSet::iterator r = needLoad.begin(); !needLoad.done(r); r = needLoad.advance(r)) {
|
||||
RegisterName load = RegisterName(needLoad.get(r));
|
||||
if (willSpill.test(load))
|
||||
insertLoadBefore(instruction, load);
|
||||
mustSpill.set(load);
|
||||
}
|
||||
needLoad.clear();
|
||||
}
|
||||
|
||||
for (definePtr = defineBegin; definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister())
|
||||
currentLive.clear(name2range[definePtr->getRegisterName()]);
|
||||
|
||||
|
||||
for (usePtr = useBegin; usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister()) {
|
||||
RegisterName range = name2range[usePtr->getRegisterName()];
|
||||
currentLive.set(range);
|
||||
needLoad.set(range);
|
||||
}
|
||||
}
|
||||
|
||||
for (SparseSet::iterator l = needLoad.begin(); !needLoad.done(l); l = needLoad.advance(l)) {
|
||||
RegisterName load = RegisterName(needLoad.get(l));
|
||||
if (willSpill.test(load))
|
||||
insertLoadBefore(instructions.first(), load);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <class RegisterPressure>
|
||||
void Spilling<RegisterPressure>::insertLoadBefore(Instruction& /*instruction*/, RegisterName name)
|
||||
{
|
||||
fprintf(stdout, "will insert load for range %d\n", name);
|
||||
}
|
||||
|
||||
template <class RegisterPressure>
|
||||
void Spilling<RegisterPressure>::insertStoreAfter(Instruction& /*instruction*/, RegisterName name)
|
||||
{
|
||||
fprintf(stdout, "will insert store for range %d\n", name);
|
||||
}
|
||||
|
||||
template <class RegisterPressure>
|
||||
void Spilling<RegisterPressure>::calculateSpillCosts(RegisterAllocator& registerAllocator)
|
||||
{
|
||||
Uint32 rangeCount = registerAllocator.rangeCount;
|
||||
RegisterName* name2range = registerAllocator.name2range;
|
||||
|
||||
Pool& pool = registerAllocator.pool;
|
||||
SparseSet live(pool, rangeCount);
|
||||
SparseSet needLoad(pool, rangeCount);
|
||||
SparseSet mustSpill(pool, rangeCount);
|
||||
|
||||
SparseSet alreadyStored(pool, rangeCount); // FIX: should get this from previous spilling.
|
||||
|
||||
SpillCost* cost = new SpillCost[rangeCount];
|
||||
memset(cost, '\0', rangeCount * sizeof(SpillCost));
|
||||
|
||||
ControlGraph& controlGraph = registerAllocator.controlGraph;
|
||||
RegisterPressure::Set* liveOut = registerAllocator.liveness.liveOut;
|
||||
ControlNode** nodes = controlGraph.dfsList;
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
|
||||
for (Uint32 n = 0; n < nNodes; n++) {
|
||||
ControlNode& node = *nodes[n];
|
||||
|
||||
double weight = doLog10(node.loopDepth);
|
||||
|
||||
needLoad.clear();
|
||||
live = liveOut[n];
|
||||
mustSpill = live;
|
||||
|
||||
InstructionList& instructions = nodes[n]->getInstructions();
|
||||
for (InstructionList::iterator i = instructions.end(); !instructions.done(i); i = instructions.retreat(i)) {
|
||||
Instruction& instruction = instructions.get(i);
|
||||
|
||||
InstructionUse* useBegin = instruction.getInstructionUseBegin();
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
InstructionUse* usePtr;
|
||||
InstructionDefine* defineBegin = instruction.getInstructionDefineBegin();
|
||||
InstructionDefine* defineEnd = instruction.getInstructionDefineEnd();
|
||||
InstructionDefine* definePtr;
|
||||
|
||||
for (definePtr = defineBegin; definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister()) {
|
||||
RegisterName range = name2range[definePtr->getRegisterName()];
|
||||
|
||||
if (needLoad.test(range))
|
||||
if (!mustSpill.test(range))
|
||||
cost[range].infinite = true;
|
||||
|
||||
if ((false /* !rematerializable(range) */ || !needLoad.test(range)) && !alreadyStored.test(range))
|
||||
cost[range].stores += weight;
|
||||
|
||||
needLoad.clear(range);
|
||||
}
|
||||
|
||||
if (instruction.getFlags() & ifCopy)
|
||||
for (usePtr = useBegin; usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister())
|
||||
if (!live.test(name2range[usePtr->getRegisterName()])) {
|
||||
for (SparseSet::iterator l = needLoad.begin(); !needLoad.done(l); l = needLoad.advance(l)) {
|
||||
Uint32 range = needLoad.get(l);
|
||||
cost[range].loads += weight;
|
||||
mustSpill.set(range);
|
||||
}
|
||||
needLoad.clear();
|
||||
}
|
||||
|
||||
for (definePtr = defineBegin; definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister())
|
||||
live.clear(name2range[definePtr->getRegisterName()]);
|
||||
|
||||
for (usePtr = useBegin; usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister()) {
|
||||
RegisterName range = name2range[usePtr->getRegisterName()];
|
||||
|
||||
live.set(range);
|
||||
needLoad.set(range);
|
||||
}
|
||||
|
||||
if (instruction.getFlags() & ifCopy) {
|
||||
assert(useBegin != useEnd && useBegin[0].isRegister());
|
||||
assert(defineBegin != defineEnd && defineBegin[0].isRegister());
|
||||
|
||||
RegisterName source = name2range[useBegin[0].getRegisterName()];
|
||||
RegisterName destination = name2range[defineBegin[0].getRegisterName()];
|
||||
|
||||
cost[source].copies += weight;
|
||||
cost[destination].copies += weight;
|
||||
}
|
||||
}
|
||||
|
||||
for (SparseSet::iterator s = needLoad.begin(); !needLoad.done(s); s = needLoad.advance(s))
|
||||
cost[needLoad.get(s)].loads += weight;
|
||||
}
|
||||
|
||||
for (Uint32 r = 0; r < rangeCount; r++) {
|
||||
SpillCost& c = cost[r];
|
||||
c.cost = 2 * (c.loads + c.stores) - c.copies;
|
||||
}
|
||||
|
||||
registerAllocator.spillCost = cost;
|
||||
}
|
||||
|
||||
#endif // _SPILLING_H_
|
||||
@@ -1,239 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _SPLITS_H_
|
||||
#define _SPLITS_H_
|
||||
|
||||
#include "Fundamentals.h"
|
||||
#include <string.h>
|
||||
#include "Pool.h"
|
||||
#include "ControlGraph.h"
|
||||
#include "ControlNodes.h"
|
||||
#include "Instruction.h"
|
||||
#include "RegisterAllocator.h"
|
||||
#include "RegisterAllocatorTools.h"
|
||||
|
||||
UT_EXTERN_LOG_MODULE(RegAlloc);
|
||||
|
||||
template <class RegisterPressure>
|
||||
struct Splits
|
||||
{
|
||||
static void calculateSplitCosts(RegisterAllocator& registerAllocator);
|
||||
static bool findSplit(RegisterAllocator& registerAllocator, RegisterName* color, RegisterName range);
|
||||
static void insertSplitCode(RegisterAllocator& registerAllocator);
|
||||
};
|
||||
|
||||
struct SplitCost
|
||||
{
|
||||
double loads;
|
||||
double stores;
|
||||
};
|
||||
|
||||
template <class RegisterPressure>
|
||||
void Splits<RegisterPressure>::insertSplitCode(RegisterAllocator& /*registerAllocator*/)
|
||||
{
|
||||
// FIX
|
||||
}
|
||||
|
||||
template <class RegisterPressure>
|
||||
bool Splits<RegisterPressure>::findSplit(RegisterAllocator& registerAllocator, RegisterName* color, RegisterName range)
|
||||
{
|
||||
Pool& pool = registerAllocator.pool;
|
||||
NameLinkedList** neighborsWithColor = new(pool) NameLinkedList*[6]; // FIX
|
||||
memset(neighborsWithColor, '\0', 6 * sizeof(NameLinkedList*));
|
||||
|
||||
InterferenceGraph<RegisterPressure>& iGraph = registerAllocator.iGraph;
|
||||
|
||||
for (InterferenceVector* vector = iGraph.getInterferenceVector(range); vector != NULL; vector = vector->next)
|
||||
for (Int32 i = vector->count - 1; i >=0; --i) {
|
||||
RegisterName neighbor = vector->neighbors[i];
|
||||
RegisterName c = color[neighbor];
|
||||
|
||||
if (c < 6) { // FIX
|
||||
NameLinkedList* node = new(pool) NameLinkedList();
|
||||
node->name = neighbor;
|
||||
node->next = neighborsWithColor[c];
|
||||
neighborsWithColor[c] = node;
|
||||
}
|
||||
}
|
||||
|
||||
bool splitAroundName = true;
|
||||
|
||||
LiveRangeGraph<RegisterPressure>& lGraph = registerAllocator.lGraph;
|
||||
RegisterName bestColor = RegisterName(6); // FIX
|
||||
double bestCost = registerAllocator.spillCost[range].cost;
|
||||
SplitCost* splitCost = registerAllocator.splitCost;
|
||||
|
||||
for (RegisterName i = RegisterName(0); i < 6; i = RegisterName(i + 1)) { // FIX
|
||||
|
||||
double splitAroundNameCost = 0.0;
|
||||
bool canSplitAroundName = true;
|
||||
|
||||
SplitCost& sCost = splitCost[range];
|
||||
double addedCost = 2.0 * (sCost.stores + sCost.loads);
|
||||
|
||||
for (NameLinkedList* node = neighborsWithColor[i]; node != NULL; node = node->next) {
|
||||
RegisterName neighbor = node->name;
|
||||
if (lGraph.haveEdge(neighbor, range)) {
|
||||
canSplitAroundName = false;
|
||||
break;
|
||||
} else
|
||||
splitAroundNameCost += addedCost;
|
||||
}
|
||||
if (canSplitAroundName && splitAroundNameCost < bestCost) {
|
||||
bestCost = splitAroundNameCost;
|
||||
bestColor = i;
|
||||
splitAroundName = true;
|
||||
}
|
||||
|
||||
double splitAroundColorCost = 0.0;
|
||||
bool canSplitAroundColor = true;
|
||||
|
||||
for (NameLinkedList* node = neighborsWithColor[i]; node != NULL; node = node->next) {
|
||||
RegisterName neighbor = node->name;
|
||||
if (lGraph.haveEdge(range, neighbor)) {
|
||||
canSplitAroundColor = false;
|
||||
break;
|
||||
} else {
|
||||
SplitCost& sCost = splitCost[neighbor];
|
||||
double addedCost = 2.0 * (sCost.stores + sCost.loads);
|
||||
splitAroundColorCost += addedCost;
|
||||
}
|
||||
}
|
||||
if (canSplitAroundColor && splitAroundColorCost < bestCost) {
|
||||
bestCost = splitAroundColorCost;
|
||||
bestColor = i;
|
||||
splitAroundName = false;
|
||||
}
|
||||
}
|
||||
if (bestColor < RegisterName(6)) {
|
||||
color[range] = bestColor;
|
||||
registerAllocator.splitFound = true;
|
||||
|
||||
NameLinkedList** splitAround = registerAllocator.splitAround;
|
||||
|
||||
if (splitAroundName)
|
||||
for (NameLinkedList* node = neighborsWithColor[bestColor]; node != NULL; node = node->next) {
|
||||
NameLinkedList* newNode = new(pool) NameLinkedList();
|
||||
newNode->name = node->name;
|
||||
newNode->next = splitAround[range];
|
||||
splitAround[range] = newNode;
|
||||
}
|
||||
else
|
||||
for (NameLinkedList* node = neighborsWithColor[bestColor]; node != NULL; node = node->next) {
|
||||
NameLinkedList* newNode = new(pool) NameLinkedList();
|
||||
RegisterName neighbor = node->name;
|
||||
newNode->name = range;
|
||||
newNode->next = splitAround[neighbor];
|
||||
splitAround[neighbor] = newNode;
|
||||
}
|
||||
|
||||
trespass("Found a split");
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
template <class RegisterPressure>
|
||||
void Splits<RegisterPressure>::calculateSplitCosts(RegisterAllocator& registerAllocator)
|
||||
{
|
||||
Pool& pool = registerAllocator.pool;
|
||||
Uint32 rangeCount = registerAllocator.rangeCount;
|
||||
RegisterName* name2range = registerAllocator.name2range;
|
||||
|
||||
SplitCost* splitCost = new(pool) SplitCost[rangeCount];
|
||||
memset(splitCost, '\0', rangeCount * sizeof(SplitCost));
|
||||
|
||||
SparseSet live(pool, rangeCount);
|
||||
RegisterPressure::Set* liveIn = registerAllocator.liveness.liveIn;
|
||||
RegisterPressure::Set* liveOut = registerAllocator.liveness.liveOut;
|
||||
|
||||
ControlGraph& controlGraph = registerAllocator.controlGraph;
|
||||
ControlNode** nodes = controlGraph.dfsList;
|
||||
Uint32 nNodes = controlGraph.nNodes;
|
||||
|
||||
for (Uint32 n = 0; n < nNodes; n++) {
|
||||
ControlNode& node = *nodes[n];
|
||||
double weight = doLog10(node.loopDepth);
|
||||
|
||||
live = liveOut[n];
|
||||
|
||||
ControlEdge* successorsEnd = node.getSuccessorsEnd();
|
||||
for (ControlEdge* successorsPtr = node.getSuccessorsBegin(); successorsPtr < successorsEnd; successorsPtr++) {
|
||||
ControlNode& successor = successorsPtr->getTarget();
|
||||
|
||||
if (successor.getControlKind() != ckEnd) {
|
||||
RegisterPressure::Set& successorLiveIn = liveIn[successor.dfsNum];
|
||||
|
||||
for (SparseSet::iterator i = live.begin(); !live.done(i); i = live.advance(i)) {
|
||||
RegisterName name = RegisterName(live.get(i));
|
||||
if (!successorLiveIn.test(name))
|
||||
splitCost[name].loads += doLog10(successor.loopDepth);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
InstructionList& instructions = node.getInstructions();
|
||||
for (InstructionList::iterator i = instructions.end(); !instructions.done(i); i = instructions.retreat(i)) {
|
||||
Instruction& instruction = instructions.get(i);
|
||||
|
||||
InstructionUse* useBegin = instruction.getInstructionUseBegin();
|
||||
InstructionUse* useEnd = instruction.getInstructionUseEnd();
|
||||
InstructionUse* usePtr;
|
||||
InstructionDefine* defineBegin = instruction.getInstructionDefineBegin();
|
||||
InstructionDefine* defineEnd = instruction.getInstructionDefineEnd();
|
||||
InstructionDefine* definePtr;
|
||||
|
||||
for (definePtr = defineBegin; definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister())
|
||||
splitCost[name2range[definePtr->getRegisterName()]].stores += weight;
|
||||
|
||||
for (usePtr = useBegin; usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister()) {
|
||||
RegisterName range = name2range[usePtr->getRegisterName()];
|
||||
if (!live.test(range)) {
|
||||
if (&instruction != &instructions.last())
|
||||
splitCost[range].loads += weight;
|
||||
else {
|
||||
ControlEdge* successorsEnd = node.getSuccessorsEnd();
|
||||
for (ControlEdge* successorsPtr = node.getSuccessorsBegin(); successorsPtr < successorsEnd; successorsPtr++)
|
||||
splitCost[range].loads += doLog10(successorsPtr->getTarget().loopDepth);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (definePtr = defineBegin; definePtr < defineEnd; definePtr++)
|
||||
if (definePtr->isRegister())
|
||||
live.clear(name2range[definePtr->getRegisterName()]);
|
||||
|
||||
for (usePtr = useBegin; usePtr < useEnd; usePtr++)
|
||||
if (usePtr->isRegister())
|
||||
live.set(name2range[usePtr->getRegisterName()]);
|
||||
}
|
||||
}
|
||||
|
||||
NameLinkedList** splitAround = new(pool) NameLinkedList*[rangeCount];
|
||||
memset(splitAround, '\0', rangeCount * sizeof(NameLinkedList*));
|
||||
registerAllocator.splitAround = splitAround;
|
||||
|
||||
registerAllocator.splitCost = splitCost;
|
||||
registerAllocator.splitFound = false;
|
||||
}
|
||||
|
||||
#endif // _SPLITS_H_
|
||||
@@ -1,186 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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 "Fundamentals.h"
|
||||
#include "HashTable.h"
|
||||
#include "Timer.h"
|
||||
#include "Pool.h"
|
||||
|
||||
static Pool pool; // Pool for the Timer class.
|
||||
static HashTable<TimerEntry*> timerEntries(pool); // Timers hashtable.
|
||||
|
||||
const nTimersInABlock = 128; // Number of timers in a block.
|
||||
static PRTime *timers = new(pool) PRTime[nTimersInABlock]; // A block of timers.
|
||||
static Uint8 nextTimer = 0; // nextAvailableTimer.
|
||||
|
||||
//
|
||||
// Calibrate the call to PR_Now().
|
||||
//
|
||||
static PRTime calibrate()
|
||||
{
|
||||
PRTime t = PR_Now();
|
||||
PRTime& a = *new(pool) PRTime();
|
||||
|
||||
// Call 10 times the PR_Now() function.
|
||||
a = PR_Now(); a = PR_Now(); a = PR_Now(); a = PR_Now(); a = PR_Now(); a = PR_Now();
|
||||
a = PR_Now(); a = PR_Now(); a = PR_Now(); a = PR_Now(); a = PR_Now(); a = PR_Now();
|
||||
t = (PR_Now() - t + 9) / 10;
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
static PRTime adjust = calibrate();
|
||||
|
||||
//
|
||||
// Return the named timer..
|
||||
//
|
||||
TimerEntry& Timer::getTimerEntry(const char* name)
|
||||
{
|
||||
if (!timerEntries.exists(name)) {
|
||||
TimerEntry* newEntry = new(pool) TimerEntry();
|
||||
newEntry->accumulator = 0;
|
||||
newEntry->running = false;
|
||||
timerEntries.add(name, newEntry);
|
||||
}
|
||||
|
||||
return *timerEntries[name];
|
||||
}
|
||||
|
||||
//
|
||||
// Return a reference to a new timer.
|
||||
//
|
||||
PRTime& Timer::getNewTimer()
|
||||
{
|
||||
if (nextTimer >= nTimersInABlock) {
|
||||
timers = new(pool) PRTime[nTimersInABlock];
|
||||
nextTimer = 0;
|
||||
}
|
||||
return timers[nextTimer++];
|
||||
}
|
||||
|
||||
static Uint32 timersAreFrozen = 0;
|
||||
|
||||
//
|
||||
// Start the named timer.
|
||||
//
|
||||
void Timer::start(const char* name)
|
||||
{
|
||||
if (timersAreFrozen)
|
||||
return;
|
||||
|
||||
freezeTimers();
|
||||
|
||||
TimerEntry& timer = getTimerEntry(name);
|
||||
PR_ASSERT(!timer.running);
|
||||
|
||||
timer.accumulator = 0;
|
||||
timer.running = true;
|
||||
timer.done = false;
|
||||
|
||||
unfreezeTimers();
|
||||
}
|
||||
|
||||
//
|
||||
// Stop the named timer.
|
||||
//
|
||||
void Timer::stop(const char* name)
|
||||
{
|
||||
if (timersAreFrozen)
|
||||
return;
|
||||
|
||||
freezeTimers();
|
||||
|
||||
TimerEntry& timer = getTimerEntry(name);
|
||||
PR_ASSERT(timer.running);
|
||||
timer.running = false;
|
||||
timer.done = true;
|
||||
|
||||
unfreezeTimers();
|
||||
}
|
||||
|
||||
//
|
||||
// Freeze all the running timers.
|
||||
//
|
||||
void Timer::freezeTimers()
|
||||
{
|
||||
PRTime when = PR_Now() - adjust;
|
||||
|
||||
if (timersAreFrozen == 0) {
|
||||
Vector<TimerEntry*> entries = timerEntries;
|
||||
Uint32 count = entries.size();
|
||||
|
||||
for (Uint32 i = 0; i < count; i++) {
|
||||
TimerEntry& entry = *entries[i];
|
||||
if (entry.running) {
|
||||
entry.accumulator += (when - *entry.startTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
timersAreFrozen++;
|
||||
}
|
||||
|
||||
//
|
||||
// Unfreeze all the running timers.
|
||||
//
|
||||
void Timer::unfreezeTimers()
|
||||
{
|
||||
PR_ASSERT(timersAreFrozen != 0);
|
||||
timersAreFrozen--;
|
||||
|
||||
if (timersAreFrozen == 0) {
|
||||
Vector<TimerEntry *> entries = timerEntries;
|
||||
Uint32 count = entries.size();
|
||||
|
||||
PRTime& newStart = getNewTimer();
|
||||
|
||||
for (Uint32 i = 0; i < count; i++) {
|
||||
TimerEntry& entry = *entries[i];
|
||||
if (entry.running) {
|
||||
entry.startTime = &newStart;
|
||||
}
|
||||
}
|
||||
|
||||
newStart = PR_Now();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Print the named timer in the file f.
|
||||
//
|
||||
void Timer::print(FILE* f, const char *name)
|
||||
{
|
||||
if (timersAreFrozen)
|
||||
return;
|
||||
|
||||
freezeTimers();
|
||||
|
||||
TimerEntry& timer = getTimerEntry(name);
|
||||
|
||||
PR_ASSERT(timer.done);
|
||||
PRTime elapsed = timer.accumulator;
|
||||
|
||||
if (elapsed >> 32) {
|
||||
fprintf(f, "[timer %s out of range]\n", name);
|
||||
} else {
|
||||
fprintf(f, "[%dus in %s]\n", Uint32(elapsed), name);
|
||||
}
|
||||
fflush(f);
|
||||
|
||||
unfreezeTimers();
|
||||
}
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _TIMER_H_
|
||||
#define _TIMER_H_
|
||||
|
||||
#include "Fundamentals.h"
|
||||
#include "HashTable.h"
|
||||
#include "prtime.h"
|
||||
|
||||
//
|
||||
// Naming convention:
|
||||
// As the class Timer contains only static methods, the timer's name should start with the
|
||||
// module name. Otherwise starting 2 timers with the same name will assert.
|
||||
//
|
||||
|
||||
#ifndef NO_TIMER
|
||||
|
||||
struct TimerEntry
|
||||
{
|
||||
PRTime *startTime; // Current time when we start the timer.
|
||||
PRTime accumulator; // Time spent in this timer.
|
||||
bool running; // True if the timer is running.
|
||||
bool done; // True if the timer was running and was stopped.
|
||||
};
|
||||
|
||||
class Timer
|
||||
{
|
||||
private:
|
||||
|
||||
// Return the named timer.
|
||||
static TimerEntry& getTimerEntry(const char* name);
|
||||
// Return a reference to a new Timer.
|
||||
static PRTime& getNewTimer();
|
||||
|
||||
public:
|
||||
|
||||
// Start the timer.
|
||||
static void start(const char* name);
|
||||
// Stop the timer.
|
||||
static void stop(const char* name);
|
||||
// Freeze all the running timers.
|
||||
static void freezeTimers();
|
||||
// Unfreeze all the running timers.
|
||||
static void unfreezeTimers();
|
||||
// Print the timer.
|
||||
static void print(FILE* f, const char *name);
|
||||
};
|
||||
|
||||
inline void startTimer(const char* name) {Timer::start(name);}
|
||||
inline void stopTimer(const char* name) {Timer::stop(name); Timer::print(stdout, name);}
|
||||
#define START_TIMER_SAFE Timer::freezeTimers();
|
||||
#define END_TIMER_SAFE Timer::unfreezeTimers();
|
||||
#define TIMER_SAFE(x) START_TIMER_SAFE x; END_TIMER_SAFE
|
||||
|
||||
#else /* NO_TIMER */
|
||||
|
||||
inline void startTimer(const char* /*name*/) {}
|
||||
inline void stopTimer(const char* /*name*/) {}
|
||||
#define START_TIMER_SAFE
|
||||
#define END_TIMER_SAFE
|
||||
#define TIMER_SAFE(x) x;
|
||||
|
||||
#endif /* NO_TIMER */
|
||||
#endif /* _TIMER_H_ */
|
||||
@@ -1,116 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _VIRTUAL_REGISTER_H_
|
||||
#define _VIRTUAL_REGISTER_H_
|
||||
|
||||
#include "Fundamentals.h"
|
||||
#include "IndexedPool.h"
|
||||
#include <string.h>
|
||||
|
||||
#include "RegisterTypes.h"
|
||||
#include "RegisterClass.h"
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// VirtualRegister - 24b
|
||||
|
||||
class Instruction;
|
||||
|
||||
class VirtualRegister : public IndexedObject<VirtualRegister>
|
||||
{
|
||||
public:
|
||||
|
||||
Instruction* definingInstruction; // Instruction defining this VR.
|
||||
|
||||
// Initialize a VR of the given classKind.
|
||||
VirtualRegister(RegisterClassKind /*classKind*/) : definingInstruction(NULL) {}
|
||||
|
||||
// Return the defining instruction for this VR.
|
||||
Instruction* getDefiningInstruction() const {return definingInstruction;}
|
||||
// Set the defining instruction.
|
||||
void setDefiningInstruction(Instruction& insn);
|
||||
};
|
||||
|
||||
// Return true if the VirtualRegisters are equals. The only way 2 VRs can be equal is if
|
||||
// they have the same index. If they have the same index then they are at the same
|
||||
// address in the indexed pool.
|
||||
//
|
||||
inline bool operator == (const VirtualRegister& regA, const VirtualRegister& regB) {return ®A == ®B;}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// VirtualRegisterManager -
|
||||
|
||||
struct PreColoredRegister
|
||||
{
|
||||
RegisterID id;
|
||||
RegisterName color;
|
||||
};
|
||||
|
||||
class VirtualRegisterManager
|
||||
{
|
||||
private:
|
||||
|
||||
IndexedPool<VirtualRegister> registerPool;
|
||||
PreColoredRegister machineRegister[6];
|
||||
|
||||
public:
|
||||
VirtualRegisterManager()
|
||||
{
|
||||
for (Uint32 i = 0; i < 6; i++)
|
||||
machineRegister[i].id = invalidID;
|
||||
}
|
||||
|
||||
// Return the VirtualRegister at the given index.
|
||||
VirtualRegister& getVirtualRegister(RegisterName name) const {return registerPool.get(name);}
|
||||
|
||||
// Return a new VirtualRegister.
|
||||
RegisterID newVirtualRegister(RegisterClassKind classKind)
|
||||
{
|
||||
VirtualRegister& vReg = *new(registerPool) VirtualRegister(classKind);
|
||||
RegisterID rid;
|
||||
|
||||
setName(rid, RegisterName(vReg.getIndex()));
|
||||
setClass(rid, classKind);
|
||||
return rid;
|
||||
}
|
||||
|
||||
RegisterID newMachineRegister(RegisterName name, RegisterClassKind classKind)
|
||||
{
|
||||
RegisterID rid = machineRegister[name].id;
|
||||
|
||||
if (rid == invalidID) {
|
||||
rid = newVirtualRegister(classKind);
|
||||
DEBUG_ONLY(setMachineRegister(rid));
|
||||
machineRegister[name].id = rid;
|
||||
machineRegister[name].color = name;
|
||||
}
|
||||
|
||||
return rid;
|
||||
}
|
||||
|
||||
PreColoredRegister* getMachineRegistersBegin() const {return (PreColoredRegister*) machineRegister;} // FIX
|
||||
PreColoredRegister* getMachineRegistersEnd() const {return (PreColoredRegister*) &machineRegister[6];} // FIX
|
||||
|
||||
// Return the VirtualRegister universe size.
|
||||
Uint32 getSize() {return registerPool.getSize();}
|
||||
|
||||
void setSize(Uint32 size) {registerPool.setSize(size);}
|
||||
};
|
||||
|
||||
#endif // _VIRTUAL_REGISTER_H_
|
||||
22
mozilla/include/Makefile
Normal file
22
mozilla/include/Makefile
Normal file
@@ -0,0 +1,22 @@
|
||||
#! gmake
|
||||
#
|
||||
# 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.
|
||||
|
||||
#
|
||||
|
||||
DEPTH = ..
|
||||
|
||||
include $(DEPTH)/config/rules.mk
|
||||
664
mozilla/include/abcom.h
Normal file
664
mozilla/include/abcom.h
Normal file
@@ -0,0 +1,664 @@
|
||||
/* -*- Mode: C; tab-width: 8; 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.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _AB_COM_H_
|
||||
#define _AB_COM_H_
|
||||
|
||||
#include "xp_core.h"
|
||||
#include "msgcom.h"
|
||||
#include "abdefn.h"
|
||||
#include "dirprefs.h"
|
||||
|
||||
#ifdef XP_CPLUSPLUS
|
||||
class AB_Pane;
|
||||
class AB_ContainerPane;
|
||||
class AB_ContainerInfo;
|
||||
class AB_MailingListPane;
|
||||
class AB_PersonPane;
|
||||
#else
|
||||
typedef struct AB_Pane AB_Pane;
|
||||
typedef struct AB_ContainerPane AB_ContainerPane;
|
||||
typedef struct AB_ContainerInfo AB_ContainerInfo;
|
||||
typedef struct AB_MailingListPane AB_MailingListPane;
|
||||
typedef struct AB_PersonPane AB_PersonPane;
|
||||
#endif
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
#define AB_API extern "C"
|
||||
|
||||
#if defined(XP_MAC)
|
||||
#define FE_IMPLEMENTS_SHOW_PROPERTY_SHEET
|
||||
#endif
|
||||
|
||||
const ABID AB_ABIDUNKNOWN = 0; /* Find a better home for this somewhere! */
|
||||
|
||||
/* new errors added by mscott for the 2 pane AB UI. I will eventually name this enumerated type AB_Error */
|
||||
enum
|
||||
{
|
||||
AB_SUCCESS = 0,
|
||||
AB_FAILURE,
|
||||
AB_INVALID_PANE,
|
||||
AB_INVALID_CONTAINER,
|
||||
AB_INVALID_ATTRIBUTE,
|
||||
AB_OUT_OF_MEMORY
|
||||
};
|
||||
|
||||
/* these are the types of possible containers */
|
||||
typedef enum
|
||||
{
|
||||
AB_LDAPContainer,
|
||||
AB_MListContainer, /* a mailing list */
|
||||
AB_PABContainer /* a personal AB */
|
||||
} AB_ContainerType;
|
||||
|
||||
/* AB_ContainerAttributes define the types of information FEs can ask the BE about
|
||||
a AB_ContainerInfo in the ABContainerPane. */
|
||||
|
||||
typedef enum
|
||||
{
|
||||
attribContainerType, /* mailing list? LDAP directory? PAB? */
|
||||
attribName, /* the name for the container */
|
||||
attribNumChildren, /* how many child containers does this container have? */
|
||||
attribDepth, /* container depth in the overall hierarchy. 0 == root ctr, 1 == one level below a root container, etc. */
|
||||
attribContainerInfo /* FEs might want to get the container Info * for a line in the container pane */
|
||||
} AB_ContainerAttribute;
|
||||
|
||||
typedef struct AB_ContainerAttribValue
|
||||
{
|
||||
AB_ContainerAttribute attrib; /* used to determine value of the union */
|
||||
union{
|
||||
char * string;
|
||||
int32 number; /* used by numchildren & depth */
|
||||
AB_ContainerType containerType;
|
||||
AB_ContainerInfo * container;
|
||||
} u;
|
||||
} AB_ContainerAttribValue;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
AB_Drag_Not_Allowed = 0x00000000,
|
||||
AB_Require_Copy = 0x00000001,
|
||||
AB_Require_Move = 0x00000002,
|
||||
AB_Default_Drag = 0xFFFFFFFF
|
||||
} AB_DragEffect;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
AB_attribUnknown = 0, /* unrecognized attribute */
|
||||
AB_attribEntryType, /* mailing list or person entry */
|
||||
AB_attribEntryID,
|
||||
AB_attribFullName,
|
||||
AB_attribNickName,
|
||||
AB_attribGivenName, /* all of the following are person entry specific */
|
||||
AB_attribMiddleName,
|
||||
AB_attribFamilyName,
|
||||
AB_attribCompanyName,
|
||||
AB_attribLocality,
|
||||
AB_attribRegion,
|
||||
AB_attribEmailAddress,
|
||||
AB_attribInfo,
|
||||
AB_attribHTMLMail,
|
||||
AB_attribExpandedName,
|
||||
AB_attribTitle,
|
||||
AB_attribPOAddress,
|
||||
AB_attribStreetAddress,
|
||||
AB_attribZipCode,
|
||||
AB_attribCountry,
|
||||
AB_attribWorkPhone,
|
||||
AB_attribFaxPhone,
|
||||
AB_attribHomePhone,
|
||||
AB_attribDistName,
|
||||
AB_attribSecurity,
|
||||
AB_attribCoolAddress,
|
||||
AB_attribUseServer,
|
||||
AB_attribPager,
|
||||
AB_attribCellularPhone,
|
||||
AB_attribDisplayName,
|
||||
AB_attribWinCSID, /* character set id */
|
||||
AB_attribOther /* any attrib with this value or higher is always a string type (our dyanmic attributes) */
|
||||
} AB_AttribID;
|
||||
|
||||
/* WARNING!!! WILL BE PHASING THIS STRUCTURE OUT!!!! */
|
||||
typedef struct AB_EntryAttributeItem{
|
||||
AB_AttribID id;
|
||||
char * description; /* resource string specifying a user-readable descript for the attrib i.e. "First Name" */
|
||||
XP_Bool sortable; /* is this attribute sortable? (may help FEs display the column if they know if it can be sorted or not */
|
||||
}AB_EntryAttributeItem;
|
||||
|
||||
typedef enum{
|
||||
AB_MailingList = 0,
|
||||
AB_Person
|
||||
} AB_EntryType;
|
||||
|
||||
typedef struct AB_AttributeValue
|
||||
{
|
||||
AB_AttribID attrib; /* we need this to know how to read the union */
|
||||
union{
|
||||
char * string;
|
||||
XP_Bool boolValue;
|
||||
AB_EntryType entryType; /* mailing list or person entry */
|
||||
int16 shortValue; /* use for server type or WinCSID field */
|
||||
} u;
|
||||
} AB_AttributeValue;
|
||||
|
||||
|
||||
/* New Column ID structure used to abstract the columns in the AB_Pane used by the FEs from the attributes thos columns actually
|
||||
represent. */
|
||||
typedef enum{
|
||||
AB_ColumnID0 = 0,
|
||||
AB_ColumnID1,
|
||||
AB_ColumnID2,
|
||||
AB_ColumnID3,
|
||||
AB_ColumnID4,
|
||||
AB_ColumnID5,
|
||||
AB_ColumnID6,
|
||||
AB_NumberOfColumns /* make sure this is always the last one!! */
|
||||
} AB_ColumnID;
|
||||
|
||||
typedef struct AB_ColumnInfo{
|
||||
AB_AttribID attribID; /* the attrib ID this column is displaying */
|
||||
char * displayString; /* column display string */
|
||||
XP_Bool sortable; /* is this column attribute sortable? i.e. phone number is not! */
|
||||
} AB_ColumnInfo;
|
||||
|
||||
|
||||
/**********************************************************************************************
|
||||
FE Call back functions. We'll show the types here...NOTE: FEs must now register their call back
|
||||
functions through these APIs so the back end knows which return to use.
|
||||
*********************************************************************************************/
|
||||
|
||||
/* FEs must register this function with the appropriate pane, it is called by the back end in
|
||||
response to the following commands: AB_PropertiesCmd, AB_AddUserCmd, AB_AddMailingListCmd */
|
||||
|
||||
/* typedef int AB_ShowPropertySheetForEntryFunc (MSG_Pane * pane, AB_EntryType entryType); */
|
||||
typedef int AB_ShowPropertySheetForEntryFunc (MSG_Pane * pane, MWContext * context);
|
||||
|
||||
int AB_SetShowPropertySheetForEntryFunc(
|
||||
MSG_Pane * abPane,
|
||||
AB_ShowPropertySheetForEntryFunc * func);
|
||||
|
||||
|
||||
/* BE sets the type for the DIR_Server and hands it to the FEs to be displayed & filled out in a
|
||||
pane. It is called by the back end in response to the following commands: AB_PropertiesCmd,
|
||||
AB_NewLDAPDirectory, AB_NewAddressBook. */
|
||||
|
||||
typedef int AB_ShowPropertySheetForDirFunc(DIR_Server * server, MWContext * context, XP_Bool newDirectory /* is it a new directory? */);
|
||||
|
||||
int AB_SetShowPropertySheetForDirFunc(
|
||||
MSG_Pane * abcPane, /* container pane */
|
||||
AB_ShowPropertySheetForDirFunc * func);
|
||||
|
||||
|
||||
/***************************************************************************************
|
||||
DON'T USE THIS FUNCTION!!!! THIS WILL BE PHASING OUT!!!!!! #mscott 01/21/98
|
||||
This is a callback into the FE instructing them to bring up a person entry pane or a
|
||||
mailing list pane. The back end has already created the pane. A type is included to let the FE
|
||||
determine if the pane is a mailing list or person entry pane. In addition, in the case of a mailing list
|
||||
pane, the FE must still initialize the mailing list pane before it can be used
|
||||
***************************************************************************************/
|
||||
#ifdef FE_IMPLEMENTS_SHOW_PROPERTY_SHEET
|
||||
extern int FE_ShowPropertySheetForAB2(
|
||||
MSG_Pane * pane, /* BE created mailing list or person entry pane */
|
||||
AB_EntryType entryType); /* mailing list or person entry */
|
||||
#endif
|
||||
|
||||
/***************************************************************************************
|
||||
None pane-specific APIs. These function work on many panes
|
||||
***************************************************************************************/
|
||||
|
||||
int AB_ClosePane(MSG_Pane * pane);
|
||||
|
||||
/****************************************************************************************
|
||||
Address Book Pane General APIs - creating, initializing, closing, changing containers,
|
||||
searching, etc.
|
||||
*****************************************************************************************/
|
||||
|
||||
int AB_CreateABPane(
|
||||
MSG_Pane ** abPane,
|
||||
MWContext * context,
|
||||
MSG_Master * master);
|
||||
|
||||
int AB_InitializeABPane(
|
||||
MSG_Pane * abPane,
|
||||
AB_ContainerInfo * abContainer);
|
||||
|
||||
|
||||
/* to change the container the abPane is currently displaying */
|
||||
int AB_ChangeABContainer(
|
||||
MSG_Pane * abPane,
|
||||
AB_ContainerInfo * container); /* the new containerInfo to display */
|
||||
|
||||
int AB_GetEntryIndex(
|
||||
MSG_Pane * abPane,
|
||||
ABID id, /* entry id in the database */
|
||||
MSG_ViewIndex * index); /* FE allocated, BE fills with index */
|
||||
|
||||
int AB_GetABIDForIndex(
|
||||
MSG_Pane * abPane,
|
||||
MSG_ViewIndex index,
|
||||
ABID * id); /* FE allocated. BE fills with the id you want */
|
||||
|
||||
int AB_SearchDirectoryAB2(
|
||||
MSG_Pane * abPane,
|
||||
char * searchString);
|
||||
|
||||
int AB_LDAPSearchResultsAB2(
|
||||
MSG_Pane * abPane,
|
||||
MSG_ViewIndex index,
|
||||
int32 num);
|
||||
|
||||
int AB_FinishSearchAB2(MSG_Pane * abPane);
|
||||
|
||||
int AB_CommandAB2(
|
||||
MSG_Pane * srcPane, /* NOTE: this can be a ABpane or an ABContainerPane!!! you can delete containers & entries */
|
||||
AB_CommandType command, /* delete or mailto are the only currently supported commands */
|
||||
MSG_ViewIndex * indices,
|
||||
int32 numIndices);
|
||||
|
||||
int AB_CommandStatusAB2(
|
||||
MSG_Pane * srcPane, /* NOTE: Can be an ABPane or an ABContainerPane!! */
|
||||
AB_CommandType command,
|
||||
MSG_ViewIndex * indices,
|
||||
int32 numIndices,
|
||||
XP_Bool * selectable_p,
|
||||
MSG_COMMAND_CHECK_STATE * selected_p,
|
||||
const char ** displayString,
|
||||
XP_Bool * plural_p);
|
||||
|
||||
/* still need to add registering and unregistering compose windows */
|
||||
|
||||
/****************************************************************************************
|
||||
AB_ContainerInfo General APIs - adding users and a sender. Doesn't require a pane.
|
||||
*****************************************************************************************/
|
||||
int AB_AddUserAB2(
|
||||
AB_ContainerInfo * abContainer, /* the container to add the person to */
|
||||
AB_AttributeValue * values, /* FE defined array of attribute values for the new user. FE must free this array */
|
||||
uint16 numItems,
|
||||
ABID * entryID); /* BE returns the ABID for this new user */
|
||||
|
||||
int AB_AddUserWithUIAB2(
|
||||
AB_ContainerInfo * abContainer,
|
||||
AB_AttributeValue * values,
|
||||
uint16 numItems,
|
||||
XP_Bool lastOneToAdd);
|
||||
|
||||
int AB_AddSenderAB2(
|
||||
AB_ContainerInfo * abContainer,
|
||||
char * author,
|
||||
char * url);
|
||||
|
||||
|
||||
/****************************************************************************************
|
||||
Drag and Drop Related APIs - vcards, ab lines, containers, etc.
|
||||
*****************************************************************************************/
|
||||
|
||||
int AB_DragEntriesIntoContainer(
|
||||
MSG_Pane * srcPane, /* could be an ABPane or ABCPane */
|
||||
const MSG_ViewIndex * srcIndices, /* indices of items to be dragged */
|
||||
int32 numIndices,
|
||||
AB_ContainerInfo * destContainer,
|
||||
AB_DragEffect request); /* copy or move? */
|
||||
|
||||
/* FE's should call this function to determine if the drag & drop they want to perform is
|
||||
valid or not. I would recommend calling it before the FE actually performs the drag & drop call */
|
||||
AB_DragEffect AB_DragEntriesIntoContainerStatus(
|
||||
MSG_Pane * abPane,
|
||||
const MSG_ViewIndex * indices,
|
||||
int32 numIndices,
|
||||
AB_ContainerInfo * destContainer,
|
||||
AB_DragEffect request); /* do you want to do a move? a copy? default drag? */
|
||||
|
||||
/****************************************************************************************
|
||||
Importing and Exporting - ABs from files, vcards...
|
||||
*****************************************************************************************/
|
||||
|
||||
typedef enum
|
||||
{
|
||||
AB_Filename, /* char * in import and export APIs contain an FE allocated/freed filename */
|
||||
AB_PromptForFileName, /* prompt for file name on import or export */
|
||||
AB_Vcard,
|
||||
AB_CommaList, /* comma separated list of email addresses */
|
||||
AB_RawData /* we don't know what it is, will try to extract email addresses */
|
||||
} AB_ImportExportType;
|
||||
|
||||
int AB_ImportData(
|
||||
AB_ContainerInfo * destContainer,
|
||||
const char * buffer, /* could be a filename or NULL (if type = prompt for filename) or a block of data to be imported */
|
||||
int32 bufSize, /* how big is the buffer? */
|
||||
AB_ImportExportType dataType); /* valid types: All */
|
||||
|
||||
/* returns TRUE if the container accepts imports of the data type and FALSE otherwise */
|
||||
XP_Bool AB_ImportDataStatus(
|
||||
AB_ContainerInfo * destContainer,
|
||||
AB_ImportExportType dataType);
|
||||
|
||||
/* exporting always occurs to a file unless the data type is vcard. Only valid export data types are: vcard,
|
||||
filename, prompt for filename */
|
||||
|
||||
int AB_ExportData(
|
||||
AB_ContainerInfo * srcContainer,
|
||||
char ** buffer, /* filename or NULL. Or if type = Vcard, the BE allocated vcard. FE responosible for freeing it?? */
|
||||
int32 * bufSize, /* ignored unless VCard is data type in which case FE allocates, BE fills */
|
||||
AB_ImportExportType dataType); /* valid types: filename, prompt for filename, vcard */
|
||||
|
||||
/****************************************************************************************
|
||||
ABContainer Pane --> Creation, Loading, getting line data for each container.
|
||||
*****************************************************************************************/
|
||||
int AB_CreateContainerPane(
|
||||
MSG_Pane ** abContainerPane, /* BE will pass back ptr to pane through this */
|
||||
MWContext * context,
|
||||
MSG_Master * master);
|
||||
|
||||
int AB_InitializeContainerPane(MSG_Pane * abContainerPane);
|
||||
|
||||
/* this will return MSG_VIEWINDEXNONE if the container info is not in the pane */
|
||||
MSG_ViewIndex AB_GetIndexForContainer(
|
||||
MSG_Pane * abContainerPane,
|
||||
AB_ContainerInfo * container); /* container you want the index for */
|
||||
|
||||
/* this will return NULL if the index is invalid */
|
||||
AB_ContainerInfo * AB_GetContainerForIndex(
|
||||
MSG_Pane * abContainerPane,
|
||||
const MSG_ViewIndex index);
|
||||
|
||||
/* the following set of APIs support getting/setting container pane line data out such as the container's
|
||||
name, type, etc. We are going to try a particular discipline for memory management of AB_ContainerAttribValues.
|
||||
For APIs which get an attribute value, the BE will actually allocate the struct. To free the space, the FE should
|
||||
call AB_FreeContainerAttribValue. For any API which sets an attribute value, the FE is responsible for allocating and
|
||||
de-allocating the data. */
|
||||
|
||||
int AB_GetContainerAttributeForPane(
|
||||
MSG_Pane * abContainerPane,
|
||||
MSG_ViewIndex index, /* index of container you want information for */
|
||||
AB_ContainerAttribute attrib, /* attribute FE wants to know */
|
||||
AB_ContainerAttribValue ** value); /* BE allocates struct. FE should call AB_FreeContainerAttribValue to free space when done */
|
||||
|
||||
int AB_SetContainerAttributeForPane(
|
||||
MSG_Pane * abContainerPane,
|
||||
MSG_ViewIndex index,
|
||||
AB_ContainerAttribValue * value); /* FE handles all memory allocation! */
|
||||
|
||||
int AB_GetContainerAttribute(
|
||||
AB_ContainerInfo * ctr,
|
||||
AB_ContainerAttribute attrib,
|
||||
AB_ContainerAttribValue ** value); /* BE allocates struct. FE should call AB_FreeContainerAttribValue to free space when donee */
|
||||
|
||||
int AB_SetContainerAttribute(
|
||||
AB_ContainerInfo * ctr,
|
||||
AB_ContainerAttribValue * value); /* FE handles all memory allocateion / deallocation! */
|
||||
|
||||
int AB_GetContainerAttributes(
|
||||
AB_ContainerInfo * ctr,
|
||||
AB_ContainerAttribute * attribsArray,
|
||||
AB_ContainerAttribValue ** valuesArray,
|
||||
uint16 * numItems);
|
||||
|
||||
int AB_SetContainerAttributes(
|
||||
AB_ContainerInfo * ctr,
|
||||
AB_ContainerAttribValue * valuesArray,
|
||||
uint16 numItems);
|
||||
|
||||
/* getting and setting multiple container attributes on a per container pane basis */
|
||||
int AB_GetContainerAttributesForPane(
|
||||
MSG_Pane * abContainerPane,
|
||||
MSG_ViewIndex index,
|
||||
AB_ContainerAttribute * attribsArray,
|
||||
AB_ContainerAttribValue ** valuesArray,
|
||||
uint16 * numItems);
|
||||
|
||||
int AB_SetContainerAttributesForPane(
|
||||
MSG_Pane * abContainerPane,
|
||||
MSG_ViewIndex index,
|
||||
AB_ContainerAttribValue * valuesArray,
|
||||
uint16 numItems);
|
||||
|
||||
int AB_FreeContainerAttribValue(AB_ContainerAttribValue * value); /* BE will free the attribute value */
|
||||
|
||||
int AB_FreeContainerAttribValues(AB_ContainerAttribValue * valuesArray, uint16 numItems);
|
||||
|
||||
XP_Bool AB_IsStringContainerAttribValue(AB_ContainerAttribValue * value); /* use this to determine if your attrib is a string attrib */
|
||||
|
||||
|
||||
/* Use the following two functions to build the combo box in the Address Window of all the root level containers.
|
||||
You first ask for the number of root level (PABs and LDAP directories). Use this number to allocate an array of
|
||||
AB_ContainerInfo ptrs. Give this array to the back end and we will fill it. FE can destroy array when done with it.
|
||||
FE shoud NOT be deleting the individual AB_ContainerInfo ptrs. */
|
||||
|
||||
int AB_GetNumRootContainers(
|
||||
MSG_Pane * abContainerPane,
|
||||
int32 * numRootContainers);
|
||||
|
||||
int AB_GetOrderedRootContainers(
|
||||
MSG_Pane * abContainerPane,
|
||||
AB_ContainerInfo ** ctrArray, /* FE Allocated & Freed */
|
||||
int32 * numCtrs); /* in - # of elements in ctrArray. out - BE fills with # root containers stored in ctrArray */
|
||||
|
||||
/* sometimes you want to get a handle on the DIR_Sever for a particular container. Both return NULL if for some
|
||||
reason there wasn't a DIR_Server. If the container is a mailing list, returns DIR_Server of the PAB the list is in.
|
||||
NOTE: If you modify any of the DIR_Server properties, you should call AB_UpdateDIRServerForContainer to make sure that the container
|
||||
(and hence any pane views on the container) are updated */
|
||||
|
||||
DIR_Server * AB_GetDirServerForContainer(AB_ContainerInfo * container);
|
||||
|
||||
/* Please don't call this function. It is going away!!! Use AB_UpdateDirServerForContainerPane instead!! */
|
||||
int AB_UpdateDIRServerForContainer(AB_ContainerInfo * container);
|
||||
|
||||
/* will create a new container in the container pane if the directory does not already exist. Otherwise updates the
|
||||
directory's container in the pane */
|
||||
int AB_UpdateDIRServerForContainerPane(
|
||||
MSG_Pane * abContainerPane,
|
||||
DIR_Server * directory);
|
||||
|
||||
|
||||
/*******************************************************************************************************************
|
||||
Old Column Header APIs. These will be phased out!!! Please don't use them
|
||||
******************************************************************************************************************/
|
||||
|
||||
int AB_GetNumEntryAttributesForContainer(
|
||||
AB_ContainerInfo * container,
|
||||
uint16 * numItems); /* BE will fill this integer with the number of available attributes for the container */
|
||||
|
||||
int AB_GetEntryAttributesForContainer(
|
||||
AB_ContainerInfo * container,
|
||||
AB_EntryAttributeItem * items, /* FE allocated array which BE fills with values */
|
||||
uint16 * maxItems); /* FE passes in # elements allocated in array. BE returns # elements filled in array */
|
||||
|
||||
/********************************************************************************************************************
|
||||
Our New Column Header APIs. We'll be phasing out AB_GetNumEntryAttributesForContainer and AB_GetEntryAttributesForContainer
|
||||
********************************************************************************************************************/
|
||||
|
||||
AB_ColumnInfo * AB_GetColumnInfo(
|
||||
AB_ContainerInfo * container,
|
||||
AB_ColumnID columnID);
|
||||
|
||||
int AB_GetNumColumnsForContainer(AB_ContainerInfo * container);
|
||||
|
||||
int AB_GetColumnAttribIDs(
|
||||
AB_ContainerInfo * container,
|
||||
AB_AttribID * attribIDs, /* FE allocated array of attribs. BE fills with values */
|
||||
int * numAttribs); /* FE passes in # elements allocated in array. BE returns # elements filled */
|
||||
|
||||
int AB_FreeColumnInfo(AB_ColumnInfo * columnInfo);
|
||||
|
||||
/****************************************************************************************
|
||||
AB Pane List Data -> how to get ab pane line attributes such as name, address, phone, etc.
|
||||
*****************************************************************************************/
|
||||
|
||||
/* to actually get an entry attribute */
|
||||
|
||||
int AB_GetEntryAttributeForPane(
|
||||
MSG_Pane * abPane,
|
||||
MSG_ViewIndex index,
|
||||
AB_AttribID attrib, /* what attribute do you want? */
|
||||
AB_AttributeValue ** valueArray); /* BE handles memory allocation. FE must call AB_FreeEntryAttributeValue when done */
|
||||
|
||||
int AB_GetEntryAttribute(
|
||||
AB_ContainerInfo * container,
|
||||
ABID entryid, /* an identifier or key used to name the object in the container */
|
||||
AB_AttribID attrib, /* attribute type the FE wants to know */
|
||||
AB_AttributeValue ** valueArray); /* BE handles memory allocation. FE must call AB_FreeEntryAttributeValue when done */
|
||||
|
||||
int AB_SetEntryAttribute(
|
||||
AB_ContainerInfo * container,
|
||||
ABID entryid, /* an identifier or key used to name the object in the container */
|
||||
AB_AttributeValue * value); /* FE handles all memory allocation */
|
||||
|
||||
int AB_SetEntryAttributeForPane(
|
||||
MSG_Pane * abPane,
|
||||
MSG_ViewIndex index,
|
||||
AB_AttributeValue * value); /* FE handles all memory allocation */
|
||||
|
||||
/* we also allow you to set entry attributes in batch by passing in an array of attribute values */
|
||||
int AB_SetEntryAttributes(
|
||||
AB_ContainerInfo * container,
|
||||
ABID entryID,
|
||||
AB_AttributeValue * valuesArray, /* FE allocated array of attribute values to set */
|
||||
uint16 numItems); /* FE passes in # items in array */
|
||||
|
||||
int AB_SetEntryAttributesForPane(
|
||||
MSG_Pane * abPane,
|
||||
MSG_ViewIndex index,
|
||||
AB_AttributeValue * valuesArray,
|
||||
uint16 numItems);
|
||||
|
||||
int AB_GetEntryAttributes(
|
||||
AB_ContainerInfo * container,
|
||||
ABID entryID,
|
||||
AB_AttribID * attribs, /* FE allocated array of attribs that you want */
|
||||
AB_AttributeValue ** values, /* BE allocates & fills an array of values for the input array of attribs */
|
||||
uint16 * numItems); /* IN: size of attribs array. OUT: # of values in value array */
|
||||
|
||||
int AB_GetEntryAttributesForPane(
|
||||
MSG_Pane * abPane,
|
||||
MSG_ViewIndex index,
|
||||
AB_AttribID * attribs, /* FE allocated array of attribs that you want */
|
||||
AB_AttributeValue ** values,
|
||||
uint16 * numItems);
|
||||
|
||||
/* Memory allocation APIs for setting/getting entry attribute values */
|
||||
int AB_FreeEntryAttributeValue(AB_AttributeValue * value /* pointer to a value */);
|
||||
int AB_FreeEntryAttributeValues(AB_AttributeValue * values /* array of values */, uint16 numItems);
|
||||
|
||||
int AB_CopyEntryAttributeValue(
|
||||
AB_AttributeValue * srcValue, /* already allocated attribute value you want to copy from */
|
||||
AB_AttributeValue * destValue); /* already allocated attribute value you want to copy into */
|
||||
|
||||
XP_Bool AB_IsStringEntryAttributeValue(AB_AttributeValue * value);
|
||||
|
||||
/****************************************************************************************
|
||||
Sorting
|
||||
*****************************************************************************************/
|
||||
|
||||
/* sorting by first name is a global setting. It is set per abPane and does not change
|
||||
when you load a new container into the abPane */
|
||||
|
||||
XP_Bool AB_GetSortByFirstNameAB2(MSG_Pane * abPane); /* is the pane sorting by first name? */
|
||||
|
||||
void AB_SortByFirstNameAB2(
|
||||
MSG_Pane * abPane,
|
||||
XP_Bool sortByFirstName); /* true for sort by first, false for last first */
|
||||
|
||||
/* Insert our sort by column stuff here */
|
||||
int AB_SortByAttribute(
|
||||
MSG_Pane * abPane,
|
||||
AB_AttribID id, /* attribute we want to sort by */
|
||||
XP_Bool sortAscending);
|
||||
|
||||
int AB_GetPaneSortedByAB2(
|
||||
MSG_Pane * abPane,
|
||||
AB_AttribID * attribID); /* BE fills with the attribute we are sorting by */
|
||||
|
||||
|
||||
XP_Bool AB_GetPaneSortedAscendingAB2(MSG_Pane * abPane);
|
||||
|
||||
/*****************************************************************************************
|
||||
APIs for the Mailing List Pane. In addition to these, the mailing list pane responds to
|
||||
previous AB APIs such as AB_Close, MSG_GetNumLines().
|
||||
****************************************************************************************/
|
||||
int AB_InitializeMailingListPaneAB2(MSG_Pane * mailingListPane);
|
||||
|
||||
AB_ContainerInfo * AB_GetContainerForMailingList(MSG_Pane * mailingListPane);
|
||||
|
||||
/* this could return ABID = 0 for a new entry that is not in the database */
|
||||
ABID AB_GetABIDForMailingListIndex(
|
||||
MSG_Pane * mailingListPane,
|
||||
const MSG_ViewIndex index);
|
||||
|
||||
MSG_ViewIndex AB_GetMailingListIndexForABID(
|
||||
MSG_Pane * mailingListPane,
|
||||
ABID entryID); /* this function could return MSG_VIEWINDEXNONE if entryID = 0 or not in list */
|
||||
|
||||
/* Use these two APIs to get Mailing List ENTRY attributes (i.e. people or other mailing list attributes in this mailing list) */
|
||||
int AB_SetMailingListEntryAttributes(
|
||||
MSG_Pane * pane,
|
||||
const MSG_ViewIndex index,
|
||||
AB_AttributeValue * valuesArray, /* FE allocated array of attribute values you want to set */
|
||||
uint16 numItems);
|
||||
|
||||
int AB_GetMailingListEntryAttributes(
|
||||
MSG_Pane * mailingListPane,
|
||||
const MSG_ViewIndex index,
|
||||
AB_AttribID * attribs, /* FE allocated & freed array of attribs you want */
|
||||
AB_AttributeValue ** values, /* BE allocates & fills values for the input array of attribs */
|
||||
uint16 * numItems); /* FE provides # attribs in array. BE fills with # values returned in values */
|
||||
|
||||
/* Use these two APIs to Set and Get the Mailing List properties. */
|
||||
int AB_GetMailingListAttributes(
|
||||
MSG_Pane * mailingListPane,
|
||||
AB_AttribID * attribs, /* FE allocated array of attribs */
|
||||
AB_AttributeValue ** values, /* BE allocates & fills values. FE must call a free to the back end */
|
||||
uint16 * numItems);
|
||||
|
||||
int AB_SetMailingListAttributes(
|
||||
MSG_Pane * mailingListPane,
|
||||
AB_AttributeValue * valuesArray, /* FE allocated array of attribute values you want to set */
|
||||
uint16 numItems);
|
||||
|
||||
|
||||
/*******************************************************************************************
|
||||
APIs for the person entry pane aka the person property sheets. The person entry pane is created
|
||||
by the back end and given to the front end in the call FE_ShowPropertySheetFor. In the current
|
||||
incarnation, person atributes are set and retrieved through the person entry pane and NOT through
|
||||
the AB_ContainerInfo the person is in. If you "cheat" and go through the container directly, you may
|
||||
not be getting the correct information. When the person entry pane is committed, the changes are pushed
|
||||
back into the container. During the commit process, if it is a new person then a new entry is made in the
|
||||
database.
|
||||
********************************************************************************************/
|
||||
AB_ContainerInfo * AB_GetContainerForPerson(MSG_Pane * personPane);
|
||||
|
||||
ABID AB_GetABIDForPerson(MSG_Pane * personPane); /* could return 0 if new user */
|
||||
|
||||
/* get and set the person attributes here */
|
||||
int AB_SetPersonEntryAttributes(
|
||||
MSG_Pane * personPane,
|
||||
AB_AttributeValue * valuesArray,
|
||||
uint16 numItems);
|
||||
|
||||
int AB_GetPersonEntryAttributes(
|
||||
MSG_Pane * personPane,
|
||||
AB_AttribID * attribs, /* FE allocted & freed array of attribs they want */
|
||||
AB_AttributeValue ** values, /* BE allocates & fills values */
|
||||
uint16 * numItems); /* in - FE provides # of attribs. out - BE fills with # values */
|
||||
|
||||
int AB_CommitChanges(MSG_Pane * pane); /* commits changes to a mailing list pane or a person entry pane! */
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* _AB_COM_H */
|
||||
200
mozilla/include/abdefn.h
Normal file
200
mozilla/include/abdefn.h
Normal file
@@ -0,0 +1,200 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef _ABDefn_H_
|
||||
#define _ABDefn_H_
|
||||
|
||||
/* max lengths for address book fields */
|
||||
const int kMaxFullNameLength = 256; /* common name */
|
||||
const int kMaxNameLength = 64; /* given, middle, family */
|
||||
const int kMaxCompanyLength = 128; /* company name */
|
||||
const int kMaxLocalityLength = 128; /* city */
|
||||
const int kMaxRegionLength = 128; /* state */
|
||||
const int kMaxCountryLength = 128; /* state */
|
||||
const int kMaxEmailAddressLength = 256;
|
||||
const int kMaxInfo = 1024;
|
||||
const int kMaxTitle = 64;
|
||||
const int kMaxAddress = 128;
|
||||
const int kMaxZipCode = 40;
|
||||
const int kMaxPhone = 32;
|
||||
const int32 kMaxDN = 32768;
|
||||
const int kMaxCoolAddress = 256;
|
||||
const int kMaxAddressEntry = 1000;
|
||||
|
||||
const short kDefaultDLS = 0;
|
||||
const short kSpecificDLS = 1;
|
||||
const short kHostOrIPAddress = 2;
|
||||
|
||||
typedef uint32 ABID;
|
||||
|
||||
/* This structure represents a single line in the address book pane
|
||||
*/
|
||||
typedef struct AB_EntryLineTag
|
||||
{
|
||||
ABID entryType; /* type of entry either person or list */
|
||||
char fullname[256];
|
||||
char emailAddress[256];
|
||||
char companyName[128];
|
||||
char nickname[64];
|
||||
char locality[128];
|
||||
char workPhone[32];
|
||||
#ifdef XP_CPLUSPLUS
|
||||
public:
|
||||
void Initialize();
|
||||
#endif
|
||||
} AB_EntryLine;
|
||||
|
||||
typedef struct PersonEntryTag {
|
||||
char * pNickName;
|
||||
char * pGivenName;
|
||||
char * pMiddleName;
|
||||
char * pFamilyName;
|
||||
char * pCompanyName;
|
||||
char * pLocality;
|
||||
char * pRegion;
|
||||
char * pEmailAddress;
|
||||
char * pInfo;
|
||||
XP_Bool HTMLmail;
|
||||
char * pTitle;
|
||||
char * pPOAddress;
|
||||
char * pAddress;
|
||||
char * pZipCode;
|
||||
char * pCountry;
|
||||
char * pWorkPhone;
|
||||
char * pFaxPhone;
|
||||
char * pHomePhone;
|
||||
char * pDistName;
|
||||
short Security;
|
||||
char * pCoolAddress;
|
||||
short UseServer;
|
||||
int16 WinCSID;
|
||||
|
||||
|
||||
#ifdef XP_CPLUSPLUS
|
||||
public:
|
||||
void Initialize();
|
||||
void CleanUp();
|
||||
#endif
|
||||
} PersonEntry;
|
||||
|
||||
|
||||
typedef struct MailingListEntryTag {
|
||||
char * pFullName;
|
||||
char * pNickName;
|
||||
char * pInfo;
|
||||
char * pDistName;
|
||||
int16 WinCSID;
|
||||
|
||||
#ifdef XP_CPLUSPLUS
|
||||
|
||||
public:
|
||||
void Initialize();
|
||||
void CleanUp();
|
||||
#endif
|
||||
} MailingListEntry;
|
||||
|
||||
const ABID ABTypeAll = 35;
|
||||
const ABID ABTypePerson = 36;
|
||||
const ABID ABTypeList = 37;
|
||||
|
||||
const unsigned long ABTypeEntry = 0x70634944; /* ASCII - 'pcID' */
|
||||
const unsigned long ABFullName = 0x636E2020; /* ASCII - 'cn ' */
|
||||
const unsigned long ABNickname = 0x6E69636B; /* ASCII - 'nick' */
|
||||
const unsigned long ABEmailAddress = 0x6D61696C; /* ASCII - 'mail' */
|
||||
const unsigned long ABLocality = 0x6C6F6320; /* ASCII - 'loc ' */
|
||||
const unsigned long ABCompany = 0x6F726720; /* ASCII - 'org ' */
|
||||
|
||||
/* defines for vcard support */
|
||||
#define vCardClipboardFormat "+//ISBN 1-887687-00-9::versit::PDI//vCard"
|
||||
#define vCardMimeFormat "text/x-vcard"
|
||||
|
||||
typedef enum
|
||||
{
|
||||
|
||||
/* FILE MENU
|
||||
=========
|
||||
*/
|
||||
AB_NewMessageCmd, /* Send a new message to the selected entries */
|
||||
|
||||
AB_ImportCmd, /* import a file into the address book */
|
||||
|
||||
AB_SaveCmd, /* export to a file */
|
||||
|
||||
AB_CloseCmd, /* close the address book window */
|
||||
|
||||
AB_NewAddressBook, /* Create a new personal address book */
|
||||
|
||||
AB_NewLDAPDirectory, /* Create a new LDAP directory */
|
||||
|
||||
|
||||
/* EDIT MENU
|
||||
=========
|
||||
*/
|
||||
|
||||
AB_UndoCmd, /* Undoes the last operation. */
|
||||
|
||||
AB_RedoCmd, /* Redoes the last undone operation. */
|
||||
|
||||
AB_DeleteCmd, /* Causes the given entries to be
|
||||
deleted. */
|
||||
|
||||
AB_DeleteAllCmd, /* Causes all occurrences of the given entries to be deleted. */
|
||||
|
||||
AB_LDAPSearchCmd, /* Perform an LDAP search */
|
||||
|
||||
|
||||
/* VIEW/SORT MENUS
|
||||
===============
|
||||
*/
|
||||
|
||||
AB_SortByTypeCmd, /* Sort alphabetized by type. */
|
||||
AB_SortByFullNameCmd, /* Sort alphabetizedby full name. */
|
||||
AB_SortByLocality, /* Sort by state */
|
||||
AB_SortByNickname, /* Sort by nickname */
|
||||
AB_SortByEmailAddress, /* Sort by email address */
|
||||
AB_SortByCompanyName, /* Sort by email address */
|
||||
AB_SortAscending, /* Sort current column ascending */
|
||||
AB_SortDescending, /* Sort current column descending */
|
||||
|
||||
/* these are the new sort command IDs added for the 2 pane AB. Use these instead of the previous ones...*/
|
||||
AB_SortByColumnID0,
|
||||
AB_SortByColumnID1,
|
||||
AB_SortByColumnID2,
|
||||
AB_SortByColumnID3,
|
||||
AB_SortByColumnID4,
|
||||
AB_SortByColumnID5,
|
||||
AB_SortByColumnID6,
|
||||
|
||||
/* ITEM MENU
|
||||
============
|
||||
*/
|
||||
|
||||
AB_AddUserCmd, /* Add a user to the address book */
|
||||
AB_AddMailingListCmd, /* Add a mailing list to the address book */
|
||||
AB_PropertiesCmd, /* Get the properties of an entry */
|
||||
AB_CallCmd, /* Call the entry using CallPoint */
|
||||
|
||||
AB_ImportLdapEntriesCmd, /* Add a user to the AB from an LDAP directory */
|
||||
|
||||
/* Mailing List Pane Specific Commands!!! */
|
||||
AB_InsertLineCmd, /* Insert a blank entry line into the mailing list pane */
|
||||
AB_ReplaceLineCmd /* Replace the entry in the mailing list pane with a blank entry */
|
||||
|
||||
} AB_CommandType;
|
||||
|
||||
#endif
|
||||
449
mozilla/include/addrbook.h
Normal file
449
mozilla/include/addrbook.h
Normal file
@@ -0,0 +1,449 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef _AddrBook_H_
|
||||
#define _AddrBook_H_
|
||||
|
||||
#include "xp_core.h"
|
||||
#include "msgcom.h"
|
||||
#include "abdefn.h"
|
||||
#include "dirprefs.h"
|
||||
|
||||
#ifdef XP_CPLUSPLUS
|
||||
class MLPane;
|
||||
class ABPane;
|
||||
class AddressPane;
|
||||
class ABook;
|
||||
#else
|
||||
typedef struct MLPane MLPane;
|
||||
typedef struct ABPane ABPane;
|
||||
typedef struct AddressPane AddressPane;
|
||||
typedef struct ABook ABook;
|
||||
#endif
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
#define AB_kGromitDbFileName "da5id.nab"
|
||||
#define AB_CONFIG_USE_GROMIT_FILE_FORMAT 1
|
||||
|
||||
/****************************************************************************/
|
||||
/* Get the address book .*/
|
||||
/****************************************************************************/
|
||||
ABook* FE_GetAddressBook(MSG_Pane* pane);
|
||||
|
||||
/****************************************************************************/
|
||||
/* This is a callback into the FE to bring up a modal property sheet */
|
||||
/* for modifying an existing entry or creating a new one from a */
|
||||
/* person structure. If entryId != MSG_MESSAGEIDNONE then it is the */
|
||||
/* entryID of the entry to modify. Each FE should Return TRUE if the user */
|
||||
/* hit ok return FALSE if they hit cancel and return -1 if there was a */
|
||||
/* problem creating the window or something */
|
||||
/****************************************************************************/
|
||||
int FE_ShowPropertySheetFor (MWContext* context, ABID entryID,
|
||||
PersonEntry* pPerson);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Return whether or not to attach the users */
|
||||
/* vcard to outgoing messages */
|
||||
/****************************************************************************/
|
||||
XP_Bool AB_AttachUsersvCard(void);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Convert the address book error code to .*/
|
||||
/****************************************************************************/
|
||||
int AB_ConvertABErrToMKErr(uint32 err);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Create and initialize the address book pane which is the a view on an */
|
||||
/* address book. It will provide a sorted list of all the address book */
|
||||
/* entries ids . This is intended to be used in a two step */
|
||||
/* process of create and then initialize */
|
||||
/****************************************************************************/
|
||||
int AB_InitAddressBookPane(ABPane** ppABookPane,
|
||||
DIR_Server* dir,
|
||||
ABook* pABook,
|
||||
MWContext* context,
|
||||
MSG_Master* master,
|
||||
unsigned long sortBy,
|
||||
XP_Bool sortForward);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Create the address book pane which is the a view on an */
|
||||
/* address book. */
|
||||
/****************************************************************************/
|
||||
int AB_CreateAddressBookPane(ABPane** ppABookPane,
|
||||
MWContext* context,
|
||||
MSG_Master* master);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Initialize the address book pane which is the a view on an */
|
||||
/* address book. It will provide a sorted list of all the address book */
|
||||
/* entries ids .*/
|
||||
/****************************************************************************/
|
||||
int AB_InitializeAddressBookPane(ABPane* ppABookPane,
|
||||
DIR_Server* dir,
|
||||
ABook* pABook,
|
||||
unsigned long sortBy,
|
||||
XP_Bool sortForward);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Close the address book pane. Called when the view on an address book */
|
||||
/* is being closed */
|
||||
/****************************************************************************/
|
||||
int AB_CloseAddressBookPane(ABPane** ppABookPane);
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Create and initialize a mailing list pane which is the a view on an */
|
||||
/* mailing list. It will provide a sorted view of all the entries in a */
|
||||
/* mailing list. This is intended to be used in as a one one step process */
|
||||
/****************************************************************************/
|
||||
int AB_InitMailingListPane(MLPane** ppABookPane,
|
||||
ABID* listID,
|
||||
DIR_Server* dir,
|
||||
ABook* pABook,
|
||||
MWContext* context,
|
||||
MSG_Master* master,
|
||||
unsigned long sortBy,
|
||||
XP_Bool sortForward);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Create a mailing list pane which is the a view on an */
|
||||
/* mailing list. This is intended to be used in a two step */
|
||||
/* process of create and then initialize */
|
||||
/****************************************************************************/
|
||||
int AB_CreateMailingListPane(MLPane** ppABookPane,
|
||||
MWContext* context,
|
||||
MSG_Master* master);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Initialize a mailing list pane which is the a view on an */
|
||||
/* mailing list. It will provide a sorted view of all the entries in a */
|
||||
/* mailing list.*/
|
||||
/****************************************************************************/
|
||||
int AB_InitializeMailingListPane(MLPane* pABookPane,
|
||||
ABID* listID,
|
||||
DIR_Server* dir,
|
||||
ABook* pABook);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Close the mailing list pane. Called when the view on an mailing list */
|
||||
/* is being closed */
|
||||
/****************************************************************************/
|
||||
int AB_CloseMailingListPane(MLPane** ppMLPane);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Register a compose window with the address book */
|
||||
/* The composition pane should do this everytime it opens */
|
||||
/* so that name completion can take place */
|
||||
/****************************************************************************/
|
||||
int AB_RegisterComposeWindow(ABook* pABook, DIR_Server* directory);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Unregister a compose window with the address book */
|
||||
/* The composition pane should do this when it is getting closed */
|
||||
/****************************************************************************/
|
||||
int AB_UnregisterComposeWindow(ABook* pABook, DIR_Server* directory);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Change the Current directory */
|
||||
/****************************************************************************/
|
||||
int AB_ChangeDirectory(ABPane* pABookPane, DIR_Server* directory);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Begin a search on the LDAP directory */
|
||||
/****************************************************************************/
|
||||
int AB_SearchDirectory(ABPane* pABookPane, char* searchString);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Process LDAP search results*/
|
||||
/****************************************************************************/
|
||||
int AB_LDAPSearchResults(ABPane* pABookPane, MSG_ViewIndex index, int32 num);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Finish an LDAP search */
|
||||
/****************************************************************************/
|
||||
int AB_FinishSearch(ABPane* pABookPane, MWContext* context);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Create and initialize the address book database */
|
||||
/****************************************************************************/
|
||||
int AB_InitAddressBook(DIR_Server* directory, ABook** ppABook);
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Create and initialize the address book database */
|
||||
/* upgrading the old html address book if we need to*/
|
||||
/****************************************************************************/
|
||||
int AB_InitializeAddressBook(DIR_Server* directory, ABook** ppABook,
|
||||
const char * pOldHTMLBook);
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Close the address book database */
|
||||
/****************************************************************************/
|
||||
int AB_CloseAddressBook(ABook** ppABook);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Add a person entry to the database */
|
||||
/****************************************************************************/
|
||||
int AB_AddUser(DIR_Server* dir, ABook* pABook, PersonEntry* pPerson,
|
||||
ABID* entryID);
|
||||
int AB_AddUserWithUI (MWContext *context, PersonEntry *person,
|
||||
DIR_Server *pab, XP_Bool lastOneToAdd);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Add an entry to the database from a url*/
|
||||
/****************************************************************************/
|
||||
int AB_AddSenderToAddBook(ABook* pABook, MWContext* context, char* author,
|
||||
char* url);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Add a mailing list to the database */
|
||||
/****************************************************************************/
|
||||
int AB_AddMailingList(DIR_Server* dir, ABook* pABook,
|
||||
MailingListEntry* pABList, ABID* entryID);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Perform a command on the selected indices */
|
||||
/* Right now this will only work on delete and mail to */
|
||||
/****************************************************************************/
|
||||
int AB_Command (ABPane* pane, AB_CommandType command,
|
||||
MSG_ViewIndex* indices, int32 numindices);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Before the front end displays any menu (each time), it should call this */
|
||||
/* function for each command on that menu to determine how it should be */
|
||||
/* displayed. */
|
||||
/****************************************************************************/
|
||||
int AB_CommandStatus (ABPane* pane,
|
||||
AB_CommandType command,
|
||||
MSG_ViewIndex* indices, int32 numindices,
|
||||
XP_Bool *selectable_p,
|
||||
MSG_COMMAND_CHECK_STATE *selected_p,
|
||||
const char **display_string,
|
||||
XP_Bool *plural_p);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Get and Set how full names are constructed for people entries */
|
||||
/* first last or last first */
|
||||
/****************************************************************************/
|
||||
XP_Bool AB_GetSortByFirstName(ABook* pABook);
|
||||
void AB_SetSortByFirstName(ABook* pABook, XP_Bool sortby);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Import Export various formats that will prompt for filename */
|
||||
/****************************************************************************/
|
||||
int AB_ImportFromFile(ABPane* pABookPane, MWContext* context);
|
||||
int AB_ExportToFile(ABPane* pABookPane, MWContext* context);
|
||||
|
||||
/****************************************************************************/
|
||||
/* This is only used right now for drop/paste of a vcard */
|
||||
/****************************************************************************/
|
||||
int AB_ImportFromVcard(AddressPane* pABookPane, const char* pVcard);
|
||||
|
||||
/****************************************************************************/
|
||||
/* This is only used right now for drop of a vcard */
|
||||
/* It it a helper function that can be called by the FE to */
|
||||
/* convert a vcard to an valid rfc822 address that can be used */
|
||||
/* in the address widget of the compose window */
|
||||
/****************************************************************************/
|
||||
int AB_ConvertVCardsToExpandedName(ABook* pABook, const char* vCardString,
|
||||
XP_List ** ppEntries, int32 * numEntries);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Import Export various formats that wont do any prompting */
|
||||
/* This is needed for the command line interface and automatic upgrading */
|
||||
/****************************************************************************/
|
||||
int AB_ImportFromFileNamed(ABook* pABook, char* filename);
|
||||
int AB_ExportToFileNamed(ABook* pABook, char* filename);
|
||||
|
||||
/****************************************************************************/
|
||||
/* This function is only called from the backend. */
|
||||
/* It is used to process the addbook url that is only used in mimevcrd.c */
|
||||
/* It probably will never be called by an FE */
|
||||
/****************************************************************************/
|
||||
int AB_ImportFromVcardURL(ABook* pABook, MWContext* context, const char* pVcard);
|
||||
|
||||
/****************************************************************************/
|
||||
/* This will create a buffer with a vcard in it. It is used for constructing */
|
||||
/* a buffer that can be used in drag/drop or copy to the clipboard */
|
||||
/****************************************************************************/
|
||||
int AB_ExportToVCard(ABook* pABook, DIR_Server* dir, ABID entryID,
|
||||
char** ppVcard);
|
||||
int AB_ExportToVCardFromPerson(ABook* pABook, PersonEntry* pPerson,
|
||||
char** ppVcard);
|
||||
|
||||
/****************************************************************************/
|
||||
/* This will create a temp file for a vcard. This function is only called */
|
||||
/* from the backend compose window for constructing a vcard attachment */
|
||||
/* It probably will never be called by an FE */
|
||||
/****************************************************************************/
|
||||
int AB_ExportToVCardTempFile(ABook* pABook, DIR_Server* dir, ABID entryID,
|
||||
char** filename);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Operations on panes/view */
|
||||
/****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
/* Get the unique database id at a particular pane index */
|
||||
/****************************************************************************/
|
||||
ABID AB_GetEntryIDAt(AddressPane* pABookPane, uint32 index);
|
||||
uint32 AB_GetIndexOfEntryID (AddressPane* pABookPane, ABID entryID);
|
||||
int AB_GetEntryLine (ABPane * pABookPane, uint32 index,
|
||||
AB_EntryLine * pEntryLine);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Get info about how a pane is sorted */
|
||||
/****************************************************************************/
|
||||
XP_Bool AB_GetPaneSortedAscending(ABPane * pABookPane);
|
||||
ABID AB_GetPaneSortedBy(ABPane * pABookPane);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Get number of entries */
|
||||
/* For the address book you can ask for ALL, people, or mailing lists */
|
||||
/* For mailing list panes you will only be returned ALL */
|
||||
/****************************************************************************/
|
||||
int AB_GetEntryCount(DIR_Server* dir, ABook* pABook, uint32* count,
|
||||
ABID etype, ABID listID);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Modify information for an entry (person or mailing list) */
|
||||
/****************************************************************************/
|
||||
int AB_ModifyUser(DIR_Server* dir, ABook* pABook, ABID entryID, PersonEntry* pPerson);
|
||||
int AB_ModifyMailingList(DIR_Server* dir, ABook* pABook, ABID entryID,
|
||||
MailingListEntry* pEntry);
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/* Modify information for a mailing list that has been modified */
|
||||
/* but not committed in a mailing list pane */
|
||||
/****************************************************************************/
|
||||
int AB_ModifyMailingListAndEntries(MLPane* pMLPane, MailingListEntry* pABList);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Modify information for a mailing list that has been modified */
|
||||
/* but not committed in a mailing list pane. Some of the error checking */
|
||||
/* that was perfomed in add/replace in a mailing list had to be moved to */
|
||||
/* here. The fe's should be calling this function instead of the one above */
|
||||
/****************************************************************************/
|
||||
int AB_ModifyMailingListAndEntriesWithChecks(MLPane* pMLPane, MailingListEntry* pList,
|
||||
MSG_ViewIndex *index, MSG_ViewIndex begIndex);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Get information for every entry (person or mailing list) */
|
||||
/****************************************************************************/
|
||||
int AB_GetType(DIR_Server* dir, ABook* pABook, ABID entryID, ABID* type);
|
||||
int AB_GetFullName(DIR_Server* dir, ABook* pABook, ABID entryID, char* pname);
|
||||
int AB_GetNickname(DIR_Server* dir, ABook* pABook, ABID entryID, char* pname);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Get information for every person entry */
|
||||
/****************************************************************************/
|
||||
int AB_GetGivenName(DIR_Server* dir, ABook* pABook, ABID entryID, char* pname);
|
||||
int AB_GetMiddleName(DIR_Server* dir, ABook* pABook, ABID entryID, char* pname);
|
||||
int AB_GetFamilyName(DIR_Server* dir, ABook* pABook, ABID entryID, char* pname);
|
||||
int AB_GetCompanyName(DIR_Server* dir, ABook* pABook, ABID entryID, char* pname);
|
||||
int AB_GetLocality(DIR_Server* dir, ABook* pABook, ABID entryID, char* pname);
|
||||
int AB_GetRegion(DIR_Server* dir, ABook* pABook, ABID entryID, char* pname);
|
||||
int AB_GetEmailAddress(DIR_Server* dir, ABook* pABook, ABID entryID, char* paddress);
|
||||
int AB_GetInfo(DIR_Server* dir, ABook* pABook, ABID entryID, char* pinfo);
|
||||
int AB_GetHTMLMail(DIR_Server* dir, ABook* pABook, ABID entryID, XP_Bool* pHTML);
|
||||
int AB_GetExpandedName(DIR_Server* dir, ABook* pABook, ABID entryID, char** pname);
|
||||
int AB_GetTitle(DIR_Server* dir, ABook* pABook, ABID entryID, char* ptitle);
|
||||
int AB_GetPOAddress(DIR_Server* dir, ABook* pABook, ABID entryID, char* ppoaddress);
|
||||
int AB_GetStreetAddress(DIR_Server* dir, ABook* pABook, ABID entryID, char* pstreet);
|
||||
int AB_GetZipCode(DIR_Server* dir, ABook* pABook, ABID entryID, char* pzip);
|
||||
int AB_GetCountry(DIR_Server* dir, ABook* pABook, ABID entryID, char* pcountry);
|
||||
int AB_GetWorkPhone(DIR_Server* dir, ABook* pABook, ABID entryID, char* pphone);
|
||||
int AB_GetFaxPhone(DIR_Server* dir, ABook* pABook, ABID entryID, char* pphone);
|
||||
int AB_GetHomePhone(DIR_Server* dir, ABook* pABook, ABID entryID, char* pphone);
|
||||
int AB_GetDistName(DIR_Server* dir, ABook* pABook, ABID entryID, char* pname);
|
||||
int AB_GetSecurity(DIR_Server* dir, ABook* pABook, ABID entryID, short* security);
|
||||
int AB_GetCoolAddress(DIR_Server* dir, ABook* pABook, ABID entryID, char* paddress);
|
||||
int AB_GetUseServer(DIR_Server* dir, ABook* pABook, ABID entryID, short* use);
|
||||
|
||||
int AB_GetEntryIDForPerson(DIR_Server* dir, ABook* pABook, ABID* entryID,
|
||||
PersonEntry* pPerson);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Add/Remove entries for a mailing list */
|
||||
/****************************************************************************/
|
||||
int AB_GetEntryCountInMailingList(MLPane* pMLPane, uint32* count);
|
||||
int AB_AddIDToMailingListAt(MLPane* pMLPane, ABID entryID, MSG_ViewIndex index);
|
||||
int AB_RemoveIDFromMailingListAt(MLPane* pMLPane, MSG_ViewIndex index);
|
||||
int AB_ReplaceIDInMailingListAt(MLPane* pMLPane, ABID entryID, MSG_ViewIndex index);
|
||||
int AB_AddPersonToMailingListAt(MLPane* pMLPane, PersonEntry* person,
|
||||
MSG_ViewIndex index, ABID* entryID);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Find index to first entry in a pane that matches the typedown */
|
||||
/****************************************************************************/
|
||||
int AB_GetIndexMatchingTypedown(ABPane* pABookPane,
|
||||
MSG_ViewIndex* index, const char* aValue, MSG_ViewIndex startIndex);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Return the id of the name/nickname entries that match a string. If we */
|
||||
/* find a nickname that uniquely matches then return otherwise check the */
|
||||
/* full name field. */
|
||||
/****************************************************************************/
|
||||
int AB_GetIDForNameCompletion(ABook* pABook, DIR_Server* dir, ABID* entryID,
|
||||
ABID* field, const char* aValue);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Return a string of expanded addresses from the address book */
|
||||
/****************************************************************************/
|
||||
char* AB_ExpandHeaderString(ABook* pABook, const char* addresses,
|
||||
XP_Bool expandfull);
|
||||
|
||||
/****************************************************************************/
|
||||
/* Return the ids of mailing lists that a entry is a member of */
|
||||
/* This was mentioned at one time as a requirement in the ui but it may */
|
||||
/* go away */
|
||||
/****************************************************************************/
|
||||
int AB_GetMailingListsContainingID(ABook* pABook, MSG_ViewIndex* plist,
|
||||
ABID entryID);
|
||||
|
||||
/****************************************************************************/
|
||||
/* This should not be called by any of the fes. I placed it here so it */
|
||||
/* could be called in the backend by other functions such as those in libmsg */
|
||||
/* This allows for an increase in performance when adding a bunch of entries */
|
||||
/* to the database */
|
||||
/****************************************************************************/
|
||||
int AB_SetIsImporting(ABook* pABook, XP_Bool isImporting);
|
||||
|
||||
/****************************************************************************/
|
||||
/* This should not be called by any of the fes. I placed it here so it */
|
||||
/* could be called in the backend by other functions in libmsg */
|
||||
/* This will set the wantsHTML boolean to be set for all address book */
|
||||
/* entries with that match the name and email address. */
|
||||
/****************************************************************************/
|
||||
int AB_SetHTMLForPerson(DIR_Server* dir, ABook* pABook, PersonEntry* pPerson);
|
||||
|
||||
/****************************************************************************/
|
||||
/* This should not be called by any of the fes. I placed it here so it */
|
||||
/* could be called in the backend by other functions in libmsg */
|
||||
/* This will break a name apart into first name and last name. */
|
||||
/* Be sure and set the WinCSID in the person structure */
|
||||
/****************************************************************************/
|
||||
int AB_BreakApartFirstName (ABook* pABook, PersonEntry* pPerson);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif
|
||||
7878
mozilla/include/allxpstr.h
Normal file
7878
mozilla/include/allxpstr.h
Normal file
File diff suppressed because it is too large
Load Diff
7878
mozilla/include/allxpstr.rc
Normal file
7878
mozilla/include/allxpstr.rc
Normal file
File diff suppressed because it is too large
Load Diff
700
mozilla/include/bkmks.h
Normal file
700
mozilla/include/bkmks.h
Normal file
@@ -0,0 +1,700 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
#ifndef BKMKS_H
|
||||
#define BKMKS_H
|
||||
|
||||
#include "xp_mcom.h"
|
||||
#include "ntypes.h"
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
#define BM_LAST_CELL 0xFFFF /* See BMFE_RefreshCells */
|
||||
|
||||
typedef time_t BM_Date;
|
||||
|
||||
typedef enum {
|
||||
BM_Cmd_Invalid, /* XFE in particular likes to have an invalid
|
||||
ID code as one of the entries here...*/
|
||||
|
||||
BM_Cmd_Open, /* Open a new bookmark file. */
|
||||
|
||||
BM_Cmd_ImportBookmarks, /* Import entries from another bookmark
|
||||
file. */
|
||||
|
||||
BM_Cmd_SaveAs, /* Save these bookmarks into another file. */
|
||||
|
||||
BM_Cmd_Close, /* Close the bookmarks window. (NYI ###) */
|
||||
|
||||
BM_Cmd_Undo, /* Undo the last command. */
|
||||
BM_Cmd_Redo, /* Redo the last undone command. */
|
||||
|
||||
BM_Cmd_Cut, /* Cut the selected bookmarks. */
|
||||
BM_Cmd_Copy, /* Copy the selected bookmarks. */
|
||||
BM_Cmd_Paste, /* Paste in the most recent cut/copy. */
|
||||
BM_Cmd_Delete, /* Delete the selected bookmarks without
|
||||
affecting the clipboard. */
|
||||
|
||||
BM_Cmd_SelectAllBookmarks, /* Select every bookmark in the window. */
|
||||
|
||||
BM_Cmd_Find, /* Find a string. */
|
||||
|
||||
BM_Cmd_FindAgain, /* Find the same string again. */
|
||||
|
||||
BM_Cmd_BookmarkProps, /* Bring up the properties window. */
|
||||
|
||||
BM_Cmd_GotoBookmark, /* Load the selected bookmark in a browser
|
||||
window. */
|
||||
|
||||
/* Sort the bookmarks. NYI### */
|
||||
BM_Cmd_Sort_Name,
|
||||
BM_Cmd_Sort_Name_Asc,
|
||||
|
||||
BM_Cmd_Sort_Address,
|
||||
BM_Cmd_Sort_Address_Asc,
|
||||
|
||||
BM_Cmd_Sort_AddDate,
|
||||
BM_Cmd_Sort_AddDate_Asc,
|
||||
|
||||
BM_Cmd_Sort_LastVisit,
|
||||
BM_Cmd_Sort_LastVisit_Asc,
|
||||
|
||||
BM_Cmd_Sort_Natural,
|
||||
|
||||
|
||||
BM_Cmd_InsertBookmark, /* Insert a new bookmark (or a new address if
|
||||
in addressbook). */
|
||||
|
||||
BM_Cmd_InsertHeader, /* Insert a new header. */
|
||||
|
||||
BM_Cmd_InsertSeparator, /* Insert a separator. */
|
||||
|
||||
BM_Cmd_MakeAlias, /* Make an alias of this bookmark. */
|
||||
|
||||
BM_Cmd_SetAddHeader, /* Make the current header be the one where new
|
||||
bookmarks are added. */
|
||||
|
||||
BM_Cmd_SetMenuHeader /* Make the current header be the one which the
|
||||
pulldown menu is created from. */
|
||||
|
||||
} BM_CommandType;
|
||||
#define BM_Cmd_SortBookmarks BM_Cmd_Sort_Name
|
||||
|
||||
typedef enum
|
||||
{
|
||||
BM_Sort_NONE = -1,
|
||||
|
||||
BM_Sort_Name,
|
||||
BM_Sort_Name_Asc,
|
||||
|
||||
BM_Sort_Address,
|
||||
BM_Sort_Address_Asc,
|
||||
|
||||
BM_Sort_AddDate,
|
||||
BM_Sort_AddDate_Asc,
|
||||
|
||||
BM_Sort_LastVisit,
|
||||
BM_Sort_LastVisit_Asc,
|
||||
|
||||
BM_Sort_Natural
|
||||
|
||||
} BM_SortType;
|
||||
|
||||
/* The various types of bookmark entries (as returned by BM_GetType). */
|
||||
|
||||
typedef uint16 BM_Type;
|
||||
|
||||
#define BM_TYPE_HEADER 0x0001
|
||||
#define BM_TYPE_URL 0x0002
|
||||
#define BM_TYPE_ADDRESS 0x0004
|
||||
#define BM_TYPE_SEPARATOR 0x0008
|
||||
#define BM_TYPE_ALIAS 0x0010
|
||||
|
||||
|
||||
/* This represents one line in the bookmarks window -- a URL, a
|
||||
separater, an addressbook entry, a header, etc. It's also already
|
||||
defined in ntypes.h, and some compilers bitch and moan about seeing it
|
||||
twice, so I've commented it out here. */
|
||||
/* typedef struct BM_Entry_struct BM_Entry; */
|
||||
|
||||
|
||||
|
||||
/* information for the find dialog */
|
||||
typedef struct BM_FindInfo {
|
||||
char* textToFind;
|
||||
XP_Bool checkNickname; /* Meaningful only in addressbook */
|
||||
XP_Bool checkName;
|
||||
XP_Bool checkLocation;
|
||||
XP_Bool checkDescription;
|
||||
XP_Bool matchCase;
|
||||
XP_Bool matchWholeWord;
|
||||
|
||||
BM_Entry* lastEntry;
|
||||
} BM_FindInfo;
|
||||
|
||||
struct BM_Entry_Focus {
|
||||
BM_Entry* saveFocus;
|
||||
XP_Bool foundSelection;
|
||||
};
|
||||
|
||||
extern XP_Bool BM_IsHeader(BM_Entry* entry);
|
||||
extern XP_Bool BM_IsUrl(BM_Entry* entry);
|
||||
extern XP_Bool BM_IsAddress(BM_Entry* entry);
|
||||
extern XP_Bool BM_IsSeparator(BM_Entry* entry);
|
||||
extern XP_Bool BM_IsAlias(BM_Entry* entry);
|
||||
extern XP_Bool BM_IsFolded(BM_Entry* entry);
|
||||
extern XP_Bool BM_IsSelected(BM_Entry* entry);
|
||||
|
||||
|
||||
/* Returns the state of whether this is a "changed URL"; that is, a URL whose
|
||||
contents have apparently changed since we last visited it. */
|
||||
|
||||
#define BM_CHANGED_YES 1
|
||||
#define BM_CHANGED_NO 0
|
||||
#define BM_CHANGED_UNKNOWN -1
|
||||
|
||||
extern int32 BM_GetChangedState(BM_Entry* entry);
|
||||
|
||||
|
||||
|
||||
/* Get/Set the header that is to be the root of the pulldown menu. */
|
||||
extern BM_Entry* BM_GetMenuHeader(MWContext* context);
|
||||
extern void BM_SetMenuHeader(MWContext* context, BM_Entry* entry);
|
||||
|
||||
/* Get/Set the header that is to be the container of new items added from
|
||||
browser windows. */
|
||||
extern BM_Entry* BM_GetAddHeader(MWContext* context);
|
||||
extern void BM_SetAddHeader(MWContext* context, BM_Entry* entry);
|
||||
|
||||
|
||||
typedef void (*EntryFunc)(MWContext* context, BM_Entry* entry, void* closure);
|
||||
|
||||
|
||||
/* Executes the given function on every single entry in the bookmark file. */
|
||||
extern void BM_EachEntryDo(MWContext* context, EntryFunc func, void* closure);
|
||||
|
||||
/* Executes the given function for every entry that is selected. */
|
||||
extern void BM_EachSelectedEntryDo(MWContext* context, EntryFunc func,
|
||||
void* closure);
|
||||
|
||||
/* Executes the given function for every entry that is selected and is not a
|
||||
descendent of a header that is not folded or selected. */
|
||||
extern void BM_EachProperSelectedEntryDo(MWContext* context, EntryFunc func,
|
||||
void* closure, struct BM_Entry_Focus* bmFocus);
|
||||
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
/* Front end stubs -- each FE needs to implement these. */
|
||||
|
||||
/* Refresh each cell between and including first and last in the bookmarks
|
||||
widget (if now is TRUE, the FE is expected to redraw them BEFORE returning,
|
||||
otherwise the FE can simply invalidate them and wait for the redraw to
|
||||
happen). If BM_LAST_CELL is passed in as last, then it means paint from
|
||||
the first to the end. */
|
||||
extern void BMFE_RefreshCells(MWContext* context, int32 first, int32 last,
|
||||
XP_Bool now);
|
||||
|
||||
|
||||
/* Resize the widget to accomodate "visibleCount" number of entries vertically
|
||||
and the width of widest entry the actual widget should NOT change size, just
|
||||
the size of the scrollable area under it */
|
||||
extern void BMFE_SyncDisplay(MWContext* context);
|
||||
|
||||
|
||||
/* measure the item and assign the width and height required to draw it into
|
||||
the widget into width and height. This is used only by BM_WidestEntry(); if
|
||||
you don't need that call, you can just make this an empty stub. */
|
||||
extern void BMFE_MeasureEntry(MWContext* context, BM_Entry* entry,
|
||||
uint32* width, uint32* height);
|
||||
|
||||
/* Save the given bucket o' bits as the clipboard. This same bucket needs to
|
||||
be returned later if BMFE_GetClipContents() is called. */
|
||||
extern void BMFE_SetClipContents(MWContext* context, void* buffer,
|
||||
int32 length);
|
||||
|
||||
|
||||
/* return the clipboard contents */
|
||||
extern void* BMFE_GetClipContents(MWContext* context, int32* length);
|
||||
|
||||
|
||||
/* Copy the selected items from a history window to the clipboard (as bookmarks) */
|
||||
extern char *BM_ClipCopyHistorySelection( void *pHistCsr, uint32 *pSelections, int iCount, int *pSize, XP_Bool bLongFormat );
|
||||
|
||||
/* Insert the block into the list */
|
||||
extern void BM_DropBlockL( MWContext *pContext, char *pData, BM_Entry *firstSelected );
|
||||
|
||||
/* Create the bookmarks property window. If one already exists, just bring it
|
||||
to the front. This will always be immediately followed by a call to
|
||||
BMFE_EditItem(). */
|
||||
extern void BMFE_OpenBookmarksWindow(MWContext* context);
|
||||
|
||||
|
||||
/* Edit the given item in the bookmarks property window. If there is no
|
||||
bookmarks property window currently, then the FE should ignore this call.
|
||||
If the bookmarks property window is currently displaying some other entry,
|
||||
then it should save any changes made to that entry (by calling BM_SetName,
|
||||
etc.) before loading up this entry. */
|
||||
extern void BMFE_EditItem(MWContext* context, BM_Entry* entry);
|
||||
|
||||
/* The given entry is no longer valid (i.e., the user just deleted it). So,
|
||||
the given pointer is about to become invalid, and the FE should remove any
|
||||
references to it it may have. In particular, if it is the one being edited
|
||||
in the bookmarks property window, then the FE should clear that window. */
|
||||
extern void BMFE_EntryGoingAway(MWContext* context, BM_Entry* entry);
|
||||
|
||||
|
||||
/* The user has requested to view the given url. Show it to him in, using some
|
||||
appropriate context. Url may be targeted to a different window */
|
||||
extern void BMFE_GotoBookmark(MWContext* context,
|
||||
const char* url, const char* target);
|
||||
|
||||
|
||||
/* Create the find dialog, and fill it in as specified in the given
|
||||
structure. When the user hits the "Find" button in the dialog, call
|
||||
BM_DoFindBookmark. */
|
||||
extern void* BMFE_OpenFindWindow(MWContext* context, BM_FindInfo* findInfo);
|
||||
|
||||
|
||||
/* Make sure that the given entry is visible. */
|
||||
extern void BMFE_ScrollIntoView(MWContext* context, BM_Entry* entry);
|
||||
|
||||
|
||||
/* The list of bookmarks has changed somehow, so any "bookmarks" menu needs to
|
||||
be recreated. This should be a cheap call, just setting a flag in the FE so
|
||||
that it knows to recreate the menu later (like, when the user tries to view
|
||||
it). Recreating it immediately would be bad, because this can get called
|
||||
much more often than is reasonable. */
|
||||
extern void BMFE_BookmarkMenuInvalid(MWContext* context);
|
||||
|
||||
|
||||
/* We're in the process of doing a What's Changed operation. The What's
|
||||
Changed window should update to display the URL, the percentage (calculate
|
||||
as done*100/total), and the total estimated time (given here as a
|
||||
pre-formatted string). The What's Changed window should end up looking
|
||||
something like this:
|
||||
|
||||
Checking <URL>... (<13> left)
|
||||
{===================== } (progress bar)
|
||||
|
||||
Estimated time remaining: <2 hours 13 minutes>
|
||||
(Remaining time depends on the sites selected and
|
||||
the network traffic).
|
||||
|
||||
|
||||
[ Cancel ]
|
||||
|
||||
It's up to the FE to notice the first time this is called and change its
|
||||
window to display the info instead of the initial What's Changed screen.
|
||||
|
||||
If the user ever hits Cancel (or does something equivilant, like destroys
|
||||
the window), the FE must call BM_CancelWhatsChanged(). */
|
||||
|
||||
extern void BMFE_UpdateWhatsChanged(MWContext* context,
|
||||
const char* url, /* If NULL, just display
|
||||
"Checking..." */
|
||||
int32 done, int32 total,
|
||||
const char* totaltime);
|
||||
|
||||
|
||||
|
||||
/* We've finished processing What's Changed. The What's Changed window should
|
||||
change to display the summary of what happened. It should look something
|
||||
like this:
|
||||
|
||||
Done checking <157> Bookmarks.
|
||||
<134> documents were reached.
|
||||
<27> documents have changed and are marked in blue.
|
||||
|
||||
[ OK ]
|
||||
|
||||
When the user clicks on the OK, the FE should just take down the window.
|
||||
(It doesn't matter if the FE calls BM_CancelWhatsChanged(); it will be a
|
||||
no-op in this situtation.) */
|
||||
|
||||
extern void BMFE_FinishedWhatsChanged(MWContext* context, int32 totalchecked,
|
||||
int32 numreached, int32 numchanged);
|
||||
|
||||
#ifdef XP_WIN
|
||||
/* The current bookmarks file is about to change */
|
||||
extern void BMFE_ChangingBookmarksFile(void);
|
||||
|
||||
/* The current bookmarks file has been changed */
|
||||
extern void BMFE_ChangedBookmarksFile(void);
|
||||
#endif
|
||||
|
||||
#ifdef XP_UNIX
|
||||
/* Use these to know when to allow refresh */
|
||||
extern void BMFE_StartBatch(MWContext* context);
|
||||
extern void BMFE_EndBatch(MWContext* context);
|
||||
#endif
|
||||
|
||||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
|
||||
|
||||
/* Initialize a new bookmarks context. (returns negative on failure) */
|
||||
extern int BM_InitializeBookmarksContext(MWContext* context);
|
||||
|
||||
|
||||
/* Prepare to destroy a bookmarks context. Will save any changes that have
|
||||
been made. */
|
||||
extern void BM_CleanupBookmarksContext(MWContext* context);
|
||||
|
||||
|
||||
/* Set some FE data to associate with a bookmarks context. */
|
||||
extern void BM_SetFEData(MWContext* context, void* data);
|
||||
|
||||
/* Get the FE data previously associated with a context. */
|
||||
extern void* BM_GetFEData(MWContext* context);
|
||||
|
||||
|
||||
/* Create a new url entry. */
|
||||
extern BM_Entry* BM_NewUrl(const char* name, const char* address,
|
||||
const char* content_type, BM_Date last_visit);
|
||||
|
||||
/* Create a new header. */
|
||||
extern BM_Entry* BM_NewHeader(const char* name);
|
||||
|
||||
|
||||
/* Create a copy of an existing bookmark. If the bookmark is a folder
|
||||
it will also contain a copy of all of the bookmarks in the folder.*/
|
||||
extern BM_Entry* BM_CopyBookmark(MWContext* context, BM_Entry* original);
|
||||
|
||||
/* Frees an entry. This should never be called unless you are sure the entry
|
||||
has not been added to some header, and is not the object of some alias. In
|
||||
other words, be sure nothing could possibly have a pointer to this it.
|
||||
If the object is a header, this will also free all of its descendents. */
|
||||
extern void BM_FreeEntry(MWContext* context, BM_Entry* entry);
|
||||
|
||||
|
||||
/* Get the type of this bookmark. (Returns one of the BM_TYPE_* values.) */
|
||||
extern BM_Type BM_GetType(BM_Entry* entry);
|
||||
|
||||
extern char* BM_GetName(BM_Entry* entry);
|
||||
|
||||
extern char* BM_GetAddress(BM_Entry* entry);
|
||||
extern char* BM_GetTarget(BM_Entry* entry, XP_Bool recurse);
|
||||
extern char* BM_GetDescription(BM_Entry* entry);
|
||||
|
||||
extern char* BM_GetNickName(BM_Entry* entry); /* Only meaningful in address
|
||||
book. */
|
||||
|
||||
/* Get the full name and address of the given entry (which must be an
|
||||
address book entry or header). Result is returned in a newly allocated
|
||||
string; free it with XP_FREE() when through. */
|
||||
extern char* BM_GetFullAddress(MWContext* context, BM_Entry* entry);
|
||||
|
||||
/* These return prettily formated info about the bookmark. They each
|
||||
return the result in a staticly allocated string, so if you call the
|
||||
same function twice the results get stomped. */
|
||||
extern char* BM_PrettyLastVisitedDate(BM_Entry* entry);
|
||||
extern char* BM_PrettyAddedOnDate(BM_Entry* entry);
|
||||
extern char* BM_PrettyAliasCount(MWContext* context, BM_Entry* entry);
|
||||
|
||||
|
||||
/* Get the root node of a context. */
|
||||
extern BM_Entry* BM_GetRoot(MWContext* context);
|
||||
|
||||
|
||||
/* Given a node, return the first of its children (if any). */
|
||||
extern BM_Entry* BM_GetChildren(BM_Entry* entry);
|
||||
|
||||
/* Given a node, return the next node that has the same parent (if any). */
|
||||
extern BM_Entry* BM_GetNext(BM_Entry* entry);
|
||||
|
||||
/* Given a node, returns its parent (or NULL if this is the root) */
|
||||
extern BM_Entry* BM_GetParent(BM_Entry* entry);
|
||||
|
||||
/* Does this node have a sibling somewhere below it? */
|
||||
extern XP_Bool BM_HasNext(BM_Entry* entry);
|
||||
|
||||
/* Does this node have a sibling somewhere above it? Note that there is *not*
|
||||
an API to actually get that sibling, as this is not a simple call. However,
|
||||
determing the existance of such a child is easy, and that's what Windows
|
||||
needs to paint its pipes. */
|
||||
extern XP_Bool BM_HasPrev(BM_Entry* entry);
|
||||
|
||||
|
||||
|
||||
/* Routines to change the name/address/description of an entry. These routines
|
||||
will take care of updating the display as necessary. */
|
||||
extern void BM_SetName(MWContext* context, BM_Entry* entry,
|
||||
const char* newName);
|
||||
extern void BM_SetAddress(MWContext* context, BM_Entry* entry,
|
||||
const char* newAddress);
|
||||
extern void BM_SetTarget(MWContext* context, BM_Entry* entry,
|
||||
const char* newTarget);
|
||||
extern void BM_SetDescription(MWContext* context, BM_Entry* entry,
|
||||
const char* newDesc);
|
||||
|
||||
/* Only meaningful in addressbook (on an address or header or alias to same) */
|
||||
extern XP_Bool BM_SetNickName(MWContext* context, BM_Entry* entry,
|
||||
const char* newName);
|
||||
|
||||
/* The user just hit "Cancel" on the properties window, which was editing
|
||||
the given item. This gives the bookmarks code a chance to delete the
|
||||
item if it was just newly created. */
|
||||
extern void BM_CancelEdit(MWContext* context, BM_Entry* entry);
|
||||
|
||||
|
||||
/* fold or unfold the header according to "fold" and all its subfolders if
|
||||
foldAll is TRUE */
|
||||
extern void BM_FoldHeader(MWContext* context, BM_Entry* entry, XP_Bool fold,
|
||||
XP_Bool refresh, XP_Bool foldAll);
|
||||
|
||||
|
||||
/* clear all the selection flags, and cause a redisplay if refresh is set. */
|
||||
extern void BM_ClearAllSelection(MWContext* context, XP_Bool refresh);
|
||||
|
||||
/* Clear all the child selections of the passes header and redisplay if refresh
|
||||
is set. */
|
||||
extern void BM_ClearAllChildSelection(MWContext* context, BM_Entry* at,
|
||||
XP_Bool refresh);
|
||||
|
||||
/* Select everything. */
|
||||
extern void BM_SelectAll(MWContext* context, XP_Bool refresh);
|
||||
|
||||
|
||||
/* selects the item, call BMFE_Refresh on it if "refresh" and calls
|
||||
BM_ClearSelection first if extend is FALSE */
|
||||
extern void BM_SelectItem(MWContext* context, BM_Entry* item, XP_Bool refresh,
|
||||
XP_Bool extend, XP_Bool select);
|
||||
|
||||
/* Adds a range of bookmarks to the current selection. To be called by the FE
|
||||
when the user Shift-Clicks in the window. This will unselect everything and
|
||||
then select a range of bookmarks, from the last bookmark that was selected
|
||||
with BM_SelectItem to the one given here. */
|
||||
extern void BM_SelectRangeTo(MWContext* context, BM_Entry* item);
|
||||
|
||||
/* toggles the selected state of the item, call BMFE_Refresh on it if "refresh"
|
||||
and calls BM_ClearSelection if extend is FALSE */
|
||||
extern void BM_ToggleItem(MWContext* context, BM_Entry* item, XP_Bool refresh,
|
||||
XP_Bool extend );
|
||||
|
||||
/* returns the first selected entry */
|
||||
extern BM_Entry* BM_FirstSelectedItem(MWContext* context);
|
||||
|
||||
|
||||
extern BM_Date BM_GetLastVisited(BM_Entry *);
|
||||
extern BM_Date BM_GetAdditionDate(BM_Entry *);
|
||||
|
||||
/* return the number of bookmarks */
|
||||
extern int32 BM_GetCount(MWContext* context);
|
||||
|
||||
/* return the number of visible bookmarks */
|
||||
extern int32 BM_GetVisibleCount(MWContext* context);
|
||||
|
||||
/* returns an integer index of the item in the list */
|
||||
extern int32 BM_GetIndex(MWContext* context, BM_Entry* item);
|
||||
|
||||
/* returns an integer index of the item in the list and does not pay attention
|
||||
to the is_folded value */
|
||||
extern int32 BM_GetUnfoldedIndex(MWContext* context, BM_Entry* item);
|
||||
|
||||
/* returns the object associated with the index returned by BM_GetIndex() */
|
||||
extern BM_Entry* BM_AtIndex(MWContext* context, int32 index);
|
||||
|
||||
/* returns the object associated with the index returned by
|
||||
BM_GetUnfoldedIndex() */
|
||||
extern BM_Entry* BM_AtUnfoldedIndex(MWContext* context, int32 index);
|
||||
|
||||
|
||||
/* returns an integer depth of the item in the list starting
|
||||
at zero */
|
||||
extern int32 BM_GetDepth(MWContext* context, BM_Entry* item);
|
||||
|
||||
|
||||
/* Execute a find operation according to the data in the given structure. This
|
||||
will cause the appropriate entry to be selected and made visible. */
|
||||
extern void BM_DoFindBookmark(MWContext* context, BM_FindInfo* findInfo);
|
||||
|
||||
/* For addressbook only: find and return the entry (if any) for the e-mail
|
||||
address within the given mailto: url. (used by libmsg) */
|
||||
extern BM_Entry* BM_FindAddress(MWContext* context, const char* mailtourl);
|
||||
|
||||
|
||||
/* For addressbook only: edit the entry for the e-mail address within the
|
||||
given mailto: url, creating the entry if necessary. (used by libmsg) */
|
||||
extern void BM_EditAddress(MWContext* context, const char* mailtourl);
|
||||
|
||||
|
||||
/* For addressbook only: if the given list of addresses includes a nickname
|
||||
from the addresses, then return a new string with the addresses expanded.
|
||||
If expandfull is True, then all mailing list entries are expanded too,
|
||||
otherwise, mailing list entries are only expanded to include their name.
|
||||
(used by libmsg). */
|
||||
extern char* BM_ExpandHeaderString(MWContext* context, const char* value,
|
||||
XP_Bool expandfull);
|
||||
|
||||
|
||||
/* Checks every bookmark context for a url and updates the last accessed
|
||||
time. (For use by global history code; FE's probably don't need this.) */
|
||||
extern void BM_UpdateBookmarksTime(URL_Struct* URL_s, BM_Date cur_time);
|
||||
|
||||
/* returns TRUE if the second argument is a direct descendent of the first
|
||||
argument, returns FALSE otherwise */
|
||||
extern XP_Bool BM_IsDescendent(MWContext* context, BM_Entry* parent,
|
||||
BM_Entry* possible_child);
|
||||
|
||||
|
||||
/* The front end can use this call to determine what the indentation depth is
|
||||
needed to display all the icons in the bookmarks. The XFE uses this to
|
||||
dynamically resize the icon column. In true C style, the number returned is
|
||||
actually one bigger than the biggest depth the FE will ever get. */
|
||||
extern int BM_GetMaxDepth(MWContext* context);
|
||||
|
||||
|
||||
/* This is called during a drag operation. The user is dragging some bookmarks
|
||||
and is currently pointing at the given line. (If under is True, then the
|
||||
user is really pointing between the given line and the next line.) This
|
||||
returns TRUE if the FE should draw a box around the given line, and FALSE if
|
||||
it should underline it. */
|
||||
extern XP_Bool BM_IsDragEffectBox(MWContext* context, int line, XP_Bool under);
|
||||
|
||||
|
||||
/* Actually do a drop in a drag-n-drop reordering operation. The arguments are
|
||||
the same as BM_IsDragEffectBox(); the selected items will be moved. */
|
||||
extern void BM_DoDrop(MWContext* ctnx, int line, XP_Bool under);
|
||||
|
||||
|
||||
|
||||
|
||||
/* find and return the widest visible entry in the bookmarks tree. This makes
|
||||
sense only if your FE has defined a meaningful BMFE_MeasureEntry(). */
|
||||
extern BM_Entry* BM_WidestEntry(MWContext* context);
|
||||
|
||||
|
||||
|
||||
/* insert an item after another item in the bm if the insert_after item is NULL
|
||||
or not found the item will be inserted at the end of the list */
|
||||
extern void BM_InsertItemAfter(MWContext* context, BM_Entry* insert_after,
|
||||
BM_Entry* insertee);
|
||||
|
||||
/* insert an item in a header if "insert_after" is a Header type, or after the
|
||||
item if "insert after" is not a header type. if the insert_after item is
|
||||
NULL or not found the item will be inserted at the end of the bm */
|
||||
extern void BM_InsertItemInHeaderOrAfterItem(MWContext* context,
|
||||
BM_Entry* insert_after,
|
||||
BM_Entry* insertee );
|
||||
|
||||
/* Cause the given item to be inserted at the end of the given header. The
|
||||
header passed in here is usually BM_GetAddHeader(). */
|
||||
extern void BM_AppendToHeader(MWContext* context, BM_Entry* header,
|
||||
BM_Entry* entry);
|
||||
|
||||
extern void BM_PrependChildToHeader(MWContext* context, BM_Entry* parent, BM_Entry* child);
|
||||
|
||||
/* Removes the given item from bookmarks without deleting it*/
|
||||
extern void BM_RemoveChildFromHeader(MWContext* context, BM_Entry* parent, BM_Entry* child);
|
||||
|
||||
/* Cause the given bookmark to be displayed in a browser window somewhere.
|
||||
The given item must be an URL (BM_IsUrl must return TRUE). */
|
||||
extern void BM_GotoBookmark(MWContext* context, BM_Entry* item);
|
||||
|
||||
|
||||
/* Reads the hostlist from disk, what else? Pass in the bm filename and a
|
||||
relative URL which represents the original location of the html file. If
|
||||
you are reading the default bm you should pass in a file URL of the form
|
||||
file://localhost/PATH */
|
||||
extern void BM_ReadBookmarksFromDisk(MWContext* context, const char* filename,
|
||||
const char* relative_url);
|
||||
|
||||
/* saves the bm to a file. If the given filename is NULL, then save it back to
|
||||
where it was loaded from and only if changes have been made. Returns
|
||||
negative on failure. */
|
||||
extern int32 BM_SaveBookmarks(MWContext* context, const char* filename);
|
||||
|
||||
|
||||
/* Returns the filename that the bookmarks are saved in. */
|
||||
extern const char* BM_GetFileName(MWContext* context);
|
||||
|
||||
/* read in a new bookmarks file (esp for LI use). */
|
||||
extern void BM_Open_File(MWContext* context, char* newFile);
|
||||
|
||||
/* ability to set the modified to true or false (esp for LI use). */
|
||||
extern void BM_SetModified(MWContext* context, XP_Bool mod);
|
||||
|
||||
/* Whether the file will be written when Save is called. */
|
||||
extern XP_Bool BM_Modified(MWContext* context);
|
||||
|
||||
/* Convert a number of selections in a bm list into a block of memory that the
|
||||
user can use for cut and paste operations */
|
||||
extern char* BM_ConvertSelectionsToBlock(MWContext* context,
|
||||
XP_Bool bLongFormat,
|
||||
int32* lTotalLen);
|
||||
|
||||
/* Take a block of memory and insert the bm items it represents into the
|
||||
current bm */
|
||||
extern void BM_InsertBlockAt(MWContext* context, char* pOriginalBlock,
|
||||
BM_Entry* addTo, XP_Bool bLongFormat,
|
||||
int32 lTotalLen);
|
||||
|
||||
|
||||
/* select all aliases for an entry */
|
||||
extern void BM_SelectAliases(MWContext* context, BM_Entry* forEntry );
|
||||
|
||||
|
||||
/* Count how many aliases there are to the given entry. */
|
||||
extern int32 BM_CountAliases(MWContext* context, BM_Entry* forEntry);
|
||||
|
||||
|
||||
/* Make an alias for each of the currently selected entries. */
|
||||
extern void BM_MakeAliases(MWContext* context);
|
||||
|
||||
|
||||
/* Returns the real item that an alias points to. The given entry must be an
|
||||
alias (BM_IsAlias must return TRUE on it). */
|
||||
extern BM_Entry* BM_GetAliasOriginal(BM_Entry*);
|
||||
|
||||
|
||||
|
||||
/* Start a What's Changed operation. Before calling this routine, it's up to
|
||||
the FE to present a dialog like this when What's Changed starts:
|
||||
|
||||
Look for documents that have changed on:
|
||||
(o) All bookmarks
|
||||
( ) Selected bookmarks
|
||||
|
||||
[ Start Checking ] [ Cancel ]
|
||||
|
||||
Then the FE calls this routine when the user clicks Start Checking. The FE
|
||||
will immediately get called via BMFE_UpdateWhatsChanged(), and the FE should
|
||||
change the dialog box's appearance to match. */
|
||||
extern int BM_StartWhatsChanged(MWContext* context,
|
||||
XP_Bool do_only_selected);
|
||||
|
||||
|
||||
/* Cancel a running What's Changed operation. */
|
||||
extern int BM_CancelWhatsChanged(MWContext* context);
|
||||
|
||||
|
||||
|
||||
/* Returns whether the given command can be executed right now. Should be
|
||||
used to decide whether to disable a menu item for this command. */
|
||||
extern XP_Bool BM_FindCommandStatus(MWContext* context,
|
||||
BM_CommandType command);
|
||||
|
||||
/* Execute the given command. */
|
||||
extern void BM_ObeyCommand(MWContext* context, BM_CommandType command );
|
||||
|
||||
/* Clean up the undo queue */
|
||||
void BM_ResetUndo(MWContext * context);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* BMLIST_H */
|
||||
159
mozilla/include/cdefs.h
Normal file
159
mozilla/include/cdefs.h
Normal file
@@ -0,0 +1,159 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 1991, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Berkeley Software Design, Inc.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)cdefs.h 8.7 (Berkeley) 1/21/94
|
||||
*/
|
||||
|
||||
#ifndef _CDEFS_H_
|
||||
#define _CDEFS_H_
|
||||
|
||||
#ifdef __BEGIN_DECLS
|
||||
#undef __BEGIN_DECLS
|
||||
#endif
|
||||
#ifdef __END_DECLS
|
||||
#undef __END_DECLS
|
||||
#endif
|
||||
|
||||
#if defined(__cplusplus)
|
||||
#define __BEGIN_DECLS extern "C" {
|
||||
#define __END_DECLS }
|
||||
#else
|
||||
#define __BEGIN_DECLS
|
||||
#define __END_DECLS
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The __CONCAT macro is used to concatenate parts of symbol names, e.g.
|
||||
* with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
|
||||
* The __CONCAT macro is a bit tricky -- make sure you don't put spaces
|
||||
* in between its arguments. __CONCAT can also concatenate double-quoted
|
||||
* strings produced by the __STRING macro, but this only works with ANSI C.
|
||||
*/
|
||||
#undef __P
|
||||
#undef __CONCAT
|
||||
#undef __STRING
|
||||
|
||||
#if defined(__STDC__) || defined(__cplusplus) || defined(_WINDOWS) || defined(XP_OS2)
|
||||
#define __P(protos) protos /* full-blown ANSI C */
|
||||
#define __CONCAT(x,y) x ## y
|
||||
#define __STRING(x) #x
|
||||
|
||||
#define __const const /* define reserved names to standard */
|
||||
#define __signed signed
|
||||
#define __volatile volatile
|
||||
#ifndef _WINDOWS
|
||||
#if defined(__cplusplus)
|
||||
#define __inline inline /* convert to C++ keyword */
|
||||
#else
|
||||
#ifndef __GNUC__
|
||||
#define __inline /* delete GCC keyword */
|
||||
#endif /* !__GNUC__ */
|
||||
#endif /* !__cplusplus */
|
||||
#endif /* !_WINDOWS */
|
||||
|
||||
#else /* !(__STDC__ || __cplusplus) */
|
||||
#define __P(protos) () /* traditional C preprocessor */
|
||||
#define __CONCAT(x,y) x/**/y
|
||||
#define __STRING(x) "x"
|
||||
|
||||
#ifndef __GNUC__
|
||||
#define __const /* delete pseudo-ANSI C keywords */
|
||||
#define __inline
|
||||
#define __signed
|
||||
#define __volatile
|
||||
/*
|
||||
* In non-ANSI C environments, new programs will want ANSI-only C keywords
|
||||
* deleted from the program and old programs will want them left alone.
|
||||
* When using a compiler other than gcc, programs using the ANSI C keywords
|
||||
* inline, signed etc. as normal identifiers should define -DNO_ANSI_KEYWORDS.
|
||||
* When using "gcc -traditional", we assume that this is the intent; if
|
||||
* __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone.
|
||||
*/
|
||||
#ifndef NO_ANSI_KEYWORDS
|
||||
#define inline /* delete ANSI C keywords */
|
||||
#define signed
|
||||
#define volatile
|
||||
#endif
|
||||
#endif /* !__GNUC__ */
|
||||
#endif /* !(__STDC__ || __cplusplus) */
|
||||
|
||||
/*
|
||||
* GCC1 and some versions of GCC2 declare dead (non-returning) and
|
||||
* pure (no side effects) functions using "volatile" and "const";
|
||||
* unfortunately, these then cause warnings under "-ansi -pedantic".
|
||||
* GCC2 uses a new, peculiar __attribute__((attrs)) style. All of
|
||||
* these work for GNU C++ (modulo a slight glitch in the C++ grammar
|
||||
* in the distribution version of 2.5.5).
|
||||
*/
|
||||
#if !defined(__GNUC__) || __GNUC__ < 2 || __GNUC_MINOR__ < 5
|
||||
#define __attribute__(x) /* delete __attribute__ if non-gcc or gcc1 */
|
||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
|
||||
#define __dead __volatile
|
||||
#define __pure __const
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Delete pseudo-keywords wherever they are not available or needed. */
|
||||
#ifndef __dead
|
||||
#define __dead
|
||||
#define __pure
|
||||
#endif
|
||||
|
||||
#ifdef AIXV3
|
||||
/* Wont compile without const. Need a cleaner way to handle this. */
|
||||
#ifdef const
|
||||
#undef const
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* !_CDEFS_H_ */
|
||||
76
mozilla/include/cgi.h
Normal file
76
mozilla/include/cgi.h
Normal file
@@ -0,0 +1,76 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef __cgi_h_
|
||||
#define __cgi_h_
|
||||
|
||||
/*
|
||||
** CGI assist library. Portability layer for writing correctly behaving
|
||||
** CGI programs.
|
||||
*/
|
||||
#include "ds.h"
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
/*
|
||||
** Read in the input, generating a single long string out of it. CGI
|
||||
** programs normally get the value of various forms elements as input.
|
||||
*/
|
||||
extern char *CGI_GatherInput(FILE *in);
|
||||
|
||||
/*
|
||||
** Given a null terminated string, compress it in place, converting
|
||||
** "funny characters" into their ascii equivalent. Maps "+" to space and
|
||||
** %xx to the binary version of xx, where xx is a pair of hex digits.
|
||||
*/
|
||||
extern void CGI_CompressString(char *s);
|
||||
|
||||
/*
|
||||
** Convert a string into an argument vector. This seperates the incoming
|
||||
** string into pieces, and calls CGI_CompressString to compress the
|
||||
** pieces. This allocates memory for the return value only.
|
||||
*/
|
||||
extern char **CGI_ConvertStringToArgVec(char *string, int *argcp);
|
||||
|
||||
/*
|
||||
** Look for the variable called "name" in the argv. Return a pointer to
|
||||
** the value portion of the variable if found, zero otherwise. this does
|
||||
** not malloc memory.
|
||||
*/
|
||||
extern char *CGI_GetVariable(char *name, int argc, char **argv);
|
||||
|
||||
/* Return non-zero if the variable string is not empty */
|
||||
#define CGI_IsEmpty(var) (!(var) || ((var)[0] == 0))
|
||||
|
||||
/*
|
||||
** Return true if the server that started the cgi running is using
|
||||
** security (https).
|
||||
*/
|
||||
extern DSBool CGI_IsSecureServer(void);
|
||||
|
||||
/*
|
||||
** Concatenate strings to produce a single string.
|
||||
*/
|
||||
extern char *CGI_Cat(char *, ...);
|
||||
|
||||
/* Escape a string, cgi style */
|
||||
char *CGI_Escape(char *in);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* __cgi_h_ */
|
||||
59
mozilla/include/client.h
Normal file
59
mozilla/include/client.h
Normal file
@@ -0,0 +1,59 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* This file should be included after xp_mcom.h
|
||||
*
|
||||
* All definitions for intermodule communications in the Netscape
|
||||
* client should be contained in this file
|
||||
*/
|
||||
|
||||
#ifndef _CLIENT_H_
|
||||
#define _CLIENT_H_
|
||||
|
||||
#define NEW_FE_CONTEXT_FUNCS
|
||||
|
||||
/* include header files needed for prototypes/etc */
|
||||
|
||||
#include "xp_mcom.h"
|
||||
|
||||
#include "ntypes.h" /* typedefs for commonly used Netscape data structures */
|
||||
#include "fe_proto.h" /* all the standard FE functions */
|
||||
#include "proto.h" /* library functions */
|
||||
|
||||
/* global data structures */
|
||||
#include "structs.h"
|
||||
#include "merrors.h"
|
||||
|
||||
#ifndef XP_MAC /* don't include everything in the world */
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
/* include other bits of the Netscape client library */
|
||||
#include "lo_ele.h" /* Layout structures */
|
||||
#include "net.h"
|
||||
#include "gui.h"
|
||||
#include "shist.h"
|
||||
#include "hotlist.h"
|
||||
#include "glhist.h"
|
||||
#include "mime.h"
|
||||
|
||||
#endif /* !XP_MAC */
|
||||
|
||||
#endif /* _CLIENT_H_ */
|
||||
|
||||
220
mozilla/include/csid.h
Normal file
220
mozilla/include/csid.h
Normal file
@@ -0,0 +1,220 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
|
||||
/* csid.h */
|
||||
|
||||
#ifndef _CSID_H_
|
||||
#define _CSID_H_
|
||||
|
||||
/* Codeset type */
|
||||
#define SINGLEBYTE 0x0000 /* 0000 0000 0000 0000 = 0 */
|
||||
#define MULTIBYTE 0x0100 /* 0000 0001 0000 0000 = 256 */
|
||||
#define STATEFUL 0x0200 /* 0000 0010 0000 0000 = 512 */
|
||||
#define WIDECHAR 0x0300 /* 0000 0011 0000 0000 = 768 */
|
||||
#define CODESET_MASK 0x0F00 /* 0000 1111 0000 0000 = 3840 */
|
||||
|
||||
/*
|
||||
* Check for double byte encodings
|
||||
* (should distinguish 2 byte from true multibyte)
|
||||
*/
|
||||
#define IS_16BIT_ENCODING(x) (((x)&CODESET_MASK) == MULTIBYTE)
|
||||
|
||||
/* line-break on spaces */
|
||||
#define CS_SPACE 0x0400 /* 0000 0100 0000 0000 = 1024 */
|
||||
|
||||
/* Auto Detect Mode */
|
||||
#define CS_AUTO 0x0800 /* 0000 1000 0000 0000 = 2048 */
|
||||
|
||||
|
||||
/* Code Set IDs */
|
||||
/* CS_DEFAULT: used if no charset param in header */
|
||||
/* CS_UNKNOWN: used for unrecognized charset */
|
||||
|
||||
/* type id */
|
||||
#define CS_DEFAULT (SINGLEBYTE | 0) /* 0 */
|
||||
#define CS_ASCII (SINGLEBYTE | 1) /* 1 */
|
||||
#define CS_LATIN1 (SINGLEBYTE | 2) /* 2 */
|
||||
#define CS_JIS (STATEFUL | 3) /* 515 */
|
||||
#define CS_SJIS (MULTIBYTE | 4) /* 260 */
|
||||
#define CS_EUCJP (MULTIBYTE | 5) /* 261 */
|
||||
|
||||
#define CS_JIS_AUTO (CS_AUTO|STATEFUL | 3) /* 2563 */
|
||||
#define CS_SJIS_AUTO (CS_AUTO|MULTIBYTE | 4) /* 2308 */
|
||||
#define CS_EUCJP_AUTO (CS_AUTO|MULTIBYTE | 5) /* 2309 */
|
||||
|
||||
#define CS_MAC_ROMAN (SINGLEBYTE | 6) /* 6 */
|
||||
#define CS_BIG5 (MULTIBYTE | 7) /* 263 */
|
||||
#define CS_GB_8BIT (MULTIBYTE | 8) /* 264 */
|
||||
#define CS_CNS_8BIT (MULTIBYTE | 9) /* 265 */
|
||||
#define CS_LATIN2 (SINGLEBYTE | 10) /* 10 */
|
||||
#define CS_MAC_CE (SINGLEBYTE | 11) /* 11 */
|
||||
|
||||
#define CS_KSC_8BIT (MULTIBYTE|CS_SPACE | 12) /* 1292 */
|
||||
#define CS_KSC_8BIT_AUTO (CS_AUTO | MULTIBYTE|CS_SPACE | 12)
|
||||
|
||||
#define CS_2022_KR (STATEFUL | 13) /* 525 */
|
||||
#define CS_8859_3 (SINGLEBYTE | 14) /* 14 */
|
||||
#define CS_8859_4 (SINGLEBYTE | 15) /* 15 */
|
||||
#define CS_8859_5 (SINGLEBYTE | 16) /* 16 ISO Cyrillic */
|
||||
#define CS_8859_6 (SINGLEBYTE | 17) /* 17 ISO Arabic */
|
||||
#define CS_8859_7 (SINGLEBYTE | 18) /* 18 ISO Greek */
|
||||
#define CS_8859_8 (SINGLEBYTE | 19) /* 19 ISO Hebrew */
|
||||
#define CS_8859_9 (SINGLEBYTE | 20) /* 20 */
|
||||
#define CS_SYMBOL (SINGLEBYTE | 21) /* 21 */
|
||||
#define CS_DINGBATS (SINGLEBYTE | 22) /* 22 */
|
||||
#define CS_DECTECH (SINGLEBYTE | 23) /* 23 */
|
||||
#define CS_CNS11643_1 (MULTIBYTE | 24) /* 280 */
|
||||
#define CS_CNS11643_2 (MULTIBYTE | 25) /* 281 */
|
||||
#define CS_JISX0208 (MULTIBYTE | 26) /* 282 */
|
||||
#define CS_JISX0201 (SINGLEBYTE | 27) /* 27 */
|
||||
#define CS_KSC5601 (MULTIBYTE | 28) /* 284 */
|
||||
#define CS_TIS620 (SINGLEBYTE | 29) /* 29 */
|
||||
#define CS_JISX0212 (MULTIBYTE | 30) /* 286 */
|
||||
#define CS_GB2312 (MULTIBYTE | 31) /* 287 */
|
||||
#define CS_UCS2 (WIDECHAR | 32) /* 810 */
|
||||
#define CS_UCS4 (WIDECHAR | 33) /* 811 */
|
||||
#define CS_UTF8 (MULTIBYTE | 34) /* 290 */
|
||||
#define CS_UTF7 (STATEFUL | 35) /* 35 */
|
||||
#define CS_NPC (MULTIBYTE | 36) /* 292 */
|
||||
#define CS_X_BIG5 (MULTIBYTE | 37) /* 293 */
|
||||
#define CS_USRDEF2 (SINGLEBYTE | 38) /* 38 */
|
||||
|
||||
#define CS_KOI8_R (SINGLEBYTE | 39) /* 39 */
|
||||
#define CS_MAC_CYRILLIC (SINGLEBYTE | 40) /* 40 */
|
||||
#define CS_CP_1251 (SINGLEBYTE | 41) /* 41 CP1251 Windows Cyrillic */
|
||||
#define CS_MAC_GREEK (SINGLEBYTE | 42) /* 42 */
|
||||
/* CS_CP_1253 should be deleted, we should use CS_8859_7 instead */
|
||||
#define CS_CP_1253 (SINGLEBYTE | 43) /* 43 CP1253 Windows Greek */
|
||||
#define CS_CP_1250 (SINGLEBYTE | 44) /* 44 CP1250 Windows C. Europe */
|
||||
/* CS_CP_1254 should be deleted, we should use CS_8859_9 instead */
|
||||
#define CS_CP_1254 (SINGLEBYTE | 45) /* 45 CP1254 Windows Turkish */
|
||||
#define CS_MAC_TURKISH (SINGLEBYTE | 46) /* 46 */
|
||||
#define CS_GB2312_11 (MULTIBYTE | 47) /* 303 */
|
||||
#define CS_JISX0208_11 (MULTIBYTE | 48) /* 304 */
|
||||
#define CS_KSC5601_11 (MULTIBYTE | 49) /* 305 */
|
||||
#define CS_CNS11643_1110 (MULTIBYTE | 50) /* 306 */
|
||||
#define CS_UCS2_SWAP (WIDECHAR | 51) /* 819 */
|
||||
#define CS_IMAP4_UTF7 (STATEFUL | 52) /* 564 */
|
||||
#define CS_CP_850 (SINGLEBYTE | 53) /* 53 PC Latin 1 */
|
||||
#define CS_CP_852 (SINGLEBYTE | 54) /* 54 PC Latin 2 */
|
||||
#define CS_CP_855 (SINGLEBYTE | 55) /* 55 PC Cyrillic */
|
||||
#define CS_CP_857 (SINGLEBYTE | 56) /* 56 PC Turkish */
|
||||
#define CS_CP_862 (SINGLEBYTE | 57) /* 57 PC Hebrew */
|
||||
#define CS_CP_864 (SINGLEBYTE | 58) /* 58 PC Arabic */
|
||||
#define CS_CP_866 (SINGLEBYTE | 59) /* 59 PC Russian */
|
||||
#define CS_CP_874 (SINGLEBYTE | 60) /* 60 PC Thai */
|
||||
#define CS_CP_1257 (SINGLEBYTE | 61) /* 61 Windows Baltic */
|
||||
#define CS_CP_1258 (SINGLEBYTE | 62) /* 62 Windows Vietnamese */
|
||||
#define INTL_CHAR_SET_MAX 63 /* must be highest + 1 */
|
||||
|
||||
|
||||
#define CS_USER_DEFINED_ENCODING (SINGLEBYTE | 254) /* 254 */
|
||||
#define CS_UNKNOWN (SINGLEBYTE | 255) /* 255 */
|
||||
|
||||
#define IS_UTF8_CSID(x) (((x)&0xFF)== (CS_UTF8&0xFF))
|
||||
#define IS_UNICODE_CSID(x) \
|
||||
( (((x)&0xFF)== (CS_UCS2&0xFF)) \
|
||||
|| (((x)&0xFF)== (CS_UTF8&0xFF)) \
|
||||
|| (((x)&0xFF)== (CS_UTF7&0xFF)) )
|
||||
|
||||
/* The trigger is passing the parameter to
|
||||
PA_FetchParamValue() to satisfy its signature */
|
||||
#ifdef XP_MAC
|
||||
#define CS_FE_ASCII CS_MAC_ROMAN
|
||||
#else
|
||||
#define CS_FE_ASCII CS_LATIN1
|
||||
#endif
|
||||
|
||||
|
||||
/* Codeset # sorted by number */
|
||||
#if 0
|
||||
|
||||
0 CS_DEFAULT 0
|
||||
1 CS_ASCII 1
|
||||
2 CS_LATIN1 2
|
||||
6 CS_MAC_ROMAN 6
|
||||
10 CS_LATIN2 10
|
||||
11 CS_MAC_CE 11
|
||||
14 CS_8859_3 14
|
||||
15 CS_8859_4 15
|
||||
16 CS_8859_5 16
|
||||
17 CS_8859_6 17
|
||||
18 CS_8859_7 18
|
||||
19 CS_8859_8 19
|
||||
20 CS_8859_9 20
|
||||
21 CS_SYMBOL 21
|
||||
22 CS_DINGBATS 22
|
||||
23 CS_DECTECH 23
|
||||
27 CS_JISX0201 27
|
||||
29 CS_TIS620 29
|
||||
35 CS_UTF7 35
|
||||
38 CS_USRDEF2 38
|
||||
39 CS_KOI8_R 39
|
||||
40 CS_MAC_CYRILLIC 40
|
||||
41 CS_CP_1251 41
|
||||
42 CS_MAC_GREEK 42
|
||||
43 CS_CP_1253 43
|
||||
44 CS_CP_1250 44
|
||||
45 CS_CP_1254 45
|
||||
46 CS_MAC_TURKISH 46
|
||||
53 CS_CP_850 53
|
||||
54 CS_CP_852 54
|
||||
55 CS_CP_855 55
|
||||
56 CS_CP_857 56
|
||||
57 CS_CP_862 57
|
||||
58 CS_CP_864 58
|
||||
59 CS_CP_866 59
|
||||
59 CS_CP_874 60
|
||||
60 CS_CP_1257 61
|
||||
61 CS_CP_1258 62
|
||||
62 INTL_CHAR_SET_MAX 63
|
||||
254 CS_USER_DEFINED_ENCODING 254
|
||||
255 CS_UNKNOWN 255
|
||||
260 CS_SJIS 260
|
||||
261 CS_EUCJP 261
|
||||
263 CS_BIG5 263
|
||||
264 CS_GB_8BIT 264
|
||||
265 CS_CNS_8BIT 265
|
||||
280 CS_CNS11643_1 280
|
||||
281 CS_CNS11643_2 281
|
||||
282 CS_JISX0208 282
|
||||
284 CS_KSC5601 284
|
||||
286 CS_JISX0212 286
|
||||
287 CS_GB2312 287
|
||||
290 CS_UTF8 290
|
||||
292 CS_NPC 292
|
||||
293 CS_X_BIG5 293
|
||||
303 CS_GB2312_11 303
|
||||
304 CS_JISX0208_11 304
|
||||
305 CS_KSC5601_11 305
|
||||
306 CS_CNS11643_1110 306
|
||||
515 CS_JIS 515
|
||||
525 CS_2022_KR 525
|
||||
564 CS_IMAP4_UTF7 564
|
||||
810 CS_UCS2 810
|
||||
811 CS_UCS4 811
|
||||
819 CS_UCS2_SWAP 819
|
||||
1292 CS_KSC_8BIT 1292
|
||||
2308 CS_SJIS_AUTO 2308
|
||||
2309 CS_EUCJP_AUTO 2309
|
||||
2563 CS_JIS_AUTO 2563
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _CSID_H_ */
|
||||
@@ -1,4 +1,4 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
/* -*- 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
|
||||
@@ -16,22 +16,21 @@
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#ifndef _REGISTER_PRESSURE_H_
|
||||
#define _REGISTER_PRESSURE_H_
|
||||
/* the context function table
|
||||
*
|
||||
* This was typedef'd to ContextFuncs in structs.h
|
||||
*/
|
||||
#ifndef _ContextFunctions_
|
||||
#define _ContextFunctions_
|
||||
|
||||
#include "BitSet.h"
|
||||
#include "HashSet.h"
|
||||
#include "il_types.h"
|
||||
#include "cl_types.h"
|
||||
#include "xp_obs.h"
|
||||
|
||||
struct LowRegisterPressure
|
||||
{
|
||||
typedef BitSet Set;
|
||||
static const bool setIsOrdered = true;
|
||||
struct _ContextFuncs {
|
||||
#define MAKE_FE_FUNCS_STRUCT
|
||||
#include "mk_cx_fn.h"
|
||||
};
|
||||
|
||||
struct HighRegisterPressure
|
||||
{
|
||||
typedef HashSet Set;
|
||||
static const bool setIsOrdered = false;
|
||||
};
|
||||
#endif /* _ContextFunctions_ */
|
||||
|
||||
#endif // _REGISTER_PRESSURE_H_
|
||||
41
mozilla/include/cvactive.h
Normal file
41
mozilla/include/cvactive.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef CV_ACTIVE
|
||||
#define CV_ACTIVE
|
||||
|
||||
#include "net.h"
|
||||
|
||||
/* define a constant to be passed to CV_MakeMultipleDocumentStream
|
||||
* as the data_object to signify that it should return
|
||||
* MK_END_OF_MULTIPART_MESSAGE when it gets to the end
|
||||
* of the multipart instead of waiting for the complete
|
||||
* function to be called
|
||||
*/
|
||||
#define CVACTIVE_SIGNAL_AT_END_OF_MULTIPART 999
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
extern NET_StreamClass *
|
||||
CV_MakeMultipleDocumentStream (int format_out,
|
||||
void *data_object,
|
||||
URL_Struct *URL_s,
|
||||
MWContext *window_id);
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* CV_ACTIVE */
|
||||
223
mozilla/include/dirprefs.h
Normal file
223
mozilla/include/dirprefs.h
Normal file
@@ -0,0 +1,223 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef _DIRPREFS_H_
|
||||
#define _DIRPREFS_H_
|
||||
|
||||
#define kCurrentListVersion 1
|
||||
|
||||
/* DIR_Server.dirType */
|
||||
typedef enum
|
||||
{
|
||||
LDAPDirectory,
|
||||
HTMLDirectory,
|
||||
PABDirectory
|
||||
} DirectoryType;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
cn,
|
||||
givenname,
|
||||
sn,
|
||||
mail,
|
||||
telephonenumber,
|
||||
o,
|
||||
ou,
|
||||
l,
|
||||
street,
|
||||
auth,
|
||||
custom1,
|
||||
custom2,
|
||||
custom3,
|
||||
custom4,
|
||||
custom5
|
||||
} DIR_AttributeId;
|
||||
|
||||
|
||||
typedef struct _DIR_ReplicationInfo DIR_ReplicationInfo;
|
||||
|
||||
|
||||
typedef struct DIR_Server
|
||||
{
|
||||
char *description; /* human readable name */
|
||||
char *serverName; /* network host name */
|
||||
char *searchBase; /* DN suffix to search at */
|
||||
char *fileName; /* XP path name of local DB */
|
||||
char *prefId; /* name of this server's tree in JS prefs */
|
||||
int port; /* network port number */
|
||||
int maxHits; /* maximum number of hits to return */
|
||||
XP_Bool isSecure; /* use SSL? */
|
||||
XP_Bool saveResults;
|
||||
XP_Bool efficientWildcards; /* server can match substrings */
|
||||
char *lastSearchString; /* required if saving results */
|
||||
DirectoryType dirType;
|
||||
uint32 flags;
|
||||
|
||||
/* site-configurable attributes and filters */
|
||||
XP_List *customFilters;
|
||||
XP_List *customAttributes;
|
||||
char *tokenSeps;
|
||||
XP_Bool stopFiltersOnHit;
|
||||
XP_Bool isOffline;
|
||||
|
||||
/* site-configurable list of attributes whose values are DNs */
|
||||
char **dnAttributes;
|
||||
int dnAttributesCount;
|
||||
|
||||
/* site-configurable list of attributes we shouldn't display in HTML */
|
||||
char **suppressedAttributes;
|
||||
int suppressedAttributesCount;
|
||||
|
||||
/* site-configurable list of attributes for the Basic Search dialog */
|
||||
DIR_AttributeId *basicSearchAttributes;
|
||||
int basicSearchAttributesCount;
|
||||
|
||||
/* site-configurable URL to open LDAP results */
|
||||
char *customDisplayUrl;
|
||||
|
||||
/* authentication fields */
|
||||
XP_Bool enableAuth; /* Use DN and password when binding? */
|
||||
XP_Bool savePassword; /* Remember the DN and password we gave? */
|
||||
char *authDn; /* DN to give to authenticate as */
|
||||
char *password; /* Password for the DN */
|
||||
|
||||
/* replication fields */
|
||||
DIR_ReplicationInfo *replInfo;
|
||||
|
||||
} DIR_Server;
|
||||
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
/* Return the list of directory servers
|
||||
* each front end hangs on to the list
|
||||
*/
|
||||
XP_List * FE_GetDirServers(void);
|
||||
|
||||
/* Since the strings in DIR_Server are allocated, we have bottleneck
|
||||
* routines to help with memory mgmt
|
||||
*/
|
||||
int DIR_CopyServer (DIR_Server *in, DIR_Server **out);
|
||||
int DIR_DeleteServer (DIR_Server *);
|
||||
int DIR_InitServer (DIR_Server *);
|
||||
|
||||
int DIR_ValidateServer (DIR_Server *);
|
||||
XP_Bool DIR_AreServersSame (DIR_Server *first, DIR_Server *second);
|
||||
int DIR_DeleteServerList(XP_List *wholeList);
|
||||
|
||||
int DIR_GetLdapServers (XP_List *wholeList, XP_List *subList);
|
||||
int DIR_ReorderLdapServers (XP_List *wholeList);
|
||||
|
||||
/* These two routines should be called to initialize and save
|
||||
* directory preferences from the XP Java Script preferences
|
||||
*/
|
||||
int DIR_GetServerPreferences (XP_List **list, const char* pabFile);
|
||||
int DIR_SaveServerPreferences (XP_List *wholeList);
|
||||
|
||||
/* This routine will clean up files for deleted directories */
|
||||
int DIR_CleanUpServerPreferences(XP_List *deletedList);
|
||||
|
||||
|
||||
#if 1
|
||||
|
||||
/* Returns a pointer into the list (not allocated, so don't free) */
|
||||
int DIR_GetPersonalAddressBook (XP_List *wholeList, DIR_Server **pab);
|
||||
int DIR_GetComposeNameCompletionAddressBook (XP_List *wholeList, DIR_Server **cab);
|
||||
|
||||
#else
|
||||
|
||||
/* Returns an allocated list of all personal address books, excluding
|
||||
* LDAP directories, replicated directories, and CABs
|
||||
*/
|
||||
XP_List *DIR_GetPersonalAddressBooks (XP_List *wholeList);
|
||||
XP_List *DIR_GetAddressBooksForCompletion (XP_List *wholeList);
|
||||
|
||||
#endif
|
||||
|
||||
void DIR_GetServerFileName(char** filename, const char* leafName);
|
||||
void DIR_SetServerFileName(DIR_Server* pServer, const char* leafName);
|
||||
|
||||
/* APIs for site-configurability of LDAP attribute names and
|
||||
* search filter behavior.
|
||||
*
|
||||
* Strings are NOT allocated, and arrays are NULL-terminated
|
||||
*/
|
||||
const char *DIR_GetAttributeName (DIR_Server *server, DIR_AttributeId id);
|
||||
const char **DIR_GetAttributeStrings (DIR_Server *server, DIR_AttributeId id);
|
||||
const char *DIR_GetFirstAttributeString (DIR_Server *server, DIR_AttributeId id);
|
||||
const char *DIR_GetFilterString (DIR_Server *server);
|
||||
const char *DIR_GetTokenSeparators (DIR_Server *server);
|
||||
XP_Bool DIR_RepeatFilterForTokens (DIR_Server *server, const char *filter);
|
||||
XP_Bool DIR_SubstStarsForSpaces (DIR_Server *server, const char *filter);
|
||||
XP_Bool DIR_UseCustomAttribute (DIR_Server *server, DIR_AttributeId id);
|
||||
|
||||
XP_Bool DIR_IsDnAttribute (DIR_Server *s, const char *attr);
|
||||
XP_Bool DIR_IsAttributeExcludedFromHtml (DIR_Server *s, const char *attr);
|
||||
|
||||
int DIR_AttributeNameToId (const char *attrName, DIR_AttributeId *id);
|
||||
|
||||
/* APIs for authentication */
|
||||
void DIR_SetAuthDN (DIR_Server *s, const char *dn);
|
||||
void DIR_SetPassword (DIR_Server *s, const char *password);
|
||||
|
||||
/* APIs for unescaping LDAP special chars */
|
||||
char *DIR_Unescape (const char *src, XP_Bool makeHtml);
|
||||
XP_Bool DIR_IsEscapedAttribute (DIR_Server *s, const char *attrib);
|
||||
|
||||
/* APIs for replication */
|
||||
int DIR_ValidateRootDSE (DIR_Server *s, int32 gen, int32 first, int32 last);
|
||||
|
||||
/* API for building a URL */
|
||||
char *DIR_BuildUrl (DIR_Server *s, const char *dn, XP_Bool forAddToAB);
|
||||
|
||||
/* Flags manipulation */
|
||||
|
||||
#define DIR_AUTO_COMPLETE_ENABLED 0x00000001
|
||||
#define DIR_ENABLE_AUTH 0x00000002
|
||||
#define DIR_SAVE_PASSWORD 0x00000004
|
||||
#define DIR_UTF8_DISABLED 0x00000008 /* not used by the FEs */
|
||||
#define DIR_IS_SECURE 0x00000010
|
||||
#define DIR_SAVE_RESULTS 0x00000020 /* not used by the FEs */
|
||||
#define DIR_EFFICIENT_WILDCARDS 0x00000040 /* not used by the FEs */
|
||||
#define DIR_LDAPV3_SUPPORTED 0x00000080 /* not used by the FEs */
|
||||
#define DIR_LDAPV3_NOT_SUPPORTED 0x00000100 /* not used by the FEs */
|
||||
#define DIR_VIRTUAL_LISTBOX_SUPPORTED 0x00000200 /* not used by the FEs */
|
||||
#define DIR_VIRTUAL_LISTBOX_NOT_SUPPORTED 0x00000400 /* not used by the FEs */
|
||||
|
||||
void DIR_SetAutoCompleteEnabled (XP_List *list, DIR_Server *server, XP_Bool onOrOff);
|
||||
|
||||
XP_Bool DIR_TestFlag (DIR_Server *server, uint32 flag);
|
||||
void DIR_SetFlag (DIR_Server *server, uint32 flag);
|
||||
void DIR_ClearFlag (DIR_Server *server, uint32 flag);
|
||||
void DIR_ForceFlag (DIR_Server *server, uint32 flag, XP_Bool forceOnOrOff);
|
||||
|
||||
char *DIR_ConvertToServerCharSet (DIR_Server *s, char *src, int16 srcCsid);
|
||||
char *DIR_ConvertFromServerCharSet (DIR_Server *s, char *src, int16 dstCsid);
|
||||
|
||||
#ifdef MOZ_LDAP
|
||||
|
||||
/* Does the LDAP client lib work for SSL */
|
||||
#include "ldap.h"
|
||||
int DIR_SetupSecureConnection (LDAP *ld);
|
||||
|
||||
#endif /* MOZ_LDAP */
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
|
||||
#endif /* dirprefs.h */
|
||||
267
mozilla/include/ds.h
Normal file
267
mozilla/include/ds.h
Normal file
@@ -0,0 +1,267 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef __DS_h_
|
||||
#define __DS_h_
|
||||
#ifdef XP_WIN32
|
||||
#include <windows.h>
|
||||
#endif /* XP_WIN32 */
|
||||
|
||||
#ifdef XP_OS2
|
||||
#define INCL_WIN
|
||||
#define INCL_GPI
|
||||
#define TID OS2TID /* global rename in OS2 H's! */
|
||||
#include <os2.h>
|
||||
#undef TID /* and restore */
|
||||
#endif
|
||||
|
||||
#include "xp_mcom.h"
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
/* Typedefs */
|
||||
typedef struct DSArrayStr DSArray;
|
||||
typedef struct DSLinkStr DSLink;
|
||||
typedef struct DSListStr DSList;
|
||||
typedef struct DSArenaStr DSArena;
|
||||
|
||||
#define DS_MIN(a,b) ((a)<(b)?(a):(b))
|
||||
#define DS_MAX(a,b) ((a)>(b)?(a):(b))
|
||||
|
||||
/*
|
||||
** Your basic boolean. Done as an enum to cause compiler warnings when a
|
||||
** boolean procedure doesn't return the right value.
|
||||
** LISA SEZ: Please do not use this; use PRBool instead. Eventually
|
||||
** (as soon as I can "make it so") DSBool is going away in favor of PRBool.
|
||||
*/
|
||||
typedef enum DSBoolEnum {
|
||||
DSTrue = 1,
|
||||
DSFalse = 0
|
||||
} DSBool;
|
||||
|
||||
/*
|
||||
** A status code. Status's are used by procedures that return status
|
||||
** values. Again the motivation is so that a compiler can generate
|
||||
** warnings when return values are wrong. Correct testing of status codes:
|
||||
**
|
||||
** DSStatus rv;
|
||||
** rv = some_function (some_argument);
|
||||
** if (rv != DSSuccess)
|
||||
** do_an_error_thing();
|
||||
**
|
||||
*/
|
||||
typedef enum DSStatusEnum {
|
||||
DSWouldBlock = -2,
|
||||
DSFailure = -1,
|
||||
DSSuccess = 0
|
||||
} DSStatus;
|
||||
|
||||
/*
|
||||
** A comparison code. Used for procedures that return comparision
|
||||
** values. Again the motivation is so that a compiler can generate
|
||||
** warnings when return values are wrong.
|
||||
*/
|
||||
typedef enum DSComparisonEnum {
|
||||
DSLessThan = -1,
|
||||
DSEqual = 0,
|
||||
DSGreaterThan = 1
|
||||
} DSComparison;
|
||||
|
||||
typedef void (*DSElementFreeFunc)(void *e1, DSBool freeit);
|
||||
typedef int (*DSElementCompareFunc)(void *e1, void *e2);
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
/*
|
||||
** Simple variable length array of pointers. The array keeps a NULL
|
||||
** pointer at the end of the array.
|
||||
*/
|
||||
struct DSArrayStr {
|
||||
void **things;
|
||||
DSElementFreeFunc freeElement;
|
||||
};
|
||||
|
||||
extern DSArray *DS_CreateArray(int slots);
|
||||
extern DSStatus DS_GrowArray(DSArray *da, int slots);
|
||||
extern void DS_SetArrayMethods(DSArray *da, DSElementFreeFunc free);
|
||||
extern void DS_DestroyArray(DSArray *da, DSBool freeit);
|
||||
extern void DS_Sort(DSArray *da, DSElementCompareFunc compare);
|
||||
extern int DS_Elements(DSArray *da);
|
||||
extern DSStatus DS_AddElement(DSArray *da, void *element);
|
||||
extern void DS_RemoveElement(DSArray *da, void *element);
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
/*
|
||||
** Circular linked list. Each link contains a pointer to the object that
|
||||
** is actually in the list.
|
||||
*/
|
||||
struct DSLinkStr {
|
||||
DSLink *next;
|
||||
DSLink *prev;
|
||||
void *thing;
|
||||
};
|
||||
|
||||
struct DSListStr {
|
||||
DSLink link;
|
||||
};
|
||||
|
||||
#define DS_InitList(lst) \
|
||||
{ \
|
||||
(lst)->link.next = &(lst)->link; \
|
||||
(lst)->link.prev = &(lst)->link; \
|
||||
(lst)->link.thing = 0; \
|
||||
}
|
||||
|
||||
#define DS_ListEmpty(lst) \
|
||||
((lst)->link.next == &(lst)->link)
|
||||
|
||||
#define DS_ListHead(lst) \
|
||||
((lst)->link.next)
|
||||
|
||||
#define DS_ListTail(lst) \
|
||||
((lst)->link.prev)
|
||||
|
||||
#define DS_ListIterDone(lst,lnk) \
|
||||
((lnk) == &(lst)->link)
|
||||
|
||||
#define DS_AppendLink(lst,lnk) \
|
||||
{ \
|
||||
(lnk)->next = &(lst)->link; \
|
||||
(lnk)->prev = (lst)->link.prev; \
|
||||
(lst)->link.prev->next = (lnk); \
|
||||
(lst)->link.prev = (lnk); \
|
||||
}
|
||||
|
||||
#define DS_InsertLink(lst,lnk) \
|
||||
{ \
|
||||
(lnk)->next = (lst)->link.next; \
|
||||
(lnk)->prev = &(lst)->link; \
|
||||
(lst)->link.next->prev = (lnk); \
|
||||
(lst)->link.next = (lnk); \
|
||||
}
|
||||
|
||||
#define DS_RemoveLink(lnk) \
|
||||
{ \
|
||||
(lnk)->next->prev = (lnk)->prev; \
|
||||
(lnk)->prev->next = (lnk)->next; \
|
||||
(lnk)->next = 0; \
|
||||
(lnk)->prev = 0; \
|
||||
}
|
||||
|
||||
extern DSLink *DS_NewLink(void *thing);
|
||||
extern DSLink *DS_FindLink(DSList *lst, void *thing);
|
||||
extern void DS_DestroyLink(DSLink *lnk, DSBool freeit);
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
/*
|
||||
** Memory manager
|
||||
*/
|
||||
|
||||
/*
|
||||
** at one time XP_Block was a float* to force clients to cast things
|
||||
** before use. Now DSBlock is defined since that will be most convenient
|
||||
** for almost all uses.
|
||||
*/
|
||||
|
||||
typedef unsigned char *DSBlock;
|
||||
/*
|
||||
** Allocate some memory. Always allocates at least one byte of memory.
|
||||
*/
|
||||
extern void *DS_Alloc(size_t bytes);
|
||||
|
||||
/*
|
||||
** Reallocate some memory, growing or shrinking the memory.
|
||||
*/
|
||||
extern void *DS_Realloc(void *oldptr, size_t bytes);
|
||||
|
||||
/*
|
||||
** Allocate and then zero some memory. Always allocates at least one byte
|
||||
** of memory.
|
||||
*/
|
||||
extern void *DS_Zalloc(size_t bytes);
|
||||
|
||||
/*
|
||||
** Allocate a block of memory. Always allocates at least one byte of
|
||||
** memory.
|
||||
*/
|
||||
extern DSBlock DS_AllocBlock(size_t bytes);
|
||||
|
||||
/*
|
||||
** Reallocate a block of memory, growing or shrinking the memory block.
|
||||
*/
|
||||
extern DSBlock DS_ReallocBlock(DSBlock block, size_t newBytes);
|
||||
|
||||
/*
|
||||
** Free a block of memory. Safe to use on null pointers.
|
||||
*/
|
||||
extern void DS_FreeBlock(DSBlock block);
|
||||
|
||||
/*
|
||||
** Free a chunk of memory. Safe to use on null pointers.
|
||||
*/
|
||||
extern void DS_Free(void *ptr);
|
||||
|
||||
/*
|
||||
** Zero and then free a chunk of memory. Safe to use on null pointers.
|
||||
*/
|
||||
extern void DS_Zfree(void *ptr, size_t bytes);
|
||||
|
||||
/*
|
||||
* Low cost Malloc Arenas.
|
||||
*
|
||||
* The chunks are a linked list.
|
||||
* The beginning of each chunk is a pointer to the next chunk.
|
||||
*/
|
||||
struct DSArenaStr {
|
||||
unsigned long chunkSize; /* size of each chunk */
|
||||
unsigned int refCount; /* reference count */
|
||||
void ** firstChunk; /* pointer to first chunk */
|
||||
void ** lastChunk; /* pointer to last chunk */
|
||||
void * pLast; /* last item allocated */
|
||||
void * pCur; /* beginning of free area */
|
||||
void * pCurEnd; /* end of free area in current chunk */
|
||||
};
|
||||
|
||||
/* make a new arena */
|
||||
extern DSArena *
|
||||
DS_NewArena(unsigned long chunkSize);
|
||||
|
||||
/* destroy an arena, and free all memory associated with it */
|
||||
extern void
|
||||
DS_FreeArena(DSArena *arena, DSBool zero);
|
||||
|
||||
/* malloc a chunk of data from the arena */
|
||||
extern void *
|
||||
DS_ArenaAlloc(DSArena *arena, unsigned long size);
|
||||
|
||||
/* malloc a chunk of data from the arena, zero filling it */
|
||||
extern void *
|
||||
DS_ArenaZalloc(DSArena *arena, unsigned long size);
|
||||
|
||||
/* change the size of an object, works best if it was the last object
|
||||
* allocated
|
||||
*/
|
||||
extern void *
|
||||
DS_ArenaGrow(DSArena *arena, void *pOld, unsigned long oldsize,
|
||||
unsigned long newsize);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* __DS_h_ */
|
||||
33
mozilla/include/dserr.h
Normal file
33
mozilla/include/dserr.h
Normal file
@@ -0,0 +1,33 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef __DS_ERR_h_
|
||||
#define __DS_ERR_h_
|
||||
|
||||
#define DS_ERROR_BASE (-0x1000)
|
||||
#define DS_ERROR_LIMIT (DS_ERROR_BASE + 1000)
|
||||
|
||||
#define IS_DS_ERROR(code) \
|
||||
(((code) >= DS_ERROR_BASE) && ((code) < DS_ERROR_LIMIT))
|
||||
|
||||
/*
|
||||
** DS library error codes
|
||||
*/
|
||||
#define DS_ERROR_OUT_OF_MEMORY (DS_ERROR_BASE + 0)
|
||||
|
||||
#endif /* __DS_ERR_h_ */
|
||||
1378
mozilla/include/edt.h
Normal file
1378
mozilla/include/edt.h
Normal file
File diff suppressed because it is too large
Load Diff
653
mozilla/include/edttypes.h
Normal file
653
mozilla/include/edttypes.h
Normal file
@@ -0,0 +1,653 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* File defines external editor types.
|
||||
*
|
||||
* These types are remapped internally to the editor.
|
||||
*/
|
||||
|
||||
#ifndef _edt_types_h_
|
||||
#define _edt_types_h_
|
||||
|
||||
#ifndef EDITOR_TYPES
|
||||
#define ED_Element void
|
||||
#define ED_Buffer void
|
||||
#define ED_TagCursor void
|
||||
#define ED_BitArray void
|
||||
#endif
|
||||
|
||||
#include "xp_core.h"
|
||||
|
||||
/* Number of "Netscape Colors" All are in
|
||||
* Color cube
|
||||
*/
|
||||
#define MAX_NS_COLORS 70
|
||||
|
||||
typedef int32 ED_BufferOffset;
|
||||
|
||||
/*
|
||||
* Handle to Internal structure used for maintaining links.
|
||||
*/
|
||||
typedef struct ED_Link* ED_LinkId;
|
||||
#define ED_LINK_ID_NONE 0
|
||||
|
||||
/* this id is passed to FE_GetImageData.. when it returns, we know to pass
|
||||
* the call to EDT_SetImageData
|
||||
*/
|
||||
#define ED_IMAGE_LOAD_HACK_ID -10
|
||||
|
||||
typedef enum {
|
||||
ED_ELEMENT_NONE, /* Not returned from EDT_GetCurrentElement, needed to have a "not known" value */
|
||||
ED_ELEMENT_SELECTION, /* a selection instead of a single element */
|
||||
ED_ELEMENT_TEXT,
|
||||
ED_ELEMENT_IMAGE,
|
||||
ED_ELEMENT_HRULE,
|
||||
ED_ELEMENT_UNKNOWN_TAG,
|
||||
ED_ELEMENT_TARGET,
|
||||
ED_ELEMENT_TABLE, /* Keep these at the end so we can use type >= ED_ELEMENT_TABLE to test for any of them */
|
||||
ED_ELEMENT_CELL,
|
||||
ED_ELEMENT_ROW, /* May not need these. Currently returning ED_ELEMENT_CELL instead */
|
||||
ED_ELEMENT_COL
|
||||
} ED_ElementType;
|
||||
|
||||
typedef enum {
|
||||
ED_CARET_BEFORE = 0,
|
||||
ED_CARET_AFTER = 1
|
||||
} ED_CaretObjectPosition;
|
||||
|
||||
#define TF_NONE 0
|
||||
#define TF_BOLD 1
|
||||
#define TF_ITALIC 2
|
||||
#define TF_FIXED 4
|
||||
#define TF_SUPER 8
|
||||
#define TF_SUB 0x10
|
||||
#define TF_STRIKEOUT 0x20
|
||||
#define TF_BLINK 0x40
|
||||
#define TF_FONT_COLOR 0x80 /* set if font has color */
|
||||
#define TF_FONT_SIZE 0x100 /* set if font has size */
|
||||
#define TF_HREF 0x200
|
||||
#define TF_SERVER 0x400
|
||||
#define TF_SCRIPT 0x800
|
||||
#define TF_STYLE 0x1000
|
||||
#define TF_UNDERLINE 0x2000
|
||||
#define TF_FONT_FACE 0x4000
|
||||
#define TF_NOBREAK 0x8000
|
||||
#define TF_SPELL 0x10000
|
||||
#define TF_INLINEINPUT 0x20000
|
||||
#define TF_INLINEINPUTTHICK 0x40000
|
||||
#define TF_INLINEINPUTDOTTED 0x80000
|
||||
#define TF_FONT_WEIGHT 0x100000
|
||||
#define TF_FONT_POINT_SIZE 0x200000
|
||||
|
||||
typedef int32 ED_TextFormat; /* Prefered type for the editor text format. */
|
||||
typedef ED_TextFormat ED_ETextFormat; /* Alias for old code. Remove when possible. */
|
||||
|
||||
/* Similar to ED_TextFormat. Used when multiple cells are represented in EDT_TableCellData */
|
||||
|
||||
#define CF_NONE 0
|
||||
#define CF_ALIGN 1
|
||||
#define CF_VALIGN 2
|
||||
#define CF_COLSPAN 4
|
||||
#define CF_ROWSPAN 8
|
||||
#define CF_HEADER 0x10
|
||||
#define CF_NOWRAP 0x20
|
||||
#define CF_WIDTH 0x40
|
||||
#define CF_HEIGHT 0x80
|
||||
#define CF_BACK_COLOR 0x100
|
||||
#define CF_BACK_IMAGE 0x200
|
||||
#define CF_BACK_NOSAVE 0x400
|
||||
#define CF_EXTRA_HTML 0x800
|
||||
|
||||
typedef int32 ED_CellFormat; /* Prefered type for the editor cell format. */
|
||||
|
||||
/*
|
||||
* The names here are confusing, and have a historical basis that is
|
||||
* lost in the mists of time. The trouble is that the "ED_ALIGN_CENTER"
|
||||
* tag is really "abscenter", while the ED_ALIGN_ABSCENTER tag is
|
||||
* really "center". (and the same for the TOP and BOTTOM tags.)
|
||||
*
|
||||
* Someday, if we have a lot of spare time we could switch the names.
|
||||
*/
|
||||
|
||||
/* CLM: Swapped bottom and center tags -- should match latest extensions now?
|
||||
* Note: BASELINE is not written out (this is default display mode)
|
||||
*/
|
||||
typedef enum {
|
||||
ED_ALIGN_DEFAULT = -1,
|
||||
ED_ALIGN_CENTER = 0, /* abscenter */
|
||||
ED_ALIGN_LEFT = 1, /* left */
|
||||
ED_ALIGN_RIGHT = 2, /* right */
|
||||
ED_ALIGN_TOP = 3, /* texttop */
|
||||
ED_ALIGN_BOTTOM = 4, /* absbottom */
|
||||
ED_ALIGN_BASELINE = 5, /* baseline */
|
||||
ED_ALIGN_ABSCENTER = 6, /* center */
|
||||
ED_ALIGN_ABSBOTTOM = 7, /* bottom */
|
||||
ED_ALIGN_ABSTOP = 8 /* top */
|
||||
} ED_Alignment;
|
||||
|
||||
|
||||
/*------------------- TABLE SIZING AND SELECTION --------------------*/
|
||||
|
||||
/* SizeStyle defines */
|
||||
#define ED_SIZE_NONE 0
|
||||
#define ED_SIZE_TOP 0x0001
|
||||
#define ED_SIZE_RIGHT 0x0002
|
||||
#define ED_SIZE_BOTTOM 0x0004
|
||||
#define ED_SIZE_LEFT 0x0008
|
||||
#define ED_SIZE_ADD_ROWS 0x0010
|
||||
#define ED_SIZE_ADD_COLS 0x0020
|
||||
|
||||
/* Hotspot at corners */
|
||||
#define ED_SIZE_TOP_RIGHT (ED_SIZE_TOP | ED_SIZE_RIGHT)
|
||||
#define ED_SIZE_BOTTOM_RIGHT (ED_SIZE_BOTTOM | ED_SIZE_RIGHT)
|
||||
#define ED_SIZE_TOP_LEFT (ED_SIZE_TOP | ED_SIZE_LEFT)
|
||||
#define ED_SIZE_BOTTOM_LEFT (ED_SIZE_BOTTOM | ED_SIZE_LEFT)
|
||||
|
||||
typedef intn ED_SizeStyle;
|
||||
|
||||
typedef enum { /* Return value for EDT_GetTableHitRegion) */
|
||||
ED_HIT_NONE,
|
||||
ED_HIT_SEL_TABLE, /* Upper left corner */
|
||||
ED_HIT_SEL_COL, /* Near top table border */
|
||||
ED_HIT_SEL_ROW, /* Near left table border */
|
||||
ED_HIT_SEL_CELL, /* Near top cell border */
|
||||
ED_HIT_SEL_ALL_CELLS, /* Upper left corner when Ctrl is pressed */
|
||||
ED_HIT_SIZE_TABLE_WIDTH, /* Near right table border */
|
||||
ED_HIT_SIZE_TABLE_HEIGHT, /* Near bottom table border */
|
||||
ED_HIT_SIZE_COL, /* Near right border of a cell and between columns */
|
||||
ED_HIT_SIZE_ROW, /* Near bottom border of a cell and between columns */
|
||||
ED_HIT_ADD_ROWS, /* Lower left corner */
|
||||
ED_HIT_ADD_COLS, /* Lower right corner */
|
||||
ED_HIT_DRAG_TABLE, /* Near bottom border and between rows when table or cell is already selected */
|
||||
ED_HIT_CHANGE_COLSPAN, /* Near Right border of cell having COLSPAN (Not used yet) */
|
||||
ED_HIT_CHANGE_ROWSPAN /* Bottom edge of cell having ROWSPAN (Not used yet) */
|
||||
} ED_HitType;
|
||||
|
||||
typedef enum { /* Return types for EDT_GetTableDragDropRegion */
|
||||
ED_DROP_NONE, /* Don't allow drop - when pasting wouldn't change anything */
|
||||
ED_DROP_NORMAL, /* No special table behavior - do the same as any HTML drop */
|
||||
ED_DROP_INSERT_BEFORE, /* Between columns - near left border of cell when source = column */
|
||||
ED_DROP_INSERT_AFTER, /* Between columns - near right border of cell when source = column */
|
||||
ED_DROP_INSERT_ABOVE, /* Between rows - near top border of cell when source = row */
|
||||
ED_DROP_INSERT_BELOW, /* Between rows - near bottom border of cell when source = row */
|
||||
ED_DROP_REPLACE_CELL, /* Inside cell - when we want to replace cell contents */
|
||||
ED_DROP_APPEND_CONTENTS /* Inside cell - when we append to existing contents */
|
||||
} ED_DropType;
|
||||
|
||||
struct _EDT_DragTableData {
|
||||
ED_HitType iSourceType; /* One of the ED_HIT_SEL_... enums */
|
||||
ED_DropType iDropType; /* One of above enum values */
|
||||
LO_Element *pFirstSelectedCell; /* First cell in source being dragged */
|
||||
LO_Element *pDragOverCell; /* Cell being dragged over */
|
||||
intn iRows; /* Number of rows */
|
||||
intn iColumns; /* and columns in selection */
|
||||
int32 X; /* Location to place highlighting or make caret */
|
||||
int32 Y; /* to show where to drop cells */
|
||||
int32 iWidth;
|
||||
int32 iHeight;
|
||||
};
|
||||
typedef struct _EDT_DragTableData EDT_DragTableData;
|
||||
|
||||
|
||||
typedef enum { /* Return values from EDT_GetMergeCellsType */
|
||||
ED_MERGE_NONE,
|
||||
ED_MERGE_NEXT_CELL,
|
||||
ED_MERGE_SELECTED_CELLS
|
||||
} ED_MergeType;
|
||||
|
||||
/* Used with EDT_ChangeTableSelection to tell if we should move
|
||||
* to next Cell, Row, or Columns along with changing the selected cells
|
||||
*/
|
||||
typedef enum {
|
||||
ED_MOVE_NONE,
|
||||
ED_MOVE_PREV,
|
||||
ED_MOVE_NEXT
|
||||
} ED_MoveSelType;
|
||||
|
||||
/*--------------------------- HREF --------------------------------*/
|
||||
|
||||
struct _EDT_HREFData {
|
||||
char *pURL;
|
||||
char *pExtra;
|
||||
};
|
||||
|
||||
typedef struct _EDT_HREFData EDT_HREFData;
|
||||
|
||||
/*--------------------------- Image --------------------------------*/
|
||||
|
||||
struct _EDT_ImageData {
|
||||
XP_Bool bIsMap;
|
||||
/* char *pUseMap; created with XP_ALLOC() Now in pExtra, hardts */
|
||||
ED_Alignment align;
|
||||
char *pSrc;
|
||||
char *pLowSrc;
|
||||
char *pName;
|
||||
char *pAlt;
|
||||
int32 iWidth;
|
||||
int32 iHeight;
|
||||
XP_Bool bWidthPercent; /* Range: 1 - 100 if TRUE, else = pixels (default) */
|
||||
XP_Bool bHeightPercent;
|
||||
int32 iHSpace;
|
||||
int32 iVSpace;
|
||||
int32 iBorder;
|
||||
/* Added hardts */
|
||||
XP_Bool bNoSave;
|
||||
/* Added by CLM: */
|
||||
int32 iOriginalWidth; /* Width and Height we got on initial loading */
|
||||
int32 iOriginalHeight;
|
||||
EDT_HREFData *pHREFData;
|
||||
char *pExtra;
|
||||
};
|
||||
|
||||
typedef struct _EDT_ImageData EDT_ImageData;
|
||||
|
||||
/*--------------------------- Target --------------------------------*/
|
||||
|
||||
struct _EDT_TargetData {
|
||||
char *pName;
|
||||
char *pExtra;
|
||||
};
|
||||
|
||||
typedef struct _EDT_TargetData EDT_TargetData;
|
||||
|
||||
/*--------------------------- Character --------------------------------*/
|
||||
#define ED_FONT_POINT_SIZE_DEFAULT 0
|
||||
#define ED_FONT_POINT_SIZE_MIN 1
|
||||
#define ED_FONT_POINT_SIZE_MAX 1000
|
||||
|
||||
#define ED_FONT_WEIGHT_MIN 100
|
||||
#define ED_FONT_WEIGHT_NORMAL 400
|
||||
#define ED_FONT_WEIGHT_BOLD 700
|
||||
#define ED_FONT_WEIGHT_MAX 900
|
||||
|
||||
enum {
|
||||
ED_FONT_VARIABLE,
|
||||
ED_FONT_FIXED,
|
||||
ED_FONT_LOCAL
|
||||
};
|
||||
|
||||
struct _EDT_CharacterData {
|
||||
ED_TextFormat mask; /* bits to set or get */
|
||||
ED_TextFormat values; /* values of the bits in the mask */
|
||||
LO_Color *pColor; /* color if mask bit is set */
|
||||
int32 iSize; /* size if mask bit is set */
|
||||
EDT_HREFData *pHREFData; /* href if mask bit is set */
|
||||
ED_LinkId linkId; /* internal use only */
|
||||
char* pFontFace; /* FontFace name */
|
||||
int16 iWeight; /* font weight range = 100-900, 400=Normal, 700=Bold*/
|
||||
int16 iPointSize; /* not sure what default is! Use 0 to mean "default" */
|
||||
};
|
||||
|
||||
typedef struct _EDT_CharacterData EDT_CharacterData;
|
||||
|
||||
/*--------------------------- Horizonal Rule --------------------------------*/
|
||||
|
||||
struct _EDT_HorizRuleData {
|
||||
ED_Alignment align; /* only allows left and right alignment */
|
||||
int32 size; /* value 1 to 100 indicates line thickness */
|
||||
int32 iWidth; /* CM: default = 100% */
|
||||
XP_Bool bWidthPercent; /* Range: 1 - 100 if TRUE(default), else = pixels */
|
||||
XP_Bool bNoShade;
|
||||
char *pExtra;
|
||||
};
|
||||
|
||||
typedef struct _EDT_HorizRuleData EDT_HorizRuleData;
|
||||
|
||||
/*--------------------------- ContainerData --------------------------------*/
|
||||
|
||||
struct _EDT_ContainerData {
|
||||
ED_Alignment align; /* only allows left and right alignment */
|
||||
char *pExtra;
|
||||
};
|
||||
|
||||
typedef struct _EDT_ContainerData EDT_ContainerData;
|
||||
|
||||
/*--------------------------- TableData --------------------------------*/
|
||||
|
||||
struct _EDT_TableData {
|
||||
ED_Alignment align; /* ED_ALIGN_LEFT, ED_ALIGN_ABSCENTER, ED_ALIGN_RIGHT */
|
||||
ED_Alignment malign; /* margin alignment: ED_ALIGN_DEFAULT, ED_ALIGN_LEFT, ED_ALIGN_RIGHT */
|
||||
XP_Bool bUseCols; /* TRUE means COLS= will be output, which speeds up layout in 4.0 */
|
||||
int32 iRows;
|
||||
int32 iColumns;
|
||||
XP_Bool bBorderWidthDefined;
|
||||
int32 iBorderWidth;
|
||||
int32 iCellSpacing;
|
||||
int32 iCellPadding;
|
||||
int32 iInterCellSpace;
|
||||
XP_Bool bWidthDefined;
|
||||
XP_Bool bWidthPercent;
|
||||
int32 iWidth;
|
||||
int32 iWidthPixels;
|
||||
XP_Bool bHeightDefined;
|
||||
XP_Bool bHeightPercent;
|
||||
int32 iHeight;
|
||||
int32 iHeightPixels;
|
||||
LO_Color *pColorBackground; /* null in the default case */
|
||||
char *pBackgroundImage; /* null in the default case */
|
||||
XP_Bool bBackgroundNoSave;
|
||||
char *pExtra;
|
||||
};
|
||||
|
||||
typedef struct _EDT_TableData EDT_TableData;
|
||||
|
||||
/* iTableMode param for SetTableMode() */
|
||||
#define ED_TABLE_PERCENT 0x0001 /* Convert table and all cells to use % of parent width */
|
||||
#define ED_TABLE_PIXELS 0x0002 /* Convert table and all cells to use absolute pixels */
|
||||
#define ED_TABLE_USE_CELL_WIDTH 0x0004 /* Set WIDTH param for all cells (facilitates table resizing) */
|
||||
#define ED_TABLE_NO_CELL_WIDTH 0x0008 /* Remove WIDTH param for all cells */
|
||||
#define ED_TABLE_USE_COLS 0x0010 /* Set COLS param for table (use only 1st row for column widths) */
|
||||
#define ED_TABLE_NO_COLS 0x0020 /* Remove COLS param for table (all cell widths used) */
|
||||
|
||||
/*--------------------------- TableCaptionData --------------------------------*/
|
||||
|
||||
struct _EDT_TableCaptionData {
|
||||
ED_Alignment align;
|
||||
char *pExtra;
|
||||
};
|
||||
|
||||
typedef struct _EDT_TableCaptionData EDT_TableCaptionData;
|
||||
|
||||
/*--------------------------- TableRowData --------------------------------*/
|
||||
|
||||
struct _EDT_TableRowData {
|
||||
ED_Alignment align;
|
||||
ED_Alignment valign;
|
||||
LO_Color *pColorBackground; /* null in the default case */
|
||||
char *pBackgroundImage; /* null in the default case */
|
||||
XP_Bool bBackgroundNoSave;
|
||||
char *pExtra;
|
||||
};
|
||||
|
||||
typedef struct _EDT_TableRowData EDT_TableRowData;
|
||||
|
||||
/*--------------------------- TableCellData --------------------------------*/
|
||||
|
||||
struct _EDT_TableCellData {
|
||||
ED_CellFormat mask; /* bits to tell us what we know for all cells */
|
||||
ED_HitType iSelectionType; /* Either: ED_HIT_SEL_CELL, ED_HIT_SEL_COL, ED_HIT_SEL_ROW, or ED_HIT_NONE */
|
||||
intn iSelectedCount; /* Number of cells selected. Usually >= 1 */
|
||||
ED_Alignment align;
|
||||
ED_Alignment valign;
|
||||
int32 iColSpan;
|
||||
int32 iRowSpan;
|
||||
XP_Bool bHeader; /* TRUE == th, FALSE == td */
|
||||
XP_Bool bNoWrap;
|
||||
int32 X;
|
||||
int32 Y;
|
||||
intn iRow;
|
||||
XP_Bool bWidthDefined;
|
||||
XP_Bool bWidthPercent;
|
||||
int32 iWidth;
|
||||
int32 iWidthPixels;
|
||||
XP_Bool bHeightDefined;
|
||||
XP_Bool bHeightPercent;
|
||||
int32 iHeight;
|
||||
int32 iHeightPixels;
|
||||
LO_Color *pColorBackground; /* null in the default case */
|
||||
char *pBackgroundImage; /* null in the default case */
|
||||
XP_Bool bBackgroundNoSave;
|
||||
char *pExtra;
|
||||
};
|
||||
|
||||
typedef struct _EDT_TableCellData EDT_TableCellData;
|
||||
|
||||
/*--------------------------- LayerData --------------------------------*/
|
||||
|
||||
struct _EDT_LayerData {
|
||||
char *pExtra;
|
||||
};
|
||||
|
||||
typedef struct _EDT_LayerData EDT_LayerData;
|
||||
|
||||
/*--------------------------- DivisionData --------------------------------*/
|
||||
|
||||
struct _EDT_DivisionData {
|
||||
ED_Alignment align;
|
||||
char *pExtra;
|
||||
};
|
||||
|
||||
typedef struct _EDT_DivisionData EDT_DivisionData;
|
||||
|
||||
/*--------------------------- Page Properties --------------------------------*/
|
||||
struct _EDT_MetaData {
|
||||
XP_Bool bHttpEquiv; /* true, http-equiv="fdsfds", false name="fdsfds" */
|
||||
char *pName; /* http-equiv's or name's value */
|
||||
char *pContent;
|
||||
};
|
||||
|
||||
typedef struct _EDT_MetaData EDT_MetaData;
|
||||
|
||||
struct _EDT_PageData {
|
||||
LO_Color *pColorBackground; /* null in the default case */
|
||||
LO_Color *pColorLink;
|
||||
LO_Color *pColorText;
|
||||
LO_Color *pColorFollowedLink;
|
||||
LO_Color *pColorActiveLink;
|
||||
char *pBackgroundImage;
|
||||
XP_Bool bBackgroundNoSave;
|
||||
char *pFontDefURL; /* For Web Fonts. */
|
||||
XP_Bool bFontDefNoSave;
|
||||
char *pTitle;
|
||||
XP_Bool bKeepImagesWithDoc;
|
||||
};
|
||||
|
||||
typedef struct _EDT_PageData EDT_PageData;
|
||||
|
||||
typedef enum {
|
||||
ED_COLOR_BACKGROUND,
|
||||
ED_COLOR_LINK,
|
||||
ED_COLOR_TEXT,
|
||||
ED_COLOR_FOLLOWED_LINK
|
||||
} ED_EColor;
|
||||
|
||||
/*
|
||||
* CLM: Java and PlugIn data structures
|
||||
*/
|
||||
struct _EDT_ParamData {
|
||||
char *pName;
|
||||
char *pValue;
|
||||
};
|
||||
typedef struct _EDT_ParamData EDT_ParamData;
|
||||
|
||||
typedef int32 EDT_ParamID;
|
||||
|
||||
struct _EDT_PlugInData {
|
||||
EDT_ParamID ParamID; /* Identifies which Param list is associated */
|
||||
char *pSrc;
|
||||
XP_Bool bHidden;
|
||||
ED_Alignment align;
|
||||
int32 iWidth;
|
||||
int32 iHeight;
|
||||
XP_Bool bWidthPercent; /* Range: 1 - 100 if TRUE, else = pixels default) */
|
||||
XP_Bool bHeightPercent;
|
||||
XP_Bool bForegroundPalette; /* PC systems only. For controling 256-color palette wars */
|
||||
int32 iHSpace;
|
||||
int32 iVSpace;
|
||||
int32 iBorder;
|
||||
};
|
||||
typedef struct _EDT_PlugInData EDT_PlugInData;
|
||||
|
||||
struct _EDT_JavaData {
|
||||
EDT_ParamID ParamID;
|
||||
char *pCode;
|
||||
char *pCodebase;
|
||||
char *pName;
|
||||
ED_Alignment align;
|
||||
char *pSrc;
|
||||
int32 iWidth;
|
||||
int32 iHeight;
|
||||
XP_Bool bWidthPercent; /* Range: 1 - 100 if TRUE, else = pixels default) */
|
||||
XP_Bool bHeightPercent;
|
||||
int32 iHSpace;
|
||||
int32 iVSpace;
|
||||
int32 iBorder;
|
||||
};
|
||||
typedef struct _EDT_JavaData EDT_JavaData;
|
||||
|
||||
/* CLM: Error codes for file writing
|
||||
* Return 0 if no error
|
||||
*/
|
||||
typedef enum {
|
||||
ED_ERROR_NONE,
|
||||
ED_ERROR_READ_ONLY, /* File is marked read-only */
|
||||
ED_ERROR_BLOCKED, /* Can't write at this time, edit buffer blocked */
|
||||
ED_ERROR_BAD_URL, /* URL was not a "file:" type or no string */
|
||||
ED_ERROR_FILE_OPEN,
|
||||
ED_ERROR_FILE_WRITE,
|
||||
ED_ERROR_CREATE_BAKNAME,
|
||||
ED_ERROR_DELETE_BAKFILE,
|
||||
ED_ERROR_FILE_RENAME_TO_BAK,
|
||||
ED_ERROR_CANCEL,
|
||||
ED_ERROR_FILE_EXISTS, /* We really didn't save -- file existed and no overwrite */
|
||||
ED_ERROR_SRC_NOT_FOUND,
|
||||
ED_ERROR_FILE_READ,
|
||||
|
||||
/* The following are used internally by the editor and will not be passed to the front end. */
|
||||
ED_ERROR_PUBLISHING, /* When netlib encounters an error http or ftp publishing. */
|
||||
ED_ERROR_TAPEFS_COMPLETION /* The tape file system for saving encountered an error when
|
||||
the Complete() method was called. E.g. an error sending a
|
||||
mail message. */
|
||||
} ED_FileError;
|
||||
|
||||
typedef enum {
|
||||
ED_TAG_OK,
|
||||
ED_TAG_UNOPENED,
|
||||
ED_TAG_UNCLOSED,
|
||||
ED_TAG_UNTERMINATED_STRING,
|
||||
ED_TAG_PREMATURE_CLOSE,
|
||||
ED_TAG_TAGNAME_EXPECTED
|
||||
} ED_TagValidateResult;
|
||||
|
||||
typedef enum {
|
||||
ED_LIST_TYPE_DEFAULT,
|
||||
ED_LIST_TYPE_DIGIT,
|
||||
ED_LIST_TYPE_BIG_ROMAN,
|
||||
ED_LIST_TYPE_SMALL_ROMAN,
|
||||
ED_LIST_TYPE_BIG_LETTERS,
|
||||
ED_LIST_TYPE_SMALL_LETTERS,
|
||||
ED_LIST_TYPE_CIRCLE,
|
||||
ED_LIST_TYPE_SQUARE,
|
||||
ED_LIST_TYPE_DISC,
|
||||
ED_LIST_TYPE_CITE /* For Mail Quoting */
|
||||
} ED_ListType;
|
||||
|
||||
|
||||
struct _EDT_ListData {
|
||||
/* This should be TagType, but there are problems with the include file dependencies. */
|
||||
int8 iTagType; /* P_UNUM_LIST, P_NUM_LIST, P_BLOCKQUOTE, */
|
||||
/* P_DIRECTOR, P_MENU, P_DESC_LIST */
|
||||
XP_Bool bCompact;
|
||||
ED_ListType eType;
|
||||
int32 iStart; /* automatically maps, start is one */
|
||||
char *pBaseURL; /* If an ED_LIST_TYPE_CITE, this is the URL from the enclosing <BASE> tag.
|
||||
Don't expose this to users because not actually written out in the HTML. */
|
||||
char *pExtra;
|
||||
};
|
||||
|
||||
typedef struct _EDT_ListData EDT_ListData;
|
||||
|
||||
typedef enum {
|
||||
ED_BREAK_NORMAL, /* just break the line, ignore images */
|
||||
ED_BREAK_LEFT, /* break so it passes the image on the left */
|
||||
ED_BREAK_RIGHT, /* break past the right image */
|
||||
ED_BREAK_BOTH /* break past both images */
|
||||
} ED_BreakType;
|
||||
|
||||
typedef enum {
|
||||
ED_SAVE_OVERWRITE_THIS,
|
||||
ED_SAVE_OVERWRITE_ALL,
|
||||
ED_SAVE_DONT_OVERWRITE_THIS,
|
||||
ED_SAVE_DONT_OVERWRITE_ALL,
|
||||
ED_SAVE_CANCEL
|
||||
} ED_SaveOption;
|
||||
|
||||
/* After saving, what to do with the editor buffer. */
|
||||
typedef enum {
|
||||
ED_FINISHED_GOTO_NEW, /* Point the editor to the location of the
|
||||
newly saved document. */
|
||||
ED_FINISHED_REVERT_BUFFER, /* Revert the buffer to the state before
|
||||
the save operation began. */
|
||||
ED_FINISHED_SAVE_DRAFT, /* Like ED_FINISHED_REVERT_BUFFER, except clears the dirty flag
|
||||
on success. */
|
||||
ED_FINISHED_MAIL_SEND /* If we succeed we're going to throw the buffer
|
||||
away, so don't revert it. If failure, revert the buffer.
|
||||
Used for mail compose, we don't
|
||||
want the editor to start any operation that
|
||||
causes problems when libmsg destroys the editor
|
||||
context. */
|
||||
} ED_SaveFinishedOption;
|
||||
|
||||
|
||||
/* For FE_SaveDialogCreate */
|
||||
typedef enum {
|
||||
ED_SAVE_DLG_SAVE_LOCAL, /* "saving files to local disk" */
|
||||
ED_SAVE_DLG_PUBLISH, /* "uploading files to remote server" */
|
||||
ED_SAVE_DLG_PREPARE_PUBLISH /* "preparing files to publish" */
|
||||
} ED_SaveDialogType;
|
||||
|
||||
typedef int32 EDT_ClipboardResult;
|
||||
#define EDT_COP_OK 0
|
||||
#define EDT_COP_DOCUMENT_BUSY 1
|
||||
#define EDT_COP_SELECTION_EMPTY 2
|
||||
#define EDT_COP_SELECTION_CROSSES_TABLE_DATA_CELL 3
|
||||
/* For the result EDT_COP_CLIPBOARD_BAD the XP code has already
|
||||
* given the user an error dialog. So FE code should not
|
||||
* give an additional error dialog. (Only occurs on
|
||||
* paste and paste-like operations.)
|
||||
*/
|
||||
#define EDT_COP_CLIPBOARD_BAD 4
|
||||
|
||||
|
||||
#ifdef FIND_REPLACE
|
||||
|
||||
#define ED_FIND_FIND_ALL_WORDS 1 /* used to enumerate all words in a */
|
||||
/* buffer */
|
||||
#define ED_FIND_MATCH_CASE 2 /* default is to ignore case */
|
||||
#define ED_FIND_REPLACE 4 /* call back the replace routine */
|
||||
#define ED_FIND_WHOLE_BUFFER 8 /* start search from the top */
|
||||
#define ED_FIND_REVERSE 0x10 /* reverse search from this point */
|
||||
|
||||
typedef intn ED_FindFlags;
|
||||
|
||||
typedef void (*EDT_PFReplaceFunc)( void *pMWContext,
|
||||
char *pFoundWord,
|
||||
char **pReplaceWord );
|
||||
|
||||
struct _EDT_FindAndReplaceData {
|
||||
char* pSearchString;
|
||||
ED_FindFlags fflags;
|
||||
EDT_PFReplaceFunc pfReplace;
|
||||
};
|
||||
|
||||
typedef struct _EDT_FindAndReplaceData EDT_FindAndReplaceData;
|
||||
|
||||
#endif /* FIND_REPLACE */
|
||||
|
||||
/* Callback function for image encoder */
|
||||
|
||||
typedef int32 EDT_ImageEncoderReference;
|
||||
typedef unsigned char EDT_ImageEncoderStatus;
|
||||
#define ED_IMAGE_ENCODER_OK 0
|
||||
#define ED_IMAGE_ENCODER_USER_CANCELED 1
|
||||
#define ED_IMAGE_ENCODER_EXCEPTION 2
|
||||
|
||||
typedef void (*EDT_ImageEncoderCallbackFn)(EDT_ImageEncoderStatus status, void* hook);
|
||||
|
||||
#endif
|
||||
1274
mozilla/include/fe_proto.h
Normal file
1274
mozilla/include/fe_proto.h
Normal file
File diff suppressed because it is too large
Load Diff
133
mozilla/include/fe_rgn.h
Normal file
133
mozilla/include/fe_rgn.h
Normal file
@@ -0,0 +1,133 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
|
||||
/* Region-related definitions and prototypes */
|
||||
|
||||
#ifndef _FE_RGN_H_
|
||||
#define _FE_RGN_H_
|
||||
|
||||
#ifdef LAYERS
|
||||
|
||||
#include "xp_core.h"
|
||||
#include "xp_rect.h"
|
||||
/******************Definitions and Types************/
|
||||
|
||||
/* For Windows only: Should we use the MFC CRgn class for region stuff? */
|
||||
#ifdef XP_WIN
|
||||
#undef FE_RGN_USE_MFC
|
||||
#endif /* XP_WIN */
|
||||
|
||||
#ifdef XP_WIN
|
||||
|
||||
#ifdef FE_RGN_USE_MFC
|
||||
#define FE_GetMDRegion(rgn) ((CRgn *)rgn)
|
||||
#else
|
||||
/*
|
||||
* Note that the resultant CRgn * does not have to be
|
||||
* explicitly deleted. It is considered a temporary object
|
||||
* by the MFC and is deleted the next time we have idle
|
||||
* time in the event loop.
|
||||
*/
|
||||
#define FE_GetMDRegion(rgn) ((HRGN)rgn)
|
||||
#endif /* FE_RGN_USE_MFC */
|
||||
|
||||
#elif defined(XP_UNIX)
|
||||
#define FE_GetMDRegion(rgn) ((Region)rgn)
|
||||
#elif defined(XP_MAC)
|
||||
#define FE_GetMDRegion(rgn) ((RgnHandle)rgn)
|
||||
#else
|
||||
#define FE_GetMDRegion(rgn) (rgn)
|
||||
#endif /* XP_WIN */
|
||||
|
||||
#ifdef XP_WIN
|
||||
#define FE_MAX_REGION_COORDINATE 0x7FFFFFFF
|
||||
#else
|
||||
#define FE_MAX_REGION_COORDINATE 0x7FFF
|
||||
#endif
|
||||
|
||||
/* Setting the clip region to this effectively unsets the clip */
|
||||
#define FE_NULL_REGION NULL
|
||||
|
||||
#define FE_CLEAR_REGION(region) \
|
||||
do {FE_SubtractRegion((region), (region), (region)); } while (0)
|
||||
|
||||
/* Function called by FE_ForEachRectInRegion */
|
||||
typedef void (*FE_RectInRegionFunc)(void *closure, XP_Rect *rect);
|
||||
|
||||
/*******************Prototypes**********************/
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
extern FE_Region FE_CreateRegion(void);
|
||||
|
||||
/* Creates a region from a rectangle. Returns */
|
||||
/* NULL if region can't be created. */
|
||||
extern FE_Region FE_CreateRectRegion(XP_Rect *rect);
|
||||
|
||||
/* Destroys region. */
|
||||
extern void FE_DestroyRegion(FE_Region region);
|
||||
|
||||
/* Makes a copy of a region. If dst is NULL, creates a new region */
|
||||
extern FE_Region FE_CopyRegion(FE_Region src, FE_Region dst);
|
||||
|
||||
/* Set an existing region to a rectangle */
|
||||
extern FE_Region FE_SetRectRegion(FE_Region region, XP_Rect *rect);
|
||||
|
||||
/* dst = src1 intersect sr2 */
|
||||
/* dst can be one of src1 or src2 */
|
||||
extern void FE_IntersectRegion(FE_Region src1, FE_Region src2, FE_Region dst);
|
||||
|
||||
/* dst = src1 union src2 */
|
||||
/* dst can be one of src1 or src2 */
|
||||
extern void FE_UnionRegion(FE_Region src1, FE_Region src2, FE_Region dst);
|
||||
|
||||
/* dst = src1 - src2 */
|
||||
/* dst can be one of src1 or src2 */
|
||||
extern void FE_SubtractRegion(FE_Region src1, FE_Region src2, FE_Region dst);
|
||||
|
||||
/* Returns TRUE if the region contains no pixels */
|
||||
extern XP_Bool FE_IsEmptyRegion(FE_Region region);
|
||||
|
||||
/* Returns the bounding rectangle of the region */
|
||||
extern void FE_GetRegionBoundingBox(FE_Region region, XP_Rect *bbox);
|
||||
|
||||
/* TRUE if rgn1 == rgn2 */
|
||||
extern XP_Bool FE_IsEqualRegion(FE_Region rgn1, FE_Region rgn2);
|
||||
|
||||
/* Moves a region by the specified offsets */
|
||||
extern void FE_OffsetRegion(FE_Region region, int32 xOffset, int32 yOffset);
|
||||
|
||||
/* Is any part of the rectangle in the specified region */
|
||||
extern XP_Bool FE_RectInRegion(FE_Region region, XP_Rect *rect);
|
||||
|
||||
/* For each rectangle that makes up this region, call the func */
|
||||
extern void FE_ForEachRectInRegion(FE_Region region,
|
||||
FE_RectInRegionFunc func,
|
||||
void * closure);
|
||||
|
||||
#ifdef DEBUG
|
||||
extern void FE_HighlightRect(void *context, XP_Rect *rect, int how_much);
|
||||
extern void FE_HighlightRegion(void *context, FE_Region region, int how_much);
|
||||
#endif /* DEBUG */
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* LAYERS */
|
||||
|
||||
#endif /* _FE_RGN_H_ */
|
||||
222
mozilla/include/fullsoft.h
Normal file
222
mozilla/include/fullsoft.h
Normal file
@@ -0,0 +1,222 @@
|
||||
/*--------------------------------------------------------------------
|
||||
* fullsoft.h
|
||||
*
|
||||
* Created: 10/15/97
|
||||
* Author: Matt Kendall
|
||||
*
|
||||
* Copyright (C) 1997-98, Full Circle Software, Inc., All Rights Reserved
|
||||
*
|
||||
* Full Circle "Spiral" Application API Definition
|
||||
* - mkk 1/19/98 renamed from "spiral.h" to "fullsoft.h"
|
||||
*
|
||||
*--------------------------------------------------------------------*/
|
||||
#if !defined(__FULLSOFT_H)
|
||||
#define __FULLSOFT_H
|
||||
|
||||
/* define NO_FC_API to disable all calls to the Full Circle library */
|
||||
/* define FC_TRACE to enable the Full Circle TRACE macro */
|
||||
/* define FC_ASSERT to enable the Full Circle ASSERT macro */
|
||||
/* define FC_TRACE_PARAM to enable the Full Circle TRACE_PARAM macro */
|
||||
/* define FC_ASSERT_PARAM to enable the Full Circle TRACE_PARAM macro */
|
||||
|
||||
#if !defined(FAR)
|
||||
#define FAR
|
||||
#endif /* !FAR */
|
||||
|
||||
#if !defined(FCAPI)
|
||||
#define FCAPI
|
||||
#endif /* defined FCAPI */
|
||||
|
||||
|
||||
typedef const char FAR * FC_KEY ;
|
||||
typedef const char FAR * FC_TRIGGER ;
|
||||
typedef unsigned long FC_DATE ;
|
||||
typedef unsigned long FC_UINT32 ;
|
||||
typedef void FAR * FC_PVOID ;
|
||||
typedef const char FAR * FC_STRING ;
|
||||
typedef void FAR * FC_CONTEXT ;
|
||||
|
||||
#define FC_CONTEXT_NONE ((FC_CONTEXT) -1)
|
||||
|
||||
typedef enum {
|
||||
FC_DATA_TYPE_BINARY,
|
||||
FC_DATA_TYPE_STRING,
|
||||
FC_DATA_TYPE_INTEGER,
|
||||
FC_DATA_TYPE_DATE,
|
||||
FC_DATA_TYPE_COUNTER
|
||||
} FC_DATA_TYPE ;
|
||||
|
||||
typedef enum {
|
||||
FC_ERROR_OK = 0,
|
||||
FC_ERROR_CANT_INITIALIZE,
|
||||
FC_ERROR_NOT_INITIALIZED,
|
||||
FC_ERROR_ALREADY_INITIALIZED,
|
||||
FC_ERROR_FAILED,
|
||||
FC_ERROR_OUT_OF_MEMORY,
|
||||
FC_ERROR_INVALID_PARAMETER
|
||||
} FC_ERROR ;
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/* define NO_FC_API to disable all calls to the Full Circle library */
|
||||
|
||||
#if !defined(NO_FC_API)
|
||||
|
||||
FC_ERROR FCAPI
|
||||
FCInitialize( void ) ;
|
||||
|
||||
FC_ERROR FCAPI
|
||||
FCCreateKey(
|
||||
FC_KEY key,
|
||||
FC_DATA_TYPE type,
|
||||
FC_UINT32 first_count,
|
||||
FC_UINT32 last_count,
|
||||
FC_UINT32 max_element_size) ;
|
||||
|
||||
FC_ERROR FCAPI
|
||||
FCCreatePersistentKey(
|
||||
FC_KEY key,
|
||||
FC_DATA_TYPE type,
|
||||
FC_UINT32 first_count,
|
||||
FC_UINT32 last_count,
|
||||
FC_UINT32 max_element_size) ;
|
||||
|
||||
FC_ERROR FCAPI
|
||||
FCAddDataToKey(
|
||||
FC_KEY key,
|
||||
FC_PVOID buffer,
|
||||
FC_UINT32 data_length) ;
|
||||
|
||||
FC_ERROR FCAPI
|
||||
FCAddIntToKey(
|
||||
FC_KEY key,
|
||||
FC_UINT32 data) ;
|
||||
|
||||
FC_ERROR FCAPI
|
||||
FCAddStringToKey(
|
||||
FC_KEY key,
|
||||
FC_STRING string) ;
|
||||
|
||||
FC_ERROR FCAPI
|
||||
FCAddDateToKey(
|
||||
FC_KEY key,
|
||||
FC_DATE date) ;
|
||||
|
||||
FC_ERROR FCAPI
|
||||
FCSetCounter(
|
||||
FC_KEY key,
|
||||
FC_UINT32 value) ;
|
||||
|
||||
FC_ERROR FCAPI
|
||||
FCIncrementCounter(
|
||||
FC_KEY key,
|
||||
FC_UINT32 value) ;
|
||||
|
||||
FC_ERROR FCAPI
|
||||
FCRegisterMemory(
|
||||
FC_KEY key,
|
||||
FC_DATA_TYPE type,
|
||||
FC_PVOID buffer,
|
||||
FC_UINT32 length,
|
||||
FC_UINT32 dereference_count,
|
||||
FC_CONTEXT context) ;
|
||||
|
||||
FC_ERROR FCAPI
|
||||
FCUnregisterMemory( FC_CONTEXT context ) ;
|
||||
|
||||
FC_ERROR FCAPI
|
||||
FCTrigger( FC_TRIGGER trigger ) ;
|
||||
|
||||
void FCAPI
|
||||
FCTrace(FC_STRING fmt, ... ) ;
|
||||
|
||||
void FCAPI
|
||||
FCAssert() ;
|
||||
|
||||
void FCAPI
|
||||
FCTraceParam(
|
||||
FC_UINT32 track,
|
||||
FC_UINT32 level,
|
||||
FC_STRING fmt,
|
||||
... ) ;
|
||||
|
||||
void FCAPI
|
||||
FCAssertParam(
|
||||
FC_UINT32 track,
|
||||
FC_UINT32 level ) ;
|
||||
|
||||
#if defined(FC_ASSERT)
|
||||
#if defined(ASSERT)
|
||||
#undef ASSERT
|
||||
#endif /* defined ASSERT */
|
||||
#define ASSERT(a) { if( !(a) ) FCAssert() ; }
|
||||
#endif /* FC_ASSERT */
|
||||
|
||||
#if defined(FC_TRACE)
|
||||
#if defined(TRACE)
|
||||
#undef TRACE
|
||||
#endif /* defined TRACE */
|
||||
#define TRACE FCTrace
|
||||
#endif /* FC_TRACE */
|
||||
|
||||
#if defined(FC_ASSERT_PARAM)
|
||||
#if defined(ASSERT_PARAM)
|
||||
#undef ASSERT_PARAM
|
||||
#endif /* defined ASSERT_PARAM */
|
||||
#define ASSERT_PARAM(a,b,c) { if ( !(c) ) FCAssertParam(a,b) ; }
|
||||
#endif /* FC_ASSERT_PARAM */
|
||||
|
||||
#if defined(FC_TRACE_PARAM)
|
||||
#if defined(TRACE_PARAM)
|
||||
#undef TRACE_PARAM
|
||||
#endif /* defined TRACE_PARAM */
|
||||
#define TRACE_PARAM FCTraceParam
|
||||
#endif /* FC_TRACE_PARAM */
|
||||
|
||||
#else /* NO_FC_API */
|
||||
|
||||
#define FCInitialize() FC_ERROR_OK
|
||||
#define FCCreateKey(a,b,c,d,e) FC_ERROR_OK
|
||||
#define FCCreatePersistentKey(a,b,c,d,e) FC_ERROR_OK
|
||||
#define FCAddDataToKey(a,b,c) FC_ERROR_OK
|
||||
#define FCAddIntToKey(a,b) FC_ERROR_OK
|
||||
#define FCAddStringToKey(a,b) FC_ERROR_OK
|
||||
#define FCAddDateToKey(a,b) FC_ERROR_OK
|
||||
#define FCRegisterMemory(a,b,c,d,e,f) FC_ERROR_OK
|
||||
#define FCUnregisterMemory(a) FC_ERROR_OK
|
||||
#define FCTrigger(a) FC_ERROR_OK
|
||||
#define FCSetCounter(a,b) FC_ERROR_OK
|
||||
#define FCIncrementCounter(a,b) FC_ERROR_OK
|
||||
|
||||
#if defined(FC_ASSERT)
|
||||
#define ASSERT(f) ((void)0)
|
||||
#endif /* FC_ASSERT */
|
||||
|
||||
#if defined(FC_TRACE)
|
||||
void FCAPI FCTrace(FC_STRING fmt,...) ;
|
||||
#define TRACE 1 ? (void)0 : FCTrace
|
||||
#endif /* FC_TRACE */
|
||||
|
||||
#if defined(FC_ASSERT_PARAM)
|
||||
#define ASSERT_PARAM(a,b,c) ((void)0)
|
||||
#endif /* FC_ASSERT_PARAM */
|
||||
|
||||
#if defined(FC_TRACE_PARAM)
|
||||
void FCAPI FCTraceParam(
|
||||
FC_UINT32 track,
|
||||
FC_UINT32 level,
|
||||
FC_STRING fmt,
|
||||
... ) ;
|
||||
|
||||
#define TRACE_PARAM 1 ? (void) 0 : FCTraceParam
|
||||
#endif /* FC_TRACE_PARAM */
|
||||
|
||||
#endif /* NO_FC_API */
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __FULLSOFT_H */
|
||||
231
mozilla/include/garray.h
Normal file
231
mozilla/include/garray.h
Normal file
@@ -0,0 +1,231 @@
|
||||
/* -*- Mode: C; tab-width: 8; 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.
|
||||
*/
|
||||
|
||||
|
||||
//
|
||||
// Warning: This is a C++ file.
|
||||
//
|
||||
//
|
||||
// This implements cross platform Growable arrays of Pointers.
|
||||
//
|
||||
#ifndef _GARRAY_H_
|
||||
#define _GARRAY_H_
|
||||
|
||||
//
|
||||
// On Unix (well at least Solaris) we are having troubles with
|
||||
// templates, so hey, we won't use them...djw.
|
||||
//
|
||||
// On Mac we are having troubles as well, so add me to the list.
|
||||
// Now, why even have templates?...jar
|
||||
//
|
||||
#if ! ( defined(XP_WIN16) || defined(XP_UNIX) || defined(XP_MAC) )
|
||||
#define TEMPLATE_SUPPORT 1
|
||||
#endif
|
||||
|
||||
|
||||
class CXP_GrowableArray {
|
||||
protected:
|
||||
void **m_pData;
|
||||
int m_iSize;
|
||||
int m_iAllocSize;
|
||||
|
||||
int NewSize( int iMinSize){
|
||||
int iNewSize = MAX( m_iAllocSize,16) ;
|
||||
while( iNewSize < iMinSize ){
|
||||
iNewSize = iNewSize+iNewSize;
|
||||
}
|
||||
return iNewSize;
|
||||
}
|
||||
|
||||
//
|
||||
// this is the routine that does the actual work. Should be in
|
||||
// its own file.
|
||||
//
|
||||
void GuaranteeSize(int iSize){
|
||||
if(m_iAllocSize <= iSize){
|
||||
int iNewSize = NewSize( iSize );
|
||||
if( m_iAllocSize ){
|
||||
void ** pNewData = new void*[iNewSize];
|
||||
XP_BCOPY( m_pData, pNewData, m_iAllocSize * sizeof(void*) );
|
||||
delete [] m_pData;
|
||||
m_pData = pNewData;
|
||||
}
|
||||
else{
|
||||
m_pData = new void*[iNewSize];
|
||||
}
|
||||
m_iAllocSize = iNewSize;
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
CXP_GrowableArray(int iStartSize=0): m_pData(0),m_iSize(0),m_iAllocSize(0){
|
||||
if( iStartSize ){
|
||||
GuaranteeSize( iStartSize );
|
||||
}
|
||||
};
|
||||
|
||||
~CXP_GrowableArray(){ delete [] m_pData; }
|
||||
|
||||
int Size(){ return m_iSize; }
|
||||
|
||||
void SetSize( int iSize ){
|
||||
GuaranteeSize( iSize );
|
||||
m_iSize = iSize;
|
||||
}
|
||||
|
||||
void* operator[](int nIndex) const { return m_pData[nIndex]; }
|
||||
void*& operator[](int nIndex){ return m_pData[nIndex]; }
|
||||
|
||||
int Add(void* newElement){
|
||||
GuaranteeSize(m_iSize+1);
|
||||
m_pData[m_iSize] = newElement;
|
||||
/* Return index to last item in list */
|
||||
return m_iSize++;
|
||||
}
|
||||
|
||||
int Delete( int nIndex ){
|
||||
if( nIndex < m_iSize )
|
||||
{
|
||||
for( int i = nIndex; i < m_iSize-1; i++ )
|
||||
{
|
||||
/* Suffle remaining pointers down */
|
||||
m_pData[nIndex] = m_pData[nIndex+1];
|
||||
}
|
||||
m_iSize--;
|
||||
}
|
||||
/* Return index to last item in list */
|
||||
return (m_iSize-1);
|
||||
}
|
||||
|
||||
int Delete( void* element ){
|
||||
for( int i = 0; i < m_iSize; i++ )
|
||||
{
|
||||
if( m_pData[i] == element )
|
||||
{
|
||||
return Delete(i);
|
||||
}
|
||||
}
|
||||
return (m_iSize-1);
|
||||
}
|
||||
|
||||
int Find( void* element ){
|
||||
for( int i = 0; i < m_iSize; i++ )
|
||||
{
|
||||
if( m_pData[i] == element )
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void Empty(){
|
||||
m_iSize = 0;
|
||||
}
|
||||
};
|
||||
|
||||
class CXP_PtrStack : public CXP_GrowableArray{
|
||||
public:
|
||||
int m_iTop;
|
||||
CXP_PtrStack(): m_iTop(-1){}
|
||||
Bool IsEmpty(){ return m_iTop == -1; }
|
||||
void Push( void* t ){
|
||||
if( ++m_iTop >= Size() ) {
|
||||
Add( t );
|
||||
}
|
||||
else {
|
||||
(*this)[m_iTop] = t;
|
||||
}
|
||||
}
|
||||
void* Top(){ return (*this)[m_iTop]; }
|
||||
void* Pop(){ return (*this)[m_iTop--];}
|
||||
void Reset(){ m_iTop = -1; }
|
||||
int StackSize() { return m_iTop + 1; }
|
||||
};
|
||||
|
||||
#ifdef TEMPLATE_SUPPORT
|
||||
|
||||
template<class PTRTYPE>
|
||||
class TXP_GrowableArray: public CXP_GrowableArray {
|
||||
public:
|
||||
PTRTYPE operator[](int nIndex) const { return (PTRTYPE)(int32)m_pData[nIndex]; }
|
||||
PTRTYPE& operator[](int nIndex){ return *(PTRTYPE*)&m_pData[nIndex]; }
|
||||
int Add(PTRTYPE newElement){ return CXP_GrowableArray::Add( (void*) newElement ); }
|
||||
};
|
||||
|
||||
#define Declare_GrowableArray(NAME,PTRTYPE) \
|
||||
typedef TXP_GrowableArray<PTRTYPE> TXP_GrowableArray_##NAME;
|
||||
|
||||
#else
|
||||
|
||||
#define Declare_GrowableArray(NAME,PTRTYPE) \
|
||||
class TXP_GrowableArray_##NAME: public CXP_GrowableArray { \
|
||||
public: \
|
||||
PTRTYPE operator[](int nIndex) const { return (PTRTYPE)(int32)m_pData[nIndex]; }\
|
||||
PTRTYPE& operator[](int nIndex){ return *(PTRTYPE*)&m_pData[nIndex]; } \
|
||||
int Add(PTRTYPE newElement){ return CXP_GrowableArray::Add( (void*) newElement ); } \
|
||||
}; \
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
//
|
||||
// PtrStack Imlementation
|
||||
//
|
||||
#ifdef TEMPLATE_SUPPORT
|
||||
template<class PTRTYPE>
|
||||
class TXP_PtrStack : public TXP_GrowableArray<PTRTYPE> {
|
||||
public:
|
||||
int m_iTop;
|
||||
TXP_PtrStack(): m_iTop(-1){}
|
||||
Bool IsEmpty(){ return m_iTop == -1; }
|
||||
void Push( PTRTYPE t ){
|
||||
if( ++m_iTop >= Size() ) {
|
||||
Add( t );
|
||||
}
|
||||
else {
|
||||
(*this)[m_iTop] = t;
|
||||
}
|
||||
}
|
||||
PTRTYPE Top(){ return (*this)[m_iTop]; }
|
||||
PTRTYPE Pop(){ return (*this)[m_iTop--];}
|
||||
void Reset(){ m_iTop = -1; }
|
||||
int StackSize(){ return m_iTop + 1; }
|
||||
};
|
||||
|
||||
#define Declare_PtrStack(NAME,PTRTYPE) \
|
||||
typedef TXP_PtrStack<PTRTYPE> TXP_PtrStack_##NAME;
|
||||
|
||||
#else // No template support
|
||||
|
||||
#define Declare_PtrStack(NAME, PTRTYPE) \
|
||||
class TXP_PtrStack_##NAME : public CXP_PtrStack { \
|
||||
public: \
|
||||
void Push( PTRTYPE t ){ CXP_PtrStack::Push((void*)(int32)t); } \
|
||||
PTRTYPE Top(){ return (PTRTYPE)(int32)CXP_PtrStack::Top(); } \
|
||||
PTRTYPE Pop(){ return (PTRTYPE)(int32)CXP_PtrStack::Pop(); } \
|
||||
PTRTYPE operator[](int nIndex) const { return (PTRTYPE)(int32)m_pData[nIndex]; }\
|
||||
PTRTYPE& operator[](int nIndex){ return *(PTRTYPE*)&m_pData[nIndex]; } \
|
||||
int Add(PTRTYPE newElement){ return CXP_GrowableArray::Add( (void*)(int32)newElement ); } \
|
||||
}; \
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
188
mozilla/include/glhist.h
Normal file
188
mozilla/include/glhist.h
Normal file
@@ -0,0 +1,188 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef GLHIST_H
|
||||
#define GLHIST_H
|
||||
|
||||
#include "ntypes.h"
|
||||
|
||||
typedef enum gh_SortColumn
|
||||
{
|
||||
eGH_NoSort = -1,
|
||||
eGH_NameSort,
|
||||
eGH_LocationSort,
|
||||
eGH_FirstDateSort,
|
||||
eGH_LastDateSort,
|
||||
eGH_VisitCountSort
|
||||
}gh_SortColumn;
|
||||
|
||||
typedef struct _gh_HistEntry
|
||||
{
|
||||
char * address;
|
||||
time_t last_accessed;
|
||||
time_t first_accessed;
|
||||
int32 iCount;
|
||||
int32 iFlags;
|
||||
char * pszName;
|
||||
}gh_HistEntry;
|
||||
|
||||
typedef struct _gh_HistEntryData
|
||||
{
|
||||
time_t last_accessed;
|
||||
time_t first_accessed;
|
||||
int32 iCount;
|
||||
int32 iFlags;
|
||||
char * pszName;
|
||||
}gh_HistEntryData;
|
||||
|
||||
typedef enum gh_FilterOp
|
||||
{
|
||||
eGH_FOEquals,
|
||||
eGH_FOEqualsNot,
|
||||
|
||||
eGH_FOGreater,
|
||||
eGH_FOGreaterEqual,
|
||||
eGH_FOLess,
|
||||
eGH_FOLessEqual,
|
||||
|
||||
eGH_FOHas,
|
||||
eGH_FOHasNot
|
||||
}gh_FilterOp;
|
||||
|
||||
typedef enum gh_FilterLogOp
|
||||
{
|
||||
eGH_FLOAnd,
|
||||
eGH_FLOOr
|
||||
}gh_FilterLogOp;
|
||||
|
||||
typedef struct _gh_FilterCondition
|
||||
{
|
||||
enum gh_SortColumn enCol;
|
||||
enum gh_FilterOp enOp;
|
||||
|
||||
union
|
||||
{
|
||||
char * pszTest;
|
||||
int32 iTest;
|
||||
} tests;
|
||||
}gh_FilterCondition;
|
||||
|
||||
typedef struct _gh_Filter
|
||||
{
|
||||
int32 iNumConditions;
|
||||
gh_FilterCondition * pConditions;
|
||||
gh_FilterLogOp * enOps;
|
||||
}gh_Filter;
|
||||
|
||||
typedef struct _gh_NotifyMsg
|
||||
{
|
||||
int32 iNotifyMsg;
|
||||
char * pszKey;
|
||||
void * pUserData;
|
||||
} gh_NotifyMsg;
|
||||
|
||||
typedef void * GHHANDLE;
|
||||
typedef void * GHURHANDLE;
|
||||
|
||||
#define GH_NOTIFY_UPDATE 1
|
||||
#define GH_NOTIFY_DELETE 2
|
||||
|
||||
#ifdef XP_WIN
|
||||
typedef int (__cdecl *GHISTORY_NOTIFYPROC)( gh_NotifyMsg *pMsg );
|
||||
#else
|
||||
typedef int (*GHISTORY_NOTIFYPROC)( gh_NotifyMsg *pMsg );
|
||||
#endif
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
/* if the url was found in the global history then the then number of seconds since
|
||||
* the last access is returned. if the url is not found -1 is returned
|
||||
*/
|
||||
extern int GH_CheckGlobalHistory(char * url);
|
||||
|
||||
/* add or update the url in the global history
|
||||
*/
|
||||
extern void GH_UpdateGlobalHistory(URL_Struct * URL_s);
|
||||
|
||||
/* save the global history to a file and remove the list from memory
|
||||
*/
|
||||
/*extern void GH_CleanupGlobalHistory(void);*/
|
||||
|
||||
/* save the global history to a file and remove the list from memory
|
||||
*/
|
||||
extern void GH_SaveGlobalHistory(void);
|
||||
|
||||
/* free the global history list
|
||||
*/
|
||||
extern void GH_FreeGlobalHistory(void);
|
||||
|
||||
/* clear the entire global history list
|
||||
*/
|
||||
extern void GH_ClearGlobalHistory(void);
|
||||
|
||||
#if defined(XP_MAC) || defined(XP_UNIX)
|
||||
/* set the maximum time for an object in the Global history in
|
||||
* number of seconds
|
||||
*/
|
||||
extern void GH_SetGlobalHistoryTimeout(int32 timeout_interval);
|
||||
#endif
|
||||
|
||||
/* start global history tracking
|
||||
*/
|
||||
extern void GH_InitGlobalHistory(void);
|
||||
|
||||
/* create an HTML stream and push a bunch of HTML about
|
||||
* the global history
|
||||
*
|
||||
* returns -1
|
||||
*/
|
||||
extern int NET_DisplayGlobalHistoryInfoAsHTML( MWContext *context, URL_Struct *URL_s, int format_out );
|
||||
|
||||
/*
|
||||
// Context/Handle based functions to retrieve a pseudo cursor on the
|
||||
// Global History list (using a specified sort/index).
|
||||
*/
|
||||
extern GHHANDLE GH_GetContext( enum gh_SortColumn enGHSort,
|
||||
gh_Filter * pFilter,
|
||||
GHISTORY_NOTIFYPROC pfNotifyProc,
|
||||
GHURHANDLE hUR,
|
||||
void * pUserData );
|
||||
extern void GH_ReleaseContext( GHHANDLE pContext, Bool bReleaseUR );
|
||||
extern gh_HistEntry * GH_GetRecord( GHHANDLE pContext, uint32 uRow );
|
||||
extern void GH_DeleteRecord( GHHANDLE pContext, uint32 uRow, Bool bGroup );
|
||||
extern uint32 GH_GetNumRecords( GHHANDLE pContext );
|
||||
extern gh_SortColumn GH_GetSortField( GHHANDLE pContext );
|
||||
extern int GH_UpdateURLTitle( URL_Struct *pUrl, char *pszTitle, Bool bFrameCell );
|
||||
extern int32 GH_GetRecordNum( GHHANDLE pContext, char *pszLocation );
|
||||
extern int GH_GetMRUPage( char *pszURL, int iMaxLen );
|
||||
extern void GH_FileSaveAsHTML( GHHANDLE pContext, MWContext *pMWContext );
|
||||
extern GHURHANDLE GH_GetURContext( GHHANDLE pContext );
|
||||
extern void GH_SupportUndoRedo( GHHANDLE pContext );
|
||||
extern void GH_Undo( GHHANDLE pContext );
|
||||
extern void GH_Redo( GHHANDLE pContext );
|
||||
extern Bool GH_CanUndo( GHHANDLE pContext );
|
||||
extern Bool GH_CanRedo( GHHANDLE pContext );
|
||||
|
||||
/* AutoComplete stuff */
|
||||
enum autoCompStatus {foundDone, notFoundDone, stillSearching, dontCallOnIdle};
|
||||
extern enum autoCompStatus urlMatch(const char *criteria, char **result, Bool freshStart, Bool scroll);
|
||||
extern void NET_RegisterEnableUrlMatchCallback(void);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* GLHIST_H */
|
||||
64
mozilla/include/gui.h
Normal file
64
mozilla/include/gui.h
Normal file
@@ -0,0 +1,64 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef _GUI_H_
|
||||
#define _GUI_H_
|
||||
|
||||
/* These are defined in libnet/mkhttp.c.
|
||||
|
||||
XP_AppName The name of the client program - usually "Netscape", but
|
||||
possibly something else for bundled versions, like the
|
||||
MCI client.
|
||||
|
||||
XP_AppCodeName The name sent at the HTTP vendor ID string; regardless of
|
||||
the value of XP_AppName, this must be "Mozilla" or
|
||||
everything will break.
|
||||
|
||||
XP_AppVersion The version number of the client as a string. This is the
|
||||
string sent along with the vendor ID string, so it should be
|
||||
of the form "1.1N (Windows)" or "1.1N (X11; SunOS 4.1.3)".
|
||||
|
||||
XP_AppLanguage The language of the navigator client. Usually a two-letter
|
||||
code (EN, FR) but could be a 5-letter code for translations
|
||||
where a sub-language designation is appropriate (FR_CA)
|
||||
|
||||
XP_AppPlatform The compiled flavor of the navigator (as opposed to what
|
||||
it may actually be running on).
|
||||
*/
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
#if defined(XP_WIN) || defined(XP_OS2)
|
||||
extern char *XP_AppName, *XP_AppCodeName, *XP_AppVersion;
|
||||
extern char *XP_AppLanguage, *XP_AppPlatform;
|
||||
#else
|
||||
extern const char *XP_AppName, *XP_AppCodeName, *XP_AppVersion;
|
||||
extern const char *XP_AppLanguage, *XP_AppPlatform;
|
||||
#endif
|
||||
XP_END_PROTOS
|
||||
|
||||
/* this define is needed for error message efficiency
|
||||
*
|
||||
* please don't comment it out for UNIX - LJM
|
||||
*/
|
||||
/* this is constant across languages - do NOT localize it */
|
||||
#define XP_CANONICAL_CLIENT_NAME "Netscape"
|
||||
|
||||
/* name of the program */
|
||||
/* XP_LOCAL_CLIENT_NAME was never used consistently: use XP_AppName instead. */
|
||||
|
||||
#endif /* _GUI_H_ */
|
||||
250
mozilla/include/hotlist.h
Normal file
250
mozilla/include/hotlist.h
Normal file
@@ -0,0 +1,250 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef HOTLIST_H
|
||||
#define HOTLIST_H
|
||||
|
||||
#include "xp_mcom.h"
|
||||
#include "ntypes.h"
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
typedef enum HOT_Type {
|
||||
HOT_URLType, HOT_HeaderType, HOT_SeparatorType } HOT_Type;
|
||||
|
||||
typedef struct HotlistStruct_ {
|
||||
HOT_Type type;
|
||||
Bool is_folded; /* if it's a header is it folded? */
|
||||
XP_List *children; /* a list of children, only headers have these */
|
||||
char *name; /* a title */
|
||||
char *address; /* the URL address */
|
||||
char *description; /* random text */
|
||||
time_t last_visit;
|
||||
time_t addition_date;
|
||||
char *content_type;
|
||||
struct HotlistStruct_ *parent; /* My hotlist parent */
|
||||
XP_List *lParent; /* The XP_List object that points to my parent or NULL */
|
||||
} HotlistStruct;
|
||||
|
||||
/* tell the hotlist code that the hotlist has been modified
|
||||
* so that it gets saved the next time SaveHotlist is called
|
||||
*/
|
||||
extern void HOT_SetModified(void);
|
||||
|
||||
/* changes a entry to a header type from a non header type
|
||||
* and vice versa. If the object was a header and
|
||||
* has children, the children will be blown away. (very bad)
|
||||
*/
|
||||
extern void HOT_ChangeEntryType(HotlistStruct * entry, HOT_Type new_type);
|
||||
|
||||
/* Fold or unfold a hotlist header
|
||||
*
|
||||
* set the Boolean to True to fold the list and
|
||||
* False to unfold
|
||||
*/
|
||||
extern void HOT_FoldHeader(HotlistStruct * item, Bool fold);
|
||||
|
||||
/* checks the hotlist for a url and updates the last accessed
|
||||
* time
|
||||
*/
|
||||
extern void HOT_UpdateHotlistTime(URL_Struct *URL_s, time_t cur_time);
|
||||
|
||||
/* Performs regular expression match on hotlist name and address
|
||||
* fields. Returns the found object, or NULL if not
|
||||
* found.
|
||||
*
|
||||
* start_obj specifies the object to start searching
|
||||
* on. The start_num object WILL NOT be searched but all those
|
||||
* after it will be.
|
||||
* To search the whole list give NULL as start_obj.
|
||||
*
|
||||
* If headers became unfolded because of the search then redisplay_all
|
||||
* will be set to TRUE
|
||||
*/
|
||||
extern HotlistStruct * HOT_SearchHotlist(char * search_string,
|
||||
HotlistStruct * start_obj,
|
||||
Bool * redisplay_all);
|
||||
|
||||
/* returns TRUE if the second argument is a direct
|
||||
* descendent of the first argument.
|
||||
*
|
||||
* returns FALSE otherwise
|
||||
*/
|
||||
extern Bool HOT_IsDescendent(HotlistStruct *parent, HotlistStruct *possible_child);
|
||||
|
||||
|
||||
/* Reads the hostlist from disk, what else?
|
||||
*
|
||||
* pass in the hotlist filename and a relative URL which represents
|
||||
* the original location of the html file. If you are reading the
|
||||
* default hotlist you should pass in a file URL of the form
|
||||
* file://localhost/PATH
|
||||
*
|
||||
*/
|
||||
extern void HOT_ReadHotlistFromDisk (char * filename, char * relative_url);
|
||||
|
||||
/* returns an integer index of the item in the list
|
||||
*/
|
||||
extern int HOT_GetIndex(HotlistStruct * item);
|
||||
|
||||
/* returns an integer index of the item in the list
|
||||
* and does not pay attention to the is_folded value
|
||||
*/
|
||||
extern int HOT_GetUnfoldedIndex(HotlistStruct * item);
|
||||
|
||||
/* returns the object associated with the index returned by
|
||||
* HOT_GetIndex()
|
||||
*/
|
||||
extern HotlistStruct * HOT_IndexOf(int index);
|
||||
|
||||
/* returns the object associated with the index returned by
|
||||
* HOT_GetUnfoldedIndex()
|
||||
*/
|
||||
extern HotlistStruct * HOT_UnfoldedIndexOf(int index);
|
||||
|
||||
/* returns an integer depth of the item in the list starting at zero
|
||||
*/
|
||||
extern int HOT_GetDepth(HotlistStruct * item);
|
||||
|
||||
/* return a pointer to the main hotlist list
|
||||
*
|
||||
* returns NULL if nothing has ever been
|
||||
* added to the hotlist
|
||||
*/
|
||||
extern XP_List * HOT_GetHotlistList(void);
|
||||
|
||||
/* saves the hotlist to a configuration file
|
||||
*/
|
||||
extern int HOT_SaveHotlist (char * filename);
|
||||
|
||||
/* Free's the entire hotlist
|
||||
*/
|
||||
extern void HOT_FreeHotlist (void);
|
||||
|
||||
|
||||
/* create a hotlist entry struct and fill it in with
|
||||
* the passed in data
|
||||
*
|
||||
* returns NULL on out of memory error.
|
||||
*/
|
||||
extern HotlistStruct *
|
||||
HOT_CreateEntry(HOT_Type type,
|
||||
const char *name,
|
||||
const char *address,
|
||||
const char *content_type,
|
||||
time_t last_visit);
|
||||
|
||||
/* free's a hotlist entry
|
||||
*/
|
||||
extern void HOT_FreeEntry(HotlistStruct * entry);
|
||||
|
||||
/* create a completely new copy of the entry passed in
|
||||
*/
|
||||
extern HotlistStruct * HOT_CopyEntry(HotlistStruct * entry);
|
||||
|
||||
/* insert an item before another item in the hotlist
|
||||
*
|
||||
* if the insert_before item is NULL or not found the item
|
||||
* will be inserted at the begining of the list
|
||||
*/
|
||||
extern void HOT_InsertItemBefore(HotlistStruct * insert_before, HotlistStruct * insertee);
|
||||
|
||||
/* insert an item after another item in the hotlist
|
||||
*
|
||||
* if the insert_after item is NULL or not found the item
|
||||
* will be inserted at the end of the list
|
||||
*/
|
||||
extern void HOT_InsertItemAfter(HotlistStruct * insert_after, HotlistStruct * insertee);
|
||||
|
||||
/* insert an item in a header if "insert_after" is a
|
||||
* Header type, or after the item if "insert after" is
|
||||
* not a header type.
|
||||
*
|
||||
* if the insert_after item is NULL or not found the item
|
||||
* will be inserted at the end of the hotlist
|
||||
*/
|
||||
extern void
|
||||
HOT_InsertItemInHeaderOrAfterItem(HotlistStruct * insert_after,
|
||||
HotlistStruct * insertee);
|
||||
|
||||
/* remove an item from the hotlist and free's it
|
||||
*
|
||||
* returns TRUE on success, FALSE if not found
|
||||
*/
|
||||
extern Bool HOT_RemoveItem(HotlistStruct * old_item);
|
||||
|
||||
/* remove an item from the hotlist and doesn't free it
|
||||
*
|
||||
* returns TRUE on success, FALSE if not found
|
||||
*/
|
||||
extern Bool HOT_RemoveItemFromList(HotlistStruct * old_item);
|
||||
|
||||
/* move an item up in the list
|
||||
*/
|
||||
extern void HOT_MoveObjectUp(HotlistStruct * item);
|
||||
|
||||
/* move an item down in the list
|
||||
*/
|
||||
extern void HOT_MoveObjectDown(HotlistStruct * item);
|
||||
|
||||
/* returns True if the object can be moved Up
|
||||
* False if the object cannot be moved Up or if
|
||||
* it cannot be found in the list
|
||||
*/
|
||||
extern Bool HOT_ObjectCanGoUp(HotlistStruct * item);
|
||||
|
||||
/* returns True if the object can be moved down
|
||||
* False if the object cannot be moved down or if
|
||||
* it cannot be found in the list
|
||||
*/
|
||||
extern Bool HOT_ObjectCanGoDown(HotlistStruct * item);
|
||||
|
||||
/* Whether the file will be written when Save is called. */
|
||||
extern Bool HOT_Modified(void);
|
||||
|
||||
/*
|
||||
* Gets the top node of the hotlist
|
||||
*/
|
||||
extern HotlistStruct*
|
||||
HOT_GetHotlist (void);
|
||||
|
||||
|
||||
/*
|
||||
* Convert a number of selections in a hotlist list into a block of
|
||||
* memory that the user can use for cut and paste operations
|
||||
*/
|
||||
extern char *
|
||||
HOT_ConvertSelectionsToBlock(HotlistStruct ** list,
|
||||
int iCount,
|
||||
int bLongFormat,
|
||||
int32 * lTotalLen);
|
||||
/*
|
||||
* Take a block of memory and insert the hotlist items it represents into
|
||||
* the current hotlist
|
||||
*/
|
||||
extern void
|
||||
HOT_InsertBlockAt(char * pOriginalBlock,
|
||||
HotlistStruct * item,
|
||||
int bLongFormat,
|
||||
int32 lTotalLen);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* HOTLIST_H */
|
||||
|
||||
|
||||
480
mozilla/include/imap.h
Normal file
480
mozilla/include/imap.h
Normal file
@@ -0,0 +1,480 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
#ifndef __imap__
|
||||
#define __imap__
|
||||
|
||||
#include "structs.h"
|
||||
#include "msgcom.h"
|
||||
|
||||
|
||||
/* used for communication between libmsg and libnet */
|
||||
#define kNoFlags 0x00 /* RFC flags */
|
||||
#define kMarked 0x01
|
||||
#define kUnmarked 0x02
|
||||
#define kNoinferiors 0x04
|
||||
#define kNoselect 0x08
|
||||
#define kImapTrash 0x10 /* Navigator flag */
|
||||
#define kJustExpunged 0x20 /* This update is a post expunge url update. */
|
||||
#define kPersonalMailbox 0x40 /* this mailbox is in the personal namespace */
|
||||
#define kPublicMailbox 0x80 /* this mailbox is in the public namespace */
|
||||
#define kOtherUsersMailbox 0x100 /* this mailbox is in the other users' namespace */
|
||||
|
||||
/* flags for individual messages */
|
||||
/* currently the ui only offers \Seen and \Flagged */
|
||||
#define kNoImapMsgFlag 0x0000
|
||||
#define kImapMsgSeenFlag 0x0001
|
||||
#define kImapMsgAnsweredFlag 0x0002
|
||||
#define kImapMsgFlaggedFlag 0x0004
|
||||
#define kImapMsgDeletedFlag 0x0008
|
||||
#define kImapMsgDraftFlag 0x0010
|
||||
#define kImapMsgRecentFlag 0x0020
|
||||
#define kImapMsgForwardedFlag 0x0040 /* Not always supported, check mailbox folder */
|
||||
#define kImapMsgMDNSentFlag 0x0080 /* Not always supported. check mailbox folder */
|
||||
|
||||
#define kImapMsgSupportUserFlag 0x8000 /* This seems to be the most cost effective way of
|
||||
* piggying back the server support user flag
|
||||
* info.
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
kPersonalNamespace = 0,
|
||||
kOtherUsersNamespace,
|
||||
kPublicNamespace,
|
||||
kDefaultNamespace,
|
||||
kUnknownNamespace
|
||||
} EIMAPNamespaceType;
|
||||
|
||||
|
||||
typedef int32 imap_uid;
|
||||
|
||||
#ifdef XP_CPLUSPLUS
|
||||
class TImapFlagAndUidState;
|
||||
#else
|
||||
typedef struct TImapFlagAndUidState TImapFlagAndUidState;
|
||||
#endif
|
||||
|
||||
/* forward declaration */
|
||||
typedef void ImapActiveEntry;
|
||||
|
||||
/* url used to signify that filtering is complete so
|
||||
we can tell the fe that the inbox thread pane is
|
||||
loaded */
|
||||
#define kImapFilteringCompleteURL "Mailbox://?filteringcomplete"
|
||||
|
||||
/* url used to signify that online/offline synch is complete */
|
||||
#define kImapOnOffSynchCompleteURL "Mailbox://?onoffsynchcomplete"
|
||||
|
||||
/* if a url creator does not know the hierarchySeparator, use this */
|
||||
#define kOnlineHierarchySeparatorUnknown ' '
|
||||
|
||||
struct mailbox_spec {
|
||||
int32 folder_UIDVALIDITY;
|
||||
int32 number_of_messages;
|
||||
int32 number_of_unseen_messages;
|
||||
int32 number_of_recent_messages;
|
||||
|
||||
uint32 box_flags;
|
||||
|
||||
char *allocatedPathName;
|
||||
char hierarchySeparator;
|
||||
const char *hostName;
|
||||
|
||||
TNavigatorImapConnection *connection;
|
||||
TImapFlagAndUidState *flagState;
|
||||
|
||||
XP_Bool folderSelected;
|
||||
XP_Bool discoveredFromLsub;
|
||||
|
||||
const char *smtpPostAddress;
|
||||
};
|
||||
|
||||
typedef struct mailbox_spec mailbox_spec;
|
||||
|
||||
|
||||
enum EIMAPSubscriptionUpgradeState {
|
||||
kEverythingDone,
|
||||
kBringUpSubscribeUI
|
||||
};
|
||||
|
||||
enum ImapOnlineCopyState {
|
||||
kInProgress,
|
||||
kSuccessfulCopy,
|
||||
kFailedCopy,
|
||||
kSuccessfulDelete,
|
||||
kFailedDelete,
|
||||
kReadyForAppendData,
|
||||
kFailedAppend
|
||||
};
|
||||
|
||||
struct folder_rename_struct {
|
||||
char *fOldName;
|
||||
char *fNewName;
|
||||
};
|
||||
|
||||
|
||||
typedef struct folder_rename_struct folder_rename_struct;
|
||||
|
||||
|
||||
/* this file defines the syntax of the imap4 url's and offers functions
|
||||
that create url strings. If the functions do not offer enough
|
||||
functionality then let kevin know before you starting creating strings
|
||||
from scratch. */
|
||||
#include "xp_mcom.h"
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
/* need mailbox status urls to get the number of message and the
|
||||
number of unread messages */
|
||||
|
||||
/* Selecting a mailbox */
|
||||
/* imap4://HOST?select?MAILBOXPATH */
|
||||
char *CreateImapMailboxSelectUrl(const char *imapHost,
|
||||
const char *mailbox,
|
||||
char hierarchySeparator,
|
||||
const char *undoDeleteIdentifierList);
|
||||
|
||||
/* lite select, used to verify UIDVALIDITY while going on/offline */
|
||||
char *CreateImapMailboxLITESelectUrl(const char *imapHost,
|
||||
const char *mailbox,
|
||||
char hierarchySeparator);
|
||||
|
||||
/* expunge, used in traditional imap delete model */
|
||||
char *CreateImapMailboxExpungeUrl(const char *imapHost,
|
||||
const char *mailbox,
|
||||
char hierarchySeparator);
|
||||
|
||||
/* Creating a mailbox */
|
||||
/* imap4://HOST?create?MAILBOXPATH */
|
||||
char *CreateImapMailboxCreateUrl(const char *imapHost, const char *mailbox, char hierarchySeparator);
|
||||
|
||||
/* discover the children of this mailbox */
|
||||
char *CreateImapChildDiscoveryUrl(const char *imapHost, const char *mailbox, char hierarchySeparator);
|
||||
|
||||
/* discover the n-th level children of this mailbox */
|
||||
char *CreateImapLevelChildDiscoveryUrl(const char *imapHost, const char *mailbox, char hierarchySeparator, int n);
|
||||
|
||||
/* discover the mailboxes of this account */
|
||||
char *CreateImapAllMailboxDiscoveryUrl(const char *imapHost);
|
||||
|
||||
/* discover the mailboxes of this account, and the subscribed mailboxes */
|
||||
char *CreateImapAllAndSubscribedMailboxDiscoveryUrl(const char *imapHost);
|
||||
|
||||
/* deleting a mailbox */
|
||||
/* imap4://HOST?delete?MAILBOXPATH */
|
||||
char *CreateImapMailboxDeleteUrl(const char *imapHost, const char *mailbox, char hierarchySeparator);
|
||||
|
||||
/* renaming a mailbox */
|
||||
/* imap4://HOST?rename?OLDNAME?NEWNAME */
|
||||
char *CreateImapMailboxRenameLeafUrl(const char *imapHost,
|
||||
const char *oldBoxPathName,
|
||||
char hierarchySeparator,
|
||||
const char *newBoxLeafName);
|
||||
|
||||
/* renaming a mailbox, moving hierarchy */
|
||||
/* imap4://HOST?movefolderhierarchy?OLDNAME?NEWNAME */
|
||||
/* oldBoxPathName is the old name of the child folder */
|
||||
/* destinationBoxPathName is the name of the new parent */
|
||||
char *CreateImapMailboxMoveFolderHierarchyUrl(const char *imapHost,
|
||||
const char *oldBoxPathName,
|
||||
char oldHierarchySeparator,
|
||||
const char *destinationBoxPathName,
|
||||
char newHierarchySeparator);
|
||||
|
||||
/* listing available mailboxes */
|
||||
/* imap4://HOST?list */
|
||||
char *CreateImapListUrl(const char *imapHost,
|
||||
const char *mailbox,
|
||||
const char hierarchySeparator);
|
||||
|
||||
/* biff */
|
||||
char *CreateImapBiffUrl(const char *imapHost,
|
||||
const char *mailbox,
|
||||
char hierarchySeparator,
|
||||
uint32 uidHighWater);
|
||||
|
||||
|
||||
|
||||
/* fetching RFC822 messages */
|
||||
/* imap4://HOST?fetch?<UID/SEQUENCE>?MAILBOXPATH?x */
|
||||
/* 'x' is the message UID or sequence number list */
|
||||
/* will set the 'SEEN' flag */
|
||||
char *CreateImapMessageFetchUrl(const char *imapHost,
|
||||
const char *mailbox,
|
||||
char hierarchySeparator,
|
||||
const char *messageIdentifierList,
|
||||
XP_Bool messageIdsAreUID);
|
||||
|
||||
|
||||
/* fetching the headers of RFC822 messages */
|
||||
/* imap4://HOST?header?<UID/SEQUENCE>?MAILBOXPATH?x */
|
||||
/* 'x' is the message UID or sequence number list */
|
||||
/* will not affect the 'SEEN' flag */
|
||||
char *CreateImapMessageHeaderUrl(const char *imapHost,
|
||||
const char *mailbox,
|
||||
char hierarchySeparator,
|
||||
const char *messageIdentifierList,
|
||||
XP_Bool messageIdsAreUID);
|
||||
|
||||
|
||||
/* search an online mailbox */
|
||||
/* imap4://HOST?search?<UID/SEQUENCE>?MAILBOXPATH?SEARCHSTRING */
|
||||
char *CreateImapSearchUrl(const char *imapHost,
|
||||
const char *mailbox,
|
||||
char hierarchySeparator,
|
||||
const char *searchString,
|
||||
XP_Bool messageIdsAreUID);
|
||||
|
||||
/* delete messages */
|
||||
/* imap4://HOST?deletemsg?<UID/SEQUENCE>?MAILBOXPATH?x */
|
||||
/* 'x' is the message UID or sequence number list */
|
||||
char *CreateImapDeleteMessageUrl(const char *imapHost,
|
||||
const char *mailbox,
|
||||
char hierarchySeparator,
|
||||
const char *messageIds,
|
||||
XP_Bool idsAreUids);
|
||||
|
||||
/* delete all messages */
|
||||
/* imap4://HOST?deleteallmsgs?MAILBOXPATH */
|
||||
char *CreateImapDeleteAllMessagesUrl(const char *imapHost,
|
||||
const char *mailbox,
|
||||
char hierarchySeparator);
|
||||
|
||||
/* store +flags url */
|
||||
/* imap4://HOST?store+flags?<UID/SEQUENCE>?MAILBOXPATH?x?f */
|
||||
/* 'x' is the message UID or sequence number list */
|
||||
/* 'f' is the byte of flags */
|
||||
char *CreateImapAddMessageFlagsUrl(const char *imapHost,
|
||||
const char *mailbox,
|
||||
char hierarchySeparator,
|
||||
const char *messageIds,
|
||||
imapMessageFlagsType flags,
|
||||
XP_Bool idsAreUids);
|
||||
/* store -flags url */
|
||||
/* imap4://HOST?store-flags?<UID/SEQUENCE>?MAILBOXPATH?x?f */
|
||||
/* 'x' is the message UID or sequence number list */
|
||||
/* 'f' is the byte of flags */
|
||||
char *CreateImapSubtractMessageFlagsUrl(const char *imapHost,
|
||||
const char *mailbox,
|
||||
char hierarchySeparator,
|
||||
const char *messageIds,
|
||||
imapMessageFlagsType flags,
|
||||
XP_Bool idsAreUids);
|
||||
|
||||
/* set flags url, make the flags match */
|
||||
char *CreateImapSetMessageFlagsUrl(const char *imapHost,
|
||||
const char *mailbox,
|
||||
char hierarchySeparator,
|
||||
const char *messageIds,
|
||||
imapMessageFlagsType flags,
|
||||
XP_Bool idsAreUids);
|
||||
|
||||
|
||||
/* copy messages from one online box to another */
|
||||
/* imap4://HOST?onlineCopy?<UID/SEQUENCE>?
|
||||
SOURCEMAILBOXPATH?x?DESTINATIONMAILBOXPATH */
|
||||
/* 'x' is the message UID or sequence number list */
|
||||
char *CreateImapOnlineCopyUrl(const char *imapHost,
|
||||
const char *sourceMailbox,
|
||||
char sourceHierarchySeparator,
|
||||
const char *messageIds,
|
||||
const char *destinationMailbox,
|
||||
char destinationHierarchySeparator,
|
||||
XP_Bool idsAreUids,
|
||||
XP_Bool isMove); /* cause delete after copy */
|
||||
|
||||
/* copy a message from an online box to an offline box */
|
||||
/* imap4://HOST?ontooffCopy?SOURCEMAILBOXPATH?number=x?
|
||||
DESTINATIONMAILBOXPATH */
|
||||
/* 'x' is the message sequence number */
|
||||
char *CreateImapOnToOfflineCopyUrl( const char *imapHost,
|
||||
const char *sourceMailbox,
|
||||
char sourceHierarchySeparator,
|
||||
const char *messageIds,
|
||||
const char *destinationMailbox,
|
||||
XP_Bool idsAreUids,
|
||||
XP_Bool isMove); /* cause delete after copy */
|
||||
|
||||
/* copy messages from an offline box to an online box */
|
||||
/* imap4://HOST?offtoonCopy?DESTINATIONMAILBOXPATH */
|
||||
/* the number of messages and their sizes are negotiated later */
|
||||
char *CreateImapOffToOnlineCopyUrl(const char *imapHost,
|
||||
const char *destinationMailbox,
|
||||
char destinationHierarchySeparator);
|
||||
|
||||
/* Subscribe to a mailbox on the given IMAP host */
|
||||
char *CreateIMAPSubscribeMailboxURL(const char *imapHost, const char *mailboxName);
|
||||
|
||||
/* Unsubscribe from a mailbox on the given IMAP host */
|
||||
char *CreateIMAPUnsubscribeMailboxURL(const char *imapHost, const char *mailboxName);
|
||||
|
||||
/* get mail account rul */
|
||||
/* imap4://HOST?NETSCAPE */
|
||||
char *CreateImapManageMailAccountUrl(const char *imapHost);
|
||||
|
||||
/* append message from file */
|
||||
/* imap4://HOST?appendmsgfromfile?MSGFILEPATH?DESTINATIONMAILBOXPATH */
|
||||
char *CreateImapAppendMessageFromFileUrl(const char *imapHost,
|
||||
const char *destinationMailboxPath,
|
||||
const char hierarchySeparator,
|
||||
XP_Bool isDraft);
|
||||
|
||||
/* refresh the ACL for a folder */
|
||||
char *CreateIMAPRefreshACLForFolderURL(const char *imapHost, const char *mailbox);
|
||||
|
||||
/* refresh the ACL for all folders on given host*/
|
||||
char *CreateIMAPRefreshACLForAllFoldersURL(const char *imapHost);
|
||||
|
||||
/* Run the auto-upgrade to IMAP Subscription */
|
||||
char *CreateIMAPUpgradeToSubscriptionURL(const char *imapHost, XP_Bool subscribeToAll);
|
||||
|
||||
NET_StreamClass *CreateIMAPDownloadMessageStream(ImapActiveEntry *ce, uint32 msgSize);
|
||||
|
||||
void UpdateIMAPMailboxInfo(mailbox_spec *adoptedBoxSpec, MWContext *currentContext);
|
||||
|
||||
#define kUidUnknown -1
|
||||
int32 GetUIDValidityForSpecifiedImapFolder(const char *hostName, const char *canonicalimapName, MWContext *currentContext);
|
||||
|
||||
enum EMailboxDiscoverStatus {
|
||||
eContinue,
|
||||
eContinueNew,
|
||||
eListMyChildren,
|
||||
eNewServerDirectory,
|
||||
eCancelled };
|
||||
|
||||
enum EMailboxDiscoverStatus DiscoverIMAPMailbox(mailbox_spec *adoptedBoxSpec, MSG_Master *master, MWContext *currentContext);
|
||||
|
||||
void ReportSuccessOfOnlineCopy(MWContext *currentContext, enum ImapOnlineCopyState copyState);
|
||||
void ReportSuccessOfOnlineDelete(MWContext *currentContext, const char *mailboxName);
|
||||
void ReportFailureOfOnlineCreate(MWContext *currentContext, const char *mailboxName);
|
||||
void ReportSuccessOfOnlineRename(MWContext *currentContext, folder_rename_struct *names);
|
||||
void ReportMailboxDiscoveryDone(MWContext *currentContext, URL_Struct *URL_s);
|
||||
void ReportSuccessOfChildMailboxDiscovery(MWContext *currentContext);
|
||||
void NotifyHeaderFetchCompleted(MWContext *currentContext, TNavigatorImapConnection *imapConnection);
|
||||
|
||||
void ReportLiteSelectUIDVALIDITY(MSG_Pane *receivingPane, uint32 UIDVALIDITY);
|
||||
|
||||
typedef void (UploadCompleteFunctionPointer)(void*);
|
||||
void BeginMessageUpload(MWContext *currentContext,
|
||||
PRFileDesc *ioSocket,
|
||||
UploadCompleteFunctionPointer *completeFunction,
|
||||
void *completionFunctionArgument);
|
||||
|
||||
void IMAP_DoNotDownLoadAnyMessageHeadersForMailboxSelect(TNavigatorImapConnection *connection);
|
||||
void IMAP_DownLoadMessagesForMailboxSelect(TNavigatorImapConnection *connection,
|
||||
uint32 *messageKeys, /* uint32* is adopted */
|
||||
uint32 numberOfKeys);
|
||||
|
||||
void IMAP_DownLoadMessageBodieForMailboxSelect(TNavigatorImapConnection *connection,
|
||||
uint32 *messageKeys, /* uint32* is adopted */
|
||||
uint32 numberOfKeys);
|
||||
|
||||
void IMAP_BodyIdMonitor(TNavigatorImapConnection *connection, XP_Bool enter);
|
||||
|
||||
const char *IMAP_GetCurrentConnectionUrl(TNavigatorImapConnection *connection);
|
||||
|
||||
void IMAP_UploadAppendMessageSize(TNavigatorImapConnection *connection, uint32 msgSize, imapMessageFlagsType flags);
|
||||
void IMAP_ResetAnyCachedConnectionInfo();
|
||||
|
||||
XP_Bool IMAP_CheckNewMail(TNavigatorImapConnection *connection);
|
||||
XP_Bool IMAP_NewMailDetected(TNavigatorImapConnection *connection);
|
||||
|
||||
TImapFlagAndUidState *IMAP_CreateFlagState(int numberOfMessages);
|
||||
void IMAP_DeleteFlagState(TImapFlagAndUidState *state);
|
||||
int IMAP_GetFlagStateNumberOfMessages(TImapFlagAndUidState *state);
|
||||
|
||||
imap_uid IMAP_GetUidOfMessage(int zeroBasedIndex, TImapFlagAndUidState *state);
|
||||
imapMessageFlagsType IMAP_GetMessageFlags(int zeroBasedIndex, TImapFlagAndUidState *state);
|
||||
imapMessageFlagsType IMAP_GetMessageFlagsFromUID(imap_uid uid, XP_Bool *foundIt, TImapFlagAndUidState *state);
|
||||
|
||||
void IMAP_TerminateConnection (TNavigatorImapConnection *connection);
|
||||
|
||||
char *IMAP_CreateOnlineSourceFolderNameFromUrl(const char *url);
|
||||
|
||||
void IMAP_FreeBoxSpec(mailbox_spec *victim);
|
||||
|
||||
const char *IMAP_GetPassword();
|
||||
void IMAP_SetPassword(const char *password);
|
||||
|
||||
/* called once only by MSG_InitMsgLib */
|
||||
void IMAP_StartupImap();
|
||||
|
||||
/* called once only by MSG_ShutdownMsgLib */
|
||||
void IMAP_ShutdownImap();
|
||||
|
||||
/* used to prevent recursive listing of mailboxes during discovery */
|
||||
int64 IMAP_GetTimeStampOfNonPipelinedList();
|
||||
|
||||
/* returns TRUE if either we have a password or we were preAuth'd by SSL certs */
|
||||
XP_Bool IMAP_HaveWeBeenAuthenticated();
|
||||
|
||||
/* used by libmsg when creating an imap message display stream */
|
||||
int IMAP_InitializeImapFeData (ImapActiveEntry * ce);
|
||||
MSG_Pane *IMAP_GetActiveEntryPane(ImapActiveEntry * ce);
|
||||
NET_StreamClass *IMAP_CreateDisplayStream(ImapActiveEntry * ce, XP_Bool clearCacheBit, uint32 msgSize);
|
||||
|
||||
/* used by libmsg when a new message is loaded to interrupt the load of the previous message */
|
||||
void IMAP_PseudoInterruptFetch(MWContext *context);
|
||||
|
||||
void IMAP_URLFinished(URL_Struct *URL_s);
|
||||
|
||||
XP_Bool IMAP_HostHasACLCapability(const char *hostName);
|
||||
|
||||
/**** IMAP Host stuff - used for communication between MSG_IMAPHost (in libmsg) and TImapHostInfo (in libnet) ****/
|
||||
|
||||
/* obsolete? */
|
||||
/*void IMAP_SetNamespacesFromPrefs(const char *hostName, char *personalDir, char *publicDir, char *otherUsersDir);*/
|
||||
|
||||
/* Sets the preference of whether or not we should always explicitly LIST the INBOX for given host */
|
||||
void IMAP_SetShouldAlwaysListInboxForHost(const char *hostName, XP_Bool shouldList);
|
||||
|
||||
/* Gets the number of namespaces in use for a given host */
|
||||
int IMAP_GetNumberOfNamespacesForHost(const char *hostName);
|
||||
|
||||
/* Sets the currently-used default personal namespace for a given host. Used for updating from libnet when
|
||||
we get a NAMESPACE response. */
|
||||
void MSG_SetNamespacePrefixes(MSG_Master *master, const char *hostName, EIMAPNamespaceType type, const char *prefix);
|
||||
|
||||
|
||||
/* Check to see if we need upgrade to IMAP subscription */
|
||||
extern XP_Bool MSG_ShouldUpgradeToIMAPSubscription(MSG_Master *mast);
|
||||
extern void MSG_ReportSuccessOfUpgradeToIMAPSubscription(MWContext *context, enum EIMAPSubscriptionUpgradeState *state);
|
||||
|
||||
/* Adds a set of ACL rights for the given folder on the given host for the given user. If userName is NULL, it means
|
||||
the currently authenticated user (i.e. my rights). */
|
||||
extern void MSG_AddFolderRightsForUser(MSG_Master *master, const char *hostName, const char*mailboxName, const char *userName, const char *rights);
|
||||
|
||||
/* Clears all ACL rights for the given folder on the given host for all users. */
|
||||
extern void MSG_ClearFolderRightsForFolder(MSG_Master *master, const char *hostName, const char *mailboxName);
|
||||
|
||||
/* Refreshes the icon / flags for a given folder, based on new ACL rights */
|
||||
extern void MSG_RefreshFolderRightsViewForFolder(MSG_Master *master, const char *hostName, const char *mailboxName);
|
||||
|
||||
extern XP_Bool MSG_GetFolderNeedsSubscribing(MSG_FolderInfo *folder);
|
||||
|
||||
/* Returns TRUE if this folder needs an auto-refresh of the ACL (on a folder open, for example) */
|
||||
extern XP_Bool MSG_GetFolderNeedsACLListed(MSG_FolderInfo *folder);
|
||||
|
||||
/* Returns TRUE if this folder has NEVER (ever) had an ACL retrieved for it */
|
||||
extern XP_Bool MSG_IsFolderACLInitialized(MSG_Master *master, const char *folderName, const char *hostName);
|
||||
|
||||
extern char *IMAP_SerializeNamespaces(char **prefixes, int len);
|
||||
extern int IMAP_UnserializeNamespaces(const char *str, char **prefixes, int len);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif
|
||||
369
mozilla/include/intl_csi.h
Normal file
369
mozilla/include/intl_csi.h
Normal file
@@ -0,0 +1,369 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
|
||||
/* intl_csi.h */
|
||||
|
||||
#ifndef INTL_CSI_H
|
||||
#define INTL_CSI_H
|
||||
/*
|
||||
Using the i18n Character-Set-Information (CSI) accessor functions:
|
||||
1) include the header file
|
||||
|
||||
#include "intl_csi.h"
|
||||
|
||||
2) get the i18n CSI object (generally from MWContext)
|
||||
|
||||
INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(context);
|
||||
|
||||
3) access (read/set) the data element
|
||||
|
||||
int16 doc_csid = INTL_GetCSIDocCSID(csi);
|
||||
INTL_SetCSIDocCSID(csi, new_doc_csid);
|
||||
|
||||
int16 win_csid = INTL_GetCSIWinCSID(csi);
|
||||
INTL_SetCSIWinCSID(csi, new_win_csid);
|
||||
|
||||
char *mime_name = INTL_GetCSIMimeCharset(csi);
|
||||
INTL_SetCSIMimeCharset(csi, new_mime_charset);
|
||||
|
||||
int16 relayout_flag = INTL_GetCSIRelayoutFlag(csi);
|
||||
INTL_SetCSIRelayoutFlag(csi, new_relayout_flag);
|
||||
|
||||
*/
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
#include "ntypes.h"
|
||||
#include "libi18n.h"
|
||||
|
||||
/**
|
||||
* Cookie for INTL_CSIInfo.
|
||||
*
|
||||
* This is a Magic Cookie to validate the pointer to INTL_CSIInfo in MWContext.
|
||||
*
|
||||
*/
|
||||
#define INTL_TAG 0x494E544C
|
||||
|
||||
/**@name Character Set Information (CSI) */
|
||||
/*@{*/
|
||||
/**
|
||||
* Allocate a new charset info object, and clear it with zeroes.
|
||||
*
|
||||
* @return The new charset info object
|
||||
* @see INTL_CSIInitialize, INTL_CSIDestroy
|
||||
*/
|
||||
PUBLIC INTL_CharSetInfo INTL_CSICreate(void);
|
||||
|
||||
/**
|
||||
* Frees the given charset info object.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @see INTL_CSICreate
|
||||
*/
|
||||
PUBLIC void INTL_CSIDestroy(
|
||||
INTL_CharSetInfo obj
|
||||
);
|
||||
|
||||
/**
|
||||
* Sets all the charset info object fields to initial values.
|
||||
*
|
||||
* The override, HTTP, HTML META, document and window charset IDs are all set
|
||||
* to CS_DEFAULT. The MIME charset is set to NULL. The relayout flag is set
|
||||
* to METACHARSET_NONE.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @see INTL_CSIInitialize
|
||||
*/
|
||||
PUBLIC void INTL_CSIReset(
|
||||
INTL_CharSetInfo obj
|
||||
);
|
||||
|
||||
/**
|
||||
* Initializes the charset info object.
|
||||
*
|
||||
* <UL>
|
||||
* <LI>
|
||||
* If the given is_metacharset_reload argument is FALSE, INTL_CSIReset is
|
||||
* called, passing the given charset info object.
|
||||
*
|
||||
* <LI>
|
||||
* If the given is_metacharset_reload argument is TRUE, the charset info
|
||||
* object's relayout flag is set to METACHARSET_RELAYOUTDONE.
|
||||
*
|
||||
* <LI>
|
||||
* Otherwise, if the override charset ID is previously set in this object,
|
||||
* it is set in the document charset ID field.
|
||||
*
|
||||
* <LI>
|
||||
* Otherwise, if the given HTTP charset is known, it is set in the HTTP
|
||||
* charset field.
|
||||
*
|
||||
* <LI>
|
||||
* Otherwise, the document charset ID field is set to the given
|
||||
* defaultDocCharSetID, unless the type is mail/news, in which case CS_DEFAULT
|
||||
* is used. This is because the META charset in mail/news is sometimes wrong.
|
||||
*
|
||||
* <LI>
|
||||
* Finally, the window charset ID is set, based on the document charset ID.
|
||||
* </UL>
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @param is_metacharset_reload TRUE if it is currently reloading because
|
||||
* the layout code found HTML META charset.
|
||||
* FALSE otherwise.
|
||||
* @param http_charset Specifies the charset name if it is presented in
|
||||
* HTTP Content-Type header
|
||||
* @param type Specifies the context type
|
||||
* @param defaultDocCharSetID Specifies the default document charset ID.
|
||||
* @see
|
||||
*/
|
||||
PUBLIC void INTL_CSIInitialize(
|
||||
INTL_CharSetInfo obj,
|
||||
XP_Bool is_metacharset_reload,
|
||||
char *http_charset,
|
||||
int type,
|
||||
uint16 defaultDocCharSetID
|
||||
);
|
||||
|
||||
/**
|
||||
* Sets HTML META charset info in the given charset info object.
|
||||
*
|
||||
* <UL>
|
||||
* <LI>
|
||||
* If the given charset is unknown, this function returns.
|
||||
*
|
||||
* <LI>
|
||||
* If the given context type is mail or news, this function returns,
|
||||
* since mail/news sometimes has wrong HTML META charsets.
|
||||
*
|
||||
* <LI>
|
||||
* If the relayout flag is set to something other than METACHARSET_NONE, this
|
||||
* function returns, to avoid setting the META charset more than once.
|
||||
*
|
||||
* <LI>
|
||||
* Otherwise, the HTML META charset field is set, and the relayout flag is
|
||||
* set to METACHARSET_HASCHARSET.
|
||||
* If the previous document charset was known,
|
||||
* and was different from the new META charset, the relayout flag is set to
|
||||
* METACHARSET_REQUESTRELAYOUT.
|
||||
* The window charset ID is also checked against the new one.
|
||||
* If they are different, the relayout flag is set to
|
||||
* METACHARSET_REQUESTRELAYOUT.
|
||||
* </UL>
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @param charset_tag Specifies the HTML META charset
|
||||
* @param type Specifies the context type
|
||||
* @see INTL_GetCSIMetaDocCSID, INTL_GetCSIRelayoutFlag
|
||||
*/
|
||||
PUBLIC void INTL_CSIReportMetaCharsetTag(
|
||||
INTL_CharSetInfo obj,
|
||||
char *charset_tag,
|
||||
int type
|
||||
);
|
||||
|
||||
/**
|
||||
* Returns the context's charset info object.
|
||||
*
|
||||
* @param context Specifies the context
|
||||
* @return The context's charset info object
|
||||
* @see INTL_CSICreate
|
||||
*/
|
||||
PUBLIC INTL_CharSetInfo LO_GetDocumentCharacterSetInfo(
|
||||
MWContext *context
|
||||
);
|
||||
|
||||
/**
|
||||
* Returns the document charset ID of the given charset info object.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @return The document charset ID
|
||||
* @see INTL_SetCSIDocCSID
|
||||
*/
|
||||
PUBLIC int16 INTL_GetCSIDocCSID(
|
||||
INTL_CharSetInfo obj
|
||||
);
|
||||
|
||||
/**
|
||||
* Sets the document charset ID field of the given charset info object.
|
||||
*
|
||||
* The document charset ID field is only set if the higher precedence fields
|
||||
* (override, HTTP and META) are all set to CS_DEFAULT.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @param docCharSetID Specifies the document charset ID
|
||||
* @see INTL_GetCSIDocCSID
|
||||
*/
|
||||
PUBLIC void INTL_SetCSIDocCSID(
|
||||
INTL_CharSetInfo obj,
|
||||
int16 docCharSetID
|
||||
);
|
||||
|
||||
/**
|
||||
* Returns the override document charset ID of the given charset info object.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @return The override document charset ID
|
||||
* @see INTL_SetCSIOverrideDocCSID
|
||||
*/
|
||||
PUBLIC int16 INTL_GetCSIOverrideDocCSID(
|
||||
INTL_CharSetInfo obj
|
||||
);
|
||||
|
||||
/**
|
||||
* Sets the override document charset ID of the given charset info object.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @param overrideDocCharSetID Specifies the override document charset ID
|
||||
* @see INTL_GetCSIOverrideDocCSID
|
||||
*/
|
||||
PUBLIC void INTL_SetCSIOverrideDocCSID(
|
||||
INTL_CharSetInfo obj,
|
||||
int16 overrideDocCharSetID
|
||||
);
|
||||
|
||||
/**
|
||||
* Returns the HTML META document charset ID of the given charset info object.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @return The HTML META document charset ID
|
||||
* @see INTL_SetCSIMetaDocCSID
|
||||
*/
|
||||
PUBLIC int16 INTL_GetCSIMetaDocCSID(
|
||||
INTL_CharSetInfo obj
|
||||
);
|
||||
|
||||
/**
|
||||
* Sets the HTML META document charset ID of the given charset info object.
|
||||
*
|
||||
* The HTML META document charset ID field is only set if the higher precedence
|
||||
* fields (override and HTTP) are all set to CS_DEFAULT.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @param metaCharSetID Specifies the HTML META document charset ID
|
||||
* @see INTL_GetCSIMetaDocCSID
|
||||
*/
|
||||
PUBLIC void INTL_SetCSIMetaDocCSID(
|
||||
INTL_CharSetInfo obj,
|
||||
int16 metaCharSetID
|
||||
);
|
||||
|
||||
/**
|
||||
* Returns the HTTP document charset ID of the given charset info object.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @return The HTTP document charset ID
|
||||
* @see INTL_SetCSIHTTPDocCSID
|
||||
*/
|
||||
PUBLIC int16 INTL_GetCSIHTTPDocCSID(
|
||||
INTL_CharSetInfo obj
|
||||
);
|
||||
|
||||
/**
|
||||
* Sets the HTTP document charset ID of the given charset info object.
|
||||
*
|
||||
* The HTTP document charset ID field is only set if the higher precedence
|
||||
* field (override) is set to CS_DEFAULT.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @param httpDocCharSetID Specifies the HTTP document charset ID
|
||||
* @see INTL_GetCSIHTTPDocCSID
|
||||
*/
|
||||
PUBLIC void INTL_SetCSIHTTPDocCSID(
|
||||
INTL_CharSetInfo obj,
|
||||
int16 httpDocCharSetID
|
||||
);
|
||||
|
||||
/**
|
||||
* Returns the window charset ID of the given charset info object.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @return The window charset ID
|
||||
* @see INTL_SetCSIWinCSID
|
||||
*/
|
||||
PUBLIC int16 INTL_GetCSIWinCSID(
|
||||
INTL_CharSetInfo obj
|
||||
);
|
||||
|
||||
/**
|
||||
* Sets the window charset ID field of the given charset info object.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @param winCharSetID Specifies the window charset ID
|
||||
* @see INTL_GetCSIWinCSID
|
||||
*/
|
||||
PUBLIC void INTL_SetCSIWinCSID(
|
||||
INTL_CharSetInfo obj,
|
||||
int16 winCharSetID
|
||||
);
|
||||
|
||||
/**
|
||||
* Returns the MIME charset field of the given charset info object.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @return The MIME charset
|
||||
* @see INTL_SetCSIMimeCharset
|
||||
*/
|
||||
PUBLIC char *INTL_GetCSIMimeCharset(
|
||||
INTL_CharSetInfo obj
|
||||
);
|
||||
|
||||
/**
|
||||
* Sets the MIME charset field of the given charset info object.
|
||||
*
|
||||
* If the charset info object already contains a pointer to a MIME charset,
|
||||
* that charset is freed. Then the given charset is copied, and the copy is
|
||||
* converted to lower case. The copy is then set in the MIME charset field.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @param mime_charset Specifies the MIME charset
|
||||
* @see INTL_GetCSIMimeCharset
|
||||
*/
|
||||
PUBLIC void INTL_SetCSIMimeCharset(
|
||||
INTL_CharSetInfo obj,
|
||||
char *mime_charset
|
||||
);
|
||||
|
||||
/**
|
||||
* Returns the relayout field of the given charset info object.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @return The relayout field
|
||||
* @see INTL_SetCSIRelayoutFlag
|
||||
*/
|
||||
PUBLIC int16 INTL_GetCSIRelayoutFlag(
|
||||
INTL_CharSetInfo obj
|
||||
);
|
||||
|
||||
/**
|
||||
* Sets the relayout field of the given charset info object.
|
||||
*
|
||||
* @param obj Specifies the charset info object
|
||||
* @param relayout Specifies the relayout field
|
||||
* @see INTL_GetCSIRelayoutFlag
|
||||
*/
|
||||
PUBLIC void INTL_SetCSIRelayoutFlag(
|
||||
INTL_CharSetInfo obj,
|
||||
int16 relayout
|
||||
);
|
||||
/*@}*/
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* INTL_CSI_H */
|
||||
176
mozilla/include/itapefs.h
Normal file
176
mozilla/include/itapefs.h
Normal file
@@ -0,0 +1,176 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef ITAPEFS_H
|
||||
#define ITAPEFS_H
|
||||
|
||||
#ifdef EDITOR
|
||||
//
|
||||
// Abstract output file stream.
|
||||
//
|
||||
class IStreamOut {
|
||||
public:
|
||||
IStreamOut();
|
||||
virtual ~IStreamOut();
|
||||
|
||||
virtual void Write( char *pBuffer, int32 iCount )=0;
|
||||
|
||||
// NOTICE: the implementation is not pure. There is a default
|
||||
// implementation that implements this function interms of
|
||||
// 'Write'.
|
||||
virtual int Printf( char * pFormat, ... );
|
||||
|
||||
enum EOutStreamStatus {
|
||||
EOS_NoError,
|
||||
EOS_DeviceFull,
|
||||
EOS_FileError
|
||||
};
|
||||
|
||||
virtual EOutStreamStatus Status(){ return EOS_NoError; }
|
||||
|
||||
// implemented in terms of the interface.
|
||||
void WriteInt( int32 i ){ Write( (char*)&i, sizeof( int32 ) ); }
|
||||
void WriteZString( char* pString);
|
||||
void WritePartialZString( char* pString, int32 start, int32 end);
|
||||
private:
|
||||
char* stream_buffer; // used to implement Printf
|
||||
};
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
// Abstract File System
|
||||
//-----------------------------------------------------------------------
|
||||
typedef void
|
||||
EDT_ITapeFileSystemComplete( XP_Bool bSuccess, void *pArg );
|
||||
|
||||
class ITapeFileSystem {
|
||||
PRBool m_FirstBinary; // is the first file really binary, not text?
|
||||
public:
|
||||
ITapeFileSystem() { m_FirstBinary = PR_FALSE; }
|
||||
// ITapeFileSystem::File, ITapeFileSystem::Publish, or
|
||||
// ITapeFileSystem::MailSend,
|
||||
enum {File,Publish,MailSend};
|
||||
virtual intn GetType() = 0;
|
||||
|
||||
// This function is called before anything else. It tells the file
|
||||
// system the base url for the URLs added in AddFile().
|
||||
// An actual file, not a directory.
|
||||
virtual void SetSourceBaseURL( char* pURL )=0;
|
||||
|
||||
// DESCRIPTION:
|
||||
//
|
||||
// Add a name to the file system. It is up to the file system to localize
|
||||
// the name. For example, I could add 'http://home.netsacpe.com/
|
||||
// and the file system might decide that it should be called 'index.html'
|
||||
// if the file system were DOS, the url might be converted to INDEX.HTML
|
||||
//
|
||||
// pMIMEType may be NULL. In this case if the tape file system needs the
|
||||
// MIME type, it must figure it out by itself.
|
||||
//
|
||||
// RETURNS: index of the file (0 based), OR
|
||||
// ITapeFileSystem::Error if an error adding name, OR
|
||||
// ITapeFileSystem::SourceDestSame if adding
|
||||
// this name would result in the source and destination being the same, and thus
|
||||
// no point in copying the file.
|
||||
//
|
||||
// The first file added must be the root HTML document. (It is ok for the root
|
||||
// document to have the same source and dest URL).
|
||||
//
|
||||
virtual intn AddFile( char* pURL, char *pMIMEType, int16 iCharSetID)=0;
|
||||
|
||||
// Return the number of files added to the file system.
|
||||
virtual intn GetNumFiles()=0;
|
||||
|
||||
// Returns the absolute version of the URL given in AddFile(), using the
|
||||
// URL given in SetSourceBaseURL() as the base.
|
||||
// Allocated with XP_STRDUP().
|
||||
virtual char* GetSourceURL(intn iFileIndex)=0;
|
||||
|
||||
// Return the absolute destination of the HTML doc if meaningful, else return
|
||||
// NULL. Almost the same as "GetDestPathURL()+GetDestURL(0)" except that this call
|
||||
// will work before file 0 has been added to the file system.
|
||||
virtual char* GetDestAbsURL()=0;
|
||||
|
||||
// Gets the name of the RELATIVE url to place in the file. String is
|
||||
// allocated with XP_STRDUP();
|
||||
//
|
||||
virtual char* GetDestURL( intn iFileIndex )=0;
|
||||
|
||||
// Return the path URL associated with the ITapeFilesystem or NULL if there is none.
|
||||
// If NULL is returned, all URLs returned by GetDestURL() must be absolute.
|
||||
//
|
||||
// i.e. for a file or remote HTTP based ITapeFileSystem, this is the directory where the images are
|
||||
// stored. For a MHTML ITapeFileSystem this is NULL.
|
||||
//
|
||||
// String is allocated with XP_STRDUP().
|
||||
virtual char* GetDestPathURL() = 0;
|
||||
|
||||
//
|
||||
// Returns the name to display when saving the file, can be the same as
|
||||
// GetURLName. String is allocated with XP_STRDUP();
|
||||
//
|
||||
virtual char* GetHumanName( intn iFileIndex )=0;
|
||||
|
||||
enum {
|
||||
Error = -1, SourceDestSame = -2
|
||||
};
|
||||
|
||||
// Does the file referenced by iFileIndex already exist?
|
||||
// E.g. for the MHTML version, this will always return FALSE.
|
||||
virtual XP_Bool FileExists(intn iFileIndex) = 0;
|
||||
|
||||
// Will we be creating a new non-temporary file on the local machine.
|
||||
// Used to update SiteManager.
|
||||
virtual XP_Bool IsLocalPersistentFile(intn iFileIndex) = 0;
|
||||
|
||||
// ### mwelch Added so that multipart/related message saver can properly construct
|
||||
// messages using quoted/forwarded part data.
|
||||
// Tell the tape file system the mime type of a particular part.
|
||||
// Calling this overrides any previously determined mime type for this part.
|
||||
virtual void CopyURLInfo(intn iFileIndex, const URL_Struct *pURL) = 0;
|
||||
|
||||
//
|
||||
// Opens the output stream. Returns a stream that can be written to or NULL if error. All
|
||||
// 'AddFile's occur before the first OpenStream.
|
||||
// Do not delete the returned stream, just call CloseStream() when done.
|
||||
//
|
||||
virtual IStreamOut *OpenStream( intn iFileIndex )=0;
|
||||
|
||||
virtual void CloseStream( intn iFileIndex )=0;
|
||||
|
||||
// Called on completion, TRUE if completed successfully, FALSE if it failed.
|
||||
// The caller should not reference the ITapeFileSystem after calling Complete().
|
||||
// Caller does not free up memory for ITapeFileSystem, Complete() causes file system to delete itself.
|
||||
//
|
||||
// The tape file system will call pfComplete with pArg and with whether the ITapeFileSystem
|
||||
// completed successfully. Note: the ITapeFileSystem may call pfComplete() with TRUE even if
|
||||
// ITapeFileSystem::Complete() was given FALSE.
|
||||
// pfComplete may be NULL. Call to pfComplete may be synchronous or asynchronous.
|
||||
//
|
||||
// The ITapeFileSystem will call pfComplete(success,pArg) before deleting itself. I.e. the ITapeFileSystem is still valid
|
||||
// when it calls pfComplete().
|
||||
virtual void Complete( Bool bSuccess, EDT_ITapeFileSystemComplete *pfComplete, void *pArg )=0;
|
||||
|
||||
inline PRBool IsFirstBinary(void) { return m_FirstBinary; }
|
||||
inline void SetFirstBinary(void) { m_FirstBinary = PR_TRUE; }
|
||||
inline void ResetFirstBinary(void) { m_FirstBinary = PR_FALSE; }
|
||||
};
|
||||
|
||||
#endif // EDITOR
|
||||
|
||||
#endif
|
||||
139
mozilla/include/libc_r.h
Normal file
139
mozilla/include/libc_r.h
Normal file
@@ -0,0 +1,139 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
/* libc_r.h -- macros, defines, etc. to make using reentrant libc calls */
|
||||
/* a bit easier. This was initially done for AIX pthreads, */
|
||||
/* but should be usable for anyone... */
|
||||
|
||||
/* Most of these use locally defined space instead of static library space. */
|
||||
/* Because of this, we use the _INIT_R to declare/allocate space (stack), */
|
||||
/* and the plain routines to actually do it..._WARNING_: avoid allocating */
|
||||
/* memory wherever possible. Memory allocation is fairly expensive, at */
|
||||
/* least on AIX...use arrays instead (which allocate from the stack.) */
|
||||
/* I know the names are a bit strange, but I wanted to be fairly certain */
|
||||
/* that we didn't have any namespace corruption...in general, the inits are */
|
||||
/* R_<name>_INIT_R(), and the actual calls are R_<name>_R(). */
|
||||
|
||||
#ifndef _LIBC_R_H
|
||||
#define _LIBC_R_H
|
||||
|
||||
/************/
|
||||
/* strtok */
|
||||
/************/
|
||||
#define R_STRTOK_INIT_R() \
|
||||
char *r_strtok_r=NULL
|
||||
|
||||
#define R_STRTOK_R(return,source,delim) \
|
||||
return=strtok_r(source,delim,&r_strtok_r)
|
||||
|
||||
#define R_STRTOK_NORET_R(source,delim) \
|
||||
strtok_r(source,delim,&r_strtok_r)
|
||||
|
||||
/**************/
|
||||
/* strerror */
|
||||
/**************/
|
||||
#define R_MAX_STRERROR_LEN_R 8192 /* Straight from limits.h */
|
||||
|
||||
#define R_STRERROR_INIT_R() \
|
||||
char r_strerror_r[R_MAX_STRERROR_LEN_R]
|
||||
|
||||
#define R_STRERROR_R(val) \
|
||||
strerror_r(val,r_strerror_r,R_MAX_STRERROR_LEN_R)
|
||||
|
||||
/*****************/
|
||||
/* time things */
|
||||
/*****************/
|
||||
#define R_ASCTIME_INIT_R() \
|
||||
char r_asctime_r[26]
|
||||
|
||||
#define R_ASCTIME_R(val) \
|
||||
asctime_r(val,r_asctime_r)
|
||||
|
||||
#define R_CTIME_INIT_R() \
|
||||
char r_ctime_r[26]
|
||||
|
||||
#define R_CTIME_R(val) \
|
||||
ctime_r(val,r_ctime_r)
|
||||
|
||||
#define R_GMTIME_INIT_R() \
|
||||
struct tm r_gmtime_r
|
||||
|
||||
#define R_GMTIME_R(time) \
|
||||
gmtime_r(time,&r_gmtime_r)
|
||||
|
||||
#define R_LOCALTIME_INIT_R() \
|
||||
struct tm r_localtime_r
|
||||
|
||||
#define R_LOCALTIME_R(val) \
|
||||
localtime_r(val,&r_localtime_r)
|
||||
|
||||
/***********/
|
||||
/* crypt */
|
||||
/***********/
|
||||
#include <crypt.h>
|
||||
#define R_CRYPT_INIT_R() \
|
||||
CRYPTD r_cryptd_r; \
|
||||
bzero(&r_cryptd_r,sizeof(CRYPTD))
|
||||
|
||||
#define R_CRYPT_R(pass,salt) \
|
||||
crypt_r(pass,salt,&r_cryptd_r)
|
||||
|
||||
/**************/
|
||||
/* pw stuff */
|
||||
/**************/
|
||||
#define R_MAX_PW_LEN_R 1024
|
||||
/* The following must be after the last declaration, but */
|
||||
/* before the first bit of code... */
|
||||
#define R_GETPWNAM_INIT_R(pw_ptr) \
|
||||
struct passwd r_getpwnam_pw_r; \
|
||||
char r_getpwnam_line_r[R_MAX_PW_LEN_R]; \
|
||||
pw_ptr = &r_getpwnam_pw_r
|
||||
|
||||
#define R_GETPWNAM_R(name) \
|
||||
getpwnam_r(name,&r_getpwnam_pw_r,r_getpwnam_line_r,R_MAX_PW_LEN_R)
|
||||
|
||||
/*******************/
|
||||
/* gethost stuff */
|
||||
/*******************/
|
||||
#define R_GETHOSTBYADDR_INIT_R() \
|
||||
struct hostent r_gethostbyaddr_r; \
|
||||
struct hostent_data r_gethostbyaddr_data_r
|
||||
|
||||
#define R_GETHOSTBYADDR_R(addr,len,type,xptr_ent) \
|
||||
bzero(&r_gethostbyaddr_r,sizeof(struct hostent)); \
|
||||
bzero(&r_gethostbyaddr_data_r,sizeof(struct hostent_data)); \
|
||||
xptr_ent = &r_gethostbyaddr_r; \
|
||||
if (gethostbyaddr_r(addr,len,type, \
|
||||
&r_gethostbyaddr_r,&r_gethostbyaddr_data_r) == -1) { \
|
||||
xptr_ent = NULL; \
|
||||
}
|
||||
|
||||
#define R_GETHOSTBYNAME_INIT_R() \
|
||||
struct hostent r_gethostbyname_r; \
|
||||
struct hostent_data r_gethostbyname_data_r
|
||||
|
||||
#define R_GETHOSTBYNAME_R(name,xptr_ent) \
|
||||
bzero(&r_gethostbyname_r,sizeof(struct hostent)); \
|
||||
bzero(&r_gethostbyname_data_r,sizeof(struct hostent_data)); \
|
||||
xptr_ent = &r_gethostbyname_r; \
|
||||
if (gethostbyname_r(name, \
|
||||
&r_gethostbyname_r,&r_gethostbyname_data_r) == -1) { \
|
||||
xptr_ent = NULL; \
|
||||
}
|
||||
|
||||
#endif /* _LIBC_R_H */
|
||||
209
mozilla/include/libcnv.h
Normal file
209
mozilla/include/libcnv.h
Normal file
@@ -0,0 +1,209 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
//"libcnv.h"
|
||||
#ifndef _LIBCNV_H
|
||||
#define _LIBCNV_H
|
||||
#ifndef _IMAGE_CONVERT
|
||||
#error _IMAGE_CONVERT SYMBOL NEEDED BEFORE INCLUSION
|
||||
#endif /*_IMAGE_CONVERT*/
|
||||
|
||||
#ifndef __cplusplus
|
||||
typedef unsigned char BYTE;
|
||||
typedef uint32 DWORD;
|
||||
#endif
|
||||
|
||||
#include "xp_core.h"/*defines of int32 ect*/
|
||||
#include "xp_file.h"
|
||||
#include "xp_mem.h"/*XP_HUGE*/
|
||||
|
||||
#define MAXIMAGEPATHLEN 255
|
||||
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CONV_CANCEL,
|
||||
CONV_OK,
|
||||
CONVERR_INVALIDSOURCE,
|
||||
CONVERR_INVALIDDEST,
|
||||
CONVERR_INVALIDFILEHEADER,
|
||||
CONVERR_INVALIDIMAGEHEADER,
|
||||
CONVERR_INVALIDBITDEPTH,
|
||||
CONVERR_INVALIDCOLORMAP,
|
||||
CONVERR_BADREAD,
|
||||
CONVERR_OUTOFMEMORY,
|
||||
CONVERR_JPEGERROR,
|
||||
CONVERR_COMPRESSED,
|
||||
CONVERR_BADPLANES,
|
||||
CONVERR_BADWRITE,
|
||||
CONVERR_INVALIDPARAMS,
|
||||
CONVERR_UNKNOWN,
|
||||
NUM_CONVERR
|
||||
}CONVERT_IMAGERESULT;
|
||||
|
||||
|
||||
|
||||
typedef BYTE * CONVERT_IMG_ROW;
|
||||
typedef CONVERT_IMG_ROW * CONVERT_IMG_ARRAY;
|
||||
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
conv_unknown,
|
||||
conv_png,
|
||||
conv_jpeg,
|
||||
conv_bmp,
|
||||
conv_pict,
|
||||
conv_xpm,
|
||||
conv_rgb,
|
||||
conv_plugin
|
||||
}convimgenum;
|
||||
|
||||
|
||||
typedef struct tagCONVERT_IMG_STREAM
|
||||
{
|
||||
XP_HUGE_CHAR_PTR m_mem;
|
||||
FILE *m_file;/*used only with type 0 -must allready be opened for read or write does not use current index ect.*/
|
||||
int16 m_type;/*0=CONVERT_FILE 1=CONVERT_MEMORY*/
|
||||
DWORD m_streamsize;/* 0== unlimited */
|
||||
DWORD m_currentindex;
|
||||
}CONVERT_IMG_STREAM;
|
||||
|
||||
|
||||
|
||||
/*Sent in a BITMAP structure*/
|
||||
#define CONVERT_MEMORY 1
|
||||
#define CONVERT_FILE 0
|
||||
|
||||
|
||||
typedef struct tagCONVERT_IMGCONTEXT CONVERT_IMGCONTEXT;
|
||||
typedef struct tagCONVERT_IMG_INFO CONVERT_IMG_INFO;
|
||||
|
||||
typedef CONVERT_IMAGERESULT (*CONVERT_DIALOGIMAGECALLBACK)(CONVERT_IMGCONTEXT *input,
|
||||
CONVERT_IMGCONTEXT *outputarray,
|
||||
CONVERT_IMG_INFO *imginfo,
|
||||
int16 numoutput,
|
||||
CONVERT_IMG_ARRAY imagearray);
|
||||
typedef CONVERT_IMAGERESULT (*CONVERT_COMPLETECALLBACK)(CONVERT_IMGCONTEXT *outputarray,int16 p_numoutputs,void *hook);
|
||||
|
||||
typedef void (*CONVERT_BUFFERCALLBACK)(void *);/*j_common_ptr);*/
|
||||
|
||||
|
||||
|
||||
typedef struct tagCONVERT_CALLBACKS
|
||||
{
|
||||
CONVERT_DIALOGIMAGECALLBACK m_dialogimagecallback;
|
||||
CONVERT_BUFFERCALLBACK m_displaybuffercallback;
|
||||
CONVERT_COMPLETECALLBACK m_completecallback;
|
||||
}CONVERT_CALLBACKS;
|
||||
|
||||
|
||||
|
||||
typedef struct tagCONVERT_IMGCONTEXT
|
||||
{
|
||||
convimgenum m_imagetype;
|
||||
CONVERT_IMG_STREAM m_stream;/*used with m_streamtype 1,2*/
|
||||
int16 m_quality;
|
||||
char m_filename[MAXIMAGEPATHLEN];/*will not be used to open FILE *. used for output. maybe in future will open file?*/
|
||||
CONVERT_CALLBACKS m_callbacks;
|
||||
#ifdef XP_OS2
|
||||
XP_OS2_ARG(void *m_parentwindow);/*used for callbacks to bring up dialog boxes. void * = CWnd *for Windows*/
|
||||
#else
|
||||
XP_WIN_ARG(void *m_parentwindow);/*used for callbacks to bring up dialog boxes. void * = CWnd *for Windows*/
|
||||
#endif
|
||||
void *m_pMWContext;//used for callbacks to insert the image. and for plugins
|
||||
}CONVERT_IMGCONTEXT;
|
||||
|
||||
|
||||
|
||||
typedef struct tagCONVERT_IMG_INFO
|
||||
{
|
||||
BYTE *m_colormap;
|
||||
int16 m_numcolorentries;
|
||||
uint16 m_X_density;
|
||||
uint16 m_Y_density;
|
||||
int16 m_density_unit;
|
||||
int16 m_in_color_space;
|
||||
int16 m_input_components;
|
||||
int16 m_data_precision;
|
||||
int16 m_image_width;/*pixel width*/
|
||||
int16 m_image_height;/*pixel_height*/
|
||||
int16 m_bitsperpixel;
|
||||
int16 m_row_width;/*width in bytes*/
|
||||
int16 m_stride; /*row_width-(pixel_width*bpp)/8 */
|
||||
DWORD m_image_size; /*informational purposes*/
|
||||
}CONVERT_IMG_INFO;
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/****************************/
|
||||
/*API CALLS AND DECLARATIONS*/
|
||||
/****************************/
|
||||
|
||||
/*converts input to p_numoutput many outputs*/
|
||||
/*p_outpuffilenames must be a PREALLOCATED array of char *s at least p_numoutputs char *s these pointers will
|
||||
point to output filenames that YOU will be responsible to destroy!
|
||||
you may pass in null for p_outputfilenames and it wil*/
|
||||
CONVERT_IMAGERESULT convert_stream2image(CONVERT_IMGCONTEXT p_input,CONVERT_IMG_INFO *p_imageinfo,int16 p_numoutputs,char **p_outputfilenames);
|
||||
|
||||
/*quantize_pixels will change the imagearray to have only maxcolors distinct values*/
|
||||
CONVERT_IMAGERESULT convert_quantize_pixels(CONVERT_IMG_ARRAY imagearray,int16 imagewidth,int16 imageheight,int16 maxcolorvalue);
|
||||
|
||||
/*given a imagecontext, it will tell you if it is a png,bmp,gif ect*/
|
||||
convimgenum select_file_type (CONVERT_IMGCONTEXT * p_input);
|
||||
|
||||
/****************************/
|
||||
/*END API CALLS AND DECLARATIONS*/
|
||||
/****************************/
|
||||
|
||||
|
||||
/****************************/
|
||||
/*STREAM DECLARATIONS*/
|
||||
/****************************/
|
||||
|
||||
/*CONV_IMG_FREAD taken from JPEG libraries for independence from common header file*/
|
||||
#define CONV_IMG_FREAD(file,buf,sizeofbuf) \
|
||||
((size_t) fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file)))
|
||||
|
||||
#define ReadOK(file,buffer,len) (CONV_IMG_FREAD(file,buffer,len) == ((size_t) (len)))
|
||||
|
||||
int16 read_mem_stream(CONVERT_IMG_STREAM *p_stream,void *p_dest,uint16 p_bytecount);
|
||||
BYTE read_mem_stream_byte(CONVERT_IMG_STREAM *p_stream);
|
||||
int16 read_param(CONVERT_IMG_STREAM *p_input,void *p_dest,uint16 p_bytecount);
|
||||
BYTE read_param_byte(CONVERT_IMG_STREAM *p_input);
|
||||
/****************************/
|
||||
/*END STREAM DECLARATIONS*/
|
||||
/****************************/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
748
mozilla/include/libevent.h
Normal file
748
mozilla/include/libevent.h
Normal file
@@ -0,0 +1,748 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Header file for event passing between the mozilla thread and
|
||||
* the mocha thread
|
||||
*/
|
||||
|
||||
#ifndef libevent_h___
|
||||
#define libevent_h___
|
||||
|
||||
#include "libmocha.h"
|
||||
#include "prtypes.h"
|
||||
#ifndef NSPR20
|
||||
#include "prevent.h"
|
||||
#else
|
||||
#include "plevent.h"
|
||||
#endif
|
||||
#include "shist.h"
|
||||
#include "fe_proto.h"
|
||||
#include "lo_ele.h"
|
||||
|
||||
NSPR_BEGIN_EXTERN_C
|
||||
|
||||
extern PREventQueue * mozilla_event_queue;
|
||||
|
||||
/*
|
||||
* XXX - should we use the same event values as layer events?
|
||||
*/
|
||||
|
||||
/* Event bits stored in the low end of decoder->event_mask. */
|
||||
#define EVENT_MOUSEDOWN 0x00000001
|
||||
#define EVENT_MOUSEUP 0x00000002
|
||||
#define EVENT_MOUSEOVER 0x00000004 /* user is mousing over a link */
|
||||
#define EVENT_MOUSEOUT 0x00000008 /* user is mousing out of a link */
|
||||
#define EVENT_MOUSEMOVE 0x00000010
|
||||
#define EVENT_MOUSEDRAG 0x00000020
|
||||
#define EVENT_CLICK 0x00000040 /* input element click in progress */
|
||||
#define EVENT_DBLCLICK 0x00000080
|
||||
#define EVENT_KEYDOWN 0x00000100
|
||||
#define EVENT_KEYUP 0x00000200
|
||||
#define EVENT_KEYPRESS 0x00000400
|
||||
#define EVENT_DRAGDROP 0x00000800 /* not yet implemented */
|
||||
#define EVENT_FOCUS 0x00001000 /* input focus event in progress */
|
||||
#define EVENT_BLUR 0x00002000 /* loss of focus event in progress */
|
||||
#define EVENT_SELECT 0x00004000 /* input field selection in progress */
|
||||
#define EVENT_CHANGE 0x00008000 /* field value change in progress */
|
||||
#define EVENT_RESET 0x00010000 /* form submit in progress */
|
||||
#define EVENT_SUBMIT 0x00020000 /* form submit in progress */
|
||||
#define EVENT_SCROLL 0x00040000 /* window is being scrolled */
|
||||
#define EVENT_LOAD 0x00080000 /* layout parsed a loaded document */
|
||||
#define EVENT_UNLOAD 0x00100000
|
||||
#define EVENT_XFER_DONE 0x00200000 /* document has loaded */
|
||||
#define EVENT_ABORT 0x00400000
|
||||
#define EVENT_ERROR 0x00800000
|
||||
#define EVENT_LOCATE 0x01000000
|
||||
#define EVENT_MOVE 0x02000000
|
||||
#define EVENT_RESIZE 0x04000000
|
||||
#define EVENT_FORWARD 0x08000000
|
||||
#define EVENT_HELP 0x10000000 /* for handling of help events */
|
||||
#define EVENT_BACK 0x20000000
|
||||
|
||||
/* #define EVENT_PRINT 0x20000000 *//* To be removed per joki */
|
||||
|
||||
#define STATUS_STOP 0x00000001 /* stop processing */
|
||||
#define STATUS_IGNORE 0x00000002 /* no new messages */
|
||||
|
||||
#define EVENT_ALT_MASK 0x00000001
|
||||
#define EVENT_CONTROL_MASK 0x00000002
|
||||
#define EVENT_SHIFT_MASK 0x00000004
|
||||
#define EVENT_META_MASK 0x00000008
|
||||
|
||||
#define ARGTYPE_NULL 0x00000001
|
||||
#define ARGTYPE_INT32 0x00000002
|
||||
#define ARGTYPE_BOOL 0x00000004
|
||||
#define ARGTYPE_STRING 0x00000008
|
||||
|
||||
#define SIZE_MAX 0x00000001
|
||||
#define SIZE_MIN 0X00000002
|
||||
/*
|
||||
* When the event has been processed by the backend, there will be
|
||||
* a front-end callback that gets called. If the event processed
|
||||
* successfully, the callback will be passed EVENT_OK. If the
|
||||
* event wasn't successful (i.e. the user canceled it) the return
|
||||
* status will be EVENT_CANCEL. If something radical happened
|
||||
* and the front-end should do nothing (i.e. mocha changed the
|
||||
* underlying context) the status will be EVENT_PANIC and the
|
||||
* front end should treat the context and element passed to the
|
||||
* exit routine as bogus
|
||||
*/
|
||||
typedef enum {
|
||||
EVENT_OK,
|
||||
EVENT_CANCEL,
|
||||
EVENT_PANIC
|
||||
} ETEventStatus;
|
||||
|
||||
/*
|
||||
* When a given event gets processed we may need to tell the front
|
||||
* end about it so that they can update the UI / continue the
|
||||
* operation. The context, lo_element, lType and whatever
|
||||
* field are all supplied by the original ET_SendEvent() call.
|
||||
* See ET_SendEvent() for a description of the values for
|
||||
* the status parameter
|
||||
*/
|
||||
typedef void
|
||||
(*ETClosureFunc)(MWContext * pContext, LO_Element * lo_element,
|
||||
int32 lType, void * whatever, ETEventStatus status);
|
||||
|
||||
/*
|
||||
* Someone has initiated a call to LM_EvaluateBuffer(). This function
|
||||
* gets called back with the result
|
||||
*/
|
||||
typedef void
|
||||
(*ETEvalAckFunc)(void * data, char * result_string, size_t result_length,
|
||||
char * wysiwyg_url, char * base_href, Bool valid);
|
||||
|
||||
/*
|
||||
* This function is called back after a layer's state has been restored
|
||||
* in a resize_relayout.
|
||||
*/
|
||||
typedef void
|
||||
(*ETRestoreAckFunc)(void * data, LO_BlockInitializeStruct *param);
|
||||
|
||||
/*
|
||||
* Typedef for a function taking a void pointer and
|
||||
* returning nothing
|
||||
*/
|
||||
typedef void
|
||||
(*ETVoidPtrFunc)(void * data);
|
||||
|
||||
/*
|
||||
* Typedef for a function taking a void pointer and
|
||||
* returning a bool
|
||||
*/
|
||||
typedef PRBool
|
||||
(*ETBoolPtrFunc)(void * data);
|
||||
|
||||
/*
|
||||
* Typedef for a function taking a void pointer and
|
||||
* returning a int32
|
||||
*/
|
||||
typedef int32
|
||||
(*ETIntPtrFunc)(void * data);
|
||||
|
||||
/*
|
||||
* Typedef for a function taking a void pointer and
|
||||
* returning a char *
|
||||
*/
|
||||
typedef char *
|
||||
(*ETStringPtrFunc)(void * data);
|
||||
|
||||
/*
|
||||
* Struct for passing JS typed variable info through C interface calls
|
||||
*/
|
||||
typedef union ArgVal {
|
||||
int32 intArg;
|
||||
XP_Bool boolArg;
|
||||
char * stringArg;
|
||||
} ArgVal;
|
||||
|
||||
typedef struct {
|
||||
uint8 type; /* arg type as defined at top of file */
|
||||
ArgVal value;
|
||||
} JSCompArg;
|
||||
|
||||
/*
|
||||
* Typedef for a function used to verify installed components and
|
||||
* get back components utility functions.
|
||||
*/
|
||||
typedef PRBool
|
||||
(*ETVerifyComponentFunc)(void **active_callback, void **startup_callback);
|
||||
|
||||
/*
|
||||
* Generic function for JS setting values with native calls.
|
||||
*/
|
||||
typedef void
|
||||
(*ETCompPropSetterFunc)(char *name, void *value);
|
||||
|
||||
/*
|
||||
* Generic function for JS getting values from native calls.
|
||||
*/
|
||||
typedef void*
|
||||
(*ETCompPropGetterFunc)(char *name);
|
||||
|
||||
/*
|
||||
* Generic function for JS calling native methods.
|
||||
*/
|
||||
typedef void*
|
||||
(*ETCompMethodFunc)(int32 argc, JSCompArg *argv);
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* Common prologue for talking between the mocha thread and the mozilla
|
||||
* thread
|
||||
*/
|
||||
typedef struct {
|
||||
PREvent event; /* the PREvent structure */
|
||||
MWContext* context; /* context */
|
||||
int32 doc_id; /* doc id of context when event launched */
|
||||
PRPackedBool handle_eagerly;
|
||||
} ETEvent;
|
||||
|
||||
/*
|
||||
* Struct to send back from front end in order to get additional
|
||||
* event information without having to initialize event object
|
||||
* until necessary. Yow, there is a lot of junk in here now
|
||||
* can we make a union out of some of these or are they always
|
||||
* needed?
|
||||
*/
|
||||
typedef struct {
|
||||
ETEvent ce;
|
||||
MochaDecoder * decoder;
|
||||
JSObject * object;
|
||||
int32 type;
|
||||
int32 layer_id;
|
||||
int32 id;
|
||||
LO_Element * lo_element;
|
||||
ETClosureFunc fnClosure; /* event sender closure */
|
||||
void * whatever; /* anything other state */
|
||||
int32 x,y;
|
||||
int32 docx,docy;
|
||||
int32 screenx,screeny;
|
||||
uint32 which;
|
||||
uint32 modifiers;
|
||||
void * data;
|
||||
uint32 dataSize;
|
||||
PRPackedBool saved;
|
||||
PRPackedBool event_handled;
|
||||
} JSEvent;
|
||||
|
||||
/*
|
||||
* Tell the backend about a new event.
|
||||
* The event is placed onto an event queue, it is not processed
|
||||
* immediately. If the event is the type that can be cancelled
|
||||
* by the backend (i.e. a button click or a submit) the front
|
||||
* end must wait until the callback routine gets called before
|
||||
* continuing with the operation. The ETEventStatus will be
|
||||
* EVENT_OK if the operation is to continue or EVENT_CANCEL
|
||||
* if it got cancelled.
|
||||
*
|
||||
* The processing of the event may cause the document to change
|
||||
* or even the whole window to close. In those cases the callback
|
||||
* will still get called in case there is any front-end cleanup
|
||||
* to do but the ETEventStatus will be set to EVENT_PANIC
|
||||
*
|
||||
*/
|
||||
|
||||
extern JSBool
|
||||
ET_SendEvent(MWContext * pContext, LO_Element *pElement, JSEvent *pEvent,
|
||||
ETClosureFunc fnClosure, void * whatever);
|
||||
|
||||
/*
|
||||
* Tell the backend about a new document load event. We need a
|
||||
* closure so that libparse/layout knows when its safe to discard
|
||||
* the old document when they were waiting for onunload events to
|
||||
* finish processing
|
||||
*/
|
||||
extern void
|
||||
ET_SendLoadEvent(MWContext * pContext, int32 type, ETVoidPtrFunc fnClosure,
|
||||
NET_StreamClass *stream, int32 layer_id, Bool resize_reload);
|
||||
|
||||
/*
|
||||
* Tell the backend about a new image event. Async. No closure
|
||||
*/
|
||||
extern void
|
||||
ET_SendImageEvent(MWContext * pContext, LO_ImageStruct *image_data,
|
||||
LM_ImageEvent event);
|
||||
|
||||
/*
|
||||
* Send an interrupt event to the current context
|
||||
* Remove all pending events for the event queue of the given context.
|
||||
*/
|
||||
extern void
|
||||
ET_InterruptContext(MWContext * pContext);
|
||||
|
||||
extern JSBool
|
||||
ET_ContinueProcessing(MWContext * pContext);
|
||||
|
||||
/*
|
||||
* Tell mocha to destroy the given context's data. The callback
|
||||
* function gets called when mocha is done with all of its data
|
||||
* that was associated with the context
|
||||
*/
|
||||
extern void
|
||||
ET_RemoveWindowContext(MWContext * context, ETVoidPtrFunc fn,
|
||||
void * data);
|
||||
|
||||
typedef struct {
|
||||
uint len, line_no;
|
||||
char * scope_to;
|
||||
void * data;
|
||||
JSVersion version;
|
||||
JSPrincipals * principals;
|
||||
JSBool want_result;
|
||||
JSBool unicode;
|
||||
} ETEvalStuff;
|
||||
|
||||
/*
|
||||
* Evaluate the mocha code in the given buffer
|
||||
*/
|
||||
extern void
|
||||
ET_EvaluateBuffer(MWContext * context, char * buffer, uint buflen,
|
||||
uint line_no, char * scope_to, JSBool want_result,
|
||||
ETEvalAckFunc fn, void * data,
|
||||
JSVersion ver, struct JSPrincipals *);
|
||||
|
||||
extern void
|
||||
ET_EvaluateScript(MWContext * context, char * buffer, ETEvalStuff * stuff,
|
||||
ETEvalAckFunc fn);
|
||||
|
||||
/*
|
||||
* Ask Mocha to reflect the given object into JavaScript
|
||||
*/
|
||||
extern void
|
||||
ET_ReflectObject(MWContext * pContext, void * lo_ele, void * tag,
|
||||
int32 layer_id, uint index, ReflectedObject type);
|
||||
|
||||
void
|
||||
ET_ReflectFormElement(MWContext * pContext, void * form,
|
||||
LO_FormElementStruct * form_element, PA_Tag * tag);
|
||||
|
||||
extern void
|
||||
ET_ReflectWindow(MWContext * pContext,
|
||||
PA_Block onLoad, PA_Block onUnload,
|
||||
PA_Block onFocus, PA_Block onBlur, PA_Block onHelp,
|
||||
PA_Block onMouseOver, PA_Block onMouseOut, PA_Block onDragDrop,
|
||||
PA_Block onMove, PA_Block onResize,
|
||||
PA_Block id, char *all,
|
||||
Bool bDelete, int newline_count);
|
||||
|
||||
/*
|
||||
* Tell mocha we are processing a form
|
||||
*/
|
||||
extern void
|
||||
ET_SetActiveForm(MWContext * pContext, struct lo_FormData_struct * loElement);
|
||||
|
||||
/*
|
||||
* Tell mocha which layer we are processing
|
||||
*/
|
||||
void
|
||||
ET_SetActiveLayer(MWContext * pContext, int32 layer_id);
|
||||
|
||||
/*
|
||||
** Tell mocha where to send its output
|
||||
*/
|
||||
extern void
|
||||
ET_ClearDecoderStream(MWContext * context, NET_StreamClass * old_stream);
|
||||
|
||||
extern void
|
||||
ET_SetDecoderStream(MWContext * context, NET_StreamClass *stream,
|
||||
URL_Struct *url_struct, JSBool free_stream_on_close);
|
||||
|
||||
/*
|
||||
** Remember the current nesting URL in the MochaDecoder
|
||||
*/
|
||||
extern void
|
||||
ET_SetNestingUrl(MWContext * context, char * szUrl);
|
||||
|
||||
/*
|
||||
** Remember the current language version in the MochaDecoder
|
||||
*/
|
||||
extern void
|
||||
ET_SetVersion(MWContext * context, JSVersion version);
|
||||
|
||||
/*
|
||||
* Tell mocha to trash the current document. around and around...
|
||||
*/
|
||||
extern void
|
||||
ET_ReleaseDocument(MWContext * pContext, JSBool resize_reload);
|
||||
|
||||
/*
|
||||
* Tell mocha to trash the layer's document.
|
||||
*/
|
||||
extern void
|
||||
ET_DestroyLayer(MWContext * pContext, JSObject *layer_obj);
|
||||
|
||||
extern void
|
||||
ET_MochaStreamComplete(MWContext * context, void * buf, int len,
|
||||
char * content_type, Bool isUnicode);
|
||||
|
||||
extern void
|
||||
ET_MochaStreamAbort(MWContext * context, int status);
|
||||
|
||||
/*
|
||||
* Called when a layer's contents are changing and we want to create
|
||||
* a new layer document.
|
||||
*/
|
||||
extern void
|
||||
ET_NewLayerDocument(MWContext *pContext, int32 layer_id);
|
||||
|
||||
extern void
|
||||
ET_DocWriteAck(MWContext *pContext, int status);
|
||||
|
||||
extern void
|
||||
ET_RegisterComponent(char *name, void *active_callback, void *startup_callback);
|
||||
|
||||
extern void
|
||||
ET_RegisterComponentProp(char *comp, char *name, uint8 retType, void *setter,
|
||||
void *getter);
|
||||
|
||||
extern void
|
||||
ET_RegisterComponentMethod(char *comp, char *name, uint8 retType, void *method,
|
||||
int32 argc);
|
||||
|
||||
/* =============================================================== */
|
||||
|
||||
/*
|
||||
* This event can be sent to both the mozilla thread and the moacha thread
|
||||
*/
|
||||
typedef struct {
|
||||
ETEvent ce;
|
||||
TimeoutCallbackFunction fnCallback;
|
||||
void* pClosure;
|
||||
uint32 ulTime;
|
||||
void* pTimerId;
|
||||
} MozillaEvent_Timeout;
|
||||
|
||||
|
||||
/* =============================================================== */
|
||||
|
||||
/*
|
||||
* Busy loop waiting for events to come along
|
||||
*/
|
||||
extern void PR_CALLBACK
|
||||
lm_wait_for_events(void *);
|
||||
|
||||
/*
|
||||
* global mocha event queues. It would be nice to not have these
|
||||
* exported this globally
|
||||
*/
|
||||
extern PREventQueue *lm_InterpretQueue;
|
||||
extern PREventQueue *lm_PriorityQueue;
|
||||
|
||||
/*
|
||||
* Ways to send events to the front end
|
||||
*/
|
||||
extern JSBool
|
||||
ET_PostMessageBox(MWContext* context, char* szMessage,
|
||||
JSBool bConfirm);
|
||||
|
||||
extern void
|
||||
ET_PostProgress(MWContext* context, const char* szMessage);
|
||||
|
||||
/* --- timeout routines --- */
|
||||
|
||||
/*
|
||||
* Set (or clear) a timeout to go off. The timeout will go off in the
|
||||
* mozilla thread so we will use the routine ET_FireTimeoutCallBack()
|
||||
* to get back into our thread to actually run the closure
|
||||
*/
|
||||
extern void *
|
||||
ET_PostSetTimeout(TimeoutCallbackFunction fnCallback,
|
||||
void * pClosure, uint32 ulTime, int32 doc_id);
|
||||
|
||||
extern void
|
||||
ET_PostClearTimeout(void * stuff);
|
||||
|
||||
extern void
|
||||
ET_FireTimeoutCallBack(void *);
|
||||
|
||||
/* --- end of timeout routines --- */
|
||||
|
||||
extern void
|
||||
ET_PostDestroyWindow(MWContext * context);
|
||||
|
||||
extern void
|
||||
ET_PostManipulateForm(MWContext * context, LO_Element * pForm, int32 action);
|
||||
|
||||
extern void
|
||||
ET_PostClearView(MWContext * context);
|
||||
|
||||
extern void
|
||||
ET_PostFreeImageElement(MWContext * context, void * stuff);
|
||||
|
||||
extern void
|
||||
ET_PostFreeImageContext(MWContext *context, IL_GroupContext *img_cx);
|
||||
|
||||
extern void
|
||||
ET_PostFreeAnonImages(MWContext *context, IL_GroupContext *img_cx);
|
||||
|
||||
extern void
|
||||
ET_PostDisplayImage(MWContext *, int, LO_ImageStruct *);
|
||||
|
||||
extern void
|
||||
ET_PostGetUrl(MWContext *, URL_Struct * pUrl);
|
||||
|
||||
extern char *
|
||||
ET_PostPrompt(MWContext* context, const char* szMessage,
|
||||
const char * szDefault);
|
||||
|
||||
extern MWContext *
|
||||
ET_PostNewWindow(MWContext* context, URL_Struct * pUrl,
|
||||
char * szName, Chrome * pChrome);
|
||||
|
||||
extern void
|
||||
ET_PostUpdateChrome(MWContext* context, Chrome * pChrome);
|
||||
|
||||
extern void
|
||||
ET_PostQueryChrome(MWContext* context, Chrome * pChrome);
|
||||
|
||||
extern void
|
||||
ET_PostGetScreenSize(MWContext* context, int32 *pX, int32 *pY);
|
||||
|
||||
extern void
|
||||
ET_PostGetAvailScreenRect(MWContext* context, int32 *pX, int32 *pY,
|
||||
int32 *pLeft, int32 *pTop);
|
||||
|
||||
extern void
|
||||
ET_PostGetColorDepth(MWContext* context, int32 *pPixel, int32 *pPallette);
|
||||
|
||||
extern char *
|
||||
ET_PostGetSelectedText(MWContext* context);
|
||||
|
||||
extern void
|
||||
ET_PostScrollDocTo(MWContext* context, int loc, int32 x, int32 y);
|
||||
|
||||
extern void
|
||||
ET_PostScrollDocBy(MWContext* context, int loc, int32 x, int32 y);
|
||||
|
||||
extern void
|
||||
ET_PostBackCommand(MWContext* context);
|
||||
|
||||
extern void
|
||||
ET_PostForwardCommand(MWContext* context);
|
||||
|
||||
extern void
|
||||
ET_PostHomeCommand(MWContext* context);
|
||||
|
||||
extern JSBool
|
||||
ET_PostFindCommand(MWContext* context, char * szName, JSBool matchCase,
|
||||
JSBool searchBackward);
|
||||
extern void
|
||||
ET_PostPrintCommand(MWContext* context);
|
||||
|
||||
extern void
|
||||
ET_PostOpenFileCommand(MWContext* context);
|
||||
|
||||
extern void
|
||||
ET_MakeHTMLAlert(MWContext * context, const char * szString);
|
||||
|
||||
/* respond to events sent to the mocha thread by the mozilla thread */
|
||||
|
||||
extern void
|
||||
ET_PostJsEventAck(MWContext* context, LO_Element * pEle, int type,
|
||||
ETClosureFunc fnClosure, void * pStuff,
|
||||
ETEventStatus status);
|
||||
|
||||
|
||||
|
||||
extern void
|
||||
ET_PostEvalAck(MWContext * context, int doc_id, void * data,
|
||||
char * str, size_t len, char * wysiwyg_url,
|
||||
char * base_href, Bool valid, ETEvalAckFunc fn);
|
||||
|
||||
extern void
|
||||
ET_PostRestoreAck(void *data, LO_BlockInitializeStruct *param,
|
||||
ETRestoreAckFunc fn);
|
||||
|
||||
/* netlib events */
|
||||
|
||||
extern char *
|
||||
ET_net_GetCookie(MWContext* context, int32 doc_id);
|
||||
|
||||
extern char *
|
||||
ET_net_SetCookieString(MWContext* context, char * szCookie, int32 doc_id);
|
||||
|
||||
extern NET_StreamClass *
|
||||
ET_net_CacheConverter(FO_Present_Types format, void * obj,
|
||||
URL_Struct *pUrl, MWContext * pContext);
|
||||
|
||||
extern void
|
||||
ET_net_FindURLInCache(URL_Struct * pUrl, MWContext * pContext);
|
||||
|
||||
extern NET_StreamClass *
|
||||
ET_net_StreamBuilder(FO_Present_Types format, URL_Struct *pUrl,
|
||||
MWContext * pContext);
|
||||
|
||||
/* layout events */
|
||||
|
||||
extern void
|
||||
ET_lo_ResetForm(MWContext * pContext, LO_Element * ele);
|
||||
|
||||
void
|
||||
ET_fe_SubmitInputElement(MWContext * pContext, LO_Element * ele);
|
||||
|
||||
/*
|
||||
* Synchronously shove the given text down the parser's processing
|
||||
* queue. If the currently loaded document is not equal to
|
||||
* doc_id, this message should be ignored since it arrived too
|
||||
* late for the intended document
|
||||
*/
|
||||
extern int
|
||||
ET_lo_DoDocWrite(JSContext *cx, MWContext * context, NET_StreamClass * stream,
|
||||
char * str, size_t len, int32 doc_id);
|
||||
|
||||
|
||||
extern void
|
||||
ET_il_GetImage(const char * str, MWContext * pContext, IL_GroupContext *img_cx,
|
||||
LO_ImageStruct * image_data, NET_ReloadMethod how);
|
||||
|
||||
extern void
|
||||
ET_il_SetGroupObserver(MWContext * pContext, IL_GroupContext *pImgCX, void *pDpyCX,
|
||||
JSBool bAddObserver);
|
||||
|
||||
extern void
|
||||
ET_InterruptImgCX(MWContext * pContext);
|
||||
|
||||
/*
|
||||
* Tell layout to trash the current document.
|
||||
*/
|
||||
extern void
|
||||
ET_lo_DiscardDocument(MWContext * pContext);
|
||||
|
||||
/*
|
||||
* Tell layout to prepare a layer for writing.
|
||||
*/
|
||||
extern Bool
|
||||
ET_lo_PrepareLayerForWriting(MWContext *context, int32 layer_id,
|
||||
const char *referer);
|
||||
|
||||
/*
|
||||
* Return a copy of the current history element. Caller must free
|
||||
*/
|
||||
extern History_entry *
|
||||
ET_shist_GetCurrent(MWContext * pContext);
|
||||
|
||||
/*
|
||||
* Return the current security status.
|
||||
*/
|
||||
extern int
|
||||
ET_GetSecurityStatus(MWContext * pContext);
|
||||
|
||||
/*
|
||||
* Make sure Mocha/Java glue is ready. Returns the same return code as
|
||||
* LM_InitMoja.
|
||||
*/
|
||||
extern int
|
||||
ET_InitMoja(MWContext * pContext);
|
||||
|
||||
/*
|
||||
* Pack up toys and go home
|
||||
*/
|
||||
extern void
|
||||
ET_FinishMocha(void);
|
||||
|
||||
/*
|
||||
* Used to call a stream completion function in the mozilla
|
||||
* thread
|
||||
*/
|
||||
extern void
|
||||
ET_moz_CallFunction(ETVoidPtrFunc fn, void * data);
|
||||
|
||||
extern void
|
||||
ET_moz_CallFunctionAsync(ETVoidPtrFunc fn, void * data);
|
||||
|
||||
extern PRBool
|
||||
ET_moz_CallFunctionBool(ETBoolPtrFunc fn, void * data);
|
||||
|
||||
extern int32
|
||||
ET_moz_CallFunctionInt(ETIntPtrFunc fn, void * data);
|
||||
|
||||
extern char *
|
||||
ET_moz_CallFunctionString(ETStringPtrFunc fn, void * data);
|
||||
|
||||
extern void
|
||||
ET_moz_CallAsyncAndSubEventLoop(ETVoidPtrFunc fn, void *data,
|
||||
MWContext *context);
|
||||
|
||||
extern void
|
||||
ET_moz_Abort(MKStreamAbortFunc fn, void * data, int status);
|
||||
|
||||
extern void
|
||||
ET_moz_SetMochaWriteStream(MochaDecoder * decoder);
|
||||
|
||||
extern NET_StreamClass *
|
||||
ET_moz_DocCacheConverter(MWContext * context, URL_Struct * pUrl,
|
||||
char * wysiwyg_url, int32 layer_id);
|
||||
|
||||
extern PRBool
|
||||
ET_moz_VerifyComponentFunction(ETVerifyComponentFunc fn, ETBoolPtrFunc *pActive_callback,
|
||||
ETVoidPtrFunc *pStartup_callback);
|
||||
|
||||
extern void
|
||||
ET_moz_CompSetterFunction(ETCompPropSetterFunc fn, char *name, void *data);
|
||||
|
||||
extern void *
|
||||
ET_moz_CompGetterFunction(ETCompPropGetterFunc fn, char *name);
|
||||
|
||||
extern void *
|
||||
ET_moz_CompMethodFunction(ETCompMethodFunc fn, int32 argc, JSCompArg *argv);
|
||||
|
||||
typedef enum {
|
||||
CL_Move,
|
||||
CL_MoveX,
|
||||
CL_MoveY,
|
||||
CL_Offset,
|
||||
CL_Resize,
|
||||
CL_SetBboxWidth,
|
||||
CL_SetBboxHeight,
|
||||
CL_SetBboxTop,
|
||||
CL_SetBboxLeft,
|
||||
CL_SetBboxBottom,
|
||||
CL_SetBboxRight,
|
||||
CL_SetHidden,
|
||||
CL_MoveInZ,
|
||||
CL_SetSrc,
|
||||
CL_SetSrcWidth,
|
||||
CL_SetZ,
|
||||
CL_SetBgColor,
|
||||
CL_SetBackdrop
|
||||
} ETLayerOp;
|
||||
|
||||
extern int
|
||||
ET_TweakLayer(MWContext * context, CL_Layer * layer, int32 x, int32 y,
|
||||
void *param_ptr, int32 param_val, ETLayerOp op,
|
||||
const char *referer, int32 doc_id);
|
||||
|
||||
extern void
|
||||
ET_RestoreLayerState(MWContext *context, int32 layer_id,
|
||||
LO_BlockInitializeStruct *param, ETRestoreAckFunc fn,
|
||||
void *data);
|
||||
|
||||
extern int32
|
||||
ET_npl_RefreshPluginList(MWContext* context, XP_Bool refreshInstances);
|
||||
|
||||
extern JSBool
|
||||
ET_HandlePref(JSContext * cx, uint argc, jsval * argv, jsval * rval);
|
||||
|
||||
extern void
|
||||
ET_SetPluginWindow(MWContext * pContext, void * app);
|
||||
|
||||
NSPR_END_EXTERN_C
|
||||
|
||||
#endif /* libevent_h___ */
|
||||
2651
mozilla/include/libi18n.h
Normal file
2651
mozilla/include/libi18n.h
Normal file
File diff suppressed because it is too large
Load Diff
538
mozilla/include/libmime.h
Normal file
538
mozilla/include/libmime.h
Normal file
@@ -0,0 +1,538 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
/* libmime.h --- external interface to libmime.a
|
||||
Created: Jamie Zawinski <jwz@netscape.com>, 15-May-96.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _LIBMIME_H_
|
||||
#define _LIBMIME_H_
|
||||
|
||||
#include "xp.h"
|
||||
|
||||
#ifndef MOZILLA_30
|
||||
# define MIME_DRAFTS
|
||||
#endif
|
||||
|
||||
/* Opaque object describing a block of message headers, and a couple of
|
||||
routines for extracting data from one.
|
||||
*/
|
||||
|
||||
typedef struct MimeHeaders
|
||||
{
|
||||
char *all_headers; /* A char* of the entire header section. */
|
||||
int32 all_headers_fp; /* The length (it is not NULL-terminated.) */
|
||||
int32 all_headers_size; /* The size of the allocated block. */
|
||||
|
||||
XP_Bool done_p; /* Whether we've read the end-of-headers marker
|
||||
(the terminating blank line.) */
|
||||
|
||||
char **heads; /* An array of length n_headers which points
|
||||
to the beginning of each distinct header:
|
||||
just after the newline which terminated
|
||||
the previous one. This is to speed search.
|
||||
|
||||
This is not initialized until all the
|
||||
headers have been read.
|
||||
*/
|
||||
int32 heads_size; /* The length (and consequently, how many
|
||||
distinct headers are in here.) */
|
||||
|
||||
|
||||
char *obuffer; /* This buffer is used for output. */
|
||||
int32 obuffer_size;
|
||||
int32 obuffer_fp;
|
||||
|
||||
char *munged_subject; /* What a hack. This is a place to write down
|
||||
the subject header, after it's been
|
||||
charset-ified and stuff. Remembered so that
|
||||
we can later use it to generate the
|
||||
<TITLE> tag. */
|
||||
} MimeHeaders;
|
||||
|
||||
typedef struct MimeDisplayOptions MimeDisplayOptions;
|
||||
typedef struct MimeParseStateObject MimeParseStateObject;
|
||||
#ifndef MOZILLA_30
|
||||
typedef struct MSG_AttachmentData MSG_AttachmentData;
|
||||
#endif
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
/* Given the name of a header, returns the contents of that header as
|
||||
a newly-allocated string (which the caller must free.) If the header
|
||||
is not present, or has no contents, NULL is returned.
|
||||
|
||||
If `strip_p' is TRUE, then the data returned will be the first token
|
||||
of the header; else it will be the full text of the header. (This is
|
||||
useful for getting just "text/plain" from "text/plain; name=foo".)
|
||||
|
||||
If `all_p' is FALSE, then the first header encountered is used, and
|
||||
any subsequent headers of the same name are ignored. If TRUE, then
|
||||
all headers of the same name are appended together (this is useful
|
||||
for gathering up all CC headers into one, for example.)
|
||||
*/
|
||||
extern char *MimeHeaders_get(MimeHeaders *hdrs,
|
||||
const char *header_name,
|
||||
XP_Bool strip_p,
|
||||
XP_Bool all_p);
|
||||
|
||||
/* Given a header of the form of the MIME "Content-" headers, extracts a
|
||||
named parameter from it, if it exists. For example,
|
||||
MimeHeaders_get_parameter("text/plain; charset=us-ascii", "charset")
|
||||
would return "us-ascii".
|
||||
|
||||
Returns NULL if there is no match, or if there is an allocation failure.
|
||||
*/
|
||||
extern char *MimeHeaders_get_parameter (const char *header_value,
|
||||
const char *parm_name);
|
||||
|
||||
extern MimeHeaders *MimeHeaders_copy (MimeHeaders *srcHeaders);
|
||||
|
||||
extern void MimeHeaders_free (MimeHeaders *hdrs);
|
||||
|
||||
/* Some defines for various standard header field names.
|
||||
*/
|
||||
#define HEADER_BCC "BCC"
|
||||
#define HEADER_CC "CC"
|
||||
#define HEADER_CONTENT_BASE "Content-Base"
|
||||
#define HEADER_CONTENT_DESCRIPTION "Content-Description"
|
||||
#define HEADER_CONTENT_DISPOSITION "Content-Disposition"
|
||||
#define HEADER_CONTENT_ENCODING "Content-Encoding"
|
||||
#define HEADER_CONTENT_LENGTH "Content-Length"
|
||||
#define HEADER_CONTENT_NAME "Content-Name"
|
||||
#define HEADER_CONTENT_TRANSFER_ENCODING "Content-Transfer-Encoding"
|
||||
#define HEADER_CONTENT_TYPE "Content-Type"
|
||||
#define HEADER_DATE "Date"
|
||||
#define HEADER_DISTRIBUTION "Distribution"
|
||||
#define HEADER_FCC "FCC"
|
||||
#define HEADER_FOLLOWUP_TO "Followup-To"
|
||||
#define HEADER_FROM "From"
|
||||
#define HEADER_LINES "Lines"
|
||||
#define HEADER_MESSAGE_ID "Message-ID"
|
||||
#define HEADER_MIME_VERSION "MIME-Version"
|
||||
#define HEADER_NEWSGROUPS "Newsgroups"
|
||||
#define HEADER_ORGANIZATION "Organization"
|
||||
#define HEADER_REFERENCES "References"
|
||||
#define HEADER_REPLY_TO "Reply-To"
|
||||
#define HEADER_RESENT_COMMENTS "Resent-Comments"
|
||||
#define HEADER_RESENT_DATE "Resent-Date"
|
||||
#define HEADER_RESENT_FROM "Resent-From"
|
||||
#define HEADER_RESENT_MESSAGE_ID "Resent-Message-ID"
|
||||
#define HEADER_RESENT_SENDER "Resent-Sender"
|
||||
#define HEADER_RESENT_TO "Resent-To"
|
||||
#define HEADER_RESENT_CC "Resent-CC"
|
||||
#define HEADER_SENDER "Sender"
|
||||
#define HEADER_SUBJECT "Subject"
|
||||
#define HEADER_TO "To"
|
||||
#define HEADER_X_MAILER "X-Mailer"
|
||||
#define HEADER_X_NEWSREADER "X-Newsreader"
|
||||
#define HEADER_X_POSTING_SOFTWARE "X-Posting-Software"
|
||||
#define HEADER_X_MOZILLA_STATUS "X-Mozilla-Status"
|
||||
#define HEADER_X_MOZILLA_NEWSHOST "X-Mozilla-News-Host"
|
||||
#define HEADER_X_MOZILLA_DRAFT_INFO "X-Mozilla-Draft-Info"
|
||||
#define HEADER_X_UIDL "X-UIDL"
|
||||
#define HEADER_XREF "XREF"
|
||||
#define HEADER_X_SUN_CHARSET "X-Sun-Charset"
|
||||
#define HEADER_X_SUN_CONTENT_LENGTH "X-Sun-Content-Length"
|
||||
#define HEADER_X_SUN_CONTENT_LINES "X-Sun-Content-Lines"
|
||||
#define HEADER_X_SUN_DATA_DESCRIPTION "X-Sun-Data-Description"
|
||||
#define HEADER_X_SUN_DATA_NAME "X-Sun-Data-Name"
|
||||
#define HEADER_X_SUN_DATA_TYPE "X-Sun-Data-Type"
|
||||
#define HEADER_X_SUN_ENCODING_INFO "X-Sun-Encoding-Info"
|
||||
#define HEADER_X_PRIORITY "X-Priority"
|
||||
|
||||
#define HEADER_PARM_BOUNDARY "BOUNDARY"
|
||||
#define HEADER_PARM_FILENAME "FILENAME"
|
||||
#define HEADER_PARM_NAME "NAME"
|
||||
#define HEADER_PARM_TYPE "TYPE"
|
||||
|
||||
|
||||
typedef enum {
|
||||
MimeHeadersAll, /* Show all headers */
|
||||
MimeHeadersSome, /* Show all "interesting" headers */
|
||||
MimeHeadersSomeNoRef, /* Same, but suppress the `References' header
|
||||
(for when we're printing this message.) */
|
||||
MimeHeadersMicro, /* Show a one-line header summary */
|
||||
MimeHeadersMicroPlus, /* Same, but show the full recipient list as
|
||||
well (To, CC, etc.) */
|
||||
MimeHeadersCitation /* A one-line summary geared toward use in a
|
||||
reply citation ("So-and-so wrote:") */
|
||||
} MimeHeadersState;
|
||||
|
||||
|
||||
/* The signature for various callbacks in the MimeDisplayOptions structure.
|
||||
*/
|
||||
typedef char *(*MimeHTMLGeneratorFunction) (const char *data, void *closure,
|
||||
MimeHeaders *headers);
|
||||
|
||||
struct MimeDisplayOptions
|
||||
{
|
||||
const char *url; /* Base URL for the document. This string should
|
||||
be freed by the caller, after the parser
|
||||
completes (possibly at the same time as the
|
||||
MimeDisplayOptions itself.) */
|
||||
|
||||
#ifndef MOZILLA_30
|
||||
MSG_Pane* pane; /* The libmsg pane object that corresponds to
|
||||
what we're showing. This is used by very
|
||||
little... */
|
||||
#endif /* !MOZILLA_30 */
|
||||
|
||||
MimeHeadersState headers; /* How headers should be displayed. */
|
||||
XP_Bool fancy_headers_p; /* Whether to do clever formatting of headers
|
||||
using tables, instead of spaces. */
|
||||
|
||||
#ifndef MOZILLA_30
|
||||
XP_Bool output_vcard_buttons_p; /* Whether to output the buttons */
|
||||
/* on vcards. */
|
||||
#endif /* !MOZILLA_30 */
|
||||
|
||||
XP_Bool fancy_links_p; /* Whether to insert fancy links, so you can
|
||||
do things like click on an email address to
|
||||
add it to your address book. Something you
|
||||
don't want to do while printing. */
|
||||
|
||||
XP_Bool variable_width_plaintext_p; /* Whether text/plain messages should
|
||||
be in variable width, or fixed. */
|
||||
XP_Bool wrap_long_lines_p; /* Whether to wrap long lines in text/plain
|
||||
messages. */
|
||||
|
||||
XP_Bool rot13_p; /* Whether text/plain parts should be rotated
|
||||
Set by "?rot13=true" */
|
||||
XP_Bool no_inline_p; /* Whether inline display of attachments should
|
||||
be suppressed. Set by "?inline=false" */
|
||||
char *part_to_load; /* The particular part of the multipart which
|
||||
we are extracting. Set by "?part=3.2.4" */
|
||||
|
||||
XP_Bool write_html_p; /* Whether the output should be HTML, or raw. */
|
||||
|
||||
XP_Bool decrypt_p; /* Whether all traces of encryption should be
|
||||
eradicated -- this is only meaningful when
|
||||
write_html_p is FALSE; we set this when
|
||||
attaching a message for forwarding, since
|
||||
forwarding someone else a message that wasn't
|
||||
encrypted for them doesn't work. We have to
|
||||
decrypt it before sending it.
|
||||
*/
|
||||
|
||||
#ifndef MOZILLA_30
|
||||
XP_Bool nice_html_only_p; /* If TRUE, then we only should write html if
|
||||
it's pretty HTML (stuff that we're willing
|
||||
to get shipped out in mail messages). If we
|
||||
can't generate nice stuff for some part,
|
||||
then don't say anything at all. */
|
||||
|
||||
XP_Bool dont_touch_citations_p; /* If TRUE, then we should leave citations
|
||||
alone in plaintext parts. If FALSE, then
|
||||
go ahead and tweak the fonts according
|
||||
to preferences. */
|
||||
#endif /* !MOZILLA_30 */
|
||||
|
||||
char *default_charset; /* If this is non-NULL, then it is the charset to
|
||||
assume when no other one is specified via a
|
||||
`charset' parameter.
|
||||
*/
|
||||
char *override_charset; /* If this is non-NULL, then we will assume that
|
||||
all data is in this charset, regardless of what
|
||||
the `charset' parameter of that part says.
|
||||
This overrides `default_charset' as well.
|
||||
(This is to cope with the fact that, in the
|
||||
real world, many messages are mislabelled with
|
||||
the wrong charset.)
|
||||
*/
|
||||
|
||||
/* =======================================================================
|
||||
Stream-related callbacks; for these functions, the `closure' argument
|
||||
is what is found in `options->stream_closure'. (One possible exception
|
||||
is for output_fn; see "output_closure" below.)
|
||||
*/
|
||||
void *stream_closure;
|
||||
|
||||
/* For setting up the display stream, so that the MIME parser can inform
|
||||
the caller of the type of the data it will be getting. */
|
||||
int (*output_init_fn) (const char *type,
|
||||
const char *charset,
|
||||
const char *name,
|
||||
const char *x_mac_type,
|
||||
const char *x_mac_creator,
|
||||
void *stream_closure);
|
||||
|
||||
/* How the MIME parser feeds its output (HTML or raw) back to the caller. */
|
||||
int (*output_fn) (char *buf, int32 size, void *closure);
|
||||
|
||||
/* Closure to pass to the above output_fn. If NULL, then the
|
||||
stream_closure is used. */
|
||||
void *output_closure;
|
||||
|
||||
/* A callback used to encapsulate an HTML section and to reset the
|
||||
HTML parser to its default state at the end of a section.
|
||||
start_p indicates whether this is being called just before the
|
||||
start or immediately after the end of the encapsulated HTML.
|
||||
layer_encapsulate_p indicates whether or not to put special
|
||||
ILAYER container tags around the HTML -- Also, when start_p is
|
||||
FALSE, this function should close off any tags we've left open,
|
||||
reset the font size and face, etc. This may be called multiple
|
||||
times -- in particular, it will be called at the end of each
|
||||
message part which might contain human-generated (and thus
|
||||
arbitrarily buggy) markup. The `abort_p' argument specifies
|
||||
whether it's ok for data to be discarded.
|
||||
*/
|
||||
int (*set_html_state_fn) (void *stream_closure,
|
||||
XP_Bool layer_encapsulate_p,
|
||||
XP_Bool start_p,
|
||||
XP_Bool abort_p);
|
||||
|
||||
/* A hook for the caller to perform charset-conversion before HTML is
|
||||
returned. Each set of characters which originated in a mail message
|
||||
(body or headers) will be run through this filter before being converted
|
||||
into HTML. (This should return bytes which may appear in an HTML file,
|
||||
ie, we must be able to scan through the string to search for "<" and
|
||||
turn it in to "<", and so on.)
|
||||
|
||||
`input' is a non-NULL-terminated string of a single line from the message.
|
||||
`input_length' is how long it is.
|
||||
`input_charset' is a string representing the charset of this string (as
|
||||
specified by MIME headers.)
|
||||
`output_charset' is the charset to which conversion is desired.
|
||||
`output_ret' is where a newly-malloced string is returned. It may be
|
||||
NULL if no translation is needed.
|
||||
`output_size_ret' is how long the returned string is (it need not be
|
||||
NULL-terminated.).
|
||||
*/
|
||||
int (*charset_conversion_fn) (const char *input_line, int32 input_length,
|
||||
const char *input_charset,
|
||||
const char *output_charset,
|
||||
char **output_ret, int32 *output_size_ret,
|
||||
void *stream_closure);
|
||||
|
||||
/* A hook for the caller to perform both charset-conversion and decoding of
|
||||
MIME-2 header fields (using RFC-1522 encoding.) Arguments and returned
|
||||
values are as for `charset_conversion_fn'.
|
||||
*/
|
||||
int (*rfc1522_conversion_fn) (const char *input_line, int32 input_length,
|
||||
const char *input_charset,
|
||||
const char *output_charset,
|
||||
char **output_ret, int32 *output_size_ret,
|
||||
void *stream_closure);
|
||||
|
||||
/* A hook for the caller to translate a time string into a prettier or more
|
||||
compact or localized form. */
|
||||
char *(*reformat_date_fn) (const char *old_date, void *stream_closure);
|
||||
|
||||
/* A hook for the caller to turn a file name into a content-type. */
|
||||
char *(*file_type_fn) (const char *filename, void *stream_closure);
|
||||
|
||||
/* A hook for the caller to turn a content-type into descriptive text. */
|
||||
char *(*type_description_fn) (const char *content_type,void *stream_closure);
|
||||
|
||||
/* A hook for the caller to turn a content-type into an image icon. */
|
||||
char *(*type_icon_name_fn) (const char *content_type, void *stream_closure);
|
||||
|
||||
/* A hook by which the user may be prompted for a password by the security
|
||||
library. (This is really of type `SECKEYGetPasswordKey'; see sec.h.) */
|
||||
void *(*passwd_prompt_fn)(void *arg1, void *arg2);
|
||||
void *passwd_prompt_fn_arg;
|
||||
|
||||
/* =======================================================================
|
||||
Various callbacks; for all of these functions, the `closure' argument
|
||||
is what is found in `html_closure'.
|
||||
*/
|
||||
void *html_closure;
|
||||
|
||||
/* For emitting some HTML before the start of the outermost message
|
||||
(this is called before any HTML is written to layout.) */
|
||||
MimeHTMLGeneratorFunction generate_header_html_fn;
|
||||
|
||||
/* For emitting some HTML after the outermost header block, but before
|
||||
the body of the first message. */
|
||||
MimeHTMLGeneratorFunction generate_post_header_html_fn;
|
||||
|
||||
/* For emitting some HTML at the very end (this is called after libmime
|
||||
has written everything it's going to write.) */
|
||||
MimeHTMLGeneratorFunction generate_footer_html_fn;
|
||||
|
||||
/* For turning a message ID into a loadable URL. */
|
||||
MimeHTMLGeneratorFunction generate_reference_url_fn;
|
||||
|
||||
/* For turning a mail address into a mailto URL. */
|
||||
MimeHTMLGeneratorFunction generate_mailto_url_fn;
|
||||
|
||||
/* For turning a newsgroup name into a news URL. */
|
||||
MimeHTMLGeneratorFunction generate_news_url_fn;
|
||||
|
||||
/* =======================================================================
|
||||
Callbacks to handle the backend-specific inlined image display
|
||||
(internal-external-reconnect junk.) For `image_begin', the `closure'
|
||||
argument is what is found in `stream_closure'; but for all of the
|
||||
others, the `closure' argument is the data that `image_begin' returned.
|
||||
*/
|
||||
|
||||
/* Begins processing an embedded image; the URL and content_type are of the
|
||||
image itself. */
|
||||
void *(*image_begin) (const char *image_url, const char *content_type,
|
||||
void *stream_closure);
|
||||
|
||||
/* Stop processing an image. */
|
||||
void (*image_end) (void *image_closure, int status);
|
||||
|
||||
/* Dump some raw image data down the stream. */
|
||||
int (*image_write_buffer) (char *buf, int32 size, void *image_closure);
|
||||
|
||||
/* What HTML should be dumped out for this image. */
|
||||
char *(*make_image_html) (void *image_closure);
|
||||
|
||||
|
||||
/* =======================================================================
|
||||
Other random opaque state.
|
||||
*/
|
||||
MimeParseStateObject *state; /* Some state used by libmime internals;
|
||||
initialize this to 0 and leave it alone.
|
||||
*/
|
||||
|
||||
|
||||
#ifdef MIME_DRAFTS
|
||||
/* =======================================================================
|
||||
Mail Draft hooks -- 09-19-1996
|
||||
*/
|
||||
XP_Bool decompose_file_p; /* are we decomposing a mime msg
|
||||
into separate files */
|
||||
XP_Bool done_parsing_outer_headers; /* are we done parsing the outer message
|
||||
headers; this is really useful when
|
||||
we have multiple Message/RFC822
|
||||
headers */
|
||||
XP_Bool is_multipart_msg; /* are we decomposing a multipart
|
||||
message */
|
||||
|
||||
int decompose_init_count; /* used for non multipart message only
|
||||
*/
|
||||
|
||||
XP_Bool signed_p; /* to tell draft this is a signed
|
||||
message */
|
||||
|
||||
/* Callback to gather the outer most headers so we could use the
|
||||
information to initialize the addressing/subject/newsgroups fields
|
||||
for the composition window. */
|
||||
int (*decompose_headers_info_fn) (void *closure,
|
||||
MimeHeaders *headers);
|
||||
|
||||
/* Callbacks to create temporary files for drafts attachments. */
|
||||
int (*decompose_file_init_fn) (void *stream_closure,
|
||||
MimeHeaders *headers );
|
||||
|
||||
int (*decompose_file_output_fn) (char *buf, int32 size,
|
||||
void *stream_closure);
|
||||
|
||||
int (*decompose_file_close_fn) (void *stream_closure);
|
||||
#endif /* MIME_DRAFTS */
|
||||
|
||||
int32 attachment_icon_layer_id; /* Hackhackhack. This is zero if we have
|
||||
not yet emitted the attachment layer
|
||||
stuff. If we have, then this is the
|
||||
id number for that layer, which is a
|
||||
unique random number every time, to keep
|
||||
evil people from writing javascript code
|
||||
to hack it. */
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* Mozilla-specific interfaces
|
||||
*/
|
||||
|
||||
/* Given a URL, this might return a better suggested name to save it as.
|
||||
|
||||
When you have a URL, you can sometimes get a suggested name from
|
||||
URL_s->content_name, but if you're saving a URL to disk before the
|
||||
URL_Struct has been filled in by netlib, you don't have that yet.
|
||||
|
||||
So if you're about to prompt for a file name *before* you call FE_GetURL
|
||||
with a format_out of FO_SAVE_AS, call this function first to see if it
|
||||
can offer you advice about what the suggested name for that URL should be.
|
||||
|
||||
(This works by looking in a cache of recently-displayed MIME objects, and
|
||||
seeing if this URL matches. If it does, the remembered content-name will
|
||||
be used.)
|
||||
*/
|
||||
extern char *MimeGuessURLContentName(MWContext *context, const char *url);
|
||||
|
||||
/* Given a URL, return the content type for the mime part, if the passed context
|
||||
recently parsed a message containing the part specified by the URL.
|
||||
This is used to figure out if we need to open the url in a browser window,
|
||||
or if we're just going to do a save as, anyay.
|
||||
*/
|
||||
extern char *MimeGetURLContentType(MWContext *context, const char *url);
|
||||
|
||||
|
||||
/* Determines whether the given context is currently showing a text/html
|
||||
message. (Used by libmsg to determine if replys should bring up the
|
||||
text/html editor. */
|
||||
|
||||
extern XP_Bool MimeShowingTextHtml(MWContext* context);
|
||||
|
||||
|
||||
|
||||
/* Yeech, hack... Determine the URL to use to save just the HTML part of the
|
||||
currently-displayed message to disk. If the current message doesn't have
|
||||
a text/html part, returns NULL. Otherwise, the caller must free the
|
||||
returned string using XP_FREE(). */
|
||||
|
||||
extern char* MimeGetHtmlPartURL(MWContext* context);
|
||||
|
||||
|
||||
/* Return how many attachments are in the currently-displayed message. */
|
||||
extern int MimeGetAttachmentCount(MWContext* context);
|
||||
|
||||
/* Returns what attachments are being viewed in the currently-displayed
|
||||
message. The returned data must be free'd using
|
||||
MimeFreeAttachmentList(). */
|
||||
extern int MimeGetAttachmentList(MWContext* context,
|
||||
MSG_AttachmentData** data);
|
||||
|
||||
extern void MimeFreeAttachmentList(MSG_AttachmentData* data);
|
||||
|
||||
|
||||
/* Call this when destroying a context; this frees up some memory.
|
||||
*/
|
||||
extern void MimeDestroyContextData(MWContext *context);
|
||||
|
||||
|
||||
/* After a message has been fully displayed (the document has finished
|
||||
loading) FEs call this with a Mail or News window to determine how
|
||||
the "security" toolbar button should be rendered.
|
||||
|
||||
The first two values are whether it was an encrypted and/or signed
|
||||
message; the second two are whether it was *valid*.
|
||||
*/
|
||||
extern void MIME_GetMessageCryptoState(MWContext *context,
|
||||
XP_Bool *signed_return,
|
||||
XP_Bool *encrypted_return,
|
||||
XP_Bool *signed_ok_return,
|
||||
XP_Bool *encrypted_ok_return);
|
||||
|
||||
#ifndef MOZILLA_30
|
||||
/* Used only by libnet, this indicates that the user bonked on the "show me
|
||||
details about attachments" button. */
|
||||
|
||||
extern int MIME_DisplayAttachmentPane(MWContext* context);
|
||||
#endif /* MOZILLA_30 */
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* _LIBMIME_H_ */
|
||||
543
mozilla/include/libmocha.h
Normal file
543
mozilla/include/libmocha.h
Normal file
@@ -0,0 +1,543 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Header file for Mocha in the Navigator (libmocha).
|
||||
*/
|
||||
|
||||
#ifndef libmocha_h___
|
||||
#define libmocha_h___
|
||||
|
||||
#include "ntypes.h"
|
||||
#include "il_types.h"
|
||||
#include "prtypes.h"
|
||||
#include "plhash.h"
|
||||
#include "prthread.h"
|
||||
#include "jsapi.h"
|
||||
|
||||
/* enable JavaScript Debugger support */
|
||||
#if defined (_WIN32) || defined(XP_UNIX) || defined(powerc) || defined(__powerc) || defined(XP_OS2)
|
||||
#ifdef JAVA
|
||||
#define JSDEBUGGER 1
|
||||
#endif
|
||||
#endif
|
||||
|
||||
NSPR_BEGIN_EXTERN_C
|
||||
|
||||
typedef struct JSTimeout JSTimeout;
|
||||
typedef struct JSPrincipalsList JSPrincipalsList;
|
||||
typedef struct JSNestingUrl JSNestingUrl;
|
||||
|
||||
/*
|
||||
* There exists one MochaDecoder per top-level MWContext that decodes Mocha,
|
||||
* either from an HTML page or from a "mocha:[expr]" URL.
|
||||
*/
|
||||
typedef struct MochaDecoder {
|
||||
int32 forw_count; /* forward reference count */
|
||||
int32 back_count; /* back (up the tree) count */
|
||||
JSContext *js_context;
|
||||
MWContext *window_context;
|
||||
JSObject *window_object;
|
||||
NET_StreamClass *stream;
|
||||
int32 stream_owner; /* id of layer that's loading the stream */
|
||||
URL_Struct *url_struct;
|
||||
JSTimeout *timeouts;
|
||||
JSTimeout *saved_timeouts;
|
||||
uint16 signature_ordinal;
|
||||
PRPackedBool replace_location;
|
||||
PRPackedBool resize_reload;
|
||||
PRPackedBool load_event_sent;
|
||||
PRPackedBool visited;
|
||||
PRPackedBool writing_input;
|
||||
PRPackedBool free_stream_on_close;
|
||||
PRPackedBool in_window_quota;
|
||||
PRPackedBool called_win_close;
|
||||
PRPackedBool principals_compromised;
|
||||
const char *source_url;
|
||||
JSNestingUrl *nesting_url;
|
||||
uint32 error_count;
|
||||
uint32 event_mask;
|
||||
int32 active_layer_id;
|
||||
uint32 active_form_id;
|
||||
uint32 event_bit;
|
||||
int32 doc_id;
|
||||
|
||||
/*
|
||||
* Class prototype objects, in alphabetical order. Must be CLEARed (set
|
||||
* to null) in LM_PutMochaDecoder, HELD (GC roots added) in lm_NewWindow,
|
||||
* and DROPped (removed as GC roots) in lm_DestroyWindow.
|
||||
* XXXbe clean up, clear via bzero, using a sub-structure.
|
||||
*/
|
||||
JSObject *anchor_prototype;
|
||||
JSObject *bar_prototype;
|
||||
JSObject *document_prototype;
|
||||
JSObject *event_prototype;
|
||||
JSObject *event_capturer_prototype;
|
||||
JSObject *event_receiver_prototype;
|
||||
JSObject *form_prototype;
|
||||
JSObject *image_prototype;
|
||||
JSObject *input_prototype;
|
||||
JSObject *layer_prototype;
|
||||
JSObject *option_prototype;
|
||||
JSObject *rect_prototype;
|
||||
JSObject *url_prototype;
|
||||
|
||||
/*
|
||||
* Window sub-objects. These must also follow the CLEAR/HOLD/DROP
|
||||
* protocol mentioned above.
|
||||
*/
|
||||
JSObject *document;
|
||||
JSObject *history;
|
||||
JSObject *location;
|
||||
JSObject *navigator;
|
||||
JSObject *components;
|
||||
JSObject *screen;
|
||||
JSObject *hardware;
|
||||
JSObject *crypto;
|
||||
JSObject *pkcs11;
|
||||
|
||||
/*
|
||||
* Ad-hoc GC roots.
|
||||
*/
|
||||
JSObject *event_receiver;
|
||||
JSObject *opener;
|
||||
|
||||
JSVersion firstVersion; /* First JS script tag version. */
|
||||
|
||||
/*
|
||||
* Security info for all of this decoder's scripts, except those
|
||||
* contained in layers.
|
||||
*/
|
||||
JSPrincipals *principals;
|
||||
JSPrincipalsList*early_access_list;
|
||||
|
||||
IL_GroupContext *image_context; /* Image context for anonymous images */
|
||||
|
||||
/*
|
||||
* Table that maintains an id to JS object mapping for reflected
|
||||
* elements. This is used during resize to reestablish the connection
|
||||
* between layout elements and their corresponding JS object.
|
||||
* Form elements are special, since they can't use the same keying
|
||||
*/
|
||||
PRHashTable *id_to_object_map;
|
||||
} MochaDecoder;
|
||||
|
||||
/*
|
||||
* Number of buckets for the id-to-object hash table.
|
||||
*/
|
||||
#define LM_ID_TO_OBJ_MAP_SIZE 20
|
||||
#define LM_FORM_ELEMENT_MAP_SIZE 10
|
||||
|
||||
/*
|
||||
* Types of objects reflected into Mocha
|
||||
*/
|
||||
typedef enum {
|
||||
LM_APPLETS = 0,
|
||||
LM_FORMS,
|
||||
LM_LINKS,
|
||||
LM_NAMEDANCHORS,
|
||||
LM_EMBEDS,
|
||||
LM_IMAGES,
|
||||
LM_FORMELEMENTS,
|
||||
LM_LAYERS
|
||||
} ReflectedObject;
|
||||
|
||||
/*
|
||||
* Generates an id-to-object mapping key from the ReflectedObject
|
||||
* type, the containing layer id and the id of the object itself.
|
||||
* The key is 4 bits type, 14 bits layer_id and 14 bits id.
|
||||
*/
|
||||
#define LM_GET_MAPPING_KEY(obj_type, layer_id, id) \
|
||||
(void *)(((((uint32)obj_type) << 28) & 0xF0000000UL) | \
|
||||
((((uint32)layer_id) << 14) & 0x0FFFC000UL) | \
|
||||
(((uint32)id) & 0x00003FFFUL))
|
||||
|
||||
/*
|
||||
* Public, well-known string constants.
|
||||
*/
|
||||
extern char js_language_name[]; /* "JavaScript" */
|
||||
extern char js_content_type[]; /* "application/x-javascript" */
|
||||
|
||||
/*
|
||||
* Initialize and finalize Mocha-in-the-client.
|
||||
*/
|
||||
extern void LM_InitMocha(void);
|
||||
extern void LM_FinishMocha(void);
|
||||
|
||||
/*
|
||||
* Force mocha on in the given context, even if the user pref is set to
|
||||
* disable mocha.
|
||||
*/
|
||||
extern void LM_ForceJSEnabled(MWContext *cx);
|
||||
|
||||
/*
|
||||
* Initialize and finalize Mocha-Java connection
|
||||
*/
|
||||
#define LM_MOJA_UNINITIALIZED 0
|
||||
#define LM_MOJA_OK 1
|
||||
#define LM_MOJA_JAVA_FAILED 2
|
||||
#define LM_MOJA_OUT_OF_MEMORY 3
|
||||
extern int LM_InitMoja(void);
|
||||
extern void LM_FinishMoja(void);
|
||||
extern int LM_IsMojaInitialized(void);
|
||||
|
||||
/*
|
||||
* Enter or leave the big mocha lock. Any thread which wants to
|
||||
* preserve JavaScript run-to-completion semantics must bracket
|
||||
* JavaScript evaluation with these calls.
|
||||
*/
|
||||
typedef void
|
||||
(PR_CALLBACK *JSLockReleaseFunc)(void * data);
|
||||
|
||||
|
||||
extern void PR_CALLBACK LM_LockJS(void);
|
||||
extern void PR_CALLBACK LM_UnlockJS(void);
|
||||
extern JSBool PR_CALLBACK LM_AttemptLockJS(JSLockReleaseFunc fn, void * data);
|
||||
extern JSBool PR_CALLBACK LM_ClearAttemptLockJS(JSLockReleaseFunc fn, void * data);
|
||||
extern PRBool PR_CALLBACK
|
||||
LM_HandOffJSLock(PRThread * oldOwner, PRThread *newOwner);
|
||||
|
||||
/*
|
||||
* For interruption purposes we will sometimes need to know the
|
||||
* context who is holding the JS lock
|
||||
*/
|
||||
extern void LM_JSLockSetContext(MWContext * context);
|
||||
extern MWContext * LM_JSLockGetContext(void);
|
||||
|
||||
/*
|
||||
* Enable/disable for Mocha-in-the-client.
|
||||
*/
|
||||
#define LM_SwitchMocha(toggle) LM_SetMochaEnabled(toggle)
|
||||
|
||||
extern JSBool
|
||||
LM_GetMochaEnabled(void);
|
||||
|
||||
/*
|
||||
* Get (create if necessary) a MochaDecoder for context, adding a reference
|
||||
* to its window_object. Put drops the reference, destroying window_object
|
||||
* when the count reaches zero. These functions should only be called in
|
||||
* the mocha thread or while holding the JS-lock
|
||||
*/
|
||||
extern MochaDecoder *
|
||||
LM_GetMochaDecoder(MWContext *context);
|
||||
|
||||
extern void
|
||||
LM_PutMochaDecoder(MochaDecoder *decoder);
|
||||
|
||||
/*
|
||||
* Get the source URL for script being loaded by document. This URL will be
|
||||
* the document's URL for inline script, or the SRC= URL for included script.
|
||||
* The returned pointer is safe only within the extent of the function that
|
||||
* calls LM_GetSourceURL().
|
||||
*/
|
||||
extern const char *
|
||||
LM_GetSourceURL(MochaDecoder *decoder);
|
||||
|
||||
/*
|
||||
* Set the current layer and hence the current scope for script evaluation.
|
||||
*/
|
||||
extern void
|
||||
LM_SetActiveLayer(MWContext * context, int32 layer_id);
|
||||
|
||||
/*
|
||||
* Get the current layer and hence the current scope for script evaluation.
|
||||
*/
|
||||
extern int32
|
||||
LM_GetActiveLayer(MWContext * context);
|
||||
|
||||
/*
|
||||
* Evaluate the contents of a SCRIPT tag. You can specify the JSObject
|
||||
* to use as the base scope. Pass NULL to use the default window_object
|
||||
*/
|
||||
extern JSBool
|
||||
LM_EvaluateBuffer(MochaDecoder *decoder, void *base, size_t length,
|
||||
uint lineno, char * scope_to, struct JSPrincipals *principals,
|
||||
JSBool unicode, jsval *result);
|
||||
|
||||
/*
|
||||
* Evaluate an expression entity in an HTML attribute (WIDTH="&{height/2};").
|
||||
* Returns null on error, otherwise a pointer to the malloc'd string result.
|
||||
* The caller is responsible for freeing the string result.
|
||||
*/
|
||||
extern char *
|
||||
LM_EvaluateAttribute(MWContext *context, char *expr, uint lineno);
|
||||
|
||||
/*
|
||||
* Remove any MochaDecoder window_context pointer to an MWContext that's
|
||||
* being destroyed.
|
||||
*/
|
||||
extern void
|
||||
LM_RemoveWindowContext(MWContext *context, History_entry * he);
|
||||
|
||||
extern void
|
||||
LM_DropSavedWindow(MWContext *context, void *window);
|
||||
|
||||
/*
|
||||
* Set and clear the HTML stream and URL for the MochaDecoder
|
||||
* associated with the given context
|
||||
*/
|
||||
extern JSBool
|
||||
LM_SetDecoderStream(MWContext * context, NET_StreamClass *stream,
|
||||
URL_Struct *url_struct, JSBool free_stream_on_close);
|
||||
|
||||
/*
|
||||
* Start caching HTML or plain text generated by document.write() where the
|
||||
* script is running on mc, the document is being generated into decoder's
|
||||
* window, and url_struct tells about the generator.
|
||||
*/
|
||||
extern NET_StreamClass *
|
||||
LM_WysiwygCacheConverter(MWContext *context, URL_Struct *url_struct,
|
||||
const char * wysiwyg_url, const char * base_href);
|
||||
|
||||
/*
|
||||
* Skip over the "wysiwyg://docid/" in url_string and return a pointer to the
|
||||
* real URL hidden after the prefix. If url_string is not of "wysiwyg:" type,
|
||||
* just return url_string. Never returns null.
|
||||
*/
|
||||
extern const char *
|
||||
LM_StripWysiwygURLPrefix(const char *url_string);
|
||||
|
||||
/*
|
||||
* This function works only on "wysiwyg:" type URLs -- don't call it unless
|
||||
* you know that NET_URL_Type(url_string) is WYSIWYG_TYPE_URL. It'll return
|
||||
* null if url_string seems too short, or if it can't find the third slash.
|
||||
*/
|
||||
extern const char *
|
||||
LM_SkipWysiwygURLPrefix(const char *url_string);
|
||||
|
||||
/*
|
||||
* Return a pointer to a malloc'd string of the form "<BASE HREF=...>" where
|
||||
* the "..." URL is the directory of cx's origin URL. Such a base URL is the
|
||||
* default base for relative URLs in generated HTML.
|
||||
*/
|
||||
extern char *
|
||||
LM_GetBaseHrefTag(JSContext *cx, JSPrincipals *principals);
|
||||
|
||||
/*
|
||||
* XXX Make these public LO_... typedefs in lo_ele.h/ntypes.h?
|
||||
*/
|
||||
struct lo_FormData_struct;
|
||||
struct lo_NameList_struct;
|
||||
|
||||
extern struct lo_FormData_struct *
|
||||
LO_GetFormDataByID(MWContext *context, int32 layer_id, intn form_id);
|
||||
|
||||
extern uint
|
||||
LO_EnumerateForms(MWContext *context, int32 layer_id);
|
||||
|
||||
extern struct LO_ImageStruct_struct *
|
||||
LO_GetImageByIndex(MWContext *context, int32 layer_id, intn image_id);
|
||||
|
||||
extern uint
|
||||
LO_EnumerateImages(MWContext *context, int32 layer_id);
|
||||
|
||||
/*
|
||||
* Reflect display layers into Mocha.
|
||||
*/
|
||||
extern JSObject *
|
||||
LM_ReflectLayer(MWContext *context, int32 layer_id, int32 parent_layer_id,
|
||||
PA_Tag *tag);
|
||||
|
||||
extern LO_FormElementStruct *
|
||||
LO_GetFormElementByIndex(struct lo_FormData_struct *form_data, int32 index);
|
||||
|
||||
extern uint
|
||||
LO_EnumerateFormElements(MWContext *context,
|
||||
struct lo_FormData_struct *form_data);
|
||||
|
||||
/*
|
||||
* Layout helper function to find a named anchor by its index in the
|
||||
* document.anchors[] array.
|
||||
*/
|
||||
extern struct lo_NameList_struct *
|
||||
LO_GetNamedAnchorByIndex(MWContext *context, int32 layer_id, uint index);
|
||||
|
||||
extern uint
|
||||
LO_EnumerateNamedAnchors(MWContext *context, int32 layer_id);
|
||||
|
||||
/*
|
||||
* Layout Mocha helper function to find an HREF Anchor by its index in the
|
||||
* document.links[] array.
|
||||
*/
|
||||
extern LO_AnchorData *
|
||||
LO_GetLinkByIndex(MWContext *context, int32 layer_id, uint index);
|
||||
|
||||
extern uint
|
||||
LO_EnumerateLinks(MWContext *context, int32 layer_id);
|
||||
|
||||
extern LO_JavaAppStruct *
|
||||
LO_GetAppletByIndex(MWContext *context, int32 layer_id, uint index);
|
||||
|
||||
extern uint
|
||||
LO_EnumerateApplets(MWContext *context, int32 layer_id);
|
||||
|
||||
extern LO_EmbedStruct *
|
||||
LO_GetEmbedByIndex(MWContext *context, int32 layer_id, uint index);
|
||||
|
||||
extern uint
|
||||
LO_EnumerateEmbeds(MWContext *context, int32 layer_id);
|
||||
|
||||
/*
|
||||
* Get and set a color attribute in the current document state.
|
||||
*/
|
||||
extern void
|
||||
LO_GetDocumentColor(MWContext *context, int type, LO_Color *color);
|
||||
|
||||
extern void
|
||||
LO_SetDocumentColor(MWContext *context, int type, LO_Color *color);
|
||||
|
||||
/*
|
||||
* Layout function to reallocate the lo_FormElementOptionData array pointed at
|
||||
* by lo_FormElementSelectData's options member to include space for the number
|
||||
* of options given by selectData->option_cnt.
|
||||
*/
|
||||
extern XP_Bool
|
||||
LO_ResizeSelectOptions(lo_FormElementSelectData *selectData);
|
||||
|
||||
/*
|
||||
* Discard the current document and all its subsidiary objects.
|
||||
*/
|
||||
extern void
|
||||
LM_ReleaseDocument(MWContext *context, JSBool resize_reload);
|
||||
|
||||
/*
|
||||
* Search if a the event is being captured in the frame hierarchy.
|
||||
*/
|
||||
extern XP_Bool
|
||||
LM_EventCaptureCheck(MWContext *context, uint32 current_event);
|
||||
|
||||
/*
|
||||
* Scroll a window to the given point.
|
||||
*/
|
||||
extern void LM_SendOnScroll(MWContext *context, int32 x, int32 y);
|
||||
|
||||
/*
|
||||
* Display a help topic.
|
||||
*/
|
||||
extern void LM_SendOnHelp(MWContext *context);
|
||||
|
||||
/*
|
||||
* Send a load or abort event for an image to a callback.
|
||||
*/
|
||||
typedef enum LM_ImageEvent {
|
||||
LM_IMGUNBLOCK = 0,
|
||||
LM_IMGLOAD = 1,
|
||||
LM_IMGABORT = 2,
|
||||
LM_IMGERROR = 3,
|
||||
LM_LASTEVENT = 3
|
||||
} LM_ImageEvent;
|
||||
|
||||
extern void
|
||||
LM_ProcessImageEvent(MWContext *context, LO_ImageStruct *image_data,
|
||||
LM_ImageEvent event);
|
||||
|
||||
/* This should be called when a named anchor is located. */
|
||||
extern JSBool
|
||||
LM_SendOnLocate(MWContext *context, struct lo_NameList_struct *name_rec);
|
||||
|
||||
extern JSObject *
|
||||
LM_ReflectApplet(MWContext *context, LO_JavaAppStruct *applet_data,
|
||||
PA_Tag * tag, int32 layer_id, uint index);
|
||||
|
||||
extern JSObject *
|
||||
LM_ReflectEmbed(MWContext *context, LO_EmbedStruct *lo_embed,
|
||||
PA_Tag * tag, int32 layer_id, uint index);
|
||||
|
||||
struct lo_FormData_struct;
|
||||
struct lo_NameList_struct;
|
||||
|
||||
extern JSObject *
|
||||
LM_ReflectForm(MWContext *context, struct lo_FormData_struct *form_data,
|
||||
PA_Tag * tag, int32 layer_id, uint index);
|
||||
|
||||
extern JSObject *
|
||||
LM_ReflectFormElement(MWContext *context, int32 layer_id, int32 form_id,
|
||||
int32 element_id, PA_Tag * tag);
|
||||
|
||||
extern JSObject *
|
||||
LM_ReflectLink(MWContext *context, LO_AnchorData *anchor_data, PA_Tag * tag,
|
||||
int32 layer_id, uint index);
|
||||
|
||||
extern JSObject *
|
||||
LM_ReflectNamedAnchor(MWContext *context, struct lo_NameList_struct *name_rec,
|
||||
PA_Tag * tag, int32 layer_id, uint index);
|
||||
|
||||
extern JSObject *
|
||||
LM_ReflectImage(MWContext *context, LO_ImageStruct *image_data,
|
||||
PA_Tag * tag, int32 layer_id, uint index);
|
||||
|
||||
extern JSBool
|
||||
LM_CanDoJS(MWContext *context);
|
||||
|
||||
extern JSBool
|
||||
LM_IsActive(MWContext *context);
|
||||
|
||||
/*
|
||||
* Security.
|
||||
*/
|
||||
|
||||
extern JSPrincipals *
|
||||
LM_NewJSPrincipals(URL_Struct *archive, char *name, const char *codebase);
|
||||
|
||||
extern char *
|
||||
LM_ExtractFromPrincipalsArchive(JSPrincipals *principals, char *name,
|
||||
uint *length);
|
||||
|
||||
extern JSBool
|
||||
LM_SetUntransformedSource(JSPrincipals *principals, char *original,
|
||||
char *transformed);
|
||||
|
||||
extern JSPrincipals * PR_CALLBACK
|
||||
LM_GetJSPrincipalsFromJavaCaller(JSContext *cx, int callerDepth);
|
||||
|
||||
/*
|
||||
* LM_RegisterPrincipals will verify and register a set of principals
|
||||
* in the decoder, modifying decoder->principals in the process. It
|
||||
* returns the modified decoder.
|
||||
*
|
||||
* The "name" parameter may be NULL if "principals" was created with a name.
|
||||
*/
|
||||
|
||||
extern JSPrincipals *
|
||||
LM_RegisterPrincipals(MochaDecoder *decoder, JSPrincipals *principals,
|
||||
char *name, char *src);
|
||||
/*
|
||||
* JavaScript Debugger support
|
||||
*/
|
||||
#ifdef JSDEBUGGER
|
||||
|
||||
extern NET_StreamClass*
|
||||
LM_StreamBuilder( int format_out,
|
||||
void *data_obj,
|
||||
URL_Struct *URL_s,
|
||||
MWContext *mwcontext );
|
||||
|
||||
extern JSBool
|
||||
LM_GetJSDebugActive(void);
|
||||
|
||||
extern void
|
||||
LM_JamSourceIntoJSDebug( const char *filename,
|
||||
const char *str,
|
||||
int32 len,
|
||||
MWContext *mwcontext );
|
||||
|
||||
#endif
|
||||
|
||||
NSPR_END_EXTERN_C
|
||||
|
||||
#endif /* libmocha_h___ */
|
||||
29
mozilla/include/libnet.h
Normal file
29
mozilla/include/libnet.h
Normal file
@@ -0,0 +1,29 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
/*-----------------------------------------------------------------------------
|
||||
Collection of all the public libnet functions
|
||||
-----------------------------------------------------------------------------*/
|
||||
#ifndef _libnet_
|
||||
#define _libnet_
|
||||
|
||||
#include "mkutils.h"
|
||||
#include "mkstream.h"
|
||||
#include "mkgeturl.h"
|
||||
|
||||
#endif /* _libnet_ */
|
||||
|
||||
35
mozilla/include/libstyle.h
Normal file
35
mozilla/include/libstyle.h
Normal file
@@ -0,0 +1,35 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
|
||||
/* libstyle.h --- Exported style sheet routines */
|
||||
|
||||
#ifndef __LIBSTYLE_H_
|
||||
#define __LIBSTYLE_H_
|
||||
|
||||
#include "xp_core.h"
|
||||
#include "libmocha.h"
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
extern JSBool
|
||||
JSS_ResolveDocName(JSContext *mc, MWContext *context, JSObject *obj, jsval id);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* __LIBSTYLE_H_ */
|
||||
1317
mozilla/include/lo_ele.h
Normal file
1317
mozilla/include/lo_ele.h
Normal file
File diff suppressed because it is too large
Load Diff
93
mozilla/include/m_cvstrm.h
Normal file
93
mozilla/include/m_cvstrm.h
Normal file
@@ -0,0 +1,93 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
** Mac_Convert_Stream.h
|
||||
** --------------------
|
||||
**
|
||||
** The header file for the constructing functions of apple file
|
||||
** encode/decode stream.
|
||||
**
|
||||
** 27sep95 mym created.
|
||||
*/
|
||||
|
||||
#ifndef M_CVStrm_h
|
||||
#define M_CVStrm_h
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
PUBLIC NET_StreamClass *
|
||||
fe_MakeBinHexEncodeStream (int format_out,
|
||||
void *data_obj,
|
||||
URL_Struct *URL_s,
|
||||
MWContext *window_id,
|
||||
char* dst_filename);
|
||||
|
||||
PUBLIC NET_StreamClass *
|
||||
fe_MakeBinHexDecodeStream (int format_out,
|
||||
void *data_obj,
|
||||
URL_Struct *URL_s,
|
||||
MWContext *window_id );
|
||||
|
||||
PUBLIC NET_StreamClass *
|
||||
fe_MakeAppleDoubleDecodeStream (int format_out,
|
||||
void *data_obj,
|
||||
URL_Struct *URL_s,
|
||||
MWContext *window_id,
|
||||
XP_Bool write_as_binhex,
|
||||
char *dst_filename);
|
||||
|
||||
PUBLIC NET_StreamClass *
|
||||
fe_MakeAppleSingleDecodeStream (int format_out,
|
||||
void *data_obj,
|
||||
URL_Struct *URL_s,
|
||||
MWContext *window_id,
|
||||
XP_Bool write_as_binhex,
|
||||
char *dst_filename);
|
||||
|
||||
#ifdef XP_MAC
|
||||
|
||||
PUBLIC NET_StreamClass *
|
||||
fe_MakeAppleDoubleEncodeStream (int format_out,
|
||||
void *data_obj,
|
||||
URL_Struct *URL_s,
|
||||
MWContext *window_id,
|
||||
char* src_filename,
|
||||
char* dst_filename,
|
||||
char* separator);
|
||||
|
||||
XP_Bool isMacFile(char* filename);
|
||||
|
||||
#endif
|
||||
|
||||
PUBLIC NET_StreamClass *
|
||||
fe_MakeAppleDoubleDecodeStream_1 (int format_out,
|
||||
void *data_obj,
|
||||
URL_Struct *URL_s,
|
||||
MWContext *window_id);
|
||||
|
||||
PUBLIC NET_StreamClass *
|
||||
fe_MakeAppleSingleDecodeStream_1 (int format_out,
|
||||
void *data_obj,
|
||||
URL_Struct *URL_s,
|
||||
MWContext *window_id);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif
|
||||
56
mozilla/include/makefile.win
Normal file
56
mozilla/include/makefile.win
Normal file
@@ -0,0 +1,56 @@
|
||||
#!gmake
|
||||
#
|
||||
# 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.
|
||||
|
||||
|
||||
|
||||
#//------------------------------------------------------------------------
|
||||
#//
|
||||
#// Makefile to install NSPR/INCLUDE header files into the distribution
|
||||
#// directory.
|
||||
#//
|
||||
#//------------------------------------------------------------------------
|
||||
|
||||
|
||||
#//------------------------------------------------------------------------
|
||||
#//
|
||||
#// Specify the depth of the current directory relative to the
|
||||
#// root of NS
|
||||
#//
|
||||
#//------------------------------------------------------------------------
|
||||
DEPTH = ..
|
||||
|
||||
#//------------------------------------------------------------------------
|
||||
#//
|
||||
#// Specify any "command" targets. (ie. DIRS, INSTALL_FILES, ...)
|
||||
#// (these must come before the common makefiles are included)
|
||||
#//
|
||||
#// DIRS - There is a subdirectory to process
|
||||
#// INSTALL_FILES - Files to be installed in the distribution area
|
||||
#//
|
||||
#//------------------------------------------------------------------------
|
||||
#INSTALL_FILE_LIST=*.h
|
||||
#INSTALL_DIR=$(XPDIST)\public\coreincl
|
||||
|
||||
#//------------------------------------------------------------------------
|
||||
#//
|
||||
#// Include the common makefile rules
|
||||
#//
|
||||
#//------------------------------------------------------------------------
|
||||
include <$(DEPTH)/config/rules.mak>
|
||||
|
||||
#export:: INSTALL_FILES
|
||||
|
||||
443
mozilla/include/mcom_db.h
Normal file
443
mozilla/include/mcom_db.h
Normal file
@@ -0,0 +1,443 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)db.h 8.7 (Berkeley) 6/16/94
|
||||
*/
|
||||
|
||||
#ifndef _DB_H_
|
||||
#define _DB_H_
|
||||
|
||||
#include "prtypes.h"
|
||||
|
||||
#ifdef __sgi
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#define BIG_ENDIAN 4321
|
||||
#define LITTLE_ENDIAN 1234 /* LSB first: i386, vax, all NT risc */
|
||||
#define __BIT_TYPES_DEFINED__
|
||||
#endif
|
||||
|
||||
#ifdef __sun
|
||||
#define BIG_ENDIAN 4321
|
||||
#define LITTLE_ENDIAN 1234 /* LSB first: i386, vax, all NT risc */
|
||||
|
||||
#ifndef SVR4
|
||||
/* compat.h is only in 4.1.3 machines. - dp */
|
||||
#include <compat.h>
|
||||
#endif
|
||||
|
||||
/* XXX - dp
|
||||
* Need to find a general way of defining endian-ness in SunOS 5.3
|
||||
* SunOS 5.4 defines _BIG_ENDIAN and _LITTLE_ENDIAN
|
||||
* SunOS 5.3 does nothing like this.
|
||||
*/
|
||||
|
||||
#ifndef BYTE_ORDER
|
||||
|
||||
#if defined(_BIG_ENDIAN)
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#elif defined(_LITTLE_ENDIAN)
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#elif !defined(SVR4)
|
||||
/* 4.1.3 is always BIG_ENDIAN as it was released only on sparc platforms. */
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#elif !defined(vax) && !defined(ntohl) && !defined(lint) && !defined(i386)
|
||||
/* 5.3 big endian. Copied this above line from sys/byteorder.h */
|
||||
/* Now we are in a 5.3 SunOS rather non 5.4 or above SunOS */
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#else
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#endif
|
||||
|
||||
#endif /* !BYTE_ORDER */
|
||||
#endif /* __sun */
|
||||
|
||||
#ifdef __linux
|
||||
# include <endian.h>
|
||||
# ifndef BYTE_ORDER
|
||||
# define BYTE_ORDER __BYTE_ORDER
|
||||
# define BIG_ENDIAN __BIG_ENDIAN
|
||||
# define LITTLE_ENDIAN __LITTLE_ENDIAN
|
||||
# endif
|
||||
#endif /* __linux */
|
||||
|
||||
#if defined(SCO) || defined(UNIXWARE) || defined(SNI) || defined(NCR) || defined(NEC)
|
||||
#include <sys/types.h>
|
||||
#include <sys/byteorder.h>
|
||||
#endif
|
||||
|
||||
#ifdef SCO
|
||||
#include <sys/bitypes.h>
|
||||
#define MAXPATHLEN 1024
|
||||
#endif
|
||||
|
||||
#ifdef SNI
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#define BIG_ENDIAN 4321
|
||||
#define LITTLE_ENDIAN 1234
|
||||
#endif
|
||||
|
||||
#ifdef NCR
|
||||
#include <sys/endian.h>
|
||||
#endif
|
||||
|
||||
#ifdef macintosh
|
||||
#include <unix.h>
|
||||
#endif
|
||||
|
||||
#ifndef macintosh
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
|
||||
#if defined(_WINDOWS) || defined(XP_OS2)
|
||||
#include <stdio.h>
|
||||
#include <io.h>
|
||||
#include <limits.h>
|
||||
|
||||
#ifndef XP_OS2
|
||||
#define MAXPATHLEN 1024
|
||||
#else
|
||||
#include "os2file.h" /* includes dirent.h */
|
||||
#endif
|
||||
|
||||
#define EFTYPE EINVAL /* POSIX 1003.1 format errno. */
|
||||
|
||||
#ifndef STDERR_FILENO
|
||||
#define STDIN_FILENO 0 /* ANSI C #defines */
|
||||
#define STDOUT_FILENO 1
|
||||
#define STDERR_FILENO 2
|
||||
#endif
|
||||
|
||||
#ifndef O_ACCMODE /* POSIX 1003.1 access mode mask. */
|
||||
#define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR)
|
||||
#endif
|
||||
|
||||
#ifdef BYTE_ORDER
|
||||
#undef BYTE_ORDER
|
||||
#endif
|
||||
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#define LITTLE_ENDIAN 1234 /* LSB first: i386, vax, all NT risc */
|
||||
#define BIG_ENDIAN 4321
|
||||
#endif
|
||||
|
||||
#if defined(_WINDOWS) && !defined(_WIN32)
|
||||
/* 16 bit windows defines */
|
||||
#define MAX_PAGE_NUMBER 0xffffffff /* >= # of pages in a file */
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef macintosh
|
||||
#include <stdio.h>
|
||||
#include "xp_mcom.h"
|
||||
#ifndef NSPR20
|
||||
#include "prmacos.h"
|
||||
#endif
|
||||
#define BIG_ENDIAN 4321
|
||||
#define LITTLE_ENDIAN 1234
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#define O_ACCMODE 3 /* Mask for file access modes */
|
||||
#define EFTYPE 2000
|
||||
XP_BEGIN_PROTOS
|
||||
int mkstemp(const char *path);
|
||||
XP_END_PROTOS
|
||||
#endif /* MACINTOSH */
|
||||
|
||||
#if defined(XP_OS2)
|
||||
#include <xp_mcom.h>
|
||||
#include <pros2os.h>
|
||||
XP_BEGIN_PROTOS
|
||||
int mkstemp(char *path);
|
||||
XP_END_PROTOS
|
||||
#endif
|
||||
|
||||
#ifndef macintosh
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#if !defined(_WINDOWS) && !defined(macintosh) && !defined(XP_OS2)
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#endif
|
||||
|
||||
#include "cdefs.h"
|
||||
|
||||
#ifndef _WINDOWS /* included above to prevent spurious warnings chouck 12-Sep-95 */
|
||||
#include <limits.h>
|
||||
#endif
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
|
||||
#endif
|
||||
|
||||
#ifndef MAX
|
||||
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
|
||||
#endif
|
||||
|
||||
#define RET_ERROR -1 /* Return values. */
|
||||
#define RET_SUCCESS 0
|
||||
#define RET_SPECIAL 1
|
||||
|
||||
#if defined(__386BSD__) || defined(SCO)
|
||||
#define __BIT_TYPES_DEFINED__
|
||||
#endif
|
||||
|
||||
#define MAX_PAGE_NUMBER 0xffffffff /* >= # of pages in a file */
|
||||
|
||||
#ifndef __sgi
|
||||
typedef uint32 pgno_t;
|
||||
#endif
|
||||
|
||||
#define MAX_PAGE_OFFSET 65535 /* >= # of bytes in a page */
|
||||
typedef uint16 indx_t;
|
||||
#define MAX_REC_NUMBER 0xffffffff /* >= # of records in a tree */
|
||||
typedef uint32 recno_t;
|
||||
|
||||
/* define EFTYPE since most don't */
|
||||
#ifndef EFTYPE
|
||||
#define EFTYPE EINVAL /* POSIX 1003.1 format errno. */
|
||||
#endif
|
||||
|
||||
/* Key/data structure -- a Data-Base Thang. */
|
||||
typedef struct {
|
||||
void *data; /* data */
|
||||
size_t size; /* data length */
|
||||
} DBT;
|
||||
|
||||
/* Routine flags. */
|
||||
#define R_CURSOR 1 /* del, put, seq */
|
||||
#define __R_UNUSED 2 /* UNUSED */
|
||||
#define R_FIRST 3 /* seq */
|
||||
#define R_IAFTER 4 /* put (RECNO) */
|
||||
#define R_IBEFORE 5 /* put (RECNO) */
|
||||
#define R_LAST 6 /* seq (BTREE, RECNO) */
|
||||
#define R_NEXT 7 /* seq */
|
||||
#define R_NOOVERWRITE 8 /* put */
|
||||
#define R_PREV 9 /* seq (BTREE, RECNO) */
|
||||
#define R_SETCURSOR 10 /* put (RECNO) */
|
||||
#define R_RECNOSYNC 11 /* sync (RECNO) */
|
||||
|
||||
typedef enum { DB_BTREE, DB_HASH, DB_RECNO } DBTYPE;
|
||||
|
||||
typedef enum { LockOutDatabase, UnlockDatabase } DBLockFlagEnum;
|
||||
|
||||
/*
|
||||
* !!!
|
||||
* The following flags are included in the dbopen(3) call as part of the
|
||||
* open(2) flags. In order to avoid conflicts with the open flags, start
|
||||
* at the top of the 16 or 32-bit number space and work our way down. If
|
||||
* the open flags were significantly expanded in the future, it could be
|
||||
* a problem. Wish I'd left another flags word in the dbopen call.
|
||||
*
|
||||
* !!!
|
||||
* None of this stuff is implemented yet. The only reason that it's here
|
||||
* is so that the access methods can skip copying the key/data pair when
|
||||
* the DB_LOCK flag isn't set.
|
||||
*/
|
||||
#if UINT_MAX > 65535
|
||||
#define DB_LOCK 0x20000000 /* Do locking. */
|
||||
#define DB_SHMEM 0x40000000 /* Use shared memory. */
|
||||
#define DB_TXN 0x80000000 /* Do transactions. */
|
||||
#else
|
||||
#define DB_LOCK 0x2000 /* Do locking. */
|
||||
#define DB_SHMEM 0x4000 /* Use shared memory. */
|
||||
#define DB_TXN 0x8000 /* Do transactions. */
|
||||
#endif
|
||||
|
||||
/* Access method description structure. */
|
||||
typedef struct __db {
|
||||
DBTYPE type; /* Underlying db type. */
|
||||
int (*close) (struct __db *);
|
||||
int (*del) (const struct __db *, const DBT *, uint);
|
||||
int (*get) (const struct __db *, const DBT *, DBT *, uint);
|
||||
int (*put) (const struct __db *, DBT *, const DBT *, uint);
|
||||
int (*seq) (const struct __db *, DBT *, DBT *, uint);
|
||||
int (*sync) (const struct __db *, uint);
|
||||
void *internal; /* Access method private. */
|
||||
int (*fd) (const struct __db *);
|
||||
} DB;
|
||||
|
||||
#define BTREEMAGIC 0x053162
|
||||
#define BTREEVERSION 3
|
||||
|
||||
/* Structure used to pass parameters to the btree routines. */
|
||||
typedef struct {
|
||||
#define R_DUP 0x01 /* duplicate keys */
|
||||
uint32 flags;
|
||||
uint cachesize; /* bytes to cache */
|
||||
int maxkeypage; /* maximum keys per page */
|
||||
int minkeypage; /* minimum keys per page */
|
||||
uint psize; /* page size */
|
||||
int (*compare) /* comparison function */
|
||||
(const DBT *, const DBT *);
|
||||
size_t (*prefix) /* prefix function */
|
||||
(const DBT *, const DBT *);
|
||||
int lorder; /* byte order */
|
||||
} BTREEINFO;
|
||||
|
||||
#define HASHMAGIC 0x061561
|
||||
#define HASHVERSION 2
|
||||
|
||||
/* Structure used to pass parameters to the hashing routines. */
|
||||
typedef struct {
|
||||
uint bsize; /* bucket size */
|
||||
uint ffactor; /* fill factor */
|
||||
uint nelem; /* number of elements */
|
||||
uint cachesize; /* bytes to cache */
|
||||
uint32 /* hash function */
|
||||
(*hash) (const void *, size_t);
|
||||
int lorder; /* byte order */
|
||||
} HASHINFO;
|
||||
|
||||
/* Structure used to pass parameters to the record routines. */
|
||||
typedef struct {
|
||||
#define R_FIXEDLEN 0x01 /* fixed-length records */
|
||||
#define R_NOKEY 0x02 /* key not required */
|
||||
#define R_SNAPSHOT 0x04 /* snapshot the input */
|
||||
uint32 flags;
|
||||
uint cachesize; /* bytes to cache */
|
||||
uint psize; /* page size */
|
||||
int lorder; /* byte order */
|
||||
size_t reclen; /* record length (fixed-length records) */
|
||||
uint8 bval; /* delimiting byte (variable-length records */
|
||||
char *bfname; /* btree file name */
|
||||
} RECNOINFO;
|
||||
|
||||
/* #ifdef __DBINTERFACE_PRIVATE */
|
||||
/*
|
||||
* Little endian <==> big endian 32-bit swap macros.
|
||||
* M_32_SWAP swap a memory location
|
||||
* P_32_SWAP swap a referenced memory location
|
||||
* P_32_COPY swap from one location to another
|
||||
*/
|
||||
#define M_32_SWAP(a) { \
|
||||
uint32 _tmp = a; \
|
||||
((char *)&a)[0] = ((char *)&_tmp)[3]; \
|
||||
((char *)&a)[1] = ((char *)&_tmp)[2]; \
|
||||
((char *)&a)[2] = ((char *)&_tmp)[1]; \
|
||||
((char *)&a)[3] = ((char *)&_tmp)[0]; \
|
||||
}
|
||||
#define P_32_SWAP(a) { \
|
||||
uint32 _tmp = *(uint32 *)a; \
|
||||
((char *)a)[0] = ((char *)&_tmp)[3]; \
|
||||
((char *)a)[1] = ((char *)&_tmp)[2]; \
|
||||
((char *)a)[2] = ((char *)&_tmp)[1]; \
|
||||
((char *)a)[3] = ((char *)&_tmp)[0]; \
|
||||
}
|
||||
#define P_32_COPY(a, b) { \
|
||||
((char *)&(b))[0] = ((char *)&(a))[3]; \
|
||||
((char *)&(b))[1] = ((char *)&(a))[2]; \
|
||||
((char *)&(b))[2] = ((char *)&(a))[1]; \
|
||||
((char *)&(b))[3] = ((char *)&(a))[0]; \
|
||||
}
|
||||
|
||||
/*
|
||||
* Little endian <==> big endian 16-bit swap macros.
|
||||
* M_16_SWAP swap a memory location
|
||||
* P_16_SWAP swap a referenced memory location
|
||||
* P_16_COPY swap from one location to another
|
||||
*/
|
||||
#define M_16_SWAP(a) { \
|
||||
uint16 _tmp = a; \
|
||||
((char *)&a)[0] = ((char *)&_tmp)[1]; \
|
||||
((char *)&a)[1] = ((char *)&_tmp)[0]; \
|
||||
}
|
||||
#define P_16_SWAP(a) { \
|
||||
uint16 _tmp = *(uint16 *)a; \
|
||||
((char *)a)[0] = ((char *)&_tmp)[1]; \
|
||||
((char *)a)[1] = ((char *)&_tmp)[0]; \
|
||||
}
|
||||
#define P_16_COPY(a, b) { \
|
||||
((char *)&(b))[0] = ((char *)&(a))[1]; \
|
||||
((char *)&(b))[1] = ((char *)&(a))[0]; \
|
||||
}
|
||||
/* #endif */
|
||||
|
||||
__BEGIN_DECLS
|
||||
DB *dbopen (const char *, int, int, DBTYPE, const void *);
|
||||
|
||||
/* set or unset a global lock flag to disable the
|
||||
* opening of any DBM file
|
||||
*/
|
||||
void dbSetOrClearDBLock(DBLockFlagEnum type);
|
||||
|
||||
/* #ifdef __DBINTERFACE_PRIVATE */
|
||||
DB *__bt_open (const char *, int, int, const BTREEINFO *, int);
|
||||
DB *__hash_open (const char *, int, int, const HASHINFO *, int);
|
||||
DB *__rec_open (const char *, int, int, const RECNOINFO *, int);
|
||||
void __dbpanic (DB *dbp);
|
||||
/* #endif */
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#if defined(linux) && !defined(MACLINUX)
|
||||
/*
|
||||
* Why you would want to override the system defines?
|
||||
*/
|
||||
#if BYTE_ORDER != LITTLE_ENDIAN
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__hpux) || defined(__hppa)
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#define BIG_ENDIAN 4321
|
||||
#define LITTLE_ENDIAN 1234 /* LSB first: i386, vax, all NT risc */
|
||||
#endif
|
||||
|
||||
#if defined(AIXV3)
|
||||
/* BYTE_ORDER, LITTLE_ENDIAN, BIG_ENDIAN are all defined here */
|
||||
#include <sys/machine.h>
|
||||
#endif
|
||||
|
||||
#ifdef __alpha
|
||||
#include <endian.h>
|
||||
#endif
|
||||
|
||||
#endif /* !_DB_H_ */
|
||||
94
mozilla/include/mcom_ndbm.h
Normal file
94
mozilla/include/mcom_ndbm.h
Normal file
@@ -0,0 +1,94 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Margo Seltzer.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ndbm.h 8.1 (Berkeley) 6/2/93
|
||||
*/
|
||||
|
||||
#ifndef _NDBM_H_
|
||||
#define _NDBM_H_
|
||||
|
||||
#include "mcom_db.h"
|
||||
|
||||
/* Map dbm interface onto db(3). */
|
||||
#define DBM_RDONLY O_RDONLY
|
||||
|
||||
/* Flags to dbm_store(). */
|
||||
#define DBM_INSERT 0
|
||||
#define DBM_REPLACE 1
|
||||
|
||||
/*
|
||||
* The db(3) support for ndbm(3) always appends this suffix to the
|
||||
* file name to avoid overwriting the user's original database.
|
||||
*/
|
||||
#define DBM_SUFFIX ".db"
|
||||
|
||||
typedef struct {
|
||||
char *dptr;
|
||||
int dsize;
|
||||
} datum;
|
||||
|
||||
typedef DB DBM;
|
||||
#define dbm_pagfno(a) DBM_PAGFNO_NOT_AVAILABLE
|
||||
|
||||
__BEGIN_DECLS
|
||||
void dbm_close (DBM *);
|
||||
int dbm_delete (DBM *, datum);
|
||||
datum dbm_fetch (DBM *, datum);
|
||||
datum dbm_firstkey (DBM *);
|
||||
long dbm_forder (DBM *, datum);
|
||||
datum dbm_nextkey (DBM *);
|
||||
DBM *dbm_open (const char *, int, int);
|
||||
int dbm_store (DBM *, datum, datum, int);
|
||||
int dbm_dirfno (DBM *);
|
||||
__END_DECLS
|
||||
|
||||
#endif /* !_NDBM_H_ */
|
||||
74
mozilla/include/merrors.h
Normal file
74
mozilla/include/merrors.h
Normal file
@@ -0,0 +1,74 @@
|
||||
/* -*- Mode: C; tab-width: 8; 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.
|
||||
*/
|
||||
|
||||
|
||||
/* merrors.h --- error codes for netlib. */
|
||||
|
||||
|
||||
#ifndef _MERRORS_H_
|
||||
#define _MERRORS_H_
|
||||
|
||||
/*
|
||||
* Return codes
|
||||
*/
|
||||
|
||||
#define MK_INTERRUPTED -201
|
||||
|
||||
#define MK_UNABLE_TO_CONVERT -208
|
||||
|
||||
#define MK_UNABLE_TO_LOGIN -210
|
||||
|
||||
#define MK_NO_NEWS_SERVER -224
|
||||
#define MK_USE_FTP_INSTEAD -225
|
||||
#define MK_USE_COPY_FROM_CACHE -226
|
||||
#define MK_EMPTY_NEWS_LIST -227
|
||||
|
||||
#define MK_MAILTO_NOT_READY -228
|
||||
|
||||
#define MK_OBJECT_NOT_IN_CACHE -239
|
||||
|
||||
#define MK_UNABLE_TO_LISTEN_ON_SOCKET -244
|
||||
|
||||
#define MK_WAITING_FOR_LOOKUP -248 /* response for async dns */
|
||||
#define MK_DO_REDIRECT -249 /* tells mkgeturl to redirect */
|
||||
|
||||
#define MK_MIME_NEED_B64 -270 /* used internally */
|
||||
#define MK_MIME_NEED_QP -271 /* used internally */
|
||||
#define MK_MIME_NEED_TEXT_CONVERTER -272 /* used internally */
|
||||
#define MK_MIME_NEED_PS_CONVERTER -273 /* used internally */
|
||||
|
||||
#define MK_IMAGE_LOSSAGE -277
|
||||
|
||||
#define MK_TOO_MANY_OPEN_FILES -310
|
||||
|
||||
#define MK_FILE_WRITE_ERROR -350
|
||||
|
||||
#define MK_GET_REST_OF_PARTIAL_FILE_FROM_NETWORK -399
|
||||
|
||||
#define MK_MULTIPART_MESSAGE_COMPLETED -437
|
||||
|
||||
#define MK_OFFLINE -438
|
||||
|
||||
/* success codes */
|
||||
#define MK_DATA_LOADED 1
|
||||
#define MK_NO_DATA 2
|
||||
#define MK_NO_ACTION 3
|
||||
#define MK_CHANGING_CONTEXT 4
|
||||
|
||||
|
||||
#endif /* _MERRORS_H_ */
|
||||
115
mozilla/include/mime.h
Normal file
115
mozilla/include/mime.h
Normal file
@@ -0,0 +1,115 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef MIME_H
|
||||
#define MIME_H
|
||||
|
||||
#include "ntypes.h"
|
||||
#include "mimeenc.h"
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
extern PUBLIC const char *FE_UsersOrganization(void);
|
||||
|
||||
|
||||
/* Returns the appropriate contents of a From: field of a mail message
|
||||
originating from the current user. This calls FE_UsersFullName()
|
||||
and FE_UsersMailAddress() and correctly munges the values, using
|
||||
MSG_MakeFullAddress()
|
||||
|
||||
A new string is returned, which you must free when you're done with it.
|
||||
*/
|
||||
extern PUBLIC char *MIME_MakeFromField (void);
|
||||
|
||||
extern PUBLIC void MISC_ValidateSignature (MWContext *context,
|
||||
const char *sig);
|
||||
|
||||
/* This does a very rough sanity-check on the return email address specified
|
||||
in preferences, and pops up a dialog and returns negative if there is
|
||||
something obviously wrong. MSG_ComposeMessage() calls this, and won't
|
||||
let messages be composed until the problem is corrected. The FEs should
|
||||
call this after preferences have been edited as well.
|
||||
|
||||
The address should be just the email address, not including the real name.
|
||||
*/
|
||||
extern PUBLIC int MISC_ValidateReturnAddress (MWContext *context,
|
||||
const char *addr);
|
||||
|
||||
|
||||
/* Convert a block of text to the MIME quoted-printable encoding.
|
||||
Returns a new string and its size, or NULL if it couldn't allocate.
|
||||
*/
|
||||
extern PUBLIC void MIME_EncodeQuotedPrintableString(const unsigned char *input,
|
||||
uint32 input_size,
|
||||
unsigned char **output,
|
||||
uint32 *output_size);
|
||||
|
||||
/* Convert a block of text to the MIME base64 encoding.
|
||||
Returns a new string and its size, or NULL if it couldn't allocate.
|
||||
*/
|
||||
extern PUBLIC void MIME_EncodeBase64String(const unsigned char *input,
|
||||
uint32 input_size,
|
||||
unsigned char **output,
|
||||
uint32 *output_size);
|
||||
|
||||
/* build a mailto: url address given a to field
|
||||
*
|
||||
* returns a malloc'd string
|
||||
*/
|
||||
extern char *
|
||||
MIME_BuildMailtoURLAddress(const char * to);
|
||||
|
||||
/* build a news: url address to post to, given a partial news-post
|
||||
* URL and the newsgroups line
|
||||
*
|
||||
* returns a malloc'd string
|
||||
*/
|
||||
extern char *
|
||||
MIME_BuildNewspostURLAddress(const char *partial_newspost_url,
|
||||
const char *newsgroups);
|
||||
|
||||
/* If the argument is true, we use quoted-printable encoding on mail and
|
||||
news messages which have 8bit characters in them. Otherwise, we assume
|
||||
that the mail and news transport will not strip the eighth bit (a bad
|
||||
assumption.) */
|
||||
extern void MIME_ConformToStandard (XP_Bool conform_p);
|
||||
|
||||
|
||||
/* Generate headers for a form post to a mailto: URL.
|
||||
This lets the URL specify additional headers, but is careful to
|
||||
ignore headers which would be dangerous. It may modify the URL
|
||||
(because of CC) so a new URL to actually post to is returned.
|
||||
*/
|
||||
extern int MIME_GenerateMailtoFormPostHeaders (const char *old_post_url,
|
||||
const char *referer,
|
||||
char **new_post_url_return,
|
||||
char **headers_return);
|
||||
|
||||
|
||||
extern NET_StreamClass *
|
||||
NET_MimeMakePartialEncodingConverterStream (int format_out,
|
||||
void *data_obj,
|
||||
URL_Struct *URL_s,
|
||||
MWContext *window_id,
|
||||
NET_StreamClass *next_stream);
|
||||
|
||||
extern int MIME_HasAttachments(MWContext *context);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* mime.h */
|
||||
85
mozilla/include/mimeenc.h
Normal file
85
mozilla/include/mimeenc.h
Normal file
@@ -0,0 +1,85 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
/* mimeenc.c --- MIME encoders and decoders, version 2 (see mimei.h)
|
||||
Created: Jamie Zawinski <jwz@netscape.com>, 15-May-96.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _MIMEENC_H_
|
||||
#define _MIMEENC_H_
|
||||
|
||||
#include "xp.h"
|
||||
|
||||
/* This file defines interfaces to generic implementations of Base64,
|
||||
Quoted-Printable, and UU decoders; and of Base64 and Quoted-Printable
|
||||
encoders.
|
||||
*/
|
||||
|
||||
|
||||
/* Opaque objects used by the encoder/decoder to store state. */
|
||||
typedef struct MimeDecoderData MimeDecoderData;
|
||||
typedef struct MimeEncoderData MimeEncoderData;
|
||||
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
/* functions for creating that opaque data.
|
||||
*/
|
||||
MimeDecoderData *MimeB64DecoderInit(int (*output_fn) (const char *buf,
|
||||
int32 size,
|
||||
void *closure),
|
||||
void *closure);
|
||||
MimeDecoderData *MimeQPDecoderInit (int (*output_fn) (const char *buf,
|
||||
int32 size,
|
||||
void *closure),
|
||||
void *closure);
|
||||
MimeDecoderData *MimeUUDecoderInit (int (*output_fn) (const char *buf,
|
||||
int32 size,
|
||||
void *closure),
|
||||
void *closure);
|
||||
|
||||
MimeEncoderData *MimeB64EncoderInit(int (*output_fn) (const char *buf,
|
||||
int32 size,
|
||||
void *closure),
|
||||
void *closure);
|
||||
MimeEncoderData *MimeQPEncoderInit (int (*output_fn) (const char *buf,
|
||||
int32 size,
|
||||
void *closure),
|
||||
void *closure);
|
||||
MimeEncoderData *MimeUUEncoderInit (char *filename,
|
||||
int (*output_fn) (const char *buf,
|
||||
int32 size,
|
||||
void *closure),
|
||||
void *closure);
|
||||
|
||||
/* Push data through the encoder/decoder, causing the above-provided write_fn
|
||||
to be called with encoded/decoded data. */
|
||||
int MimeDecoderWrite (MimeDecoderData *data, const char *buffer, int32 size);
|
||||
int MimeEncoderWrite (MimeEncoderData *data, const char *buffer, int32 size);
|
||||
|
||||
/* When you're done encoding/decoding, call this to free the data. If
|
||||
abort_p is FALSE, then calling this may cause the write_fn to be called
|
||||
one last time (as the last buffered data is flushed out.)
|
||||
*/
|
||||
int MimeDecoderDestroy(MimeDecoderData *data, XP_Bool abort_p);
|
||||
int MimeEncoderDestroy(MimeEncoderData *data, XP_Bool abort_p);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* _MIMEENC_H_ */
|
||||
123
mozilla/include/minicom.h
Normal file
123
mozilla/include/minicom.h
Normal file
@@ -0,0 +1,123 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Mini Component Object Model
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef MINICOM_H
|
||||
#define MINICOM_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
#if defined(XP_PC) && !defined(XP_OS2)
|
||||
#if defined(_WIN32)
|
||||
#include "objbase.h"
|
||||
#else
|
||||
#include <windows.h>
|
||||
#include "compobj.h"
|
||||
#endif
|
||||
#else /* !XP_PC or XP_OS2*/
|
||||
|
||||
#if defined(XP_OS2)
|
||||
#define TID OS2TID /* global rename in OS2 H's! */
|
||||
#include <os2.h>
|
||||
#undef TID /* and restore */
|
||||
#endif
|
||||
|
||||
typedef struct _GUID {
|
||||
long Data1;
|
||||
short Data2;
|
||||
short Data3;
|
||||
char Data4[8];
|
||||
} GUID;
|
||||
|
||||
typedef GUID IID;
|
||||
typedef GUID CLSID;
|
||||
|
||||
typedef IID* REFIID;
|
||||
typedef GUID* REFGUID;
|
||||
typedef CLSID* REFCLSID;
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define EXTERN_C extern "C"
|
||||
#else
|
||||
#define EXTERN_C
|
||||
#endif /* cplusplus */
|
||||
|
||||
#ifndef INITGUID
|
||||
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
|
||||
EXTERN_C const GUID name
|
||||
#else
|
||||
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
|
||||
EXTERN_C const GUID name \
|
||||
= { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
|
||||
#endif /* INITGUID */
|
||||
|
||||
#endif /* !XP_PC or XP_OS2*/
|
||||
|
||||
#define JRI_DEFINE_GUID(name, l, w1, w2) \
|
||||
DEFINE_GUID(name, l, w1, w2, \
|
||||
0xbb, 0x58, 0x00, 0x80, 0x5f, 0x74, 0x03, 0x79)
|
||||
|
||||
typedef long
|
||||
(*MCOM_QueryInterface_t)(void* self, REFIID id, void* *result);
|
||||
|
||||
typedef long
|
||||
(*MCOM_AddRef_t)(void* self);
|
||||
|
||||
typedef long
|
||||
(*MCOM_Release_t)(void* self);
|
||||
|
||||
#if !defined(XP_PC) || defined(XP_OS2)
|
||||
|
||||
typedef struct IUnknown {
|
||||
MCOM_QueryInterface_t QueryInterface;
|
||||
MCOM_AddRef_t AddRef;
|
||||
MCOM_Release_t Release;
|
||||
} IUnknown;
|
||||
|
||||
#define IUnknown_QueryInterface(self, interfaceID, resultingInterface) \
|
||||
(((*((IUnknown**)self))->QueryInterface)(self, interfaceID, resultingInterface))
|
||||
|
||||
#define IUnknown_AddRef(self) \
|
||||
(((*((IUnknown**)self))->AddRef)(self))
|
||||
|
||||
#define IUnknown_Release(self) \
|
||||
(((*((IUnknown**)self))->Release)(self))
|
||||
|
||||
#endif /* !XP_PC or XP_OS2*/
|
||||
|
||||
typedef long
|
||||
(*MCOM_CreateInstance_t)(void* self, IUnknown* outer, REFIID interfaceID,
|
||||
void** newInstance);
|
||||
|
||||
typedef long
|
||||
(*MCOM_LockServer_t)(void* self, int doLock);
|
||||
|
||||
/******************************************************************************/
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* MINICOM_H */
|
||||
/******************************************************************************/
|
||||
149
mozilla/include/mk_cx_fn.h
Normal file
149
mozilla/include/mk_cx_fn.h
Normal file
@@ -0,0 +1,149 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
** This file is Michael Toy's fault. If you hate it or have troubles figuring
|
||||
** it out, you should bother him about it.
|
||||
**
|
||||
** This file generates both the fields of the front end structure, and the
|
||||
** fe specific prototypes for your front end implementations, AND the
|
||||
** the code to fill in the structure in your context initilization code
|
||||
**
|
||||
** To use it:
|
||||
**
|
||||
** #define MAKE_FE_FUNCS_STRUCT
|
||||
** #include "mk_cx_fn.h"
|
||||
** This will generate the field definitions for the structure.
|
||||
**
|
||||
** #define MAKE_FE_FUNCS_PREFIX(func) prefix_##func
|
||||
** #define MAKE_FE_FUNCS_ASSIGN cx->
|
||||
** #include "mk_cx_fn.h"
|
||||
** Substitute your naming prefix for "prefix" (e.g XFE)
|
||||
** This will generate the assignment statements to fill in the structure,
|
||||
** the definition of MAKE_FE_FUNCS_ASSIGN will be the left hand side of the
|
||||
** assignment statement.
|
||||
**
|
||||
** #define MAKE_FE_FUNCS_PREFIX(func) prefix_##func
|
||||
** #define MAKE_FE_FUNCS_EXTERN
|
||||
** #include "mk_cx_fn.h"
|
||||
** This will generate the prototypes for all your front end functions.
|
||||
*/
|
||||
|
||||
#if defined(MAKE_FE_FUNCS_TYPES)
|
||||
#define FE_DEFINE(func, returns, args) typedef returns (*MAKE_FE_TYPES_PREFIX(func)) args;
|
||||
#elif defined(MAKE_FE_FUNCS_STRUCT)
|
||||
#define FE_DEFINE(func, returns, args) returns (*func) args;
|
||||
#elif defined(MAKE_FE_FUNCS_EXTERN)
|
||||
#define FE_DEFINE(func, returns, args) extern returns MAKE_FE_FUNCS_PREFIX(func) args;
|
||||
#elif defined(MAKE_FE_FUNCS_ASSIGN)
|
||||
#define FE_DEFINE(func, returns, args) MAKE_FE_FUNCS_ASSIGN func = MAKE_FE_FUNCS_PREFIX(func);
|
||||
#elif !defined(FE_DEFINE)
|
||||
You;Should;Read;The;Header;For;This;File;Before;Including;Error;Error;Error;
|
||||
#endif
|
||||
|
||||
FE_DEFINE(CreateNewDocWindow, MWContext*, (MWContext * calling_context,URL_Struct * URL))
|
||||
FE_DEFINE(LayoutNewDocument, void, (MWContext *context, URL_Struct *url_struct, int32 *iWidth, int32 *iHeight, int32 *mWidth, int32 *mHeight))
|
||||
FE_DEFINE(SetDocTitle,void, (MWContext * context, char * title))
|
||||
FE_DEFINE(FinishedLayout,void, (MWContext *context))
|
||||
FE_DEFINE(TranslateISOText,char *, (MWContext * context, int charset, char *ISO_Text))
|
||||
FE_DEFINE(GetTextInfo,int, (MWContext * context, LO_TextStruct *text, LO_TextInfo *text_info))
|
||||
#ifdef XP_MAC
|
||||
FE_DEFINE(MeasureText,int, (MWContext * context, LO_TextStruct *text, short *charLocs))
|
||||
#endif
|
||||
FE_DEFINE(GetEmbedSize,void, (MWContext * context, LO_EmbedStruct *embed_struct, NET_ReloadMethod force_reload))
|
||||
FE_DEFINE(GetJavaAppSize,void, (MWContext * context, LO_JavaAppStruct *java_struct, NET_ReloadMethod force_reload))
|
||||
FE_DEFINE(GetFormElementInfo,void, (MWContext * context, LO_FormElementStruct * form_element))
|
||||
FE_DEFINE(GetFormElementValue,void, (MWContext * context, LO_FormElementStruct * form_element, XP_Bool hide))
|
||||
FE_DEFINE(ResetFormElement,void, (MWContext * context, LO_FormElementStruct * form_element))
|
||||
FE_DEFINE(SetFormElementToggle,void, (MWContext * context, LO_FormElementStruct * form_element, XP_Bool toggle))
|
||||
FE_DEFINE(FreeEmbedElement,void, (MWContext *context, LO_EmbedStruct *))
|
||||
FE_DEFINE(CreateEmbedWindow, void, (MWContext *context, NPEmbeddedApp *app))
|
||||
FE_DEFINE(SaveEmbedWindow, void, (MWContext *context, NPEmbeddedApp *app))
|
||||
FE_DEFINE(RestoreEmbedWindow, void, (MWContext *context, NPEmbeddedApp *app))
|
||||
FE_DEFINE(DestroyEmbedWindow, void, (MWContext *context, NPEmbeddedApp *app))
|
||||
FE_DEFINE(FreeJavaAppElement,void, (MWContext *context, struct LJAppletData *appletData))
|
||||
FE_DEFINE(HideJavaAppElement,void, (MWContext *context, struct LJAppletData *))
|
||||
FE_DEFINE(FreeEdgeElement,void, (MWContext *context, LO_EdgeStruct *))
|
||||
FE_DEFINE(FormTextIsSubmit,void, (MWContext * context, LO_FormElementStruct * form_element))
|
||||
FE_DEFINE(DisplaySubtext,void, (MWContext * context, int iLocation, LO_TextStruct *text, int32 start_pos, int32 end_pos, XP_Bool need_bg))
|
||||
FE_DEFINE(DisplayText,void, (MWContext * context, int iLocation, LO_TextStruct *text, XP_Bool need_bg))
|
||||
FE_DEFINE(DisplayEmbed,void, (MWContext * context, int iLocation ,LO_EmbedStruct *embed_struct))
|
||||
FE_DEFINE(DisplayJavaApp,void, (MWContext * context, int iLocation ,LO_JavaAppStruct *java_struct))
|
||||
FE_DEFINE(DisplayEdge,void, (MWContext * context, int iLocation ,LO_EdgeStruct *edge_struct))
|
||||
FE_DEFINE(DisplayTable,void, (MWContext * context, int iLocation ,LO_TableStruct *table_struct))
|
||||
FE_DEFINE(DisplayCell,void, (MWContext * context, int iLocation ,LO_CellStruct *cell_struct))
|
||||
#ifdef XP_MAC
|
||||
FE_DEFINE(InvalidateEntireTableOrCell,void, (MWContext * context, LO_Element *element))
|
||||
FE_DEFINE(DisplayAddRowOrColBorder,void, (MWContext * context, XP_Rect* r ,XP_Bool bErase))
|
||||
#endif
|
||||
FE_DEFINE(DisplaySubDoc,void, (MWContext * context, int iLocation ,LO_SubDocStruct *subdoc_struct))
|
||||
FE_DEFINE(DisplayLineFeed,void, (MWContext * context, int iLocation , LO_LinefeedStruct *line_feed, XP_Bool need_bg))
|
||||
FE_DEFINE(DisplayHR,void, (MWContext * context, int iLocation , LO_HorizRuleStruct *HR_struct))
|
||||
FE_DEFINE(DisplayBullet,void, (MWContext *context, int iLocation, LO_BullettStruct *bullet))
|
||||
FE_DEFINE(DisplayFormElement,void, (MWContext * context, int iLocation, LO_FormElementStruct * form_element))
|
||||
FE_DEFINE(DisplayBorder,void, (MWContext *context, int iLocation, int x, int y, int width, int height, int bw, LO_Color *color, LO_LineStyle style))
|
||||
#ifdef XP_MAC
|
||||
FE_DEFINE(UpdateEnableStates,void, (MWContext *context))
|
||||
#endif
|
||||
FE_DEFINE(DisplayFeedback,void, (MWContext *context, int iLocation, LO_Element *element))
|
||||
FE_DEFINE(ClearView,void, (MWContext * context, int which))
|
||||
FE_DEFINE(SetDocDimension,void, (MWContext *context, int iLocation, int32 iWidth, int32 iLength))
|
||||
FE_DEFINE(SetDocPosition,void, (MWContext *context, int iLocation, int32 iX, int32 iY))
|
||||
FE_DEFINE(GetDocPosition,void, (MWContext *context, int iLocation, int32 *iX, int32 *iY))
|
||||
FE_DEFINE(BeginPreSection,void, (MWContext *context))
|
||||
FE_DEFINE(EndPreSection,void, (MWContext *context))
|
||||
FE_DEFINE(SetProgressBarPercent,void, (MWContext *context, int32 percent))
|
||||
FE_DEFINE(SetBackgroundColor,void, (MWContext *context, uint8 red, uint8 green, uint8 blue))
|
||||
FE_DEFINE(Progress, void, (MWContext * cx, const char *msg))
|
||||
FE_DEFINE(Alert, void, (MWContext * cx, const char *msg))
|
||||
FE_DEFINE(SetCallNetlibAllTheTime, void, (MWContext * win_id))
|
||||
FE_DEFINE(ClearCallNetlibAllTheTime, void, (MWContext * win_id))
|
||||
FE_DEFINE(GraphProgressInit, void, (MWContext *context, URL_Struct *URL_s, int32 content_length))
|
||||
FE_DEFINE(GraphProgressDestroy, void, (MWContext *context, URL_Struct *URL_s, int32 content_length, int32 total_bytes_read))
|
||||
FE_DEFINE(GraphProgress, void, (MWContext *context, URL_Struct *URL_s, int32 bytes_received, int32 bytes_since_last_time, int32 content_length))
|
||||
FE_DEFINE(UseFancyFTP, XP_Bool, (MWContext * window_id))
|
||||
FE_DEFINE(UseFancyNewsgroupListing, XP_Bool, (MWContext *window_id))
|
||||
FE_DEFINE(FileSortMethod, int, (MWContext * window_id))
|
||||
FE_DEFINE(ShowAllNewsArticles, XP_Bool, (MWContext *window_id))
|
||||
FE_DEFINE(Confirm, XP_Bool,(MWContext * context, const char * Msg))
|
||||
FE_DEFINE(Prompt,char*,(MWContext * context, const char * Msg, const char * dflt))
|
||||
FE_DEFINE(PromptWithCaption,char*,(MWContext * context, const char *caption, const char * Msg, const char * dflt))
|
||||
FE_DEFINE(PromptUsernameAndPassword, XP_Bool, (MWContext *,const char *,char **, char **))
|
||||
FE_DEFINE(PromptPassword,char*,(MWContext * context, const char * Msg))
|
||||
FE_DEFINE(EnableClicking,void,(MWContext*))
|
||||
FE_DEFINE(AllConnectionsComplete,void,(MWContext * context))
|
||||
#ifdef XP_OS2 /* performance */
|
||||
FE_DEFINE(GetMaxWidth,int, (MWContext * context, LO_TextStruct *text))
|
||||
#endif
|
||||
#ifdef LAYERS
|
||||
FE_DEFINE(EraseBackground, void, (MWContext *, int, int32, int32, uint32, uint32, LO_Color *))
|
||||
FE_DEFINE(SetDrawable, void, (MWContext *, CL_Drawable *))
|
||||
FE_DEFINE(GetTextFrame, void, (MWContext *, LO_TextStruct *, int32, int32, XP_Rect *))
|
||||
#ifdef XP_MAC
|
||||
FE_DEFINE(GetDefaultBackgroundColor, void, (MWContext* context, LO_Color* color))
|
||||
#endif
|
||||
#endif
|
||||
/* these functions are to allow dealyed native window applet creation and transparent applet */
|
||||
FE_DEFINE(HandleClippingView, void, (MWContext *pContext, struct LJAppletData *appletD, int x, int y, int width, int height))
|
||||
FE_DEFINE(DrawJavaApp, void, (MWContext *pContext, int iLocation, LO_JavaAppStruct *pJava))
|
||||
|
||||
#undef FE_DEFINE
|
||||
#undef MAKE_FE_FUNCS_PREFIX
|
||||
#undef MAKE_FE_FUNCS_ASSIGN
|
||||
#undef MAKE_FE_FUNCS_EXTERN
|
||||
#undef MAKE_FE_FUNCS_STRUCT
|
||||
219
mozilla/include/msg_filt.h
Normal file
219
mozilla/include/msg_filt.h
Normal file
@@ -0,0 +1,219 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
/* foobar Public API for mail (and news?) filters */
|
||||
#ifndef MSG_RULE_H
|
||||
#define MSG_RULE_H
|
||||
|
||||
/*
|
||||
Terminology - Filter - either a Rule (defined with GUI) or a (Java) Script
|
||||
Rule -
|
||||
*/
|
||||
#include "msg_srch.h"
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FilterError_Success = 0, /* no error */
|
||||
FilterError_First = SearchError_Last + 1, /* no functions return this; just for bookkeeping */
|
||||
FilterError_NotImplemented, /* coming soon */
|
||||
FilterError_OutOfMemory, /* out of memory */
|
||||
FilterError_FileError, /* error reading or writing the rules file */
|
||||
FilterError_InvalidVersion, /* invalid filter file version */
|
||||
FilterError_InvalidIndex, /* Invalid filter index */
|
||||
FilterError_InvalidMotion, /* invalid filter move motion */
|
||||
FilterError_InvalidFilterType, /* method doesn't accept this filter type */
|
||||
FilterError_NullPointer, /* a required pointer parameter was null */
|
||||
FilterError_NotRule, /* tried to get rule for non-rule filter */
|
||||
FilterError_NotScript, /* tried to get a script name for a non-script filter */
|
||||
FilterError_InvalidAction, /* invalid action */
|
||||
FilterError_SearchError, /* error in search code */
|
||||
FilterError_Last /* no functions return this; just for bookkeeping */
|
||||
} MSG_FilterError;
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
acNone, /* uninitialized state */
|
||||
acMoveToFolder,
|
||||
acChangePriority,
|
||||
acDelete,
|
||||
acMarkRead,
|
||||
acKillThread,
|
||||
acWatchThread
|
||||
} MSG_RuleActionType;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
filterInboxRule = 0x1,
|
||||
filterInboxJavaScript = 0x2,
|
||||
filterInbox = 0x3,
|
||||
filterNewsRule = 0x4,
|
||||
filterNewsJavaScript = 0x8,
|
||||
filterNews=0xb,
|
||||
filterAll=0xf
|
||||
} MSG_FilterType;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
filterUp,
|
||||
filterDown
|
||||
} MSG_FilterMotion;
|
||||
|
||||
typedef int32 MSG_FilterIndex;
|
||||
|
||||
/* opaque struct defs - defined in libmsg/pmsgfilt.h */
|
||||
#ifdef XP_CPLUSPLUS
|
||||
struct MSG_Filter;
|
||||
struct MSG_Rule;
|
||||
struct MSG_RuleAction;
|
||||
struct MSG_FilterList;
|
||||
#else
|
||||
typedef struct MSG_FilterList MSG_FilterList;
|
||||
typedef struct MSG_Filter MSG_Filter;
|
||||
typedef struct MSG_Rule MSG_Rule;
|
||||
typedef struct MSG_RuleAction MSG_RuleAction;
|
||||
#endif
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
/* Front ends call MSG_OpenFilterList to get a handle to a FilterList, of existing MSG_Filter *.
|
||||
These are manipulated by the front ends as a result of user interaction
|
||||
with dialog boxes. To apply the new list, fe's call MSG_CloseFilterList.
|
||||
|
||||
For example, if the user brings up the rule management UI, deletes a rule,
|
||||
and presses OK, the front end calls MSG_RemoveFilterListAt, and
|
||||
then MSG_CloseFilterList.
|
||||
|
||||
*/
|
||||
MSG_FilterError MSG_OpenFilterList(MSG_Master *master, MSG_FilterType type, MSG_FilterList **filterList);
|
||||
MSG_FilterError MSG_OpenFolderFilterList(MSG_Pane *pane, MSG_FolderInfo *folder, MSG_FilterType type, MSG_FilterList **filterList);
|
||||
MSG_FilterError MSG_CloseFilterList(MSG_FilterList *filterList);
|
||||
MSG_FilterError MSG_SaveFilterList(MSG_FilterList *filterList); /* save without deleting */
|
||||
MSG_FilterError MSG_CancelFilterList(MSG_FilterList *filterList);
|
||||
|
||||
MSG_FolderInfo *MSG_GetFolderInfoForFilterList(MSG_FilterList *filterList);
|
||||
MSG_FilterError MSG_GetFilterCount(MSG_FilterList *filterList, int32 *pCount);
|
||||
MSG_FilterError MSG_GetFilterAt(MSG_FilterList *filterList,
|
||||
MSG_FilterIndex filterIndex, MSG_Filter **filter);
|
||||
/* these methods don't delete filters - they just change the list. FE still must
|
||||
call MSG_DestroyFilter to delete a filter.
|
||||
*/
|
||||
MSG_FilterError MSG_SetFilterAt(MSG_FilterList *filterList,
|
||||
MSG_FilterIndex filterIndex, MSG_Filter *filter);
|
||||
MSG_FilterError MSG_RemoveFilterAt(MSG_FilterList *filterList,
|
||||
MSG_FilterIndex filterIndex);
|
||||
MSG_FilterError MSG_MoveFilterAt(MSG_FilterList *filterList,
|
||||
MSG_FilterIndex filterIndex, MSG_FilterMotion motion);
|
||||
MSG_FilterError MSG_InsertFilterAt(MSG_FilterList *filterList,
|
||||
MSG_FilterIndex filterIndex, MSG_Filter *filter);
|
||||
|
||||
MSG_FilterError MSG_EnableLogging(MSG_FilterList *filterList, XP_Bool enable);
|
||||
XP_Bool MSG_IsLoggingEnabled(MSG_FilterList *filterList);
|
||||
|
||||
/* In general, any data gotten with MSG_*Get is good until the owning object
|
||||
is deleted, or the data is replaced with a MSG_*Set call. For example, the name
|
||||
returned in MSG_GetFilterName is valid until either the filter is destroyed,
|
||||
or MSG_SetFilterName is called on the same filter.
|
||||
*/
|
||||
MSG_FilterError MSG_CreateFilter (MSG_FilterType type, char *name, MSG_Filter **result);
|
||||
MSG_FilterError MSG_DestroyFilter(MSG_Filter *filter);
|
||||
MSG_FilterError MSG_GetFilterType(MSG_Filter *, MSG_FilterType *filterType);
|
||||
MSG_FilterError MSG_EnableFilter(MSG_Filter *, XP_Bool enable);
|
||||
MSG_FilterError MSG_IsFilterEnabled(MSG_Filter *, XP_Bool *enabled);
|
||||
MSG_FilterError MSG_GetFilterRule(MSG_Filter *, MSG_Rule ** result);
|
||||
MSG_FilterError MSG_GetFilterName(MSG_Filter *, char **name);
|
||||
MSG_FilterError MSG_SetFilterName(MSG_Filter *, const char *name);
|
||||
MSG_FilterError MSG_GetFilterDesc(MSG_Filter *, char **description);
|
||||
MSG_FilterError MSG_SetFilterDesc(MSG_Filter*, const char *description);
|
||||
MSG_FilterError MSG_GetFilterScript(MSG_Filter *, char **name);
|
||||
MSG_FilterError MSG_SetFilterScript(MSG_Filter *, const char *name);
|
||||
|
||||
MSG_FilterError MSG_RuleAddTerm(MSG_Rule *,
|
||||
MSG_SearchAttribute attrib, /* attribute for this term */
|
||||
MSG_SearchOperator op, /* operator e.g. opContains */
|
||||
MSG_SearchValue *value, /* value e.g. "Dogbert" */
|
||||
XP_Bool BooleanAND, /* TRUE if AND is the boolean operator. FALSE if OR is the boolean operators */
|
||||
char * arbitraryHeader); /* arbitrary header specified by user. ignored unless attrib = attribOtherHeader */
|
||||
|
||||
MSG_FilterError MSG_RuleGetNumTerms(MSG_Rule *, int32 *numTerms);
|
||||
|
||||
MSG_FilterError MSG_RuleGetTerm(MSG_Rule *, int32 termIndex,
|
||||
MSG_SearchAttribute *attrib, /* attribute for this term */
|
||||
MSG_SearchOperator *op, /* operator e.g. opContains */
|
||||
MSG_SearchValue *value, /* value e.g. "Dogbert" */
|
||||
XP_Bool *BooleanAnd, /* TRUE if AND is the boolean operator. FALSE if OR is the boolean operator */
|
||||
char ** arbitraryHeader); /* arbitrary header specified by user. ignore unless attrib = attribOtherHeader */
|
||||
|
||||
MSG_FilterError MSG_RuleSetScope(MSG_Rule *, MSG_ScopeTerm *scope);
|
||||
MSG_FilterError MSG_RuleGetScope(MSG_Rule *, MSG_ScopeTerm **scope);
|
||||
|
||||
/* if type is acChangePriority, value is a pointer to priority.
|
||||
If type is acMoveToFolder, value is pointer to folder name.
|
||||
Otherwise, value is ignored.
|
||||
*/
|
||||
MSG_FilterError MSG_RuleSetAction(MSG_Rule *, MSG_RuleActionType type, void *value);
|
||||
MSG_FilterError MSG_RuleGetAction(MSG_Rule *, MSG_RuleActionType *type, void **value);
|
||||
|
||||
/* help FEs manage menu choices in Filter dialog box */
|
||||
|
||||
/* Use this to help build menus in the filter dialogs. See APIs below */
|
||||
typedef struct MSG_RuleMenuItem
|
||||
{
|
||||
int16 attrib;
|
||||
char name[32];
|
||||
} MSG_RuleMenuItem;
|
||||
|
||||
|
||||
MSG_FilterError MSG_GetRuleActionMenuItems (
|
||||
MSG_FilterType type, /* type of filter */
|
||||
MSG_RuleMenuItem *items, /* array of caller-allocated structs */
|
||||
uint16 *maxItems); /* in- max array size; out- num returned */
|
||||
|
||||
MSG_FilterError MSG_GetFilterWidgetForAction( MSG_RuleActionType action,
|
||||
MSG_SearchValueWidget *widget );
|
||||
|
||||
MSG_SearchError MSG_GetValuesForAction( MSG_RuleActionType action,
|
||||
MSG_SearchMenuItem *items,
|
||||
uint16 *maxItems);
|
||||
|
||||
void MSG_ViewFilterLog(MSG_Pane *pane);
|
||||
|
||||
/*
|
||||
** Adding/editting javascript filters.
|
||||
**
|
||||
** The FE calls one of the below functions, along with a callback and some closure
|
||||
** data. This callback is invoked when the user clicks OK in the JS filter dialog.
|
||||
** If CANCEL is pressed, the callback is not invoked.
|
||||
**
|
||||
** If the user called MSG_EditJSFilter, the filter_index parameter of the callback
|
||||
** is the same one passed in. If the user called MSG_NewJSFilter, the filter_index
|
||||
** parameter is -1.
|
||||
**
|
||||
** The filter_changed parameter is TRUE if the user modified any of the fields of
|
||||
** the javascript filter, and FALSE otherwise.
|
||||
*/
|
||||
typedef void (*JSFilterCallback)(void* arg, MSG_FilterIndex filter_index, XP_Bool filter_changed);
|
||||
|
||||
void MSG_EditJSFilter(MWContext *context, MSG_FilterList *filter_list,
|
||||
MSG_FilterIndex filter_index,
|
||||
JSFilterCallback cb, void *arg);
|
||||
void MSG_NewJSFilter(MWContext *context, MSG_FilterList *filter_list,
|
||||
MSG_FilterType filter_type, JSFilterCallback cb, void *arg);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif
|
||||
447
mozilla/include/msg_srch.h
Normal file
447
mozilla/include/msg_srch.h
Normal file
@@ -0,0 +1,447 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
/*
|
||||
* Public API for searching mail, news, and LDAP
|
||||
* pieces of this API are also used by filter rules and address book
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _MSG_SRCH_H
|
||||
#define _MSG_SRCH_H
|
||||
|
||||
#include "msgcom.h" /* for MSG_PRIORITY, MessageKey */
|
||||
#include "dirprefs.h" /* for DIR_AttributeId */
|
||||
|
||||
#define FE_IMPLEMENTS_BOOLEAN_OR
|
||||
#define B3_SEARCH_API
|
||||
|
||||
typedef enum
|
||||
{
|
||||
SearchError_First, /* no functions return this; just for bookkeeping */
|
||||
SearchError_Success, /* no error */
|
||||
SearchError_NotImplemented, /* coming soon */
|
||||
|
||||
SearchError_OutOfMemory, /* can't allocate required memory */
|
||||
SearchError_NullPointer, /* a req'd pointer parameter was null */
|
||||
SearchError_ScopeAgreement, /* attr or op not supp in this scope */
|
||||
SearchError_ListTooSmall, /* menu item array not big enough */
|
||||
|
||||
SearchError_ResultSetEmpty, /* search done, no matches found */
|
||||
SearchError_ResultSetTooBig, /* too many matches to get them all */
|
||||
|
||||
SearchError_InvalidAttribute, /* specified attrib not in enum */
|
||||
SearchError_InvalidScope, /* specified scope not in enum */
|
||||
SearchError_InvalidOperator, /* specified op not in enum */
|
||||
|
||||
SearchError_InvalidSearchTerm, /* cookie for search term is bogus */
|
||||
SearchError_InvalidScopeTerm, /* cookie for scope term is bogus */
|
||||
SearchError_InvalidResultElement, /* cookie for result element is bogus */
|
||||
SearchError_InvalidPane, /* context probably bogus */
|
||||
SearchError_InvalidStream, /* in strm bad (too short? bad magic?) */
|
||||
SearchError_InvalidFolder, /* given folderInfo isn't searchable */
|
||||
SearchError_InvalidIndex, /* the passed index is invalid */
|
||||
|
||||
SearchError_HostNotFound, /* couldn't connect to server */
|
||||
SearchError_Timeout, /* network didn't respond */
|
||||
SearchError_DBOpenFailed, /* couldn't open off-line msg db */
|
||||
|
||||
SearchError_NotAMatch, /* used internally for term eval */
|
||||
SearchError_ScopeDone, /* used internally for scope list eval */
|
||||
|
||||
SearchError_Unknown, /* some random error */
|
||||
|
||||
SearchError_Last /* no functions return this; just for bookkeeping */
|
||||
} MSG_SearchError;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
scopeMailFolder,
|
||||
scopeNewsgroup,
|
||||
scopeLdapDirectory,
|
||||
scopeOfflineNewsgroup,
|
||||
scopeAllSearchableGroups
|
||||
} MSG_ScopeAttribute;
|
||||
|
||||
/* NB: If you add elements to this enum, add only to the end, since
|
||||
* RULES.DAT stores enum values persistently
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
attribSender = 0, /* mail and news */
|
||||
attribSubject,
|
||||
attribBody,
|
||||
attribDate,
|
||||
|
||||
attribPriority, /* mail only */
|
||||
attribMsgStatus,
|
||||
attribTo,
|
||||
attribCC,
|
||||
attribToOrCC,
|
||||
|
||||
attribCommonName, /* LDAP only */
|
||||
attrib822Address,
|
||||
attribPhoneNumber,
|
||||
attribOrganization,
|
||||
attribOrgUnit,
|
||||
attribLocality,
|
||||
attribStreetAddress,
|
||||
attribSize,
|
||||
attribAnyText, /* any header or body */
|
||||
attribKeywords,
|
||||
|
||||
attribDistinguishedName, /* LDAP result elem only */
|
||||
attribObjectClass,
|
||||
attribJpegFile,
|
||||
|
||||
attribLocation, /* result list only */
|
||||
attribMessageKey, /* message result elems */
|
||||
|
||||
attribAgeInDays, /* for purging old news articles */
|
||||
|
||||
attribGivenName, /* for sorting LDAP results */
|
||||
attribSurname,
|
||||
|
||||
attribFolderInfo, /* for "view thread context" from result */
|
||||
|
||||
attribCustom1, /* custom LDAP attributes */
|
||||
attribCustom2,
|
||||
attribCustom3,
|
||||
attribCustom4,
|
||||
attribCustom5,
|
||||
|
||||
attribMessageId,
|
||||
attribOtherHeader, /* for mail and news. MUST ALWAYS BE LAST attribute since we can have an arbitrary # of these...*/
|
||||
|
||||
kNumAttributes /* must be last attribute */
|
||||
} MSG_SearchAttribute;
|
||||
|
||||
/* NB: If you add elements to this enum, add only to the end, since
|
||||
* RULES.DAT stores enum values persistently
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
opContains = 0, /* for text attributes */
|
||||
opDoesntContain,
|
||||
opIs, /* is and isn't also apply to some non-text attrs */
|
||||
opIsnt,
|
||||
opIsEmpty,
|
||||
|
||||
opIsBefore, /* for date attributes */
|
||||
opIsAfter,
|
||||
|
||||
opIsHigherThan, /* for priority. opIs also applies */
|
||||
opIsLowerThan,
|
||||
|
||||
opBeginsWith,
|
||||
opEndsWith,
|
||||
|
||||
opSoundsLike, /* for LDAP phoenetic matching */
|
||||
opLdapDwim, /* Do What I Mean for simple search */
|
||||
|
||||
opIsGreaterThan,
|
||||
opIsLessThan,
|
||||
|
||||
kNumOperators /* must be last operator */
|
||||
} MSG_SearchOperator;
|
||||
|
||||
/* FEs use this to help build the search dialog box */
|
||||
typedef enum
|
||||
{
|
||||
widgetText,
|
||||
widgetDate,
|
||||
widgetMenu,
|
||||
widgetInt, /* added to account for age in days which requires an integer field */
|
||||
widgetNone
|
||||
} MSG_SearchValueWidget;
|
||||
|
||||
/* Use this to specify the value of a search term */
|
||||
typedef struct MSG_SearchValue
|
||||
{
|
||||
MSG_SearchAttribute attribute;
|
||||
union
|
||||
{
|
||||
char *string;
|
||||
MSG_PRIORITY priority;
|
||||
time_t date;
|
||||
uint32 msgStatus; /* see MSG_FLAG in msgcom.h */
|
||||
uint32 size;
|
||||
MessageKey key;
|
||||
uint32 age; /* in days */
|
||||
MSG_FolderInfo *folder;
|
||||
} u;
|
||||
} MSG_SearchValue;
|
||||
|
||||
/* Use this to help build menus in the search dialog. See APIs below */
|
||||
#define kSearchMenuLength 64
|
||||
typedef struct MSG_SearchMenuItem
|
||||
{
|
||||
int16 attrib;
|
||||
char name[kSearchMenuLength];
|
||||
XP_Bool isEnabled;
|
||||
} MSG_SearchMenuItem;
|
||||
|
||||
#ifdef XP_CPLUSPLUS
|
||||
struct MSG_ScopeTerm;
|
||||
struct MSG_ResultElement;
|
||||
struct DIR_Server;
|
||||
#else
|
||||
#include "dirprefs.h"
|
||||
typedef struct MSG_ScopeTerm MSG_ScopeTerm;
|
||||
typedef struct MSG_ResultElement MSG_ResultElement;
|
||||
#endif
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
/* manage lifetime of internal search memory */
|
||||
MSG_SearchError MSG_SearchAlloc (MSG_Pane *); /* alloc memory in context */
|
||||
MSG_SearchError MSG_SearchFree (MSG_Pane *); /* free memory in context */
|
||||
|
||||
MSG_SearchError MSG_AddSearchTerm (
|
||||
MSG_Pane *searchPane, /* ptr to pane to add criteria */
|
||||
MSG_SearchAttribute attrib, /* attribute for this term */
|
||||
MSG_SearchOperator op, /* operator e.g. opContains */
|
||||
MSG_SearchValue *value, /* value e.g. "Dogbert" */
|
||||
XP_Bool BooleanAND, /* set to true if associated boolean operator is AND */
|
||||
char * arbitraryHeader); /* user defined arbitrary header. ignored unless attrib = attribOtherHeader */
|
||||
|
||||
/* It's generally not necessary for the FE to read the list of terms after
|
||||
* the list has been built. However, in our Basic/Advanced LDAP search dialogs
|
||||
* the FE is supposed to remember the criteria, and since that information is
|
||||
* lying around in the backend anyway, we'll just make it available to the FE
|
||||
*/
|
||||
MSG_SearchError MSG_CountSearchTerms (
|
||||
MSG_Pane *searchPane,
|
||||
int *numTerms);
|
||||
MSG_SearchError MSG_GetNthSearchTerm (
|
||||
MSG_Pane *searchPane,
|
||||
int whichTerm,
|
||||
MSG_SearchAttribute *attrib,
|
||||
MSG_SearchOperator *op,
|
||||
MSG_SearchValue *value);
|
||||
|
||||
MSG_SearchError MSG_CountSearchScopes (
|
||||
MSG_Pane *searchPane,
|
||||
int *numScopes);
|
||||
MSG_SearchError MSG_GetNthSearchScope (
|
||||
MSG_Pane *searchPane,
|
||||
int which,
|
||||
MSG_ScopeAttribute *scopeId,
|
||||
void **scope);
|
||||
|
||||
/* add a scope (e.g. a mail folder) to the search */
|
||||
MSG_SearchError MSG_AddScopeTerm (
|
||||
MSG_Pane *searchPane, /* ptr to pane to add search scope */
|
||||
MSG_ScopeAttribute attrib, /* what kind of scope term is this */
|
||||
MSG_FolderInfo *folder); /* which folder to search */
|
||||
|
||||
/* special cases for LDAP since LDAP isn't really a folderInfo */
|
||||
MSG_SearchError MSG_AddLdapScope (
|
||||
MSG_Pane *searchPane,
|
||||
DIR_Server *server);
|
||||
MSG_SearchError MSG_AddAllLdapScopes (
|
||||
MSG_Pane *searchPane,
|
||||
XP_List *dirServerList);
|
||||
|
||||
/* Call this function everytime the scope changes! It informs the FE if
|
||||
the current scope support custom header use. FEs should not display the
|
||||
custom header dialog if custom headers are not supported */
|
||||
|
||||
XP_Bool MSG_ScopeUsesCustomHeaders(
|
||||
MSG_Master * master,
|
||||
MSG_ScopeAttribute scope,
|
||||
void * selection, /* could be a folder or server based on scope */
|
||||
XP_Bool forFilters); /* is this a filter we are talking about? */
|
||||
|
||||
XP_Bool MSG_IsStringAttribute( /* use this to determine if your attribute is a string attrib */
|
||||
MSG_SearchAttribute);
|
||||
|
||||
/* add all scopes of a given type to the search */
|
||||
MSG_SearchError MSG_AddAllScopes (
|
||||
MSG_Pane *searchPane, /* ptr to pane to add scopes */
|
||||
MSG_Master *master, /* mail or news scopes */
|
||||
MSG_ScopeAttribute attrib); /* what kind of scopes to add */
|
||||
|
||||
/* begin execution of the search */
|
||||
MSG_SearchError MSG_Search (
|
||||
MSG_Pane *searchPane); /* So we know how to work async */
|
||||
|
||||
/* manage elements in list of search hits */
|
||||
MSG_SearchError MSG_GetResultElement (
|
||||
MSG_Pane *searchPane, /* ptr to pane containing results */
|
||||
MSG_ViewIndex idx, /* zero-based index of result to get */
|
||||
MSG_ResultElement **result); /* filled in resultElement. NOT allocated */
|
||||
MSG_SearchError MSG_GetResultAttribute (
|
||||
MSG_ResultElement *elem, /* which result elem to get value for */
|
||||
MSG_SearchAttribute attrib, /* which attribute to get value for */
|
||||
MSG_SearchValue **result); /* filled in value */
|
||||
MSG_SearchError MSG_OpenResultElement (
|
||||
MSG_ResultElement *elem, /* which result elem to open */
|
||||
void *window); /* MSG_Pane* for mail/news, contxt for LDAP */
|
||||
MWContextType MSG_GetResultElementType (
|
||||
MSG_ResultElement *elem); /* context type needed for this elem */
|
||||
MWContext *MSG_IsResultElementOpen (
|
||||
MSG_ResultElement *elem); /* current context if open, NULL if not */
|
||||
MSG_SearchError MSG_SortResultList (
|
||||
MSG_Pane *searchPane, /* ptr to pane containing results */
|
||||
MSG_SearchAttribute sortKey, /* which attribute is the sort key */
|
||||
XP_Bool descending); /* T- sort descending, F- sort ascending */
|
||||
MSG_SearchError MSG_DestroySearchValue (
|
||||
MSG_SearchValue *value); /* free struct and heap-based struct elems */
|
||||
MSG_SearchError MSG_ModifyLdapResult (
|
||||
MSG_ResultElement *elem, /* which result element to modify */
|
||||
MSG_SearchValue *val); /* new value to stuff in */
|
||||
MSG_SearchError MSG_AddLdapResultsToAddressBook(
|
||||
MSG_Pane *searchPane, /* ptr to pane containing results */
|
||||
MSG_ViewIndex *indices, /* selection array */
|
||||
int count); /* size of array */
|
||||
MSG_SearchError MSG_ComposeFromLdapResults(
|
||||
MSG_Pane *searchPane, /* ptr to pane containing results */
|
||||
MSG_ViewIndex *indices, /* selection array */
|
||||
int count); /* size of array */
|
||||
|
||||
/* help FEs manage menu selections in Search dialog box */
|
||||
MSG_SearchError MSG_GetSearchWidgetForAttribute (
|
||||
MSG_SearchAttribute attrib, /* which attr to get UI widget type for */
|
||||
MSG_SearchValueWidget *widget); /* what kind of UI widget specifies attr */
|
||||
|
||||
/* For referring to DIR_Servers and MSG_FolderInfos polymorphically */
|
||||
typedef struct MSG_ScopeUnion
|
||||
{
|
||||
MSG_ScopeAttribute *attribute;
|
||||
union
|
||||
{
|
||||
DIR_Server *server;
|
||||
MSG_FolderInfo *folder;
|
||||
} u;
|
||||
} MSG_ScopeUnion;
|
||||
|
||||
|
||||
/* always call this routine b4 calling MSG_GetAttributesForSearchScopes to
|
||||
determine how many elements your MSG_SearchMenuItem array needs to be */
|
||||
MSG_SearchError MSG_GetNumAttributesForSearchScopes(
|
||||
MSG_Master *master,
|
||||
MSG_ScopeAttribute scope,
|
||||
void ** selArray, /* selected items for LCD calculation */
|
||||
uint16 selCount, /* number of selected items */
|
||||
uint16 *numItems); /* out - number of attribute items for scope */
|
||||
|
||||
MSG_SearchError MSG_GetAttributesForSearchScopes (
|
||||
MSG_Master *master,
|
||||
MSG_ScopeAttribute scope,
|
||||
void **selArray, /* selected items for LCD calculation */
|
||||
uint16 selCount, /* number of selected items */
|
||||
MSG_SearchMenuItem *items, /* array of caller-allocated structs */
|
||||
uint16 *maxItems); /* in- max array size; out- num returned */
|
||||
|
||||
MSG_SearchError MSG_GetOperatorsForSearchScopes (
|
||||
MSG_Master *master,
|
||||
MSG_ScopeAttribute scope,
|
||||
void **selArray, /* selected items for LCD calculation */
|
||||
uint16 selCount, /* number of selected items */
|
||||
MSG_SearchAttribute attrib, /* return available ops for this attrib */
|
||||
MSG_SearchMenuItem *items, /* array of caller-allocated structs */
|
||||
uint16 *maxItems); /* in- max array size; out- num returned */
|
||||
|
||||
MSG_SearchError MSG_GetScopeMenuForSearchMessages (
|
||||
MSG_Master *master,
|
||||
MSG_FolderInfo **selArray,
|
||||
uint16 selCount,
|
||||
MSG_SearchMenuItem *items,
|
||||
uint16 *maxItems);
|
||||
|
||||
/* always call this routine b4 calling MSG_GetAttributesForFilterScopes to
|
||||
determine how many elements your MSG_SearchMenuItem array needs to be */
|
||||
MSG_SearchError MSG_GetNumAttributesForFilterScopes(
|
||||
MSG_Master *master,
|
||||
MSG_ScopeAttribute scope,
|
||||
void ** selArray, /* selected items for LCD calculation */
|
||||
uint16 selCount, /* number of selected items */
|
||||
uint16 *numItems); /* out - number of attribute items for scope */
|
||||
|
||||
MSG_SearchError MSG_GetAttributesForFilterScopes (
|
||||
MSG_Master *master,
|
||||
MSG_ScopeAttribute scope,
|
||||
void **selArray, /* selected items for LCD calculation */
|
||||
uint16 selCount, /* number of selected items */
|
||||
MSG_SearchMenuItem *items, /* array of caller-allocated structs */
|
||||
uint16 *maxItems); /* in- max array size; out- num returned */
|
||||
|
||||
MSG_SearchError MSG_GetOperatorsForFilterScopes (
|
||||
MSG_Master *master,
|
||||
MSG_ScopeAttribute scope,
|
||||
void **selArray, /* selected items for LCD calculation */
|
||||
uint16 selCount, /* number of selected items */
|
||||
MSG_SearchAttribute attrib, /* return available ops for this attrib */
|
||||
MSG_SearchMenuItem *items, /* array of caller-allocated structs */
|
||||
uint16 *maxItems); /* in- max array size; out- num returned */
|
||||
|
||||
/*****************************************************************************
|
||||
These two functions have been added to the search APIs to help support Arbitrary
|
||||
Headers. In particular, the FEs need to be able to grab a semaphore when they
|
||||
create an edit headers dialog (we only want to allow 1 dialog to be open at a time).
|
||||
AcquireEditHeadersSemaphore returns TRUE if the FE successfully acquired the semaphore
|
||||
and FALSE if someone else acquired it. ReleaseEditHeaderSemaphore returns TRUE if you
|
||||
were the original holder of the semaphore and the semaphore was released. FALSE if you
|
||||
were not the original holder
|
||||
**********************************************************************************/
|
||||
XP_Bool MSG_AcquireEditHeadersSemaphore (MSG_Master * master, void * holder);
|
||||
XP_Bool MSG_ReleaseEditHeadersSemaphore (MSG_Master * master, void * holder);
|
||||
|
||||
MSG_SearchError MSG_SearchAttribToDirAttrib (
|
||||
MSG_SearchAttribute searchAttrib,
|
||||
DIR_AttributeId *dirAttrib);
|
||||
|
||||
|
||||
MSG_SearchError MSG_GetBasicLdapSearchAttributes (
|
||||
DIR_Server *server,
|
||||
MSG_SearchMenuItem *items,
|
||||
int *maxItems);
|
||||
|
||||
/* maybe these belong in msgcom.h? */
|
||||
void MSG_GetPriorityName (MSG_PRIORITY priority, char *name, uint16 max);
|
||||
void MSG_GetUntranslatedPriorityName (MSG_PRIORITY priority,
|
||||
char *name, uint16 max);
|
||||
void MSG_GetStatusName (uint32 status, char *name, uint16 max);
|
||||
MSG_PRIORITY MSG_GetPriorityFromString(const char *priority);
|
||||
|
||||
/* support for profile searching in Dredd */
|
||||
MSG_SearchError MSG_SaveProfileStatus (MSG_Pane *searchPane, XP_Bool *enabled);
|
||||
MSG_SearchError MSG_SaveProfile (MSG_Pane *searchPane, const char *profileName);
|
||||
|
||||
/* support for searching all Dredd groups + all subscribed groups */
|
||||
MSG_SearchError MSG_AddAllSearchableGroupsStatus(MSG_Pane *searchPane, XP_Bool *enabled);
|
||||
|
||||
/* support for opening a search result in its thread pane context */
|
||||
XP_Bool MSG_GoToFolderStatus (MSG_Pane *searchPane,
|
||||
MSG_ViewIndex *indices,
|
||||
int32 numIndices);
|
||||
|
||||
/* used between libnet and libmsg to allow searching for characters which
|
||||
* are otherwise significant in news: URLs
|
||||
*/
|
||||
extern char *MSG_EscapeSearchUrl (const char *value);
|
||||
extern char *MSG_UnEscapeSearchUrl (const char *value);
|
||||
|
||||
/* This is how "search:" of different mail/news folder types works */
|
||||
extern int MSG_ProcessSearch (MWContext *context);
|
||||
extern int MSG_InterruptSearch (MWContext *context);
|
||||
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* _MSG_SRCH_H */
|
||||
3116
mozilla/include/msgcom.h
Normal file
3116
mozilla/include/msgcom.h
Normal file
File diff suppressed because it is too large
Load Diff
80
mozilla/include/msgmapi.h
Normal file
80
mozilla/include/msgmapi.h
Normal file
@@ -0,0 +1,80 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
** msgmapi.h -- implements XP mail/news support for the Microsoft Mail API (MAPI)
|
||||
**
|
||||
*/
|
||||
|
||||
#ifndef _MSGMAPI_H
|
||||
#define _MSGMAPI_H
|
||||
|
||||
#ifdef XP_WIN
|
||||
|
||||
#include "msgcom.h"
|
||||
#include "abcom.h"
|
||||
|
||||
// rhp - to fix the problem caused by MSFT...grrrrr...
|
||||
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
|
||||
#include <mapi.h> // for MAPI specific types...
|
||||
#endif
|
||||
|
||||
#ifdef XP_CPLUSPLUS
|
||||
class MSG_MapiListContext;
|
||||
#else
|
||||
typedef struct MSG_MapiListContext MSG_MapiListContext;
|
||||
#endif
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
MessageKey MSG_GetFirstKeyInFolder (MSG_FolderInfo *folder, MSG_MapiListContext **cookie);
|
||||
MessageKey MSG_GetNextKeyInFolder (MSG_MapiListContext *cookie);
|
||||
XP_Bool MSG_GetMapiMessageById (MSG_FolderInfo *folder, MessageKey key, lpMapiMessage *message);
|
||||
XP_Bool MSG_MarkMapiMessageRead (MSG_FolderInfo *folder, MessageKey key, XP_Bool read);
|
||||
void MSG_FreeMapiMessage (lpMapiMessage msg);
|
||||
|
||||
/* Address Book Specific APIs to support MAPI calls for MAPIDetails and MAPIResolveName */
|
||||
|
||||
int AB_MAPI_ResolveName(
|
||||
char * string,
|
||||
AB_ContainerInfo ** ctr, /* caller allocates ptr to ctr, BE fills. Caller must close the ctr when done */
|
||||
ABID * id);
|
||||
|
||||
/* Caller must free the character strings returned by these functions using XP_FREE */
|
||||
char * AB_MAPI_GetEmailAddress(AB_ContainerInfo * ctr,ABID id);
|
||||
|
||||
char * AB_MAPI_GetFullName(AB_ContainerInfo * ctr, ABID id);
|
||||
|
||||
char * AB_MAPI_ConvertToDescription(AB_ContainerInfo * ctr);
|
||||
|
||||
AB_ContainerInfo * AB_MAPI_ConvertToContainer(char * description);
|
||||
|
||||
int AB_MAPI_CreatePropertySheetPane(
|
||||
MWContext * context,
|
||||
MSG_Master * master,
|
||||
AB_ContainerInfo * ctr,
|
||||
ABID id,
|
||||
MSG_Pane ** personPane); /* BE fills the ptr with a person pane */
|
||||
|
||||
void AB_MAPI_CloseContainer(AB_ContainerInfo ** ctr);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* XP_WIN */
|
||||
|
||||
#endif /* _MSGMAPI_H */
|
||||
491
mozilla/include/msgnet.h
Normal file
491
mozilla/include/msgnet.h
Normal file
@@ -0,0 +1,491 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
/* msgnet.h --- prototypes for API's between libmsg and libnet.
|
||||
*/
|
||||
|
||||
#ifndef _MSGNET_H_
|
||||
#define _MSGNET_H_
|
||||
#include "msgcom.h"
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
/* so libnet can mark expired articles as read. */
|
||||
extern int MSG_MarkMessageKeyRead (MSG_Pane *pane, MessageKey key, const char *xref);
|
||||
|
||||
/* record imap message flags in the db of the current pane (message or thread panes) */
|
||||
extern void MSG_RecordImapMessageFlags(MSG_Pane* pane,
|
||||
MessageKey msgKey,
|
||||
imapMessageFlagsType flags);
|
||||
|
||||
/* notify libmsg of deleted messages */
|
||||
extern void MSG_ImapMsgsDeleted(MSG_Pane *urlPane,
|
||||
const char *onlineMailboxName,
|
||||
XP_Bool deleteAllMsgs,
|
||||
const char *doomedKeyString);
|
||||
|
||||
/* called to setup state before a copy download */
|
||||
extern void MSG_StartImapMessageToOfflineFolderDownload(MWContext* context);
|
||||
|
||||
/* notify libmsg that inbox filtering is complete */
|
||||
extern void MSG_ImapInboxFilteringComplete(MSG_Pane *urlPane);
|
||||
|
||||
/* notify libmsg that the online/offline synch is complete */
|
||||
extern void MSG_ImapOnOffLineSynchComplete(MSG_Pane *urlPane);
|
||||
|
||||
/* notify libmsg that an imap folder load was interrupted */
|
||||
extern void MSG_InterruptImapFolderLoad(MSG_Pane *urlPane, const char *hostName, const char *onlineFolderPath);
|
||||
|
||||
/* find a reference or NULL to the specified imap folder */
|
||||
extern MSG_FolderInfo* MSG_FindImapFolder(MSG_Pane *urlPane, const char *hostName, const char *onlineFolderPath);
|
||||
|
||||
/* If there is a cached connection, for this folder, uncache it and return it */
|
||||
extern TNavigatorImapConnection* MSG_UnCacheImapConnection(MSG_Master* master, const char *host, const char *folderName);
|
||||
|
||||
/* Cache this connection and return TRUE if there is not one there already, else false */
|
||||
extern XP_Bool MSG_TryToCacheImapConnection(MSG_Master* master, const char *host, const char *folderName, TNavigatorImapConnection *connection);
|
||||
|
||||
extern void MSG_SetIMAPMessageUID (MessageKey key,
|
||||
void *state);
|
||||
|
||||
|
||||
extern const char *MSG_GetMessageIdFromState (void *state);
|
||||
extern XP_Bool MSG_IsSaveDraftDeliveryState (void *state);
|
||||
|
||||
extern void MSG_SetUserAuthenticated (MSG_Master* master, XP_Bool bAuthenticated);
|
||||
|
||||
extern XP_Bool MSG_IsUserAuthenticated (MSG_Master* master);
|
||||
|
||||
extern void MSG_SetMailAccountURL(MSG_Master* master, const char *urlString);
|
||||
|
||||
extern const char *MSG_GetMailAccountURL(MSG_Master* master);
|
||||
|
||||
extern void MSG_SetNewsgroupUsername(MSG_Pane* pane, const char *username);
|
||||
extern const char *MSG_GetNewsgroupUsername(MSG_Pane *pane);
|
||||
|
||||
extern void MSG_SetNewsgroupPassword(MSG_Pane* pane, const char *password);
|
||||
extern const char *MSG_GetNewsgroupPassword(MSG_Pane *pane);
|
||||
|
||||
extern const char* MSG_GetPopHost(MSG_Prefs* prefs);
|
||||
|
||||
extern XP_Bool MSG_GetUseSSLForIMAP4(MSG_Pane *pane);
|
||||
extern int32 MSG_GetIMAPSSLPort(MSG_Pane *pane);
|
||||
|
||||
/* called from libnet to clean up state from mailbox:copymessages */
|
||||
extern void MSG_MessageCopyIsCompleted (struct MessageCopyInfo**);
|
||||
|
||||
/* called from libnet to determine if the current copy is finished */
|
||||
extern XP_Bool MSG_IsMessageCopyFinished(struct MessageCopyInfo*);
|
||||
|
||||
/* called from mailbox and url libnet modules */
|
||||
extern
|
||||
int MSG_BeginCopyingMessages(MWContext *context);
|
||||
|
||||
extern
|
||||
int MSG_FinishCopyingMessages(MWContext *context);
|
||||
|
||||
extern const char *MSG_GetIMAPHostUsername(MSG_Master *master, const char *hostName);
|
||||
extern const char *MSG_GetIMAPHostPassword(MSG_Master *master, const char *hostName);
|
||||
extern void MSG_SetIMAPHostPassword(MSG_Master *master, const char *hostName, const char *password);
|
||||
extern int MSG_GetIMAPHostIsUsingSubscription(MSG_Master *master, const char *hostName, XP_Bool *usingSubscription);
|
||||
extern XP_Bool MSG_GetIMAPHostDeleteIsMoveToTrash(MSG_Master *master, const char *hostName);
|
||||
extern int IMAP_AddIMAPHost(const char *hostName, XP_Bool usingSubscription, XP_Bool overrideNamespaces,
|
||||
const char *personalNamespacePrefix, const char *publicNamespacePrefixes, const char *otherUsersNamespacePrefixes);
|
||||
|
||||
typedef enum
|
||||
{ MSG_NotRunning = 0x00000000
|
||||
, MSG_RunningOnline = 0x00000001
|
||||
, MSG_RunningOffline = 0x00000002
|
||||
} MSG_RunningState;
|
||||
|
||||
extern MSG_FolderInfo *MSG_SetFolderRunningIMAPUrl(MSG_Pane *urlPane, const char *hostName, const char *onlineFolderPath, MSG_RunningState runningState);
|
||||
extern void MSG_IMAPUrlFinished(MSG_FolderInfo *folder, URL_Struct *URL_s);
|
||||
|
||||
/* ===========================================================================
|
||||
OFFLINE IMAP
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
extern uint32 MSG_GetImapMessageFlags(MSG_Pane *urlPane,
|
||||
const char *hostName,
|
||||
const char *onlineBoxName,
|
||||
uint32 key);
|
||||
|
||||
extern void MSG_StartOfflineImapRetrieval(MSG_Pane *urlPane,
|
||||
const char *hostName,
|
||||
const char *onlineBoxName,
|
||||
uint32 key,
|
||||
void **offLineRetrievalData);
|
||||
|
||||
extern uint32 MSG_GetOfflineMessageSize(void *offLineRetrievalData);
|
||||
|
||||
extern int MSG_ProcessOfflineImap(void *offLineRetrievalData, char *socketBuffer, uint32 read_size);
|
||||
|
||||
extern int MSG_InterruptOfflineImap(void *offLineRetrievalData);
|
||||
|
||||
extern void MSG_GetNextURL(MSG_Pane *pane);
|
||||
|
||||
/* Returns the original pane that a progress pane was associated with. If
|
||||
the given pane is not a progresspane, returns NULL. */
|
||||
extern MSG_Pane* MSG_GetParentPane(MSG_Pane* progresspane);
|
||||
|
||||
/* do an imap biff of the imap inbox */
|
||||
extern void MSG_ImapBiff(MWContext* context, MSG_Prefs* prefs);
|
||||
|
||||
/* The NNTP module of netlib calls these to feed XOVER data to the message
|
||||
library, in response to a news:group.name URL having been opened.
|
||||
If MSG_FinishXOVER() returns a message ID, that message will be loaded
|
||||
next (used for selecting the first unread message in a group after
|
||||
listing that group.)
|
||||
|
||||
The "out" arguments are (if non-NULL) a file descriptor to write the XOVER
|
||||
line to, followed by a "\n". This is used by the XOVER-caching code.
|
||||
*/
|
||||
extern int MSG_InitXOVER (MSG_Pane* pane,
|
||||
MSG_NewsHost* host,
|
||||
const char* group_name,
|
||||
uint32 first_msg, uint32 last_msg,
|
||||
uint32 oldest_msg, uint32 youngest_msg,
|
||||
void **data);
|
||||
extern int MSG_ProcessXOVER (MSG_Pane* pane, char *line, void **data);
|
||||
extern int MSG_ProcessNonXOVER (MSG_Pane* pane, char *line, void **data);
|
||||
extern int MSG_FinishXOVER (MSG_Pane* pane, void **data, int status);
|
||||
|
||||
/* In case of XOVER failed due to the authentication process, we need to
|
||||
do some clean up. So that we could have a fresh start once we pass the
|
||||
authentication check.
|
||||
*/
|
||||
extern int MSG_ResetXOVER (MSG_Pane* pane, void **data);
|
||||
|
||||
|
||||
/* These calls are used by libnet to determine which articles it ought to
|
||||
get in a big newsgroup. */
|
||||
|
||||
extern int
|
||||
MSG_GetRangeOfArtsToDownload(MSG_Pane* pane, void** data, MSG_NewsHost* host,
|
||||
const char* group_name,
|
||||
int32 first_possible, /* Oldest article available
|
||||
from newsserver*/
|
||||
int32 last_possible, /* Newest article available
|
||||
from newsserver*/
|
||||
int32 maxextra,
|
||||
int32* first,
|
||||
int32* last);
|
||||
|
||||
|
||||
extern int
|
||||
MSG_AddToKnownArticles(MSG_Pane *pane, MSG_NewsHost* host,
|
||||
const char* groupname, int32 first, int32 last);
|
||||
|
||||
extern int MSG_InitAddArticleKeyToGroup(MSG_Pane *pane, MSG_NewsHost* host,
|
||||
const char* groupName, void **parseState);
|
||||
|
||||
extern int MSG_AddArticleKeyToGroup(void *parse_state, int32 first);
|
||||
|
||||
extern int MSG_FinishAddArticleKeyToGroup(MSG_Pane *pane, void **parse_state);
|
||||
|
||||
/* After displaying a list of newsgroups, we need the NNTP module to go and
|
||||
run "GROUP" commands for the ones for which we don't know the unread
|
||||
article count. This function returns a count of how many groups we think
|
||||
we're going to need this for (so we can display progress in a reasonable
|
||||
way).
|
||||
*/
|
||||
extern int32 MSG_GetNewsRCCount(MSG_Pane* pane, MSG_NewsHost* host);
|
||||
|
||||
/* Gets the name of the next group that we want to get article counts for.
|
||||
The caller must free the given name using XP_FREE().
|
||||
MSG_DisplaySubscribedGroup() should get called with this group before
|
||||
this call happens again. */
|
||||
|
||||
extern char* MSG_GetNewsRCGroup(MSG_Pane* pane, MSG_NewsHost* host);
|
||||
|
||||
|
||||
|
||||
/* In response to a "news://host/" URL; this is called once for each group
|
||||
that was returned by MSG_GetNewsRCGroup(), after the NNTP GROUP command has
|
||||
been run. It's also called whenever we actually visit the group (the user
|
||||
clicks on the newsgroup line), in case the data has changed since the
|
||||
initial passthrough. The "nowvisiting" parameter is TRUE in the latter
|
||||
case, FALSE otherwise. */
|
||||
extern int MSG_DisplaySubscribedGroup(MSG_Pane* pane,
|
||||
MSG_NewsHost* host,
|
||||
const char *group,
|
||||
int32 oldest_message,
|
||||
int32 youngest_message,
|
||||
int32 total_messages,
|
||||
XP_Bool nowvisiting);
|
||||
|
||||
/* In response to an NNTP GROUP command, the server said the group doesn't exist */
|
||||
extern int MSG_GroupNotFound(MSG_Pane* pane,
|
||||
MSG_NewsHost* host,
|
||||
const char *group,
|
||||
XP_Bool opening);
|
||||
|
||||
/* In response to a "news://host/?newgroups" URL, to ask the server for a
|
||||
list of recently-added newsgroups. Similar to MSG_DisplaySubscribedGroup,
|
||||
except that in this case, the group is not already in the list. */
|
||||
extern int MSG_DisplayNewNewsGroup (MWContext *context,
|
||||
MSG_NewsHost* host, const char *group_name,
|
||||
int32 oldest_message,
|
||||
int32 youngest_message);
|
||||
|
||||
|
||||
/* News servers work better if you ask for message numbers instead of IDs.
|
||||
So, the NNTP module asks us what the group and number of an ID is with
|
||||
this. If we don't know, we return 0 for both. If the pane is not a
|
||||
thead or message pane, this routine will fail.
|
||||
*/
|
||||
extern void MSG_NewsGroupAndNumberOfID (MSG_Pane *pane,
|
||||
const char *message_id,
|
||||
const char **group_return,
|
||||
uint32 *message_number_return);
|
||||
|
||||
/* This routine is used by netlib to see if we have this article off-line
|
||||
It might be combined with the above routine, but I'm not sure if this
|
||||
is the way we're ultimately going to do this.
|
||||
*/
|
||||
extern XP_Bool MSG_IsOfflineArticle (MSG_Pane *pane,
|
||||
const char *message_id,
|
||||
const char **group_return,
|
||||
uint32 *message_number_return);
|
||||
|
||||
extern int MSG_StartOfflineRetrieval(MSG_Pane *pane,
|
||||
const char *group,
|
||||
uint32 message_number,
|
||||
void **offlineState);
|
||||
|
||||
extern int MSG_ProcessOfflineNews(void *offlineState, char *outputBuffer, int outputBufSize);
|
||||
|
||||
extern int MSG_InterruptOfflineNews(void *offlineState);
|
||||
|
||||
/* libnet callbacks for Dredd NNTP extensions */
|
||||
|
||||
extern void MSG_SupportsNewsExtensions (MSG_NewsHost *host, XP_Bool supports);
|
||||
extern void MSG_AddNewsExtension (MSG_NewsHost *host, const char *ext);
|
||||
extern XP_Bool MSG_QueryNewsExtension (MSG_NewsHost *host, const char *ext);
|
||||
extern XP_Bool MSG_NeedsNewsExtension (MSG_NewsHost *host, const char *ext);
|
||||
|
||||
extern void MSG_AddSearchableGroup (MSG_NewsHost *host, const char *group);
|
||||
extern void MSG_AddSearchableHeader (MSG_NewsHost *host, const char *header);
|
||||
extern int MSG_AddProfileGroup (MSG_Pane *pane,
|
||||
MSG_NewsHost* host,
|
||||
const char *groupName);
|
||||
|
||||
extern int MSG_AddPrettyName(MSG_NewsHost* host,
|
||||
const char *groupName, const char *prettyName);
|
||||
|
||||
extern int MSG_SetXActiveFlags(MSG_Pane *pane, char *groupName,
|
||||
int32 firstPossibleArt,
|
||||
int32 lastPossibleArt,
|
||||
char *flags);
|
||||
|
||||
extern int MSG_AddSubscribedGroup (MSG_Pane *pane, const char *groupUrl);
|
||||
|
||||
extern void MSG_AddPropertyForGet (MSG_NewsHost *host, const char *property,
|
||||
const char *value);
|
||||
|
||||
/* libnet calls this if it got an error 441 back from the newsserver. That
|
||||
error almost certainly means that the newsserver already has a message
|
||||
with the same message id. If this routine returns TRUE, then we were
|
||||
pretty much expecting that error code, because we know we tried twice to
|
||||
post the same message, and we can just ignore it. */
|
||||
extern XP_Bool MSG_IsDuplicatePost(MSG_Pane* comppane);
|
||||
|
||||
|
||||
/* libnet uses this on an error condition to tell libmsg to generate a new
|
||||
message-id for the given composition. */
|
||||
extern void MSG_ClearCompositionMessageID(MSG_Pane* comppane);
|
||||
|
||||
|
||||
/* libnet uses this to determine the message-id for the given composition (so
|
||||
it can test if this message was already posted.) */
|
||||
extern const char* MSG_GetCompositionMessageID(MSG_Pane* comppane);
|
||||
|
||||
/* The "news:" and "mailbox:" protocol handlers call this when a message is
|
||||
displayed, so that we can use the contents of the headers when composing
|
||||
replies.
|
||||
*/
|
||||
extern void
|
||||
MSG_ActivateReplyOptions(MSG_Pane* messagepane, MimeHeaders *headers);
|
||||
|
||||
/* Tell the subscribe pane about a new newsgroup we noticed. */
|
||||
|
||||
extern int
|
||||
MSG_AddNewNewsGroup(MSG_Pane* pane, MSG_NewsHost* host,
|
||||
const char* groupname, int32 oldest, int32 youngest,
|
||||
const char *flag, XP_Bool bXactiveFlags);
|
||||
|
||||
/* tell the host info database that we're going to need to get the extra info
|
||||
for this new newsgroup
|
||||
*/
|
||||
extern int MSG_SetGroupNeedsExtraInfo(MSG_NewsHost *host,
|
||||
const char* groupname, XP_Bool needsExtra);
|
||||
|
||||
/* returns the name of the first group which needs extra info */
|
||||
extern char *MSG_GetFirstGroupNeedingExtraInfo(MSG_NewsHost *host);
|
||||
|
||||
/* Find out from libmsg when we last checked for new newsgroups (so we know
|
||||
what date to give the "newgroups" command.) */
|
||||
|
||||
extern time_t
|
||||
MSG_NewsgroupsLastUpdatedTime(MSG_NewsHost* host);
|
||||
|
||||
|
||||
|
||||
/* The "mailbox:" protocol module uses these routines to invoke the mailbox
|
||||
parser in libmsg.
|
||||
*/
|
||||
extern int MSG_BeginOpenFolderSock (MSG_Pane* pane,
|
||||
const char *folder_name,
|
||||
const char *message_id, int32 msgnum,
|
||||
void **folder_ptr);
|
||||
extern int MSG_FinishOpenFolderSock (MSG_Pane* pane,
|
||||
const char *folder_name,
|
||||
const char *message_id, int32 msgnum,
|
||||
void **folder_ptr);
|
||||
extern void MSG_CloseFolderSock (MSG_Pane* pane, const char *folder_name,
|
||||
const char *message_id, int32 msgnum,
|
||||
void *folder_ptr);
|
||||
extern int MSG_OpenMessageSock (MSG_Pane* messagepane, const char *folder_name,
|
||||
const char *msg_id, int32 msgnum,
|
||||
void *folder_ptr, void **message_ptr,
|
||||
int32 *content_length);
|
||||
extern int MSG_ReadMessageSock (MSG_Pane* messagepane, const char *folder_name,
|
||||
void *message_ptr, const char *message_id,
|
||||
int32 msgnum, char *buffer, int32 buffer_size);
|
||||
extern void MSG_CloseMessageSock (MSG_Pane* messagepane,
|
||||
const char *folder_name,
|
||||
const char *message_id, int32 msgnum,
|
||||
void *message_ptr);
|
||||
extern void MSG_PrepareToIncUIDL(MSG_Pane* messagepane, URL_Struct* url,
|
||||
const char* uidl);
|
||||
|
||||
/* This is how "mailbox:?empty-trash" works
|
||||
*/
|
||||
extern int MSG_BeginEmptyTrash(MSG_Pane* folderpane, URL_Struct* url,
|
||||
void** closure);
|
||||
extern int MSG_FinishEmptyTrash(MSG_Pane* folderpane, URL_Struct* url,
|
||||
void* closure);
|
||||
extern int MSG_CloseEmptyTrashSock(MSG_Pane* folderpane, URL_Struct* url,
|
||||
void* closure);
|
||||
|
||||
/* This is how "mailbox:?compress-folder" and
|
||||
"mailbox:/foo/baz/nsmail/inbox?compress-folder" works. */
|
||||
|
||||
extern int MSG_BeginCompressFolder(MSG_Pane* pane, URL_Struct* url,
|
||||
const char* foldername, void** closure);
|
||||
extern int MSG_FinishCompressFolder(MSG_Pane* pane, URL_Struct* url,
|
||||
const char* foldername, void* closure);
|
||||
extern int MSG_CloseCompressFolderSock(MSG_Pane* pane, URL_Struct* url,
|
||||
void* closure);
|
||||
/* This is how "mailbox:?deliver-queued" works
|
||||
*/
|
||||
extern int MSG_BeginDeliverQueued(MSG_Pane* pane, URL_Struct* url,
|
||||
void** closure);
|
||||
extern int MSG_FinishDeliverQueued(MSG_Pane* pane, URL_Struct* url,
|
||||
void* closure);
|
||||
extern int MSG_CloseDeliverQueuedSock(MSG_Pane* pane, URL_Struct* url,
|
||||
void* closure);
|
||||
|
||||
/* This is how "mailbox:?background" works */
|
||||
extern int MSG_ProcessBackground(URL_Struct* urlstruct);
|
||||
|
||||
/* libnet --> libmsg glue for newsgroup searching */
|
||||
extern void MSG_AddNewsXpatHit (MWContext *context, uint32 artNum);
|
||||
extern void MSG_AddNewsSearchHit (MWContext *context, const char *resultLine);
|
||||
|
||||
/* libnet --> libmsg glue for imap mail folder searching */
|
||||
extern void MSG_AddImapSearchHit (MWContext *context, const char *resultLine);
|
||||
/* The POP3 protocol module uses these routines to hand us new messages.
|
||||
*/
|
||||
extern XP_Bool MSG_BeginMailDelivery (MSG_Pane* folderpane);
|
||||
extern void MSG_AbortMailDelivery (MSG_Pane* folderpane);
|
||||
extern void MSG_EndMailDelivery (MSG_Pane* folderpane);
|
||||
extern void *MSG_IncorporateBegin (MSG_Pane* folderpane,
|
||||
FO_Present_Types format_out,
|
||||
char *pop3_uidl,
|
||||
URL_Struct *url,
|
||||
uint32 flags);
|
||||
extern int MSG_IncorporateWrite (MSG_Pane* folderpane, void *closure,
|
||||
const char *block, int32 length);
|
||||
extern int MSG_IncorporateComplete(MSG_Pane* folderpane, void *closure);
|
||||
extern int MSG_IncorporateAbort (MSG_Pane* folderpane, void *closure,
|
||||
int status);
|
||||
extern void MSG_ClearSenderAuthedFlag(MSG_Pane* folderpane, void *closure);
|
||||
|
||||
|
||||
|
||||
|
||||
/* This is how the netlib registers the converters relevant to MIME message
|
||||
display and composition.
|
||||
*/
|
||||
void MSG_RegisterConverters (void);
|
||||
|
||||
extern void
|
||||
MSG_StartMessageDelivery (MSG_Pane *pane,
|
||||
void *fe_data,
|
||||
MSG_CompositionFields *fields,
|
||||
XP_Bool digest_p,
|
||||
XP_Bool dont_deliver_p,
|
||||
const char *attachment1_type,
|
||||
const char *attachment1_body,
|
||||
uint32 attachment1_body_length,
|
||||
const struct MSG_AttachmentData *attachments,
|
||||
void *mimeRelatedPart, /* only used in compose pane */
|
||||
void (*message_delivery_done_callback)
|
||||
(MWContext *context,
|
||||
void *fe_data,
|
||||
int status,
|
||||
const char *error_message));
|
||||
|
||||
/* When a message which has the `partial' bit set, meaning we only downloaded
|
||||
the first 20 lines because it was huge, this function will be called to
|
||||
return some HTML to tack onto the end of the message to explain that it
|
||||
is truncated, and provide a clickable link which will download the whole
|
||||
message.
|
||||
*/
|
||||
extern char *MSG_GeneratePartialMessageBlurb (MSG_Pane* messagepane,
|
||||
URL_Struct *url, void *closure,
|
||||
MimeHeaders *headers);
|
||||
|
||||
|
||||
extern int MSG_GetUrlQueueSize (const char *url, MWContext *context);
|
||||
|
||||
extern XP_Bool MSG_RequestForReturnReceipt(MSG_Pane* pane);
|
||||
extern XP_Bool MSG_SendingMDNInProgress(MSG_Pane* pane);
|
||||
|
||||
extern uint32 MSG_GetIMAPMessageSizeFromDB(MSG_Pane *masterPane, const char *hostName, char *folderName, char *id, XP_Bool idIsUid);
|
||||
|
||||
extern void MSG_RefreshFoldersForUpdatedIMAPHosts(MWContext *context);
|
||||
|
||||
extern XP_Bool MSG_MailCheck(MWContext *context, MSG_Prefs *prefs);
|
||||
|
||||
extern void MSG_Pop3MailCheck(MWContext *context);
|
||||
|
||||
extern int NET_parse_news_url (const char *url,
|
||||
char **host_and_portP,
|
||||
XP_Bool *securepP,
|
||||
char **groupP,
|
||||
char **message_idP,
|
||||
char **command_specific_dataP);
|
||||
|
||||
extern char *MSG_GetArbitraryHeadersForHost(MSG_Master *master, const char *hostName);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
|
||||
#endif
|
||||
45
mozilla/include/msgtypes.h
Normal file
45
mozilla/include/msgtypes.h
Normal file
@@ -0,0 +1,45 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
/* msgtypes.h --- types for the mail/news reader module.
|
||||
*/
|
||||
|
||||
#ifndef _MSGTYPES_H_
|
||||
#define _MSGTYPES_H_
|
||||
|
||||
/* This file defines types that are used by libmsg. Actually, it's rather
|
||||
underpopulated right now; much more should be moved here from msgcom.h. */
|
||||
|
||||
|
||||
|
||||
|
||||
/* Instances of MSG_Pane are used to represent the various panes in the user
|
||||
interfaces. The FolderPanes and MessagePanes must have a context associated
|
||||
with them, but the ThreadPane generally does not. MSG_Pane is deliberately
|
||||
an opaque type; FE's can't manipulate them except via the calls defined
|
||||
here. */
|
||||
|
||||
#ifdef XP_CPLUSPLUS
|
||||
class MSG_Pane;
|
||||
#else
|
||||
typedef struct MSG_Pane MSG_Pane;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif /* _MSGTYPES_H_ */
|
||||
250
mozilla/include/ncompat.h
Normal file
250
mozilla/include/ncompat.h
Normal file
@@ -0,0 +1,250 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
/*-
|
||||
* Copyright (c) 1991, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)compat.h 8.13 (Berkeley) 2/21/94
|
||||
*/
|
||||
|
||||
#ifndef _COMPAT_H_
|
||||
#define _COMPAT_H_
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
/*
|
||||
* If your system doesn't typedef u_long, u_short, or u_char, change
|
||||
* the 0 to a 1.
|
||||
*/
|
||||
/*DSR041497 - these are defined in pmwsock.h, so only need for DOUGSOCK*/
|
||||
#ifdef XP_OS2_DOUGSOCK
|
||||
typedef unsigned char u_char; /* 4.[34]BSD names. */
|
||||
typedef unsigned int u_int;
|
||||
typedef unsigned long u_long;
|
||||
typedef unsigned short u_short;
|
||||
#endif
|
||||
|
||||
/* If your system doesn't typedef size_t, change the 0 to a 1. */
|
||||
#if 0
|
||||
typedef unsigned int size_t; /* POSIX, 4.[34]BSD names. */
|
||||
#endif
|
||||
|
||||
/* If your system doesn't typedef ssize_t, change the 0 to a 1. */
|
||||
#if 0
|
||||
typedef int ssize_t; /* POSIX names. */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If your system doesn't have the POSIX type for a signal mask,
|
||||
* change the 0 to a 1.
|
||||
*/
|
||||
#if 0 /* POSIX 1003.1 signal mask type. */
|
||||
typedef unsigned int sigset_t;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If your system's vsprintf returns a char *, not an int,
|
||||
* change the 0 to a 1.
|
||||
*/
|
||||
#if defined (__sun) && !defined(SVR4) /* SUNOS */
|
||||
#define VSPRINTF_CHARSTAR
|
||||
#endif
|
||||
/*
|
||||
* If you don't have POSIX 1003.1 signals, the signal code surrounding the
|
||||
* temporary file creation is intended to block all of the possible signals
|
||||
* long enough to create the file and unlink it. All of this stuff is
|
||||
* intended to use old-style BSD calls to fake POSIX 1003.1 calls.
|
||||
*/
|
||||
#ifdef NO_POSIX_SIGNALS
|
||||
#define sigemptyset(set) (*(set) = 0)
|
||||
#define sigfillset(set) (*(set) = ~(sigset_t)0, 0)
|
||||
#define sigaddset(set,signo) (*(set) |= sigmask(signo), 0)
|
||||
#define sigdelset(set,signo) (*(set) &= ~sigmask(signo), 0)
|
||||
#define sigismember(set,signo) ((*(set) & sigmask(signo)) != 0)
|
||||
|
||||
#define SIG_BLOCK 1
|
||||
#define SIG_UNBLOCK 2
|
||||
#define SIG_SETMASK 3
|
||||
|
||||
static int __sigtemp; /* For the use of sigprocmask */
|
||||
|
||||
/* Repeated test of oset != NULL is to avoid "*0". */
|
||||
#define sigprocmask(how, set, oset) \
|
||||
((__sigtemp = \
|
||||
(((how) == SIG_BLOCK) ? \
|
||||
sigblock(0) | *(set) : \
|
||||
(((how) == SIG_UNBLOCK) ? \
|
||||
sigblock(0) & ~(*(set)) : \
|
||||
((how) == SIG_SETMASK ? \
|
||||
*(set) : sigblock(0))))), \
|
||||
((oset) ? (*(oset ? oset : set) = sigsetmask(__sigtemp)) : \
|
||||
sigsetmask(__sigtemp)), 0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If your system doesn't have an include file with the appropriate
|
||||
* byte order set, make sure you specify the correct one.
|
||||
*/
|
||||
#ifndef BYTE_ORDER
|
||||
#define LITTLE_ENDIAN 1234 /* LSB first: i386, vax */
|
||||
#define BIG_ENDIAN 4321 /* MSB first: 68000, ibm, net */
|
||||
#define BYTE_ORDER BIG_ENDIAN /* Set for your system. */
|
||||
#endif
|
||||
|
||||
#if defined(SYSV) || defined(SYSTEM5) || defined(__sun)
|
||||
#define index(a, b) strchr(a, b)
|
||||
#define rindex(a, b) strrchr(a, b)
|
||||
#define bzero(a, b) memset(a, 0, b)
|
||||
#define bcmp(a, b, n) memcmp(a, b, n)
|
||||
#define bcopy(a, b, n) memmove(b, a, n)
|
||||
#endif
|
||||
|
||||
#if defined(BSD) || defined(BSD4_3)
|
||||
#define strchr(a, b) index(a, b)
|
||||
#define strrchr(a, b) rindex(a, b)
|
||||
#define memcmp(a, b, n) bcmp(a, b, n)
|
||||
#define memmove(a, b, n) bcopy(b, a, n)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* 32-bit machine. The db routines are theoretically independent of
|
||||
* the size of u_shorts and u_longs, but I don't know that anyone has
|
||||
* ever actually tried it. At a minimum, change the following #define's
|
||||
* if you are trying to compile on a different type of system.
|
||||
*/
|
||||
#ifndef USHRT_MAX
|
||||
#define USHRT_MAX 0xFFFF
|
||||
#define ULONG_MAX 0xFFFFFFFF
|
||||
#endif
|
||||
|
||||
#ifndef O_ACCMODE /* POSIX 1003.1 access mode mask. */
|
||||
#define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR)
|
||||
#endif
|
||||
|
||||
#ifndef _POSIX2_RE_DUP_MAX /* POSIX 1003.2 RE limit. */
|
||||
#define _POSIX2_RE_DUP_MAX 255
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If you can't provide lock values in the open(2) call. Note, this
|
||||
* allows races to happen.
|
||||
*/
|
||||
#ifndef O_EXLOCK /* 4.4BSD extension. */
|
||||
#define O_EXLOCK 0
|
||||
#endif
|
||||
|
||||
#ifndef O_SHLOCK /* 4.4BSD extension. */
|
||||
#define O_SHLOCK 0
|
||||
#endif
|
||||
|
||||
#ifndef EFTYPE
|
||||
#define EFTYPE EINVAL /* POSIX 1003.1 format errno. */
|
||||
#endif
|
||||
|
||||
#ifndef WCOREDUMP /* 4.4BSD extension */
|
||||
#define WCOREDUMP(a) 0
|
||||
#endif
|
||||
|
||||
#ifndef STDERR_FILENO
|
||||
#define STDIN_FILENO 0 /* ANSI C #defines */
|
||||
#define STDOUT_FILENO 1
|
||||
#define STDERR_FILENO 2
|
||||
#endif
|
||||
|
||||
#ifndef SEEK_END
|
||||
#define SEEK_SET 0 /* POSIX 1003.1 seek values */
|
||||
#define SEEK_CUR 1
|
||||
#define SEEK_END 2
|
||||
#endif
|
||||
|
||||
#ifndef _POSIX_VDISABLE /* POSIX 1003.1 disabling char. */
|
||||
#define _POSIX_VDISABLE 0 /* Some systems used 0. */
|
||||
#endif
|
||||
|
||||
#ifndef TCSASOFT /* 4.4BSD extension. */
|
||||
#define TCSASOFT 0
|
||||
#endif
|
||||
|
||||
#ifndef _POSIX2_RE_DUP_MAX /* POSIX 1003.2 values. */
|
||||
#define _POSIX2_RE_DUP_MAX 255
|
||||
#endif
|
||||
|
||||
#ifndef NULL /* ANSI C #defines NULL everywhere. */
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
#ifndef MAX /* Usually found in <sys/param.h>. */
|
||||
#define MAX(_a,_b) ((_a)<(_b)?(_b):(_a))
|
||||
#endif
|
||||
#ifndef MIN /* Usually found in <sys/param.h>. */
|
||||
#define MIN(_a,_b) ((_a)<(_b)?(_a):(_b))
|
||||
#endif
|
||||
|
||||
/* Default file permissions. */
|
||||
#ifndef DEFFILEMODE /* 4.4BSD extension. */
|
||||
#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
|
||||
#endif
|
||||
|
||||
#ifndef __sun
|
||||
#ifndef S_ISDIR /* POSIX 1003.1 file type tests. */
|
||||
#define S_ISDIR(m) ((m & 0170000) == 0040000) /* directory */
|
||||
#define S_ISCHR(m) ((m & 0170000) == 0020000) /* char special */
|
||||
#define S_ISBLK(m) ((m & 0170000) == 0060000) /* block special */
|
||||
#define S_ISREG(m) ((m & 0170000) == 0100000) /* regular file */
|
||||
#define S_ISFIFO(m) ((m & 0170000) == 0010000) /* fifo */
|
||||
#endif
|
||||
#ifndef S_ISLNK /* BSD POSIX 1003.1 extensions */
|
||||
#define S_ISLNK(m) ((m & 0170000) == 0120000) /* symbolic link */
|
||||
#define S_ISSOCK(m) ((m & 0170000) == 0140000) /* socket */
|
||||
#endif
|
||||
#endif /* __sun */
|
||||
|
||||
/* The type of a va_list. */
|
||||
#ifndef _BSD_VA_LIST_ /* 4.4BSD #define. */
|
||||
#define _BSD_VA_LIST_ char *
|
||||
#endif
|
||||
|
||||
#endif /* !_COMPAT_H_ */
|
||||
2103
mozilla/include/net.h
Normal file
2103
mozilla/include/net.h
Normal file
File diff suppressed because it is too large
Load Diff
133
mozilla/include/np.h
Normal file
133
mozilla/include/np.h
Normal file
@@ -0,0 +1,133 @@
|
||||
/* -*- Mode: C; tab-width: 8; 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.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* np.h $Revision: 3.1 $
|
||||
* Prototypes for functions exported by libplugin and called by the FEs or other XP libs.
|
||||
* Prototypes for functions exported by the FEs and called by libplugin are in nppg.h.
|
||||
*/
|
||||
|
||||
#ifndef _NP_H
|
||||
#define _NP_H
|
||||
|
||||
#include "lo_ele.h"
|
||||
#include "npapi.h"
|
||||
#include "net.h"
|
||||
|
||||
#ifdef XP_UNIX
|
||||
/* Aaagh. npapi.h include Xlib.h. Bool is being #defined by Xlib and
|
||||
we are typedeffing it in the navigator. */
|
||||
#ifdef Bool
|
||||
#undef Bool
|
||||
#endif /* Bool */
|
||||
#endif
|
||||
|
||||
typedef enum { NP_Untyped = 0, NP_OLE, NP_Plugin } NPAppType;
|
||||
typedef enum { NP_FullPage = 1, NP_Embedded } NPPageType;
|
||||
|
||||
typedef void* NPReference;
|
||||
#define NPRefFromStart ((NPReference)NULL)
|
||||
|
||||
|
||||
/* it's lame that this is supposed to support more than plugins but
|
||||
it has plugin specific junk (wdata) in it -jg */
|
||||
|
||||
struct _NPEmbeddedApp {
|
||||
struct _NPEmbeddedApp *next;
|
||||
NPAppType type;
|
||||
void *fe_data;
|
||||
void *np_data;
|
||||
NPWindow *wdata;
|
||||
NPPageType pagePluginType;
|
||||
};
|
||||
|
||||
/* Uncomment this to enable ANTHRAX. .c files affected: npglue.c, layembed.c, layobj.c */
|
||||
/* amusil 1.8.98 */
|
||||
/* #define ANTHRAX */
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
extern void NPL_Init(void);
|
||||
extern void NPL_Shutdown(void);
|
||||
|
||||
extern void NPL_RegisterDefaultConverters(void);
|
||||
extern NPError NPL_RegisterPluginFile(const char* pluginname, const char* filename,
|
||||
const char* description, void* pd);
|
||||
extern NPError NPL_RegisterPluginType(NPMIMEType type, const char *extentstring,
|
||||
const char* description, void* fileType, void* pd, XP_Bool enabled);
|
||||
extern NPError NPL_RefreshPluginList(XP_Bool reloadPages);
|
||||
|
||||
extern NPBool NPL_IteratePluginFiles(NPReference* ref, char** name, char** filename, char** description);
|
||||
extern NPBool NPL_IteratePluginTypes(NPReference* ref, NPReference plugin, NPMIMEType* type,
|
||||
char*** extents, char** description, void** fileType);
|
||||
extern char** NPL_FindPluginsForType(const char* typeToFind);
|
||||
extern char* NPL_FindPluginEnabledForType(const char* typeToFind);
|
||||
|
||||
extern NPError NPL_EnablePlugin(NPMIMEType type,
|
||||
const char* pluginname,
|
||||
XP_Bool enabled);
|
||||
extern NPError NPL_EnablePluginType(NPMIMEType type, void* pdesc, XP_Bool enabled);
|
||||
extern NPError NPL_DisablePlugin(NPMIMEType type);
|
||||
|
||||
extern NPEmbeddedApp* NPL_EmbedCreate(MWContext *context, LO_EmbedStruct *embed_struct);
|
||||
extern NPError NPL_EmbedStart(MWContext* cx, LO_EmbedStruct* embed_struct, NPEmbeddedApp* app);
|
||||
|
||||
extern void NPL_EmbedSize(NPEmbeddedApp *app);
|
||||
|
||||
/* ~~av the following is used in CGenericDoc::FreeEmbedElement */
|
||||
extern int32 NPL_GetEmbedReferenceCount(NPEmbeddedApp *app);
|
||||
|
||||
extern void NPL_EmbedDelete(MWContext *context, LO_EmbedStruct *embed_struct);
|
||||
|
||||
extern XP_Bool NPL_IsLiveConnected(LO_EmbedStruct *embed);
|
||||
|
||||
extern int NPL_HandleEvent(NPEmbeddedApp *app, void *event, void* window); /* window may be NULL */
|
||||
extern void NPL_Print(NPEmbeddedApp *app, void *printData);
|
||||
extern void NPL_SamePage(MWContext *context);
|
||||
extern void NPL_SameElement(LO_EmbedStruct *embed);
|
||||
extern void NPL_DeleteSessionData(MWContext* context, void* sessionData);
|
||||
extern XP_Bool NPL_HandleURL(MWContext *pContext, FO_Present_Types iFormatOut, URL_Struct *pURL,
|
||||
Net_GetUrlExitFunc *pExitFunc);
|
||||
#ifndef XP_MAC
|
||||
extern void NPL_DisplayPluginsAsHTML(FO_Present_Types format_out, URL_Struct *urls, MWContext *cx);
|
||||
#endif
|
||||
extern void NPL_PreparePrint(MWContext* context, SHIST_SavedData* savedData);
|
||||
|
||||
extern NET_StreamClass* NPL_NewEmbedStream(FO_Present_Types format_out, void *type, URL_Struct *urls, MWContext *cx);
|
||||
extern NET_StreamClass* NPL_NewPresentStream(FO_Present_Types format_out, void *type, URL_Struct *urls, MWContext *cx);
|
||||
extern unsigned int NPL_WriteReady(NET_StreamClass *stream);
|
||||
extern int NPL_Write(NET_StreamClass *stream, const unsigned char *str, int32 len);
|
||||
extern void NPL_Complete(NET_StreamClass *stream);
|
||||
extern void NPL_Abort(NET_StreamClass *stream, int status);
|
||||
extern XP_Bool NPL_IsEmbedWindowed(NPEmbeddedApp *app);
|
||||
extern void NPL_URLExit(URL_Struct *urls, int status, MWContext *cx);
|
||||
|
||||
#ifdef ANTHRAX
|
||||
extern char** NPL_FindAppletsForType(const char* typeToFind);
|
||||
extern char* NPL_FindAppletEnabledForMimetype(const char* mimetype);
|
||||
extern NPError NPL_RegisterAppletType(NPMIMEType type);
|
||||
#endif /* ANTHRAX */
|
||||
|
||||
PR_EXTERN(void) NPL_SetPluginWindow(void *data);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* _NP_H */
|
||||
|
||||
|
||||
575
mozilla/include/npapi.h
Normal file
575
mozilla/include/npapi.h
Normal file
@@ -0,0 +1,575 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* npapi.h $Revision: 3.1.10.1 $
|
||||
* Netscape client plug-in API spec
|
||||
*/
|
||||
|
||||
#ifndef _NPAPI_H_
|
||||
#define _NPAPI_H_
|
||||
|
||||
#ifdef __OS2__
|
||||
#pragma pack(1)
|
||||
#endif
|
||||
|
||||
#if defined(JAVA)
|
||||
#include "jri.h" /* Java Runtime Interface */
|
||||
#endif
|
||||
|
||||
#if defined (__OS2__ ) || defined (OS2)
|
||||
# ifndef XP_OS2
|
||||
# define XP_OS2 1
|
||||
# endif /* XP_OS2 */
|
||||
#endif /* __OS2__ */
|
||||
|
||||
#ifdef _WINDOWS
|
||||
# ifndef XP_WIN
|
||||
# define XP_WIN 1
|
||||
# endif /* XP_WIN */
|
||||
#endif /* _WINDOWS */
|
||||
|
||||
#ifdef __MWERKS__
|
||||
# define _declspec __declspec
|
||||
# ifdef macintosh
|
||||
# ifndef XP_MAC
|
||||
# define XP_MAC 1
|
||||
# endif /* XP_MAC */
|
||||
# endif /* macintosh */
|
||||
# ifdef __INTEL__
|
||||
# undef NULL
|
||||
# ifndef XP_WIN
|
||||
# define XP_WIN 1
|
||||
# endif /* __INTEL__ */
|
||||
# endif /* XP_PC */
|
||||
#endif /* __MWERKS__ */
|
||||
|
||||
#ifdef XP_MAC
|
||||
#include <Quickdraw.h>
|
||||
#include <Events.h>
|
||||
#endif
|
||||
|
||||
#ifdef XP_UNIX
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
#endif
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
/* Plugin Version Constants */
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
#define NP_VERSION_MAJOR 0
|
||||
#define NP_VERSION_MINOR 12
|
||||
|
||||
|
||||
/* The OS/2 version of Netscape uses RC_DATA to define the
|
||||
mime types, file extentions, etc that are required.
|
||||
Use a vertical bar to seperate types, end types with \0.
|
||||
FileVersion and ProductVersion are 32bit ints, all other
|
||||
entries are strings the MUST be terminated wwith a \0.
|
||||
|
||||
AN EXAMPLE:
|
||||
|
||||
RCDATA NP_INFO_ProductVersion { 1,0,0,1,}
|
||||
|
||||
RCDATA NP_INFO_MIMEType { "video/x-video|",
|
||||
"video/x-flick\0" }
|
||||
RCDATA NP_INFO_FileExtents { "avi|",
|
||||
"flc\0" }
|
||||
RCDATA NP_INFO_FileOpenName{ "MMOS2 video player(*.avi)|",
|
||||
"MMOS2 Flc/Fli player(*.flc)\0" }
|
||||
|
||||
RCDATA NP_INFO_FileVersion { 1,0,0,1 }
|
||||
RCDATA NP_INFO_CompanyName { "Netscape Communications\0" }
|
||||
RCDATA NP_INFO_FileDescription { "NPAVI32 Extension DLL\0"
|
||||
RCDATA NP_INFO_InternalName { "NPAVI32\0" )
|
||||
RCDATA NP_INFO_LegalCopyright { "Copyright Netscape Communications \251 1996\0"
|
||||
RCDATA NP_INFO_OriginalFilename { "NVAPI32.DLL" }
|
||||
RCDATA NP_INFO_ProductName { "NPAVI32 Dynamic Link Library\0" }
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/* RC_DATA types for version info - required */
|
||||
#define NP_INFO_ProductVersion 1
|
||||
#define NP_INFO_MIMEType 2
|
||||
#define NP_INFO_FileOpenName 3
|
||||
#define NP_INFO_FileExtents 4
|
||||
|
||||
/* RC_DATA types for version info - used if found */
|
||||
#define NP_INFO_FileDescription 5
|
||||
#define NP_INFO_ProductName 6
|
||||
|
||||
/* RC_DATA types for version info - optional */
|
||||
#define NP_INFO_CompanyName 7
|
||||
#define NP_INFO_FileVersion 8
|
||||
#define NP_INFO_InternalName 9
|
||||
#define NP_INFO_LegalCopyright 10
|
||||
#define NP_INFO_OriginalFilename 11
|
||||
|
||||
#ifndef RC_INVOKED
|
||||
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
/* Definition of Basic Types */
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
#ifndef _UINT16
|
||||
typedef unsigned short uint16;
|
||||
#endif
|
||||
#ifndef _UINT32
|
||||
#if defined(__alpha)
|
||||
typedef unsigned int uint32;
|
||||
#else /* __alpha */
|
||||
typedef unsigned long uint32;
|
||||
#endif /* __alpha */
|
||||
#endif
|
||||
#ifndef _INT16
|
||||
typedef short int16;
|
||||
#endif
|
||||
#ifndef _INT32
|
||||
#if defined(__alpha)
|
||||
typedef int int32;
|
||||
#else /* __alpha */
|
||||
typedef long int32;
|
||||
#endif /* __alpha */
|
||||
#endif
|
||||
|
||||
#ifndef FALSE
|
||||
#define FALSE (0)
|
||||
#endif
|
||||
#ifndef TRUE
|
||||
#define TRUE (1)
|
||||
#endif
|
||||
#ifndef NULL
|
||||
#define NULL (0L)
|
||||
#endif
|
||||
|
||||
typedef unsigned char NPBool;
|
||||
typedef int16 NPError;
|
||||
typedef int16 NPReason;
|
||||
typedef char* NPMIMEType;
|
||||
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
/* Structures and definitions */
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
#ifdef XP_MAC
|
||||
#pragma options align=mac68k
|
||||
#endif
|
||||
|
||||
/*
|
||||
* NPP is a plug-in's opaque instance handle
|
||||
*/
|
||||
typedef struct _NPP
|
||||
{
|
||||
void* pdata; /* plug-in private data */
|
||||
void* ndata; /* netscape private data */
|
||||
} NPP_t;
|
||||
|
||||
typedef NPP_t* NPP;
|
||||
|
||||
|
||||
typedef struct _NPStream
|
||||
{
|
||||
void* pdata; /* plug-in private data */
|
||||
void* ndata; /* netscape private data */
|
||||
const char* url;
|
||||
uint32 end;
|
||||
uint32 lastmodified;
|
||||
void* notifyData;
|
||||
} NPStream;
|
||||
|
||||
|
||||
typedef struct _NPByteRange
|
||||
{
|
||||
int32 offset; /* negative offset means from the end */
|
||||
uint32 length;
|
||||
struct _NPByteRange* next;
|
||||
} NPByteRange;
|
||||
|
||||
|
||||
typedef struct _NPSavedData
|
||||
{
|
||||
int32 len;
|
||||
void* buf;
|
||||
} NPSavedData;
|
||||
|
||||
|
||||
typedef struct _NPRect
|
||||
{
|
||||
uint16 top;
|
||||
uint16 left;
|
||||
uint16 bottom;
|
||||
uint16 right;
|
||||
} NPRect;
|
||||
|
||||
typedef struct _NPSize
|
||||
{
|
||||
int32 width;
|
||||
int32 height;
|
||||
} NPSize;
|
||||
|
||||
#ifdef XP_UNIX
|
||||
/*
|
||||
* Unix specific structures and definitions
|
||||
*/
|
||||
|
||||
/*
|
||||
* Callback Structures.
|
||||
*
|
||||
* These are used to pass additional platform specific information.
|
||||
*/
|
||||
enum {
|
||||
NP_SETWINDOW = 1,
|
||||
NP_PRINT
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int32 type;
|
||||
} NPAnyCallbackStruct;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int32 type;
|
||||
Display* display;
|
||||
Visual* visual;
|
||||
Colormap colormap;
|
||||
unsigned int depth;
|
||||
} NPSetWindowCallbackStruct;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int32 type;
|
||||
FILE* fp;
|
||||
} NPPrintCallbackStruct;
|
||||
|
||||
#endif /* XP_UNIX */
|
||||
|
||||
/*
|
||||
* List of variable names for which NPP_GetValue shall be implemented
|
||||
*/
|
||||
typedef enum {
|
||||
NPPVpluginNameString = 1,
|
||||
NPPVpluginDescriptionString,
|
||||
NPPVpluginWindowBool,
|
||||
NPPVpluginTransparentBool,
|
||||
NPPVjavaClass,
|
||||
NPPVpluginWindowSize
|
||||
} NPPVariable;
|
||||
|
||||
/*
|
||||
* List of variable names for which NPN_GetValue is implemented by Mozilla
|
||||
*/
|
||||
typedef enum {
|
||||
NPNVxDisplay = 1,
|
||||
NPNVxtAppContext,
|
||||
NPNVnetscapeWindow,
|
||||
NPNVjavascriptEnabledBool,
|
||||
NPNVasdEnabledBool,
|
||||
NPNVisOfflineBool
|
||||
} NPNVariable;
|
||||
|
||||
/*
|
||||
* The type of a NPWindow - it specifies the type of the data structure
|
||||
* returned in the window field.
|
||||
*/
|
||||
typedef enum {
|
||||
NPWindowTypeWindow = 1,
|
||||
NPWindowTypeDrawable
|
||||
} NPWindowType;
|
||||
|
||||
typedef struct _NPWindow
|
||||
{
|
||||
void* window; /* Platform specific window handle */
|
||||
/* OS/2: x - Position of bottom left corner */
|
||||
/* OS/2: y - relative to visible netscape window */
|
||||
uint32 x; /* Position of top left corner relative */
|
||||
uint32 y; /* to a netscape page. */
|
||||
uint32 width; /* Maximum window size */
|
||||
uint32 height;
|
||||
NPRect clipRect; /* Clipping rectangle in port coordinates */
|
||||
/* Used by MAC only. */
|
||||
#ifdef XP_UNIX
|
||||
void * ws_info; /* Platform-dependent additonal data */
|
||||
#endif /* XP_UNIX */
|
||||
NPWindowType type; /* Is this a window or a drawable? */
|
||||
} NPWindow;
|
||||
|
||||
|
||||
typedef struct _NPFullPrint
|
||||
{
|
||||
NPBool pluginPrinted; /* Set TRUE if plugin handled fullscreen */
|
||||
/* printing */
|
||||
NPBool printOne; /* TRUE if plugin should print one copy */
|
||||
/* to default printer */
|
||||
void* platformPrint; /* Platform-specific printing info */
|
||||
} NPFullPrint;
|
||||
|
||||
typedef struct _NPEmbedPrint
|
||||
{
|
||||
NPWindow window;
|
||||
void* platformPrint; /* Platform-specific printing info */
|
||||
} NPEmbedPrint;
|
||||
|
||||
typedef struct _NPPrint
|
||||
{
|
||||
uint16 mode; /* NP_FULL or NP_EMBED */
|
||||
union
|
||||
{
|
||||
NPFullPrint fullPrint; /* if mode is NP_FULL */
|
||||
NPEmbedPrint embedPrint; /* if mode is NP_EMBED */
|
||||
} print;
|
||||
} NPPrint;
|
||||
|
||||
#ifdef XP_MAC
|
||||
typedef EventRecord NPEvent;
|
||||
#elif defined(XP_WIN)
|
||||
typedef struct _NPEvent
|
||||
{
|
||||
uint16 event;
|
||||
uint32 wParam;
|
||||
uint32 lParam;
|
||||
} NPEvent;
|
||||
#elif defined(XP_OS2)
|
||||
typedef struct _NPEvent
|
||||
{
|
||||
uint32 event;
|
||||
uint32 wParam;
|
||||
uint32 lParam;
|
||||
} NPEvent;
|
||||
#elif defined (XP_UNIX)
|
||||
typedef XEvent NPEvent;
|
||||
#else
|
||||
typedef void* NPEvent;
|
||||
#endif /* XP_MAC */
|
||||
|
||||
#ifdef XP_MAC
|
||||
typedef RgnHandle NPRegion;
|
||||
#elif defined(XP_WIN)
|
||||
typedef HRGN NPRegion;
|
||||
#elif defined(XP_UNIX)
|
||||
typedef Region NPRegion;
|
||||
#else
|
||||
typedef void *NPRegion;
|
||||
#endif /* XP_MAC */
|
||||
|
||||
#ifdef XP_MAC
|
||||
/*
|
||||
* Mac-specific structures and definitions.
|
||||
*/
|
||||
|
||||
typedef struct NP_Port
|
||||
{
|
||||
CGrafPtr port; /* Grafport */
|
||||
int32 portx; /* position inside the topmost window */
|
||||
int32 porty;
|
||||
} NP_Port;
|
||||
|
||||
/*
|
||||
* Non-standard event types that can be passed to HandleEvent
|
||||
*/
|
||||
#define getFocusEvent (osEvt + 16)
|
||||
#define loseFocusEvent (osEvt + 17)
|
||||
#define adjustCursorEvent (osEvt + 18)
|
||||
|
||||
#endif /* XP_MAC */
|
||||
|
||||
|
||||
/*
|
||||
* Values for mode passed to NPP_New:
|
||||
*/
|
||||
#define NP_EMBED 1
|
||||
#define NP_FULL 2
|
||||
|
||||
/*
|
||||
* Values for stream type passed to NPP_NewStream:
|
||||
*/
|
||||
#define NP_NORMAL 1
|
||||
#define NP_SEEK 2
|
||||
#define NP_ASFILE 3
|
||||
#define NP_ASFILEONLY 4
|
||||
|
||||
#define NP_MAXREADY (((unsigned)(~0)<<1)>>1)
|
||||
|
||||
#ifdef XP_MAC
|
||||
#pragma options align=reset
|
||||
#endif
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
/* Error and Reason Code definitions */
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Values of type NPError:
|
||||
*/
|
||||
#define NPERR_BASE 0
|
||||
#define NPERR_NO_ERROR (NPERR_BASE + 0)
|
||||
#define NPERR_GENERIC_ERROR (NPERR_BASE + 1)
|
||||
#define NPERR_INVALID_INSTANCE_ERROR (NPERR_BASE + 2)
|
||||
#define NPERR_INVALID_FUNCTABLE_ERROR (NPERR_BASE + 3)
|
||||
#define NPERR_MODULE_LOAD_FAILED_ERROR (NPERR_BASE + 4)
|
||||
#define NPERR_OUT_OF_MEMORY_ERROR (NPERR_BASE + 5)
|
||||
#define NPERR_INVALID_PLUGIN_ERROR (NPERR_BASE + 6)
|
||||
#define NPERR_INVALID_PLUGIN_DIR_ERROR (NPERR_BASE + 7)
|
||||
#define NPERR_INCOMPATIBLE_VERSION_ERROR (NPERR_BASE + 8)
|
||||
#define NPERR_INVALID_PARAM (NPERR_BASE + 9)
|
||||
#define NPERR_INVALID_URL (NPERR_BASE + 10)
|
||||
#define NPERR_FILE_NOT_FOUND (NPERR_BASE + 11)
|
||||
#define NPERR_NO_DATA (NPERR_BASE + 12)
|
||||
#define NPERR_STREAM_NOT_SEEKABLE (NPERR_BASE + 13)
|
||||
|
||||
/*
|
||||
* Values of type NPReason:
|
||||
*/
|
||||
#define NPRES_BASE 0
|
||||
#define NPRES_DONE (NPRES_BASE + 0)
|
||||
#define NPRES_NETWORK_ERR (NPRES_BASE + 1)
|
||||
#define NPRES_USER_BREAK (NPRES_BASE + 2)
|
||||
|
||||
/*
|
||||
* Don't use these obsolete error codes any more.
|
||||
*/
|
||||
#define NP_NOERR NP_NOERR_is_obsolete_use_NPERR_NO_ERROR
|
||||
#define NP_EINVAL NP_EINVAL_is_obsolete_use_NPERR_GENERIC_ERROR
|
||||
#define NP_EABORT NP_EABORT_is_obsolete_use_NPRES_USER_BREAK
|
||||
|
||||
/*
|
||||
* Version feature information
|
||||
*/
|
||||
#define NPVERS_HAS_STREAMOUTPUT 8
|
||||
#define NPVERS_HAS_NOTIFICATION 9
|
||||
#define NPVERS_HAS_LIVECONNECT 9
|
||||
#define NPVERS_WIN16_HAS_LIVECONNECT 9
|
||||
#define NPVERS_68K_HAS_LIVECONNECT 11
|
||||
#define NPVERS_HAS_WINDOWLESS 11
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
#if defined(_WINDOWS) && !defined(WIN32)
|
||||
#define NP_LOADDS _loadds
|
||||
#else
|
||||
#if defined(__OS2__)
|
||||
#define NP_LOADDS _System
|
||||
#else
|
||||
#define NP_LOADDS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* NPP_* functions are provided by the plugin and called by the navigator.
|
||||
*/
|
||||
|
||||
#ifdef XP_UNIX
|
||||
char* NPP_GetMIMEDescription(void);
|
||||
#endif /* XP_UNIX */
|
||||
|
||||
NPError NP_LOADDS NPP_Initialize(void);
|
||||
void NP_LOADDS NPP_Shutdown(void);
|
||||
NPError NP_LOADDS NPP_New(NPMIMEType pluginType, NPP instance,
|
||||
uint16 mode, int16 argc, char* argn[],
|
||||
char* argv[], NPSavedData* saved);
|
||||
NPError NP_LOADDS NPP_Destroy(NPP instance, NPSavedData** save);
|
||||
NPError NP_LOADDS NPP_SetWindow(NPP instance, NPWindow* window);
|
||||
NPError NP_LOADDS NPP_NewStream(NPP instance, NPMIMEType type,
|
||||
NPStream* stream, NPBool seekable,
|
||||
uint16* stype);
|
||||
NPError NP_LOADDS NPP_DestroyStream(NPP instance, NPStream* stream,
|
||||
NPReason reason);
|
||||
int32 NP_LOADDS NPP_WriteReady(NPP instance, NPStream* stream);
|
||||
int32 NP_LOADDS NPP_Write(NPP instance, NPStream* stream, int32 offset,
|
||||
int32 len, void* buffer);
|
||||
void NP_LOADDS NPP_StreamAsFile(NPP instance, NPStream* stream,
|
||||
const char* fname);
|
||||
void NP_LOADDS NPP_Print(NPP instance, NPPrint* platformPrint);
|
||||
int16 NP_LOADDS NPP_HandleEvent(NPP instance, void* event);
|
||||
void NP_LOADDS NPP_URLNotify(NPP instance, const char* url,
|
||||
NPReason reason, void* notifyData);
|
||||
#if defined(JAVA)
|
||||
jref NP_LOADDS NPP_GetJavaClass(void);
|
||||
#endif
|
||||
NPError NP_LOADDS NPP_GetValue(void *instance, NPPVariable variable,
|
||||
void *value);
|
||||
NPError NP_LOADDS NPP_SetValue(void *instance, NPNVariable variable,
|
||||
void *value);
|
||||
|
||||
/*
|
||||
* NPN_* functions are provided by the navigator and called by the plugin.
|
||||
*/
|
||||
void NP_LOADDS NPN_Version(int* plugin_major, int* plugin_minor,
|
||||
int* netscape_major, int* netscape_minor);
|
||||
NPError NP_LOADDS NPN_GetURLNotify(NPP instance, const char* url,
|
||||
const char* target, void* notifyData);
|
||||
NPError NP_LOADDS NPN_GetURL(NPP instance, const char* url,
|
||||
const char* target);
|
||||
NPError NP_LOADDS NPN_PostURLNotify(NPP instance, const char* url,
|
||||
const char* target, uint32 len,
|
||||
const char* buf, NPBool file,
|
||||
void* notifyData);
|
||||
NPError NP_LOADDS NPN_PostURL(NPP instance, const char* url,
|
||||
const char* target, uint32 len,
|
||||
const char* buf, NPBool file);
|
||||
NPError NP_LOADDS NPN_RequestRead(NPStream* stream, NPByteRange* rangeList);
|
||||
NPError NP_LOADDS NPN_NewStream(NPP instance, NPMIMEType type,
|
||||
const char* target, NPStream** stream);
|
||||
int32 NP_LOADDS NPN_Write(NPP instance, NPStream* stream, int32 len,
|
||||
void* buffer);
|
||||
NPError NP_LOADDS NPN_DestroyStream(NPP instance, NPStream* stream,
|
||||
NPReason reason);
|
||||
void NP_LOADDS NPN_Status(NPP instance, const char* message);
|
||||
const char* NP_LOADDS NPN_UserAgent(NPP instance);
|
||||
void* NP_LOADDS NPN_MemAlloc(uint32 size);
|
||||
void NP_LOADDS NPN_MemFree(void* ptr);
|
||||
uint32 NP_LOADDS NPN_MemFlush(uint32 size);
|
||||
void NP_LOADDS NPN_ReloadPlugins(NPBool reloadPages);
|
||||
#if defined(JAVA)
|
||||
JRIEnv* NP_LOADDS NPN_GetJavaEnv(void);
|
||||
jref NP_LOADDS NPN_GetJavaPeer(NPP instance);
|
||||
#endif
|
||||
NPError NP_LOADDS NPN_GetValue(NPP instance, NPNVariable variable,
|
||||
void *value);
|
||||
NPError NP_LOADDS NPN_SetValue(NPP instance, NPPVariable variable,
|
||||
void *value);
|
||||
void NP_LOADDS NPN_InvalidateRect(NPP instance, NPRect *invalidRect);
|
||||
void NP_LOADDS NPN_InvalidateRegion(NPP instance, NPRegion invalidRegion);
|
||||
void NP_LOADDS NPN_ForceRedraw(NPP instance);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* end extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* RC_INVOKED */
|
||||
#ifdef __OS2__
|
||||
#pragma pack()
|
||||
#endif
|
||||
|
||||
#endif /* _NPAPI_H_ */
|
||||
52
mozilla/include/npassoc.h
Normal file
52
mozilla/include/npassoc.h
Normal file
@@ -0,0 +1,52 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* npassoc.h $Revision: 3.1 $
|
||||
* xp filetype associations
|
||||
*/
|
||||
|
||||
#ifndef _NPASSOC_H
|
||||
#define _NPASSOC_H
|
||||
|
||||
#include "xp_core.h"
|
||||
|
||||
typedef struct _NPFileTypeAssoc {
|
||||
char* type; /* a MIME type */
|
||||
char* description; /* Intelligible description */
|
||||
char** extentlist; /* a NULL-terminated list of file extensions */
|
||||
char* extentstring; /* the same extensions, as a single string */
|
||||
void* fileType; /* platform-specific file selector magic */
|
||||
struct _NPFileTypeAssoc* pNext;
|
||||
} NPFileTypeAssoc;
|
||||
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
extern NPFileTypeAssoc* NPL_NewFileAssociation(const char *type, const char *extensions,
|
||||
const char *description, void *fileType);
|
||||
extern void* NPL_DeleteFileAssociation(NPFileTypeAssoc *fassoc);
|
||||
extern void NPL_RegisterFileAssociation(NPFileTypeAssoc *fassoc);
|
||||
extern NPFileTypeAssoc* NPL_RemoveFileAssociation(NPFileTypeAssoc *fassoc);
|
||||
extern NPFileTypeAssoc* NPL_GetFileAssociation(const char *type);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
#endif /* _NPASSOC_H */
|
||||
|
||||
19
mozilla/include/nsldap.h
Normal file
19
mozilla/include/nsldap.h
Normal file
@@ -0,0 +1,19 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
/* blank ldap header just to satisfy MSVC dependency generator */
|
||||
54
mozilla/include/nslocks.h
Normal file
54
mozilla/include/nslocks.h
Normal file
@@ -0,0 +1,54 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef nspr_locks_h___
|
||||
#define nspr_locks_h___
|
||||
|
||||
/* many people in libnet [mkautocf.c ...] (and possibly others) get
|
||||
* NSPR20 for free by including nslocks.h. To minimize changes during
|
||||
* the javaectomy effort, we are including this file (where previously
|
||||
* it was only included if java was included.
|
||||
*/
|
||||
#include "prmon.h"
|
||||
#ifdef NSPR20
|
||||
#ifdef XP_MAC
|
||||
#include "prpriv.h" /* for MonitorEntryCount */
|
||||
#else
|
||||
#include "private/prpriv.h"
|
||||
#endif
|
||||
#endif /* NSPR20 */
|
||||
|
||||
#if defined(JAVA)
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
extern PRMonitor* libnet_asyncIO;
|
||||
XP_END_PROTOS
|
||||
|
||||
#define LIBNET_LOCK() PR_EnterMonitor(libnet_asyncIO)
|
||||
#define LIBNET_UNLOCK() PR_ExitMonitor(libnet_asyncIO)
|
||||
#define LIBNET_IS_LOCKED() PR_InMonitor(libnet_asyncIO)
|
||||
|
||||
#else /* !JAVA */
|
||||
|
||||
#define LIBNET_LOCK()
|
||||
#define LIBNET_UNLOCK()
|
||||
#define LIBNET_IS_LOCKED() 1
|
||||
|
||||
#endif /* JAVA */
|
||||
|
||||
#endif /* nspr_locks_h___ */
|
||||
120
mozilla/include/ntos.h
Normal file
120
mozilla/include/ntos.h
Normal file
@@ -0,0 +1,120 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
/**********************************************************************
|
||||
* ntOS.h - functionality used bt NT Operating System
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef _ntos_h
|
||||
#define _ntos_h
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/* prototypes for info.c */
|
||||
typedef enum {
|
||||
OS_WIN95,
|
||||
OS_WINNT,
|
||||
OS_WIN32S,
|
||||
OS_UNKNOWN
|
||||
} OS_TYPE;
|
||||
|
||||
typedef enum {
|
||||
PROCESSOR_I386,
|
||||
PROCESSOR_ALPHA,
|
||||
PROCESSOR_MIPS,
|
||||
PROCESSOR_PPC,
|
||||
PROCESSOR_UNKNOWN
|
||||
} PROCESSOR_TYPE;
|
||||
|
||||
OS_TYPE INFO_GetOperatingSystem ();
|
||||
DWORD INFO_GetOperatingSystemMajorVersion ();
|
||||
DWORD INFO_GetOperatingSystemMinorVersion ();
|
||||
void OS_GetComputerName (LPTSTR computerName, int nComputerNameLength );
|
||||
PROCESSOR_TYPE OS_GetProcessor ();
|
||||
|
||||
|
||||
/* prototypes for path.c */
|
||||
DWORD WINAPI PATH_RemoveRelative ( char * path );
|
||||
DWORD WINAPI PATH_ConvertNtSlashesToUnix( LPCTSTR lpszNtPath, LPSTR lpszUnixPath );
|
||||
|
||||
|
||||
/* prototypes for registry.c */
|
||||
BOOL REG_CheckIfKeyExists( HKEY hKey, LPCTSTR registryKey );
|
||||
BOOL REG_CreateKey( HKEY hKey, LPCTSTR registryKey );
|
||||
BOOL REG_DeleteKey( HKEY hKey, LPCTSTR registryKey );
|
||||
|
||||
BOOL
|
||||
REG_GetRegistryParameter(
|
||||
HKEY hKey,
|
||||
LPCTSTR registryKey,
|
||||
LPTSTR QueryValueName,
|
||||
LPDWORD ValueType,
|
||||
LPBYTE ValueBuffer,
|
||||
LPDWORD ValueBufferSize
|
||||
);
|
||||
|
||||
BOOL
|
||||
REG_SetRegistryParameter(
|
||||
HKEY hKey,
|
||||
LPCTSTR registryKey,
|
||||
LPTSTR valueName,
|
||||
DWORD valueType,
|
||||
LPCTSTR ValueString,
|
||||
DWORD valueStringLength
|
||||
);
|
||||
|
||||
BOOL
|
||||
REG_GetSubKeysInfo(
|
||||
HKEY hKey,
|
||||
LPCTSTR registryKey,
|
||||
LPDWORD lpdwNumberOfSubKeys,
|
||||
LPDWORD lpdwMaxSubKeyLength
|
||||
);
|
||||
|
||||
BOOL
|
||||
REG_GetSubKey( HKEY hKey,
|
||||
LPCTSTR registryKey,
|
||||
DWORD nSubKeyIndex,
|
||||
LPTSTR registrySubKeyBuffer,
|
||||
DWORD subKeyBufferSize
|
||||
);
|
||||
|
||||
/* prototypes for service.c */
|
||||
#define SERVRET_ERROR 0
|
||||
#define SERVRET_INSTALLED 1
|
||||
#define SERVRET_STARTING 2
|
||||
#define SERVRET_STARTED 3
|
||||
#define SERVRET_STOPPING 4
|
||||
#define SERVRET_REMOVED 5
|
||||
|
||||
DWORD SERVICE_GetNTServiceStatus(LPCTSTR serviceName, LPDWORD lpLastError );
|
||||
DWORD SERVICE_InstallNTService(LPCTSTR serviceName, LPCTSTR serviceExe );
|
||||
DWORD SERVICE_RemoveNTService(LPCTSTR serviceName);
|
||||
DWORD SERVICE_StartNTService(LPCTSTR serviceName);
|
||||
DWORD SERVICE_StopNTService(LPCTSTR serviceName);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif
|
||||
201
mozilla/include/ntypes.h
Normal file
201
mozilla/include/ntypes.h
Normal file
@@ -0,0 +1,201 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _NetscapeTypes_
|
||||
#define _NetscapeTypes_
|
||||
|
||||
#include "xp_core.h"
|
||||
|
||||
/*
|
||||
netlib
|
||||
*/
|
||||
typedef int FO_Present_Types;
|
||||
typedef struct URL_Struct_ URL_Struct;
|
||||
typedef struct _NET_StreamClass NET_StreamClass;
|
||||
|
||||
|
||||
/*
|
||||
* libi18n
|
||||
*/
|
||||
typedef struct OpaqueCCCDataObject *CCCDataObject;
|
||||
typedef struct OpaqueINTL_CharSetInfo *INTL_CharSetInfo;
|
||||
|
||||
/* How to refill when there's a cache miss */
|
||||
typedef enum NET_ReloadMethod
|
||||
{
|
||||
NET_DONT_RELOAD, /* use the cache */
|
||||
NET_RESIZE_RELOAD, /* use the cache -- special for resizing */
|
||||
NET_NORMAL_RELOAD, /* use IMS gets for reload */
|
||||
NET_SUPER_RELOAD, /* retransfer everything */
|
||||
NET_CACHE_ONLY_RELOAD /* Don't do anything if we miss in the cache.
|
||||
(For the image library) */
|
||||
} NET_ReloadMethod;
|
||||
|
||||
/*
|
||||
plugins
|
||||
*/
|
||||
typedef struct _NPEmbeddedApp NPEmbeddedApp;
|
||||
|
||||
/*
|
||||
history
|
||||
*/
|
||||
typedef struct _History_entry History_entry;
|
||||
typedef struct History_ History;
|
||||
|
||||
/*
|
||||
bookmarks (so shist.h doesn't have to include all of bkmks.h.)
|
||||
|
||||
Note, BM_Entry_struct is defined in bkmks.c. Not good practice
|
||||
since this hides dependency info about the struct i.e., if you
|
||||
change the struct, clients of the struct in other source files
|
||||
will not indirectly recompile.
|
||||
*/
|
||||
|
||||
typedef struct BM_Entry_struct BM_Entry;
|
||||
|
||||
/*
|
||||
parser
|
||||
*/
|
||||
typedef struct _PA_Functions PA_Functions;
|
||||
typedef struct PA_Tag_struct PA_Tag;
|
||||
|
||||
/*
|
||||
layout
|
||||
*/
|
||||
typedef union LO_Element_struct LO_Element;
|
||||
|
||||
typedef struct LO_AnchorData_struct LO_AnchorData;
|
||||
typedef struct LO_Color_struct LO_Color;
|
||||
typedef struct LO_TextAttr_struct LO_TextAttr;
|
||||
typedef struct LO_TextInfo_struct LO_TextInfo;
|
||||
typedef struct LO_TextStruct_struct LO_TextStruct;
|
||||
typedef struct LO_ImageAttr_struct LO_ImageAttr;
|
||||
typedef struct LO_ImageStruct_struct LO_ImageStruct;
|
||||
typedef struct LO_SubDocStruct_struct LO_SubDocStruct;
|
||||
typedef struct LO_EmbedStruct_struct LO_EmbedStruct;
|
||||
typedef struct LO_JavaAppStruct_struct LO_JavaAppStruct;
|
||||
typedef struct LO_EdgeStruct_struct LO_EdgeStruct;
|
||||
typedef struct LO_ObjectStruct_struct LO_ObjectStruct;
|
||||
|
||||
typedef union LO_FormElementData_struct LO_FormElementData;
|
||||
|
||||
typedef struct lo_FormElementOptionData_struct lo_FormElementOptionData;
|
||||
typedef struct lo_FormElementSelectData_struct lo_FormElementSelectData;
|
||||
typedef struct lo_FormElementTextData_struct lo_FormElementTextData;
|
||||
typedef struct lo_FormElementTextareaData_struct lo_FormElementTextareaData;
|
||||
typedef struct lo_FormElementMinimalData_struct lo_FormElementMinimalData;
|
||||
typedef struct lo_FormElementToggleData_struct lo_FormElementToggleData;
|
||||
typedef struct lo_FormElementObjectData_struct lo_FormElementObjectData;
|
||||
typedef struct lo_FormElementKeygenData_struct lo_FormElementKeygenData;
|
||||
|
||||
typedef struct LO_Any_struct LO_Any;
|
||||
typedef struct LO_FormSubmitData_struct LO_FormSubmitData;
|
||||
typedef struct LO_FormElementStruct_struct LO_FormElementStruct;
|
||||
typedef struct LO_LinefeedStruct_struct LO_LinefeedStruct;
|
||||
typedef struct LO_HorizRuleStruct_struct LO_HorizRuleStruct;
|
||||
typedef struct LO_BulletStruct_struct LO_BulletStruct;
|
||||
/* was misspelled as LO_BullettStruct */
|
||||
#define LO_BullettStruct LO_BulletStruct
|
||||
typedef struct LO_TableStruct_struct LO_TableStruct;
|
||||
typedef struct LO_CellStruct_struct LO_CellStruct;
|
||||
typedef struct LO_Position_struct LO_Position;
|
||||
typedef struct LO_Selection_struct LO_Selection;
|
||||
typedef struct LO_HitLineResult_struct LO_HitLineResult;
|
||||
typedef struct LO_HitElementResult_struct LO_HitElementResult;
|
||||
typedef union LO_HitResult_struct LO_HitResult;
|
||||
|
||||
/* Line style parameter for displaying borders */
|
||||
typedef enum {
|
||||
LO_SOLID,
|
||||
LO_DASH,
|
||||
LO_BEVEL
|
||||
} LO_LineStyle;
|
||||
|
||||
|
||||
/*#ifndef NO_TAB_NAVIGATION */
|
||||
typedef struct LO_tabFocus_struct LO_TabFocusData;
|
||||
/* NO_TAB_NAVIGATION */
|
||||
|
||||
/*
|
||||
XLation
|
||||
*/
|
||||
typedef struct PrintInfo_ PrintInfo;
|
||||
typedef struct PrintSetup_ PrintSetup;
|
||||
|
||||
/*
|
||||
mother of data structures
|
||||
*/
|
||||
typedef struct MWContext_ MWContext;
|
||||
|
||||
/*
|
||||
Chrome structure
|
||||
*/
|
||||
typedef struct _Chrome Chrome;
|
||||
|
||||
/*
|
||||
Editor
|
||||
*/
|
||||
#include "edttypes.h"
|
||||
|
||||
typedef enum
|
||||
{
|
||||
MWContextAny = -1, /* Used as a noopt when searching for a context of a particular type */
|
||||
MWContextBrowser, /* A web browser window */
|
||||
MWContextMail, /* A mail reader window */
|
||||
MWContextNews, /* A news reader window */
|
||||
MWContextMailMsg, /* A window to display a mail msg */
|
||||
MWContextNewsMsg, /* A window to display a news msg */
|
||||
MWContextMessageComposition, /* A news-or-mail message editing window */
|
||||
MWContextSaveToDisk, /* The placeholder window for a download */
|
||||
MWContextText, /* non-window context for text conversion */
|
||||
MWContextPostScript, /* non-window context for PS conversion */
|
||||
MWContextBiff, /* non-window context for background mail
|
||||
notification */
|
||||
MWContextJava, /* non-window context for Java */
|
||||
MWContextBookmarks, /* Context for the bookmarks */
|
||||
MWContextAddressBook, /* Context for the addressbook */
|
||||
MWContextOleNetwork, /* non-window context for the OLE network1 object */
|
||||
MWContextPrint, /* non-window context for printing */
|
||||
MWContextDialog, /* non-browsing dialogs. view-source/security */
|
||||
MWContextMetaFile, /* non-window context for Windows metafile support */
|
||||
MWContextEditor, /* An Editor Window */
|
||||
MWContextSearch, /* a window for modeless search dialog */
|
||||
MWContextSearchLdap, /* a window for modeless LDAP search dialog */
|
||||
MWContextHTMLHelp, /* HTML Help context to load map files */
|
||||
MWContextMailFilters, /* Mail filters context */
|
||||
MWContextHistory, /* A history window */
|
||||
MWContextMailNewsProgress, /* a progress pane for mail/news URLs */
|
||||
MWContextPane, /* Misc browser pane/window in weird parts of
|
||||
* the UI, such as the navigation center */
|
||||
MWContextRDFSlave, /* Slave context for RDF network loads */
|
||||
MWContextProgressModule, /* Progress module (PW_ functions) */
|
||||
MWContextIcon /* Context for loading images as icons */
|
||||
} MWContextType;
|
||||
|
||||
#define MAIL_NEWS_TYPE(x) ( \
|
||||
((x) == MWContextMail) || \
|
||||
((x) == MWContextNews) || \
|
||||
((x) == MWContextMailMsg) || \
|
||||
((x) == MWContextNewsMsg) )
|
||||
|
||||
|
||||
struct LJAppletData;
|
||||
|
||||
#endif /* _NetscapeTypes_ */
|
||||
|
||||
73
mozilla/include/os2file.h
Normal file
73
mozilla/include/os2file.h
Normal file
@@ -0,0 +1,73 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
/* ---------------------------------------------------------------------------
|
||||
Stuff to fake unix file I/O on os2 boxes
|
||||
------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef OS2FILE_H
|
||||
#define OS2FILE_H
|
||||
|
||||
#if defined(XP_OS2)
|
||||
/* 32-bit stuff here */
|
||||
#define INCL_DOSPROCESS
|
||||
#define INCL_DOS
|
||||
#define INCL_DOSERRORS
|
||||
#define INCL_DOSFILEMGR
|
||||
#define INCL_DOSMODULEMGR
|
||||
#define INCL_PM
|
||||
|
||||
|
||||
#define INCL_WIN
|
||||
#define INCL_WINATOM
|
||||
#define INCL_GPI
|
||||
#define TID OS2TID /* global rename in OS2 H's! */
|
||||
#include <os2.h>
|
||||
#undef TID /* and restore */
|
||||
|
||||
|
||||
/*DAK these are empty.. #include <windef.h> */
|
||||
/*DAK these are empty.. #include <winbase.h>*/
|
||||
#include <stdlib.h>
|
||||
#include <sys\types.h>
|
||||
#include <sys\stat.h>
|
||||
#include "dirent.h"
|
||||
|
||||
/*DSR020697 - now using dirent.h for DIR...*/
|
||||
|
||||
#define _ST_FSTYPSZ 16
|
||||
typedef unsigned long mode_t;
|
||||
typedef long uid_t;
|
||||
typedef long gid_t;
|
||||
#ifndef XP_OS2
|
||||
typedef long off_t;
|
||||
#endif
|
||||
typedef unsigned long nlink_t;
|
||||
|
||||
typedef struct timestruc {
|
||||
time_t tv_sec; /* seconds */
|
||||
long tv_nsec; /* and nanoseconds */
|
||||
} timestruc_t;
|
||||
|
||||
/*DSR020697 - now using dirent.h for dirent, S_ISDIR...*/
|
||||
|
||||
#endif /* XP_OS2 */
|
||||
|
||||
#define CONST const
|
||||
|
||||
#endif /* OS2FILE_H */
|
||||
68
mozilla/include/os2sock.h
Normal file
68
mozilla/include/os2sock.h
Normal file
@@ -0,0 +1,68 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
/* New file created by IBM-VPB050196 */
|
||||
#ifndef _OS2SOCK_H
|
||||
#define _OS2SOCK_H
|
||||
#if !defined(RC_INVOKED)
|
||||
#include "mcom_db.h"
|
||||
#endif
|
||||
|
||||
/*DSR050297 - this is based on types.h in the TCP/IP headers... */
|
||||
/*I'm not including types.h because that causes all sorts of damage... */
|
||||
#define MAXHOSTNAMELEN 120
|
||||
|
||||
#if defined(XP_OS2_DOUGSOCK)
|
||||
#ifndef BSD_SELECT
|
||||
#error you need BSD_SELECT defined in your command line for all files
|
||||
#endif
|
||||
#include <nerrno.h>
|
||||
#include <sys\socket.h>
|
||||
#include <sys\select.h>
|
||||
#include <sys\time.h>
|
||||
#include <sys\ioctl.h>
|
||||
#include <netdb.h>
|
||||
#include <utils.h>
|
||||
|
||||
#else
|
||||
/*DSR072196 - replaced many files with pmwsock.h...*/
|
||||
#include <pmwsock.h>
|
||||
|
||||
#ifndef IP_MULTICAST_IF
|
||||
#define IP_MULTICAST_IF 2 /* set/get IP multicast interface*/
|
||||
#define IP_MULTICAST_TTL 3 /* set/get IP multicast timetolive*/
|
||||
#define IP_MULTICAST_LOOP 4 /* set/get IP multicast loopback */
|
||||
#define IP_ADD_MEMBERSHIP 5 /* add an IP group membership */
|
||||
#define IP_DROP_MEMBERSHIP 6 /* drop an IP group membership */
|
||||
|
||||
#define IP_DEFAULT_MULTICAST_TTL 1 /* normally limit m'casts to 1 hop */
|
||||
#define IP_DEFAULT_MULTICAST_LOOP 1 /* normally hear sends if a member */
|
||||
#define IP_MAX_MEMBERSHIPS 20 /* per socket; must fit in one mbuf*/
|
||||
|
||||
/*
|
||||
* Argument structure for IP_ADD_MEMBERSHIP and IP_DROP_MEMBERSHIP.
|
||||
*/
|
||||
struct ip_mreq {
|
||||
struct in_addr imr_multiaddr; /* IP multicast address of group */
|
||||
struct in_addr imr_interface; /* local IP address of interface */
|
||||
};
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
66
mozilla/include/pics.h
Normal file
66
mozilla/include/pics.h
Normal file
@@ -0,0 +1,66 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef PICS_H
|
||||
#define PICS_H
|
||||
|
||||
typedef struct {
|
||||
char *service;
|
||||
XP_Bool generic;
|
||||
char *fur; /* means 'for' */
|
||||
XP_List *ratings;
|
||||
} PICS_RatingsStruct;
|
||||
|
||||
typedef struct {
|
||||
char *name;
|
||||
double value;
|
||||
} PICS_RatingValue;
|
||||
|
||||
typedef enum {
|
||||
PICS_RATINGS_PASSED,
|
||||
PICS_RATINGS_FAILED,
|
||||
PICS_NO_RATINGS
|
||||
} PICS_PassFailReturnVal;
|
||||
|
||||
void PICS_FreeRatingsStruct(PICS_RatingsStruct *rs);
|
||||
|
||||
/* return NULL or ratings struct */
|
||||
PICS_RatingsStruct * PICS_ParsePICSLable(char * label);
|
||||
|
||||
/* returns TRUE if page should be censored
|
||||
* FALSE if page is allowed to be shown
|
||||
*/
|
||||
PICS_PassFailReturnVal PICS_CompareToUserSettings(PICS_RatingsStruct *rs, char *cur_page_url);
|
||||
|
||||
XP_Bool PICS_IsPICSEnabledByUser(void);
|
||||
|
||||
XP_Bool PICS_AreRatingsRequired(void);
|
||||
|
||||
/* returns a URL string from a RatingsStruct
|
||||
* that includes the service URL and rating info
|
||||
*/
|
||||
char * PICS_RStoURL(PICS_RatingsStruct *rs, char *cur_page_url);
|
||||
|
||||
void PICS_Init(MWContext *context);
|
||||
|
||||
XP_Bool PICS_CanUserEnableAdditionalJavaCapabilities(void);
|
||||
|
||||
XP_Bool PICS_CheckForValidTreeRating(char *url_address);
|
||||
|
||||
|
||||
#endif /* PICS_H */
|
||||
26
mozilla/include/prefetch.h
Normal file
26
mozilla/include/prefetch.h
Normal file
@@ -0,0 +1,26 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
/* Prefetching H file */
|
||||
#ifndef PREFETCH_H
|
||||
#define PREFETCH_H
|
||||
|
||||
extern void PRE_AddToList(MWContext* context, char* url, double value);
|
||||
extern void PRE_Fetch(MWContext* context);
|
||||
extern void PRE_Enable(XP_Bool enabled);
|
||||
|
||||
#endif /* PREFETCH_H */
|
||||
420
mozilla/include/proto.h
Normal file
420
mozilla/include/proto.h
Normal file
@@ -0,0 +1,420 @@
|
||||
/* -*- Mode: C; tab-width: 8; 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.
|
||||
*/
|
||||
|
||||
|
||||
/* This file should contain prototypes of all public functions for all
|
||||
modules in the client library.
|
||||
|
||||
This file will be included automatically when source includes "client.h".
|
||||
By the time this file is included, all global typedefs have been executed.
|
||||
*/
|
||||
|
||||
/* make sure we only include this once */
|
||||
#ifndef _PROTO_H_
|
||||
#define _PROTO_H_
|
||||
|
||||
#include "ntypes.h"
|
||||
#include "lo_ele.h"
|
||||
|
||||
#ifndef NSPR20
|
||||
#if defined(__sun)
|
||||
# include "sunos4.h"
|
||||
#endif /* __sun */
|
||||
#endif /* NSPR20 */
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
/* put your prototypes here..... */
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* Parser stuff
|
||||
*/
|
||||
|
||||
extern intn PA_ParserInit(PA_Functions *);
|
||||
extern NET_StreamClass *PA_BeginParseMDL(FO_Present_Types, void *,
|
||||
URL_Struct *, MWContext *);
|
||||
extern intn PA_ParseBlock(NET_StreamClass *, const char *, int);
|
||||
extern void PA_MDLComplete(NET_StreamClass *);
|
||||
extern void PA_MDLAbort(NET_StreamClass *, int);
|
||||
extern Bool PA_HasMocha(PA_Tag *tag);
|
||||
extern PA_Tag * PA_CloneMDLTag(PA_Tag * src);
|
||||
extern intn PA_ParseStringToTags(MWContext *, char *, int32, void *);
|
||||
extern const char *PA_TagString(int32);
|
||||
extern int32 PA_TagIndex(char *);
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* Layout stuff
|
||||
*/
|
||||
|
||||
/*#ifndef NO_TAB_NAVIGATION */
|
||||
|
||||
extern Bool LO_isTabableElement(MWContext *context, LO_TabFocusData *pCurrentFocus );
|
||||
extern Bool LO_isTabableFormElement( LO_FormElementStruct * next_ele );
|
||||
extern Bool LO_isFormElementNeedTextTabFocus( LO_FormElementStruct *pElement );
|
||||
extern LO_Element * LO_getFirstLastElement(MWContext *context, int wantFirst );
|
||||
extern Bool LO_getNextTabableElement( MWContext *context, LO_TabFocusData *currentFocus, int forward );
|
||||
|
||||
/* NO_TAB_NAVIGATION */
|
||||
|
||||
extern LO_FormElementStruct *
|
||||
LO_ReturnNextFormElement(MWContext *context,
|
||||
LO_FormElementStruct *current_element);
|
||||
extern LO_FormElementStruct *
|
||||
LO_ReturnPrevFormElement(MWContext *context,
|
||||
LO_FormElementStruct *current_element);
|
||||
|
||||
/* NO_TAB_NAVIGATION,
|
||||
LO_ReturnNextFormElementInTabGroup() is used to tab through form elements.
|
||||
Since the winfe now has TAB_NAVIGATION, it is not used any more.
|
||||
If mac and Unix don't use it either, it can be removed.
|
||||
*/
|
||||
extern LO_FormElementStruct *
|
||||
LO_ReturnNextFormElementInTabGroup(MWContext *context,
|
||||
LO_FormElementStruct *current_element,
|
||||
XP_Bool go_backwards);
|
||||
|
||||
extern intn LO_ProcessTag(void *, PA_Tag *, intn);
|
||||
extern void LO_RefreshArea(MWContext *context, int32 left, int32 top,
|
||||
uint32 width, uint32 height);
|
||||
extern Bool LO_CheckForUnload(MWContext *context);
|
||||
|
||||
#ifdef LAYERS
|
||||
extern void LO_MoveLayer(CL_Layer *layer, int32 x, int32 y);
|
||||
extern int32 LO_GetLayerXOffset(CL_Layer *layer);
|
||||
extern int32 LO_GetLayerYOffset(CL_Layer *layer);
|
||||
|
||||
extern int32 LO_GetLayerWrapWidth(CL_Layer *layer);
|
||||
extern int32 LO_GetLayerScrollWidth(CL_Layer *layer);
|
||||
extern int32 LO_GetLayerScrollHeight(CL_Layer *layer);
|
||||
extern void LO_SetLayerScrollWidth(CL_Layer *layer, uint32 width);
|
||||
extern void LO_SetLayerScrollHeight(CL_Layer *layer, uint32 height);
|
||||
|
||||
extern void LO_SetLayerBbox(CL_Layer *layer, XP_Rect *bbox);
|
||||
|
||||
extern void LO_SetLayerBgColor(CL_Layer *layer, LO_Color *color);
|
||||
extern LO_Color * LO_GetLayerBgColor(CL_Layer *layer);
|
||||
extern void LO_SetLayerBackdropURL(CL_Layer *layer, const char *url);
|
||||
extern const char *LO_GetLayerBackdropURL(CL_Layer *layer);
|
||||
extern LO_ImageStruct *LO_GetLayerBackdropImage(CL_Layer *layer);
|
||||
extern void LO_SetImageURL(MWContext *context, IL_GroupContext *mocha_img_cx,
|
||||
LO_ImageStruct *image, const char *url,
|
||||
NET_ReloadMethod reload_policy);
|
||||
extern void LO_SetDocBgColor(MWContext *context, LO_Color *rgb);
|
||||
|
||||
extern void
|
||||
lo_SetLayerClipExpansionPolicy(CL_Layer *layer, int policy);
|
||||
extern int
|
||||
lo_GetLayerClipExpansionPolicy(CL_Layer *layer);
|
||||
|
||||
#ifdef JAVA
|
||||
/* Java Applet layer code */
|
||||
extern void LO_SetJavaAppTransparent(LO_JavaAppStruct *javaData);
|
||||
#endif
|
||||
|
||||
extern void LO_SetEmbedType(LO_EmbedStruct *embed, PRBool is_windowed);
|
||||
extern void LO_SetEmbedSize( MWContext *context, LO_EmbedStruct *embed, int32 width, int32 height );
|
||||
|
||||
#ifdef JAVA
|
||||
extern void LO_SetJavaAppTransparent(LO_JavaAppStruct *javaData);
|
||||
#endif
|
||||
|
||||
extern void *LO_GetLayerMochaObjectFromId(MWContext *context, int32 layer_id);
|
||||
extern void *LO_GetLayerMochaObjectFromLayer(MWContext *context,
|
||||
CL_Layer *layer);
|
||||
extern void LO_SetLayerMochaObject(MWContext *context, int32 layer_id,
|
||||
void *mocha_object);
|
||||
extern CL_Layer *LO_GetLayerFromId(MWContext *context, int32 layer_id);
|
||||
extern int32 LO_GetIdFromLayer(MWContext *context, CL_Layer *layer);
|
||||
extern int32 LO_GetNumberOfLayers(MWContext *context);
|
||||
#endif
|
||||
extern NET_ReloadMethod LO_GetReloadMethod(MWContext *context);
|
||||
|
||||
#ifdef LAYERS
|
||||
extern LO_Element *LO_XYToElement(MWContext *, int32, int32, CL_Layer *);
|
||||
extern LO_Element *LO_XYToNearestElement(MWContext *, int32, int32,
|
||||
CL_Layer *);
|
||||
#else
|
||||
extern LO_Element *LO_XYToElement(MWContext *, int32, int32);
|
||||
extern LO_Element *LO_XYToNearestElement(MWContext *, int32, int32);
|
||||
#endif /* LAYERS */
|
||||
|
||||
extern void LO_MoveGridEdge(MWContext *context, LO_EdgeStruct *edge,
|
||||
int32 x, int32 y);
|
||||
extern void LO_SetImageInfo(MWContext *context, int32 ele_id,
|
||||
int32 width, int32 height);
|
||||
extern void LO_SetForceLoadImage(char *url, XP_Bool all_images);
|
||||
extern void LO_SetUserOverride(Bool override);
|
||||
extern void LO_SetDefaultBackdrop(char *url);
|
||||
extern void LO_SetDefaultColor(intn type, uint8 red, uint8 green, uint8 blue);
|
||||
extern Bool LO_ParseRGB(char *rgb, uint8 *red, uint8 *green, uint8 *blue);
|
||||
extern Bool LO_ParseStyleSheetRGB(char *rgb, uint8 *red, uint8 *green, uint8 *blue);
|
||||
extern void LO_ClearBackdropBlock(MWContext *context,
|
||||
LO_ImageStruct *image, Bool fg_ok);
|
||||
extern void LO_ClearEmbedBlock(MWContext *context, LO_EmbedStruct *embed);
|
||||
extern Bool LO_BlockedOnImage(MWContext *, LO_ImageStruct *image);
|
||||
extern void LO_CloseAllTags(MWContext *);
|
||||
extern void LO_DiscardDocument(MWContext *);
|
||||
extern LO_FormSubmitData *LO_SubmitForm(MWContext *context,
|
||||
LO_FormElementStruct *form_element);
|
||||
extern LO_FormSubmitData *LO_SubmitImageForm(MWContext *context,
|
||||
LO_ImageStruct *image, int32 x, int32 y);
|
||||
extern void LO_ResetForm(MWContext *context,
|
||||
LO_FormElementStruct *form_element);
|
||||
extern LO_FormElementStruct *
|
||||
LO_FormRadioSet(MWContext *context, LO_FormElementStruct *form_element);
|
||||
extern void LO_SaveFormData(MWContext *context);
|
||||
extern void LO_CloneFormData(SHIST_SavedData *, MWContext *context,
|
||||
URL_Struct *url_struct);
|
||||
extern void LO_HighlightAnchor(MWContext *context, LO_Element *element,Bool on);
|
||||
#ifdef OLD_POS_HIST
|
||||
extern void LO_SetDocumentPosition(MWContext *context, int32 x, int32 y);
|
||||
#endif /* OLD_POS_HIST */
|
||||
extern void LO_SetDocumentDimensions(MWContext *context,
|
||||
int32 width, int32 height);
|
||||
#ifdef LAYERS
|
||||
extern void LO_StartSelection(MWContext *context, int32 x, int32 y,
|
||||
CL_Layer *layer);
|
||||
#else
|
||||
extern void LO_StartSelection(MWContext *context, int32 x, int32 y);
|
||||
#endif /* LAYERS */
|
||||
|
||||
typedef enum {
|
||||
SMALL_BM_ICON,
|
||||
LARGE_BM_ICON
|
||||
} BMIconType;
|
||||
|
||||
extern char * LO_GetBookmarkIconURLForPage(MWContext *context, BMIconType type);
|
||||
|
||||
/* Re-layout layout elements on resize without destroying them and reloading page
|
||||
from scratch */
|
||||
extern void LO_RelayoutOnResize(MWContext *context, int32 width, int32 height, int32 leftMargin, int32 topMargin);
|
||||
/* Re-layout layout elements when one changes size. */
|
||||
extern void LO_RelayoutFromElement(MWContext *context, LO_Element *element);
|
||||
|
||||
extern void LO_ExtendSelection(MWContext *context, int32 x, int32 y);
|
||||
extern void LO_EndSelection(MWContext *context);
|
||||
extern void LO_ClearSelection(MWContext *context);
|
||||
extern XP_Block LO_GetSelectionText(MWContext *context);
|
||||
extern Bool LO_FindText(MWContext *context, char *text,
|
||||
LO_Element **start_ele_loc, int32 *start_position,
|
||||
LO_Element **end_ele_loc, int32 *end_position,
|
||||
Bool use_case, Bool forward);
|
||||
extern Bool LO_FindGridText(MWContext *context, MWContext **ret_context,
|
||||
char *text,
|
||||
LO_Element **start_ele_loc, int32 *start_position,
|
||||
LO_Element **end_ele_loc, int32 *end_position,
|
||||
Bool use_case, Bool forward);
|
||||
extern Bool LO_SelectAll(MWContext *context);
|
||||
extern void LO_SelectText(MWContext *context, LO_Element *start,int32 start_pos,
|
||||
LO_Element *end, int32 end_pos, int32 *x, int32 *y);
|
||||
extern void LO_RefreshAnchors(MWContext *context);
|
||||
extern Bool LO_HaveSelection(MWContext *context);
|
||||
extern void LO_GetSelectionEndpoints(MWContext *context,
|
||||
LO_Element **start, LO_Element **end, int32 *start_pos, int32 *end_pos, CL_Layer **sel_layer);
|
||||
extern void LO_FreeSubmitData(LO_FormSubmitData *submit_data);
|
||||
extern void LO_FreeDocumentFormListData(MWContext *context, void *form_data);
|
||||
extern void LO_FreeDocumentEmbedListData(MWContext *context, void *embed_data);
|
||||
extern void LO_FreeDocumentGridData(MWContext *context, void *grid_data);
|
||||
extern void LO_FreeDocumentAppletData(MWContext *context, void *applet_data);
|
||||
extern void LO_RedoFormElements(MWContext *context);
|
||||
extern void LO_InvalidateFontData(MWContext *context);
|
||||
extern void LO_GetDocumentMargins(MWContext *context,
|
||||
int32 *margin_width, int32 *margin_height);
|
||||
extern Bool LO_HasBGImage(MWContext *context);
|
||||
extern Bool LO_LocateNamedAnchor(MWContext *context, URL_Struct *url_struct,
|
||||
int32 *xpos, int32 *ypos);
|
||||
extern int32 LO_EmptyRecyclingBin(MWContext *context);
|
||||
extern LO_AnchorData *LO_MapXYToAreaAnchor(MWContext *context,
|
||||
LO_ImageStruct *image, int32 x, int32 y);
|
||||
extern intn LO_DocumentInfo(MWContext *context, NET_StreamClass *stream);
|
||||
extern intn LO_ChangeFontSize(intn size, char *size_str);
|
||||
extern double LO_GetScalingFactor(int32 scaler);
|
||||
extern int16 LO_WindowWidthInFixedChars(MWContext *context);
|
||||
extern void LO_CleanupGridHistory(MWContext *context);
|
||||
extern void LO_UpdateGridHistory(MWContext *context);
|
||||
extern Bool LO_BackInGrid(MWContext *context);
|
||||
extern Bool LO_ForwardInGrid(MWContext *context);
|
||||
extern Bool LO_GridCanGoForward(MWContext *context);
|
||||
extern Bool LO_GridCanGoBackward(MWContext *context);
|
||||
|
||||
#ifdef LAYERS
|
||||
extern Bool LO_Click( MWContext *context, int32 x, int32 y,
|
||||
Bool requireCaret, CL_Layer *layer );
|
||||
extern void LO_Hit(MWContext *context, int32 x, int32 y,
|
||||
Bool requireCaret, LO_HitResult *result, CL_Layer *layer);
|
||||
#else
|
||||
extern Bool LO_Click( MWContext *context, int32 x, int32 y, Bool requireCaret );
|
||||
extern void LO_Hit(MWContext *context, int32 x, int32 y,
|
||||
Bool requireCaret, LO_HitResult *result);
|
||||
#endif /* LAYERS */
|
||||
|
||||
extern int32 LO_TextElementWidth(MWContext *context, LO_TextStruct *text_ele, int charOffset);
|
||||
|
||||
extern void LO_AddEmbedData(MWContext* context, LO_EmbedStruct* embed, void* data);
|
||||
extern void LO_CopySavedEmbedData(MWContext* context, SHIST_SavedData* newdata);
|
||||
extern NET_StreamClass* LO_NewObjectStream(FO_Present_Types format_out, void* type,
|
||||
URL_Struct* urls, MWContext* context);
|
||||
|
||||
extern void LO_CreateReblockTag(MWContext* context, LO_Element* element);
|
||||
extern void LO_LockLayout(void);
|
||||
extern void LO_UnlockLayout(void);
|
||||
extern Bool LO_VerifyUnlockedLayout();
|
||||
extern void LO_NetlibComplete(MWContext * context);
|
||||
|
||||
extern void LO_UpdateTextData(lo_FormElementTextData * textData, const char * text);
|
||||
|
||||
#ifdef EDITOR
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* Layout stuff specific to the editor
|
||||
*/
|
||||
|
||||
|
||||
#ifdef LAYERS
|
||||
extern void LO_PositionCaret( MWContext *context, int32 x, int32 y,
|
||||
CL_Layer *layer);
|
||||
extern void LO_DoubleClick( MWContext *context, int32 x, int32 y,
|
||||
CL_Layer *layer );
|
||||
#else
|
||||
extern void LO_PositionCaret( MWContext *context, int32 x, int32 y );
|
||||
extern void LO_DoubleClick( MWContext *context, int32 x, int32 y );
|
||||
#endif /* LAYERS */
|
||||
|
||||
void LO_PositionCaretBounded(MWContext *context, int32 x, int32 y,
|
||||
int32 minY, int32 maxY );
|
||||
|
||||
extern ED_Buffer* LO_GetEDBuffer( MWContext *context);
|
||||
extern void LO_GetEffectiveCoordinates( MWContext *pContext, LO_Element *pElement, int32 position,
|
||||
int32* pX, int32* pY, int32* pWidth, int32* pHeight );
|
||||
extern void LO_UpDown( MWContext *pContext, LO_Element *pElement, int32 position, int32 iDesiredX, Bool bSelect, Bool bForward );
|
||||
extern Bool LO_PreviousPosition( MWContext *pContext,LO_Element *pElement, intn iOffset,
|
||||
ED_Element **ppEdElement, intn* pOffset);
|
||||
extern Bool LO_NextPosition( MWContext *pContext,LO_Element *pElement, intn iOffset,
|
||||
ED_Element **ppEdElement, intn* pOffset);
|
||||
extern Bool LO_NavigateChunk( MWContext *pContext, intn chunkType, Bool bSelect, Bool bForward );
|
||||
extern Bool LO_ComputeNewPosition( MWContext *context, intn chunkType,
|
||||
Bool bSelect, Bool bDeselecting, Bool bForward,
|
||||
LO_Element** pElement, int32* pPosition );
|
||||
|
||||
extern LO_Element* LO_BeginOfLine( MWContext *pContext, LO_Element *pElement );
|
||||
extern LO_Element* LO_EndOfLine( MWContext *pContext, LO_Element *pElement);
|
||||
extern LO_Element* LO_FirstElementOnLine( MWContext *pContext,
|
||||
int32 x, int32 y, int32 *pLineNum);
|
||||
#ifdef LAYERS
|
||||
extern void LO_StartSelectionFromElement( MWContext *context, LO_Element *eptr,
|
||||
int32 new_pos, CL_Layer *layer );
|
||||
#else
|
||||
extern void LO_StartSelectionFromElement( MWContext *context, LO_Element *eptr,
|
||||
int32 new_pos );
|
||||
#endif /* LAYERS */
|
||||
extern void LO_ExtendSelectionFromElement( MWContext *context, LO_Element *eptr,
|
||||
int32 position, Bool bFromStart );
|
||||
extern Bool LO_SelectElement( MWContext *context, LO_Element *eptr,
|
||||
int32 position, Bool bFromStart );
|
||||
extern void LO_SelectRegion( MWContext *context, LO_Element *begin,
|
||||
int32 beginPosition, LO_Element *end, int32 endPosition,
|
||||
Bool fromStart, Bool forward );
|
||||
extern Bool LO_IsSelected( MWContext *context );
|
||||
extern Bool LO_IsSelectionStarted( MWContext *context );
|
||||
extern void LO_GetSelectionEndPoints( MWContext *context,
|
||||
LO_Element **ppStart, intn *pStartOffset, LO_Element **ppEnd,
|
||||
intn *pEndOffset, Bool *pbFromStart, Bool *pbSingleElementSelection );
|
||||
extern void LO_GetSelectionNewPoint( MWContext *context,
|
||||
LO_Element **ppNew, intn *pNewOffset);
|
||||
extern LO_Element* LO_PreviousEditableElement( LO_Element *pElement );
|
||||
extern LO_Element* LO_NextEditableElement( LO_Element *pElement );
|
||||
extern LO_ImageStruct* LO_NewImageElement( MWContext* context );
|
||||
extern void LO_SetBackgroundImage( MWContext *context, char *pUrl );
|
||||
extern void LO_RefetchWindowDimensions( MWContext *pContext );
|
||||
extern void LO_Relayout( MWContext *context, ED_TagCursor *pCursor,
|
||||
int32 iLine, int iStartEditOffset, XP_Bool bDisplayTables );
|
||||
|
||||
#endif /*EDITOR*/
|
||||
|
||||
extern void LO_SetBaseURL( MWContext *pContext, char *pURL );
|
||||
extern char* LO_GetBaseURL( MWContext *pContext );
|
||||
|
||||
#if 0
|
||||
extern Bool LO_Click( MWContext *context, int32 x, int32 y, Bool requireCaret );
|
||||
extern void LO_Hit(MWContext *context, int32 x, int32 y, Bool requireCaret, LO_HitResult *result);
|
||||
#endif
|
||||
|
||||
#ifdef LAYERS
|
||||
extern void LO_SelectObject( MWContext *context, int32 x, int32 y,
|
||||
CL_Layer *layer );
|
||||
#else
|
||||
extern void LO_SelectObject( MWContext *context, int32 x, int32 y );
|
||||
#endif /* LAYERS */
|
||||
|
||||
#ifdef LAYERS
|
||||
extern LO_LayerType LO_GetLayerType(CL_Layer *layer);
|
||||
extern Bool LO_PrepareLayerForWriting(MWContext *context, int32 layer_id,
|
||||
const char *referer, int32 width);
|
||||
extern Bool LO_SetLayerSrc(MWContext *context, int32 layer_id, char *str,
|
||||
const char *referer, int32 width);
|
||||
extern int32 LO_CreateNewLayer(MWContext *context, int32 wrap_width, int32 parent_layer_id);
|
||||
#endif /* LAYERS */
|
||||
|
||||
#ifdef XP_UNIX
|
||||
extern void LO_DisplayFormElement(LO_FormElementStruct *form);
|
||||
#endif /* XP_UNIX */
|
||||
|
||||
/* Allows front ends to test for empty cell.
|
||||
* Used in Composer to display "zero width border"
|
||||
* in cells that layout would normally not display
|
||||
*/
|
||||
XP_Bool LO_IsEmptyCell(LO_CellStruct *cell);
|
||||
|
||||
#ifdef DOM
|
||||
/* Returns true if the layout element is enclosed
|
||||
in <SPAN> </SPAN> */
|
||||
Bool LO_IsWithinSpan( LO_Element *ele );
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This is probably the wrong place to add this, but tough,
|
||||
* this stuff shouldn't have to exist anyways.
|
||||
*/
|
||||
extern void XP_InitializeContext(MWContext *context);
|
||||
extern MWContext *XP_NewContext(void);
|
||||
extern void XP_DeleteContext(MWContext *context);
|
||||
extern XP_List *XP_GetGlobalContextList(void);
|
||||
extern void XP_AddContextToList(MWContext *context);
|
||||
extern Bool XP_IsContextInList(MWContext *context);
|
||||
extern void XP_RemoveContextFromList(MWContext *context);
|
||||
extern MWContext *XP_GetNonGridContext(MWContext *context);
|
||||
extern Bool XP_IsChildContext(MWContext* parent, MWContext* child);
|
||||
|
||||
extern MWContext *XP_FindNamedContextInList(MWContext * context, char *name);
|
||||
extern MWContext *XP_FindContextOfType(MWContext *, MWContextType);
|
||||
extern MWContext *XP_FindSomeContext(void);
|
||||
extern Bool XP_FindNamedAnchor(MWContext * context, URL_Struct * url,
|
||||
int32 *xpos, int32 *ypos);
|
||||
extern void XP_RefreshAnchors(void);
|
||||
extern void XP_InterruptContext(MWContext * context);
|
||||
extern Bool XP_IsContextBusy(MWContext * context);
|
||||
extern Bool XP_IsContextStoppable(MWContext * context);
|
||||
extern void XP_UpdateParentContext(MWContext * context);
|
||||
extern int XP_GetSecurityStatus(MWContext *pContext);
|
||||
extern int XP_ContextCount(MWContextType cxType, XP_Bool bTopLevel);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
# endif /* _PROTO_H_ */
|
||||
|
||||
99
mozilla/include/pwcacapi.h
Normal file
99
mozilla/include/pwcacapi.h
Normal file
@@ -0,0 +1,99 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef PWCACAPI_H
|
||||
#define PWCACAPI_H
|
||||
|
||||
/* contains a null terminated array of name and value stings
|
||||
*
|
||||
* end index of name should always be equal to the end index of value
|
||||
*
|
||||
*/
|
||||
|
||||
typedef struct _PCNameValuePair PCNameValuePair;
|
||||
typedef struct _PCNameValueArray PCNameValueArray;
|
||||
|
||||
typedef void PCDataInterpretFunc (
|
||||
char *module,
|
||||
char *key,
|
||||
char *data, int32 data_size,
|
||||
char *type_buffer, int32 type_buffer_size,
|
||||
char *url_buffer, int32 url_buffer_size,
|
||||
char *username_buffer, int32 username_buffer_size,
|
||||
char *password_buffer, int32 password_buffer_size);
|
||||
|
||||
/* returns 0 on success -1 on error
|
||||
*/
|
||||
extern int PC_RegisterDataInterpretFunc(char *module,
|
||||
PCDataInterpretFunc *func);
|
||||
|
||||
extern int PC_PromptUsernameAndPassword(MWContext *context,
|
||||
char *prompt,
|
||||
char **username,
|
||||
char **password,
|
||||
XP_Bool *remember_password,
|
||||
XP_Bool is_secure);
|
||||
|
||||
extern char *PC_PromptPassword(MWContext *context,
|
||||
char *prompt,
|
||||
XP_Bool *remember_password,
|
||||
XP_Bool is_secure);
|
||||
|
||||
extern char *PC_Prompt(MWContext *context,
|
||||
char *prompt,
|
||||
char *deft,
|
||||
XP_Bool *remember,
|
||||
XP_Bool is_secure);
|
||||
|
||||
void PC_FreeNameValueArray(PCNameValueArray *array);
|
||||
|
||||
PCNameValueArray * PC_NewNameValueArray();
|
||||
|
||||
uint32 PC_ArraySize(PCNameValueArray *array);
|
||||
|
||||
char * PC_FindInNameValueArray(PCNameValueArray *array, char *name);
|
||||
|
||||
int PC_DeleteNameFromNameValueArray(PCNameValueArray *array, char *name);
|
||||
|
||||
void PC_EnumerateNameValueArray(PCNameValueArray *array, char **name, char **value, XP_Bool beginning);
|
||||
|
||||
int PC_AddToNameValueArray(PCNameValueArray *array, char *name, char *value);
|
||||
|
||||
void PC_CheckForStoredPasswordData(char *module, char *key, char **data, int32 *len);
|
||||
|
||||
int PC_DeleteStoredPassword(char *module, char *key);
|
||||
|
||||
PCNameValueArray * PC_CheckForStoredPasswordArray(char *module, char *key);
|
||||
|
||||
int PC_StoreSerializedPassword(char *module, char *key, char *data, int32 len);
|
||||
|
||||
int PC_StorePasswordNameValueArray(char *module, char *key, PCNameValueArray *array);
|
||||
|
||||
void PC_SerializeNameValueArray(PCNameValueArray *array, char **data, int32 *len);
|
||||
|
||||
PCNameValueArray * PC_CharToNameValueArray(char *data, int32 len);
|
||||
|
||||
/*, returns status
|
||||
*/
|
||||
int PC_DisplayPasswordCacheAsHTML(URL_Struct *URL_s,
|
||||
FO_Present_Types format_out,
|
||||
MWContext *context);
|
||||
|
||||
void PC_Shutdown();
|
||||
|
||||
#endif /* PWCACAPI_H */
|
||||
101
mozilla/include/resdef.h
Normal file
101
mozilla/include/resdef.h
Normal file
@@ -0,0 +1,101 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef _RESDEF_H_
|
||||
#define _RESDEF_H_
|
||||
|
||||
#include "xp_core.h"
|
||||
|
||||
#define RES_OFFSET 7000
|
||||
|
||||
|
||||
#ifndef RESOURCE_STR
|
||||
|
||||
#ifdef WANT_ENUM_STRING_IDS
|
||||
|
||||
#define RES_START
|
||||
#if defined(XP_WIN) && _MSC_VER == 1100
|
||||
/* VC50 has a bug, where large enumerations cause an
|
||||
* internal compiler error. Do some hack here to fix without
|
||||
* breaking the other platforms.
|
||||
*/
|
||||
#define BEGIN_STR(arg)
|
||||
#define ResDef(name,id,msg) enum { name=id };
|
||||
#define END_STR(arg)
|
||||
#else /* XP_WIN _MSC_VER */
|
||||
#define BEGIN_STR(arg) enum {
|
||||
#define ResDef(name,id,msg) name=id,
|
||||
#if defined(XP_WIN)
|
||||
#define END_STR(arg) };
|
||||
#else
|
||||
#define END_STR(arg) arg=0 };
|
||||
#endif
|
||||
#endif /* XP_WIN _MSC_VER */
|
||||
|
||||
#else /* WANT_ENUM_STRING_IDS */
|
||||
|
||||
#define RES_START
|
||||
#define BEGIN_STR(arg)
|
||||
#ifdef XP_WIN16
|
||||
/* Get these ints out of DGROUP (/Gt3 compiler switch)
|
||||
* so we can increase the stack size
|
||||
*/
|
||||
#define ResDef(name,id,msg) int __far name = (id);
|
||||
#else
|
||||
#define ResDef(name,id,msg) int name = (id);
|
||||
#endif
|
||||
#define END_STR(arg)
|
||||
|
||||
#endif /* WANT_ENUM_STRING_IDS */
|
||||
|
||||
#else /* RESOURCE_STR, the definition here is for building resources */
|
||||
#if defined(XP_WIN) || defined(XP_OS2)
|
||||
|
||||
#ifndef MOZILLA_CLIENT
|
||||
#define RES_START
|
||||
#define BEGIN_STR(arg) static char * (arg) (int16 i) { switch (i) {
|
||||
#define ResDef(name,id,msg) case (id)+RES_OFFSET: return (msg);
|
||||
#define END_STR(arg) } return NULL; }
|
||||
#else /* MOZILLA_CLIENT */
|
||||
#define RES_START STRINGTABLE DISCARDABLE
|
||||
#define BEGIN_STR(arg) BEGIN
|
||||
#define ResDef(name,id,msg) id+RES_OFFSET msg
|
||||
#define END_STR(arg) END
|
||||
#endif /* not MOZILLA_CLIENT */
|
||||
|
||||
#elif defined(XP_MAC)
|
||||
/* Do nothing -- leave ResDef() to be perl'ized via MPW */
|
||||
#define ResDef(name,id,msg) ResDef(name,id,msg)
|
||||
|
||||
#elif defined(XP_UNIX)
|
||||
#ifdef RESOURCE_STR_X
|
||||
#define RES_START
|
||||
#define BEGIN_STR(arg) static char *(arg)(void) {
|
||||
#define ResDef(name,id,msg) output((id)+RES_OFFSET, (msg));
|
||||
#define END_STR(arg) }
|
||||
#else
|
||||
#define RES_START
|
||||
#define BEGIN_STR(arg) static char *(arg)(int16 i) { switch (i) {
|
||||
#define ResDef(name,id,msg) case (id)+RES_OFFSET: return (msg);
|
||||
#define END_STR(arg) } return NULL; }
|
||||
#endif /* RESOURCE_STR_X */
|
||||
#endif /* XP_WIN */
|
||||
#endif /* RESOURCE_STR */
|
||||
|
||||
|
||||
#endif /* _RESDEF_H_ */
|
||||
163
mozilla/include/shist.h
Normal file
163
mozilla/include/shist.h
Normal file
@@ -0,0 +1,163 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
#ifndef SHIST_H
|
||||
#define SHIST_H
|
||||
|
||||
#include "xp_list.h"
|
||||
#include "ntypes.h"
|
||||
#include "hotlist.h"
|
||||
|
||||
|
||||
/* see shistele.h for the structure definitions. :(
|
||||
*/
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* Session history module routines
|
||||
*/
|
||||
|
||||
struct MWContext_;
|
||||
struct URL_Struct_;
|
||||
|
||||
#define HIST_NEW_OBJECT 0
|
||||
#define HIST_MOVE_FORWARD 1
|
||||
#define HIST_MOVE_BACK 2
|
||||
|
||||
/* Max length of the URL when title is unknown */
|
||||
#define HIST_MAX_URL_LEN 30
|
||||
|
||||
|
||||
XP_BEGIN_PROTOS
|
||||
|
||||
/* Front-End Specialized Functions */
|
||||
extern void SHIST_InitSession(struct MWContext_ * ctxt);
|
||||
extern void SHIST_EndSession(MWContext * ctxt);
|
||||
|
||||
/* copys all the session data from the old context into the
|
||||
* new context. Does not effect data in old_context session history
|
||||
*
|
||||
* if new_context has not had SHIST_InitSession called for it
|
||||
* it will be called to initalize it.
|
||||
*/
|
||||
extern void
|
||||
SHIST_CopySession(MWContext * new_context, MWContext * old_context);
|
||||
|
||||
/* make a new copy of the given history entry */
|
||||
extern History_entry * SHIST_CloneEntry(History_entry * old_entry);
|
||||
|
||||
/*
|
||||
* someone (like another thread) needs to keep this entry around for
|
||||
* a while, increase the reference count so it doesn't disappear
|
||||
* on us. Return the held reference to entry. Tolerate NULL entry.
|
||||
*/
|
||||
extern History_entry * SHIST_HoldEntry(History_entry * entry);
|
||||
|
||||
#define SHIST_DropEntry SHIST_FreeHistoryEntry
|
||||
|
||||
/* these update position and buttons! */
|
||||
extern void SHIST_AddDocument(struct MWContext_ * ctxt, History_entry * entry);
|
||||
extern History_entry * SHIST_GetPrevious(struct MWContext_ * ctxt);
|
||||
extern History_entry * SHIST_GetNext(struct MWContext_ * ctxt);
|
||||
/* convenience functions */
|
||||
extern char* SHIST_StripProtocol ( char* inURL ) ;
|
||||
extern History_entry * SHIST_CreateHistoryEntry (struct URL_Struct_ * URL_s, char * title);
|
||||
extern URL_Struct * SHIST_CreateURLStructFromHistoryEntry(struct MWContext_ * ctxt,
|
||||
History_entry * entry);
|
||||
extern URL_Struct * SHIST_CreateWysiwygURLStruct(struct MWContext_ * ctxt,
|
||||
History_entry * entry);
|
||||
extern BM_Entry* SHIST_CreateHotlistStructFromHistoryEntry(History_entry * h);
|
||||
|
||||
extern void SHIST_FreeHistoryEntry (MWContext * ctxt, History_entry * entry);
|
||||
|
||||
|
||||
/* Standard History Functions */
|
||||
extern int SHIST_CanGoBack(MWContext * ctxt);
|
||||
extern int SHIST_CanGoForward(MWContext * ctxt);
|
||||
extern History_entry * SHIST_GetEntry(History * hist, int entry_number);
|
||||
extern History_entry * SHIST_GetCurrent(History * hist);
|
||||
extern XP_List * SHIST_GetList(MWContext * ctxt);
|
||||
|
||||
/* Functions to handle Page Services functionality */
|
||||
extern int SHIST_CurrentHandlesPageServices(MWContext * ctxt);
|
||||
extern char * SHIST_GetCurrentPageServicesURL(MWContext * ctxt);
|
||||
|
||||
/* sets the current doc pointer to the index specified in the call
|
||||
*
|
||||
* entry numbering begins at one.
|
||||
*/
|
||||
extern void SHIST_SetCurrent(History * hist, int entry_number);
|
||||
|
||||
/* set the title of the current document
|
||||
*
|
||||
* TODO: All FEs should use the XP_WIN version asap.
|
||||
*/
|
||||
#if defined(XP_WIN) || defined(XP_MAC) || defined(XP_OS2)
|
||||
extern void SHIST_SetTitleOfCurrentDoc(MWContext * context);
|
||||
#else
|
||||
extern void SHIST_SetTitleOfCurrentDoc(History * hist, char * title);
|
||||
#endif
|
||||
|
||||
/* set the layout specific form data neccessary to recreate the user settable
|
||||
* entries within a form
|
||||
*/
|
||||
PUBLIC void
|
||||
SHIST_SetCurrentDocFormListData(MWContext * context, void * form_data);
|
||||
|
||||
/* set the layout-plugin specific embed data neccessary to recreate the
|
||||
* last session state within the embedded object.
|
||||
*/
|
||||
PUBLIC void
|
||||
SHIST_SetCurrentDocEmbedListData(MWContext * context, void * embed_data);
|
||||
|
||||
/* set the layout grid data neccessary to recreate the
|
||||
* grid when revisited through history.
|
||||
*/
|
||||
PUBLIC void
|
||||
SHIST_SetCurrentDocGridData(MWContext * context, void * grid_data);
|
||||
|
||||
/* set the window object for a grid being resized.
|
||||
*/
|
||||
PUBLIC void
|
||||
SHIST_SetCurrentDocWindowData(MWContext * context, void * window_data);
|
||||
|
||||
/* set the layout applet data neccessary to recreate the
|
||||
* applet when revisited through history.
|
||||
*/
|
||||
PUBLIC void
|
||||
SHIST_SetCurrentDocAppletData(MWContext * context, void * applet_data);
|
||||
|
||||
/* set the position of the current document
|
||||
*/
|
||||
extern void SHIST_SetPositionOfCurrentDoc(History * hist, int32 position_tag);
|
||||
|
||||
/* gets an index associated with the entry
|
||||
*
|
||||
* entry numbering begins at one.
|
||||
*
|
||||
* zero is returned if object not found
|
||||
*/
|
||||
extern int SHIST_GetIndex(History * hist, History_entry * entry);
|
||||
|
||||
/* return the n'th object
|
||||
*/
|
||||
extern History_entry * SHIST_GetObjectNum(History * hist, int n);
|
||||
|
||||
XP_END_PROTOS
|
||||
|
||||
|
||||
#endif /* SHIST_H */
|
||||
129
mozilla/include/shistele.h
Normal file
129
mozilla/include/shistele.h
Normal file
@@ -0,0 +1,129 @@
|
||||
/* -*- 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.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef SHISTELE_H
|
||||
#define SHISTELE_H
|
||||
|
||||
#include "xp_list.h"
|
||||
|
||||
/*
|
||||
** This structure holds pointer so all saved data in the history. It is
|
||||
** also used by URL_Structs and is ultimately fed to layout.
|
||||
**
|
||||
** Warning: Don't change the names of the fields because they're used by
|
||||
** macros.
|
||||
*/
|
||||
typedef struct SHIST_SavedData {
|
||||
void* FormList; /* layout data to recreate forms */
|
||||
void* EmbedList; /* layout data to recreate embeds and applets */
|
||||
void* Grid; /* layout data to recreate grids */
|
||||
#ifdef MOCHA
|
||||
void* Window; /* window object for grid being resized */
|
||||
|
||||
/* XXX none of this would be necessary if frameset docs were reparsed */
|
||||
void* OnLoad; /* JavaScript onload event handler source */
|
||||
void* OnUnload; /* JavaScript onunload event handler source */
|
||||
void* OnFocus; /* JavaScript onfocus event handler source */
|
||||
void* OnBlur; /* JavaScript onblur event handler source */
|
||||
void* OnHelp; /* JavaScript onhelp event handler source */
|
||||
void* OnMouseOver; /* JavaScript onmouseover event handler source */
|
||||
void* OnMouseOut; /* JavaScript onmouseout event handler source */
|
||||
void* OnDragDrop; /* JavaScript ondragdrop event handler source */
|
||||
void* OnMove; /* JavaScript onmove event handler source */
|
||||
void* OnResize; /* JavaScript onresize event handler source */
|
||||
void* style_stack; /* JSSS style stack info */
|
||||
#endif
|
||||
} SHIST_SavedData;
|
||||
|
||||
/*
|
||||
This structure encapsulates all of the information needed for the
|
||||
session history. It should contain stuff like a list of all of the
|
||||
documents in the current history and a pointer to where the currently
|
||||
viewed document sits in the chain.
|
||||
|
||||
WARNING!! Some slots of this structure are shared with URL_Struct and
|
||||
net_CacheObject. If you add a slot, decide whether it needs to be
|
||||
shared as well.
|
||||
*/
|
||||
|
||||
struct _History_entry {
|
||||
char * title; /* title for this entry */
|
||||
char * address; /* URL address string */
|
||||
char * content_name; /* Server-provided "real name", used for
|
||||
default file name when saving. */
|
||||
int method; /* method of acessing URL */
|
||||
char * referer; /* What document points to this url */
|
||||
char * post_data; /* post data */
|
||||
int32 post_data_size; /* post data size */
|
||||
Bool post_data_is_file; /* is the post data a filename? */
|
||||
char * post_headers; /* content type for posted data */
|
||||
int32 position_tag; /* layout specific data for determining
|
||||
* where in the document the user was
|
||||
*/
|
||||
time_t last_modified; /* time of last modification */
|
||||
time_t last_access; /* time of last access */
|
||||
int history_num; /* special hack to add navigation */
|
||||
|
||||
SHIST_SavedData savedData; /* layout data */
|
||||
|
||||
PRPackedBool
|
||||
is_binary, /* is this a binary object pretending
|
||||
* to be HTML?
|
||||
*/
|
||||
is_active, /* is it an active stream? */
|
||||
is_netsite, /* did it come from netsite? */
|
||||
replace; /* did it come from netsite? */
|
||||
|
||||
int transport_method; /* network, disk cache, memory cache */
|
||||
|
||||
uint32 refresh; /* refresh interval */
|
||||
char *refresh_url; /* URL to refresh */
|
||||
char *wysiwyg_url; /* URL for WYSIWYG printing/saving */
|
||||
|
||||
/* Security information */
|
||||
int security_on; /* is security on? */
|
||||
/* Security info on a connection is opaque */
|
||||
unsigned char *sec_info;
|
||||
|
||||
/* Unique identifier */
|
||||
int32 unique_id;
|
||||
int32 ref_count;
|
||||
|
||||
/* Page services*/
|
||||
char *page_services_url; /* If it supports services, what link is used */
|
||||
|
||||
/* HTTP_11 support*/
|
||||
char *etag; /* Unique entity tag */
|
||||
char *origin_url; /* original referrer of javascript: URL */
|
||||
};
|
||||
|
||||
#define SHIST_CAME_FROM_NETWORK 0
|
||||
#define SHIST_CAME_FROM_DISK_CACHE 1
|
||||
#define SHIST_CAME_FROM_MEMORY_CACHE 2
|
||||
|
||||
struct History_ {
|
||||
XP_List * list_ptr; /* pointer to linked list */
|
||||
int cur_doc; /* an index into the list that points to the current document */
|
||||
History_entry *cur_doc_ptr; /* a ptr to the current doc entry */
|
||||
int32 num_entries; /* size of the history list */
|
||||
int32 max_entries; /* maximum size of list; -1 == no limit */
|
||||
};
|
||||
|
||||
|
||||
#endif /* SHISTELE_H */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user