Compare commits
4 Commits
NSS_3_12_A
...
MAPI_TRUNK
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
112cd3f592 | ||
|
|
0e43f0be3f | ||
|
|
2eb83bc94e | ||
|
|
eabbdbd75c |
@@ -1,53 +0,0 @@
|
||||
#
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Netscape Communications Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 1998
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
DEPTH = ..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = dbm
|
||||
DIRS = include src
|
||||
|
||||
ifdef ENABLE_TESTS
|
||||
DIRS += tests
|
||||
endif
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
#
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Netscape Communications Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 1998
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
DEPTH = ../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = dbm
|
||||
|
||||
EXPORTS = \
|
||||
nsres.h \
|
||||
cdefs.h \
|
||||
mcom_db.h \
|
||||
ncompat.h \
|
||||
winfile.h \
|
||||
$(NULL)
|
||||
|
||||
EXPORTS := $(addprefix $(srcdir)/, $(EXPORTS))
|
||||
|
||||
PRIVATE_EXPORTS = \
|
||||
hsearch.h \
|
||||
page.h \
|
||||
extern.h \
|
||||
ndbm.h \
|
||||
queue.h \
|
||||
hash.h \
|
||||
mpool.h \
|
||||
search.h \
|
||||
$(NULL)
|
||||
|
||||
PRIVATE_EXPORTS := $(addprefix $(srcdir)/, $(PRIVATE_EXPORTS))
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
@@ -1,77 +0,0 @@
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Netscape Communications Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 1998
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
|
||||
#//------------------------------------------------------------------------
|
||||
#//
|
||||
#// Makefile to build the cert library
|
||||
#//
|
||||
#//------------------------------------------------------------------------
|
||||
|
||||
!if "$(MOZ_BITS)" == "16"
|
||||
!ifndef MOZ_DEBUG
|
||||
OPTIMIZER=-Os -UDEBUG -DNDEBUG
|
||||
!endif
|
||||
!endif
|
||||
|
||||
#//------------------------------------------------------------------------
|
||||
#//
|
||||
#// Specify the depth of the current directory relative to the
|
||||
#// root of NS
|
||||
#//
|
||||
#//------------------------------------------------------------------------
|
||||
DEPTH= ..\..
|
||||
|
||||
!ifndef MAKE_OBJ_TYPE
|
||||
MAKE_OBJ_TYPE=EXE
|
||||
!endif
|
||||
|
||||
#//------------------------------------------------------------------------
|
||||
#//
|
||||
#// install headers
|
||||
#//
|
||||
#//------------------------------------------------------------------------
|
||||
EXPORTS=nsres.h cdefs.h mcom_db.h ncompat.h winfile.h
|
||||
|
||||
#//------------------------------------------------------------------------
|
||||
#//
|
||||
#// Include the common makefile rules
|
||||
#//
|
||||
#//------------------------------------------------------------------------
|
||||
include <$(DEPTH)/config/rules.mak>
|
||||
|
||||
CFLAGS = $(CFLAGS) -DMOZILLA_CLIENT
|
||||
|
||||
@@ -1,126 +0,0 @@
|
||||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/*
|
||||
* 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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_
|
||||
|
||||
#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.
|
||||
*/
|
||||
#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
|
||||
|
||||
/* On HP-UX 11.00, <sys/stdsyms.h> defines __const. */
|
||||
#ifndef __const
|
||||
#define __const const /* define reserved names to standard */
|
||||
#endif /* __const */
|
||||
#define __signed signed
|
||||
#define __volatile volatile
|
||||
#ifndef _WINDOWS
|
||||
#if defined(__cplusplus)
|
||||
#define __inline inline /* convert to C++ keyword */
|
||||
#else
|
||||
#if !defined(__GNUC__) && !defined(__MWERKS__)
|
||||
#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
|
||||
* const, inline 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 const /* delete ANSI C keywords */
|
||||
#define inline
|
||||
#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
|
||||
|
||||
#endif /* !_CDEFS_H_ */
|
||||
@@ -1,63 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1991, 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*
|
||||
* @(#)extern.h 8.4 (Berkeley) 6/16/94
|
||||
*/
|
||||
|
||||
BUFHEAD *__add_ovflpage (HTAB *, BUFHEAD *);
|
||||
int __addel (HTAB *, BUFHEAD *, const DBT *, const DBT *);
|
||||
int __big_delete (HTAB *, BUFHEAD *);
|
||||
int __big_insert (HTAB *, BUFHEAD *, const DBT *, const DBT *);
|
||||
int __big_keydata (HTAB *, BUFHEAD *, DBT *, DBT *, int);
|
||||
int __big_return (HTAB *, BUFHEAD *, int, DBT *, int);
|
||||
int __big_split (HTAB *, BUFHEAD *, BUFHEAD *, BUFHEAD *,
|
||||
uint32, uint32, SPLIT_RETURN *);
|
||||
int __buf_free (HTAB *, int, int);
|
||||
void __buf_init (HTAB *, int);
|
||||
uint32 __call_hash (HTAB *, char *, size_t);
|
||||
int __delpair (HTAB *, BUFHEAD *, int);
|
||||
int __expand_table (HTAB *);
|
||||
int __find_bigpair (HTAB *, BUFHEAD *, int, char *, int);
|
||||
uint16 __find_last_page (HTAB *, BUFHEAD **);
|
||||
void __free_ovflpage (HTAB *, BUFHEAD *);
|
||||
BUFHEAD *__get_buf (HTAB *, uint32, BUFHEAD *, int);
|
||||
int __get_page (HTAB *, char *, uint32, int, int, int);
|
||||
int __ibitmap (HTAB *, int, int, int);
|
||||
uint32 __log2 (uint32);
|
||||
int __put_page (HTAB *, char *, uint32, int, int);
|
||||
void __reclaim_buf (HTAB *, BUFHEAD *);
|
||||
int __split_page (HTAB *, uint32, uint32);
|
||||
|
||||
/* Default hash routine. */
|
||||
extern uint32 (*__default_hash) (const void *, size_t);
|
||||
|
||||
#ifdef HASH_STATISTICS
|
||||
extern int hash_accesses, hash_collisions, hash_expansions, hash_overflows;
|
||||
#endif
|
||||
@@ -1,335 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993, 1994
|
||||
* 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*
|
||||
* @(#)hash.h 8.3 (Berkeley) 5/31/94
|
||||
*/
|
||||
|
||||
/* Operations */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "mcom_db.h"
|
||||
typedef enum {
|
||||
HASH_GET, HASH_PUT, HASH_PUTNEW, HASH_DELETE, HASH_FIRST, HASH_NEXT
|
||||
} ACTION;
|
||||
|
||||
/* Buffer Management structures */
|
||||
typedef struct _bufhead BUFHEAD;
|
||||
|
||||
struct _bufhead {
|
||||
BUFHEAD *prev; /* LRU links */
|
||||
BUFHEAD *next; /* LRU links */
|
||||
BUFHEAD *ovfl; /* Overflow page buffer header */
|
||||
uint32 addr; /* Address of this page */
|
||||
char *page; /* Actual page data */
|
||||
char is_disk;
|
||||
char flags;
|
||||
#define BUF_MOD 0x0001
|
||||
#define BUF_DISK 0x0002
|
||||
#define BUF_BUCKET 0x0004
|
||||
#define BUF_PIN 0x0008
|
||||
};
|
||||
|
||||
#define IS_BUCKET(X) ((X) & BUF_BUCKET)
|
||||
|
||||
typedef BUFHEAD **SEGMENT;
|
||||
|
||||
typedef int DBFILE_PTR;
|
||||
#define NO_FILE -1
|
||||
#ifdef macintosh
|
||||
#define DBFILE_OPEN(path, flag,mode) open((path), flag)
|
||||
#define EXISTS(path)
|
||||
#else
|
||||
#define DBFILE_OPEN(path, flag,mode) open((path), (flag), (mode))
|
||||
#endif
|
||||
/* Hash Table Information */
|
||||
typedef struct hashhdr { /* Disk resident portion */
|
||||
int32 magic; /* Magic NO for hash tables */
|
||||
int32 version; /* Version ID */
|
||||
uint32 lorder; /* Byte Order */
|
||||
int32 bsize; /* Bucket/Page Size */
|
||||
int32 bshift; /* Bucket shift */
|
||||
int32 dsize; /* Directory Size */
|
||||
int32 ssize; /* Segment Size */
|
||||
int32 sshift; /* Segment shift */
|
||||
int32 ovfl_point; /* Where overflow pages are being
|
||||
* allocated */
|
||||
int32 last_freed; /* Last overflow page freed */
|
||||
int32 max_bucket; /* ID of Maximum bucket in use */
|
||||
int32 high_mask; /* Mask to modulo into entire table */
|
||||
int32 low_mask; /* Mask to modulo into lower half of
|
||||
* table */
|
||||
int32 ffactor; /* Fill factor */
|
||||
int32 nkeys; /* Number of keys in hash table */
|
||||
int32 hdrpages; /* Size of table header */
|
||||
uint32 h_charkey; /* value of hash(CHARKEY) */
|
||||
#define NCACHED 32 /* number of bit maps and spare
|
||||
* points */
|
||||
int32 spares[NCACHED];/* spare pages for overflow */
|
||||
uint16 bitmaps[NCACHED]; /* address of overflow page
|
||||
* bitmaps */
|
||||
} HASHHDR;
|
||||
|
||||
typedef struct htab { /* Memory resident data structure */
|
||||
HASHHDR hdr; /* Header */
|
||||
int nsegs; /* Number of allocated segments */
|
||||
int exsegs; /* Number of extra allocated
|
||||
* segments */
|
||||
uint32 /* Hash function */
|
||||
(*hash)(const void *, size_t);
|
||||
int flags; /* Flag values */
|
||||
DBFILE_PTR fp; /* File pointer */
|
||||
char *filename;
|
||||
char *tmp_buf; /* Temporary Buffer for BIG data */
|
||||
char *tmp_key; /* Temporary Buffer for BIG keys */
|
||||
BUFHEAD *cpage; /* Current page */
|
||||
int cbucket; /* Current bucket */
|
||||
int cndx; /* Index of next item on cpage */
|
||||
int dbmerrno; /* Error Number -- for DBM
|
||||
* compatability */
|
||||
int new_file; /* Indicates if fd is backing store
|
||||
* or no */
|
||||
int save_file; /* Indicates whether we need to flush
|
||||
* file at
|
||||
* exit */
|
||||
uint32 *mapp[NCACHED]; /* Pointers to page maps */
|
||||
int nmaps; /* Initial number of bitmaps */
|
||||
int nbufs; /* Number of buffers left to
|
||||
* allocate */
|
||||
BUFHEAD bufhead; /* Header of buffer lru list */
|
||||
SEGMENT *dir; /* Hash Bucket directory */
|
||||
off_t file_size; /* in bytes */
|
||||
char is_temp; /* unlink file on close */
|
||||
char updateEOF; /* force EOF update on flush */
|
||||
} HTAB;
|
||||
|
||||
/*
|
||||
* Constants
|
||||
*/
|
||||
#define DATABASE_CORRUPTED_ERROR -999 /* big ugly abort, delete database */
|
||||
#define OLD_MAX_BSIZE 65536 /* 2^16 */
|
||||
#define MAX_BSIZE 32l*1024l /* 2^15 */
|
||||
#define MIN_BUFFERS 6
|
||||
#define MINHDRSIZE 512
|
||||
#define DEF_BUFSIZE 65536l /* 64 K */
|
||||
#define DEF_BUCKET_SIZE 4096
|
||||
#define DEF_BUCKET_SHIFT 12 /* log2(BUCKET) */
|
||||
#define DEF_SEGSIZE 256
|
||||
#define DEF_SEGSIZE_SHIFT 8 /* log2(SEGSIZE) */
|
||||
#define DEF_DIRSIZE 256
|
||||
#define DEF_FFACTOR 65536l
|
||||
#define MIN_FFACTOR 4
|
||||
#define SPLTMAX 8
|
||||
#define CHARKEY "%$sniglet^&"
|
||||
#define NUMKEY 1038583l
|
||||
#define BYTE_SHIFT 3
|
||||
#define INT_TO_BYTE 2
|
||||
#define INT_BYTE_SHIFT 5
|
||||
#define ALL_SET ((uint32)0xFFFFFFFF)
|
||||
#define ALL_CLEAR 0
|
||||
|
||||
#define PTROF(X) ((ptrdiff_t)(X) == BUF_DISK ? 0 : (X))
|
||||
#define ISDISK(X) ((X) ? ((ptrdiff_t)(X) == BUF_DISK ? BUF_DISK \
|
||||
: (X)->is_disk) : 0)
|
||||
|
||||
#define BITS_PER_MAP 32
|
||||
|
||||
/* Given the address of the beginning of a big map, clear/set the nth bit */
|
||||
#define CLRBIT(A, N) ((A)[(N)/BITS_PER_MAP] &= ~(1<<((N)%BITS_PER_MAP)))
|
||||
#define SETBIT(A, N) ((A)[(N)/BITS_PER_MAP] |= (1<<((N)%BITS_PER_MAP)))
|
||||
#define ISSET(A, N) ((A)[(N)/BITS_PER_MAP] & (1<<((N)%BITS_PER_MAP)))
|
||||
|
||||
/* Overflow management */
|
||||
/*
|
||||
* Overflow page numbers are allocated per split point. At each doubling of
|
||||
* the table, we can allocate extra pages. So, an overflow page number has
|
||||
* the top 5 bits indicate which split point and the lower 11 bits indicate
|
||||
* which page at that split point is indicated (pages within split points are
|
||||
* numberered starting with 1).
|
||||
*/
|
||||
|
||||
#define SPLITSHIFT 11
|
||||
#define SPLITMASK 0x7FF
|
||||
#define SPLITNUM(N) (((uint32)(N)) >> SPLITSHIFT)
|
||||
#define OPAGENUM(N) ((N) & SPLITMASK)
|
||||
#define OADDR_OF(S,O) ((uint32)((uint32)(S) << SPLITSHIFT) + (O))
|
||||
|
||||
#define BUCKET_TO_PAGE(B) \
|
||||
(B) + hashp->HDRPAGES + ((B) ? hashp->SPARES[__log2((uint32)((B)+1))-1] : 0)
|
||||
#define OADDR_TO_PAGE(B) \
|
||||
BUCKET_TO_PAGE ( (1 << SPLITNUM((B))) -1 ) + OPAGENUM((B));
|
||||
|
||||
/*
|
||||
* page.h contains a detailed description of the page format.
|
||||
*
|
||||
* Normally, keys and data are accessed from offset tables in the top of
|
||||
* each page which point to the beginning of the key and data. There are
|
||||
* four flag values which may be stored in these offset tables which indicate
|
||||
* the following:
|
||||
*
|
||||
*
|
||||
* OVFLPAGE Rather than a key data pair, this pair contains
|
||||
* the address of an overflow page. The format of
|
||||
* the pair is:
|
||||
* OVERFLOW_PAGE_NUMBER OVFLPAGE
|
||||
*
|
||||
* PARTIAL_KEY This must be the first key/data pair on a page
|
||||
* and implies that page contains only a partial key.
|
||||
* That is, the key is too big to fit on a single page
|
||||
* so it starts on this page and continues on the next.
|
||||
* The format of the page is:
|
||||
* KEY_OFF PARTIAL_KEY OVFL_PAGENO OVFLPAGE
|
||||
*
|
||||
* KEY_OFF -- offset of the beginning of the key
|
||||
* PARTIAL_KEY -- 1
|
||||
* OVFL_PAGENO - page number of the next overflow page
|
||||
* OVFLPAGE -- 0
|
||||
*
|
||||
* FULL_KEY This must be the first key/data pair on the page. It
|
||||
* is used in two cases.
|
||||
*
|
||||
* Case 1:
|
||||
* There is a complete key on the page but no data
|
||||
* (because it wouldn't fit). The next page contains
|
||||
* the data.
|
||||
*
|
||||
* Page format it:
|
||||
* KEY_OFF FULL_KEY OVFL_PAGENO OVFL_PAGE
|
||||
*
|
||||
* KEY_OFF -- offset of the beginning of the key
|
||||
* FULL_KEY -- 2
|
||||
* OVFL_PAGENO - page number of the next overflow page
|
||||
* OVFLPAGE -- 0
|
||||
*
|
||||
* Case 2:
|
||||
* This page contains no key, but part of a large
|
||||
* data field, which is continued on the next page.
|
||||
*
|
||||
* Page format it:
|
||||
* DATA_OFF FULL_KEY OVFL_PAGENO OVFL_PAGE
|
||||
*
|
||||
* KEY_OFF -- offset of the beginning of the data on
|
||||
* this page
|
||||
* FULL_KEY -- 2
|
||||
* OVFL_PAGENO - page number of the next overflow page
|
||||
* OVFLPAGE -- 0
|
||||
*
|
||||
* FULL_KEY_DATA
|
||||
* This must be the first key/data pair on the page.
|
||||
* There are two cases:
|
||||
*
|
||||
* Case 1:
|
||||
* This page contains a key and the beginning of the
|
||||
* data field, but the data field is continued on the
|
||||
* next page.
|
||||
*
|
||||
* Page format is:
|
||||
* KEY_OFF FULL_KEY_DATA OVFL_PAGENO DATA_OFF
|
||||
*
|
||||
* KEY_OFF -- offset of the beginning of the key
|
||||
* FULL_KEY_DATA -- 3
|
||||
* OVFL_PAGENO - page number of the next overflow page
|
||||
* DATA_OFF -- offset of the beginning of the data
|
||||
*
|
||||
* Case 2:
|
||||
* This page contains the last page of a big data pair.
|
||||
* There is no key, only the tail end of the data
|
||||
* on this page.
|
||||
*
|
||||
* Page format is:
|
||||
* DATA_OFF FULL_KEY_DATA <OVFL_PAGENO> <OVFLPAGE>
|
||||
*
|
||||
* DATA_OFF -- offset of the beginning of the data on
|
||||
* this page
|
||||
* FULL_KEY_DATA -- 3
|
||||
* OVFL_PAGENO - page number of the next overflow page
|
||||
* OVFLPAGE -- 0
|
||||
*
|
||||
* OVFL_PAGENO and OVFLPAGE are optional (they are
|
||||
* not present if there is no next page).
|
||||
*/
|
||||
|
||||
#define OVFLPAGE 0
|
||||
#define PARTIAL_KEY 1
|
||||
#define FULL_KEY 2
|
||||
#define FULL_KEY_DATA 3
|
||||
#define REAL_KEY 4
|
||||
|
||||
/* Short hands for accessing structure */
|
||||
#undef BSIZE
|
||||
#define BSIZE hdr.bsize
|
||||
#undef BSHIFT
|
||||
#define BSHIFT hdr.bshift
|
||||
#define DSIZE hdr.dsize
|
||||
#define SGSIZE hdr.ssize
|
||||
#define SSHIFT hdr.sshift
|
||||
#define LORDER hdr.lorder
|
||||
#define OVFL_POINT hdr.ovfl_point
|
||||
#define LAST_FREED hdr.last_freed
|
||||
#define MAX_BUCKET hdr.max_bucket
|
||||
#define FFACTOR hdr.ffactor
|
||||
#define HIGH_MASK hdr.high_mask
|
||||
#define LOW_MASK hdr.low_mask
|
||||
#define NKEYS hdr.nkeys
|
||||
#define HDRPAGES hdr.hdrpages
|
||||
#define SPARES hdr.spares
|
||||
#define BITMAPS hdr.bitmaps
|
||||
#define VERSION hdr.version
|
||||
#define MAGIC hdr.magic
|
||||
#define NEXT_FREE hdr.next_free
|
||||
#define H_CHARKEY hdr.h_charkey
|
||||
|
||||
extern uint32 (*__default_hash) (const void *, size_t);
|
||||
void __buf_init(HTAB *hashp, int32 nbytes);
|
||||
int __big_delete(HTAB *hashp, BUFHEAD *bufp);
|
||||
BUFHEAD * __get_buf(HTAB *hashp, uint32 addr, BUFHEAD *prev_bp, int newpage);
|
||||
uint32 __call_hash(HTAB *hashp, char *k, size_t len);
|
||||
#include "page.h"
|
||||
extern int __big_split(HTAB *hashp, BUFHEAD *op,BUFHEAD *np,
|
||||
BUFHEAD *big_keyp,uint32 addr,uint32 obucket, SPLIT_RETURN *ret);
|
||||
void __free_ovflpage(HTAB *hashp, BUFHEAD *obufp);
|
||||
BUFHEAD * __add_ovflpage(HTAB *hashp, BUFHEAD *bufp);
|
||||
int __big_insert(HTAB *hashp, BUFHEAD *bufp, const DBT *key, const DBT *val);
|
||||
int __expand_table(HTAB *hashp);
|
||||
uint32 __log2(uint32 num);
|
||||
void __reclaim_buf(HTAB *hashp, BUFHEAD *bp);
|
||||
int __get_page(HTAB *hashp, char * p, uint32 bucket, int is_bucket, int is_disk, int is_bitmap);
|
||||
int __put_page(HTAB *hashp, char *p, uint32 bucket, int is_bucket, int is_bitmap);
|
||||
int __ibitmap(HTAB *hashp, int pnum, int nbits, int ndx);
|
||||
int __buf_free(HTAB *hashp, int do_free, int to_disk);
|
||||
int __find_bigpair(HTAB *hashp, BUFHEAD *bufp, int ndx, char *key, int size);
|
||||
uint16 __find_last_page(HTAB *hashp, BUFHEAD **bpp);
|
||||
int __addel(HTAB *hashp, BUFHEAD *bufp, const DBT *key, const DBT * val);
|
||||
int __big_return(HTAB *hashp, BUFHEAD *bufp, int ndx, DBT *val, int set_current);
|
||||
int __delpair(HTAB *hashp, BUFHEAD *bufp, int ndx);
|
||||
int __big_keydata(HTAB *hashp, BUFHEAD *bufp, DBT *key, DBT *val, int set);
|
||||
int __split_page(HTAB *hashp, uint32 obucket, uint32 nbucket);
|
||||
@@ -1,49 +0,0 @@
|
||||
/*-
|
||||
* 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*
|
||||
* @(#)search.h 8.1 (Berkeley) 6/4/93
|
||||
*/
|
||||
|
||||
/* Backward compatibility to hsearch interface. */
|
||||
typedef struct entry {
|
||||
char *key;
|
||||
char *data;
|
||||
} ENTRY;
|
||||
|
||||
typedef enum {
|
||||
FIND, ENTER
|
||||
} ACTION;
|
||||
|
||||
int hcreate (unsigned int);
|
||||
void hdestroy (void);
|
||||
ENTRY *hsearch (ENTRY, ACTION);
|
||||
@@ -1,424 +0,0 @@
|
||||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/*-
|
||||
* 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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_
|
||||
|
||||
|
||||
#ifdef WINCE
|
||||
#define off_t long
|
||||
#endif
|
||||
|
||||
#ifndef macintosh
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#include "prtypes.h"
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#ifdef __DBINTERFACE_PRIVATE
|
||||
|
||||
#ifdef HAVE_SYS_CDEFS_H
|
||||
#include <sys/cdefs.h>
|
||||
#else
|
||||
#include "cdefs.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_BYTEORDER_H
|
||||
#include <sys/byteorder.h>
|
||||
#endif
|
||||
|
||||
#if defined(__linux) || defined(__BEOS__)
|
||||
#include <endian.h>
|
||||
#ifndef BYTE_ORDER
|
||||
#define BYTE_ORDER __BYTE_ORDER
|
||||
#define BIG_ENDIAN __BIG_ENDIAN
|
||||
#define LITTLE_ENDIAN __LITTLE_ENDIAN
|
||||
#endif
|
||||
#endif /* __linux */
|
||||
|
||||
#ifdef __sgi
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#define BIG_ENDIAN 4321
|
||||
#define LITTLE_ENDIAN 1234 /* LSB first: i386, vax, all NT risc */
|
||||
#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 */
|
||||
|
||||
#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) || defined(AIX)
|
||||
/* BYTE_ORDER, LITTLE_ENDIAN, BIG_ENDIAN are all defined here */
|
||||
#include <sys/machine.h>
|
||||
#endif
|
||||
|
||||
/* Digital Unix */
|
||||
#ifdef __osf__
|
||||
#include <machine/endian.h>
|
||||
#endif
|
||||
|
||||
#ifdef __alpha
|
||||
#ifndef WIN32
|
||||
#else
|
||||
/* Alpha NT */
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#define BIG_ENDIAN 4321
|
||||
#define LITTLE_ENDIAN 1234
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef NCR
|
||||
#include <sys/endian.h>
|
||||
#endif
|
||||
|
||||
#ifdef __QNX__
|
||||
#ifdef __QNXNTO__
|
||||
#include <sys/param.h>
|
||||
#else
|
||||
#define LITTLE_ENDIAN 1234
|
||||
#define BIG_ENDIAN 4321
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef SNI
|
||||
/* #include <sys/hetero.h> */
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#define BIG_ENDIAN 4321
|
||||
#define LITTLE_ENDIAN 1234
|
||||
#endif
|
||||
|
||||
#if defined(_WINDOWS) || defined(XP_OS2_VACPP)
|
||||
#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
|
||||
|
||||
#ifdef macintosh
|
||||
#define BIG_ENDIAN 4321
|
||||
#define LITTLE_ENDIAN 1234
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#endif
|
||||
|
||||
#endif /* __DBINTERFACE_PRIVATE */
|
||||
|
||||
#ifdef SCO
|
||||
#define MAXPATHLEN 1024
|
||||
#endif
|
||||
|
||||
#include <fcntl.h>
|
||||
|
||||
#if defined(_WINDOWS) || defined(XP_OS2)
|
||||
#include <stdio.h>
|
||||
#include <io.h>
|
||||
|
||||
#ifndef XP_OS2
|
||||
#define MAXPATHLEN 1024
|
||||
#endif
|
||||
|
||||
#ifdef XP_OS2_VACPP
|
||||
#include <os2.h>
|
||||
#define MAXPATHLEN CCHMAXPATH
|
||||
#define EPERM EINVAL
|
||||
#define ENOTDIR EBADPOS
|
||||
#define S_ISDIR(s) ((s) & S_IFDIR)
|
||||
#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
|
||||
#endif
|
||||
|
||||
#ifdef macintosh
|
||||
#include <stdio.h>
|
||||
#include "xp_mcom.h"
|
||||
#define O_ACCMODE 3 /* Mask for file access modes */
|
||||
#define EFTYPE 2000
|
||||
PR_BEGIN_EXTERN_C
|
||||
int mkstemp(const char *path);
|
||||
PR_END_EXTERN_C
|
||||
#endif /* MACINTOSH */
|
||||
|
||||
#if !defined(_WINDOWS) && !defined(macintosh)
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#endif
|
||||
|
||||
/* define EFTYPE since most don't */
|
||||
#ifndef EFTYPE
|
||||
#define EFTYPE EINVAL /* POSIX 1003.1 format errno. */
|
||||
#endif
|
||||
|
||||
#define RET_ERROR -1 /* Return values. */
|
||||
#define RET_SUCCESS 0
|
||||
#define RET_SPECIAL 1
|
||||
|
||||
#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;
|
||||
|
||||
/* 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
|
||||
|
||||
PR_BEGIN_EXTERN_C
|
||||
#if defined(__WATCOMC__) || defined(__WATCOM_CPLUSPLUS__)
|
||||
extern DB *
|
||||
#else
|
||||
PR_EXTERN(DB *)
|
||||
#endif
|
||||
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
|
||||
|
||||
PR_END_EXTERN_C
|
||||
|
||||
#endif /* !_DB_H_ */
|
||||
@@ -1,97 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1991, 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*
|
||||
* @(#)mpool.h 8.2 (Berkeley) 7/14/94
|
||||
*/
|
||||
|
||||
#include <sys/queue.h>
|
||||
|
||||
/*
|
||||
* The memory pool scheme is a simple one. Each in-memory page is referenced
|
||||
* by a bucket which is threaded in up to two of three ways. All active pages
|
||||
* are threaded on a hash chain (hashed by page number) and an lru chain.
|
||||
* Inactive pages are threaded on a free chain. Each reference to a memory
|
||||
* pool is handed an opaque MPOOL cookie which stores all of this information.
|
||||
*/
|
||||
#define HASHSIZE 128
|
||||
#define HASHKEY(pgno) ((pgno - 1) % HASHSIZE)
|
||||
|
||||
/* The BKT structures are the elements of the queues. */
|
||||
typedef struct _bkt {
|
||||
CIRCLEQ_ENTRY(_bkt) hq; /* hash queue */
|
||||
CIRCLEQ_ENTRY(_bkt) q; /* lru queue */
|
||||
void *page; /* page */
|
||||
pgno_t pgno; /* page number */
|
||||
|
||||
#define MPOOL_DIRTY 0x01 /* page needs to be written */
|
||||
#define MPOOL_PINNED 0x02 /* page is pinned into memory */
|
||||
uint8 flags; /* flags */
|
||||
} BKT;
|
||||
|
||||
typedef struct MPOOL {
|
||||
CIRCLEQ_HEAD(_lqh, _bkt) lqh; /* lru queue head */
|
||||
/* hash queue array */
|
||||
CIRCLEQ_HEAD(_hqh, _bkt) hqh[HASHSIZE];
|
||||
pgno_t curcache; /* current number of cached pages */
|
||||
pgno_t maxcache; /* max number of cached pages */
|
||||
pgno_t npages; /* number of pages in the file */
|
||||
uint32 pagesize; /* file page size */
|
||||
int fd; /* file descriptor */
|
||||
/* page in conversion routine */
|
||||
void (*pgin) (void *, pgno_t, void *);
|
||||
/* page out conversion routine */
|
||||
void (*pgout) (void *, pgno_t, void *);
|
||||
void *pgcookie; /* cookie for page in/out routines */
|
||||
#ifdef STATISTICS
|
||||
uint32 cachehit;
|
||||
uint32 cachemiss;
|
||||
uint32 pagealloc;
|
||||
uint32 pageflush;
|
||||
uint32 pageget;
|
||||
uint32 pagenew;
|
||||
uint32 pageput;
|
||||
uint32 pageread;
|
||||
uint32 pagewrite;
|
||||
#endif
|
||||
} MPOOL;
|
||||
|
||||
__BEGIN_DECLS
|
||||
MPOOL *mpool_open (void *, int, pgno_t, pgno_t);
|
||||
void mpool_filter (MPOOL *, void (*)(void *, pgno_t, void *),
|
||||
void (*)(void *, pgno_t, void *), void *);
|
||||
void *mpool_new (MPOOL *, pgno_t *);
|
||||
void *mpool_get (MPOOL *, pgno_t, uint);
|
||||
int mpool_put (MPOOL *, void *, uint);
|
||||
int mpool_sync (MPOOL *);
|
||||
int mpool_close (MPOOL *);
|
||||
#ifdef STATISTICS
|
||||
void mpool_stat (MPOOL *);
|
||||
#endif
|
||||
__END_DECLS
|
||||
@@ -1,230 +0,0 @@
|
||||
/*-
|
||||
* 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*/
|
||||
#if 0
|
||||
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_ */
|
||||
@@ -1,94 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993, 1994
|
||||
* 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*
|
||||
* @(#)page.h 8.2 (Berkeley) 5/31/94
|
||||
*/
|
||||
|
||||
/*
|
||||
* Definitions for hashing page file format.
|
||||
*/
|
||||
|
||||
/*
|
||||
* routines dealing with a data page
|
||||
*
|
||||
* page format:
|
||||
* +------------------------------+
|
||||
* p | n | keyoff | datoff | keyoff |
|
||||
* +------------+--------+--------+
|
||||
* | datoff | free | ptr | --> |
|
||||
* +--------+---------------------+
|
||||
* | F R E E A R E A |
|
||||
* +--------------+---------------+
|
||||
* | <---- - - - | data |
|
||||
* +--------+-----+----+----------+
|
||||
* | key | data | key |
|
||||
* +--------+----------+----------+
|
||||
*
|
||||
* Pointer to the free space is always: p[p[0] + 2]
|
||||
* Amount of free space on the page is: p[p[0] + 1]
|
||||
*/
|
||||
|
||||
/*
|
||||
* How many bytes required for this pair?
|
||||
* 2 shorts in the table at the top of the page + room for the
|
||||
* key and room for the data
|
||||
*
|
||||
* We prohibit entering a pair on a page unless there is also room to append
|
||||
* an overflow page. The reason for this it that you can get in a situation
|
||||
* where a single key/data pair fits on a page, but you can't append an
|
||||
* overflow page and later you'd have to split the key/data and handle like
|
||||
* a big pair.
|
||||
* You might as well do this up front.
|
||||
*/
|
||||
#ifndef PAGE_H
|
||||
#define PAGE_H
|
||||
|
||||
#define PAIRSIZE(K,D) (2*sizeof(uint16) + (K)->size + (D)->size)
|
||||
#define BIGOVERHEAD (4*sizeof(uint16))
|
||||
#define KEYSIZE(K) (4*sizeof(uint16) + (K)->size);
|
||||
#define OVFLSIZE (2*sizeof(uint16))
|
||||
#define FREESPACE(P) ((P)[(P)[0]+1])
|
||||
#define OFFSET(P) ((P)[(P)[0]+2])
|
||||
#define PAIRFITS(P,K,D) \
|
||||
(((P)[2] >= REAL_KEY) && \
|
||||
(PAIRSIZE((K),(D)) + OVFLSIZE) <= FREESPACE((P)))
|
||||
#define PAGE_META(N) (((N)+3) * sizeof(uint16))
|
||||
|
||||
typedef struct {
|
||||
BUFHEAD *newp;
|
||||
BUFHEAD *oldp;
|
||||
BUFHEAD *nextp;
|
||||
uint16 next_addr;
|
||||
} SPLIT_RETURN;
|
||||
#endif
|
||||
|
||||
@@ -1,243 +0,0 @@
|
||||
/*
|
||||
* 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*
|
||||
* @(#)queue.h 8.3 (Berkeley) 12/13/93
|
||||
*/
|
||||
|
||||
#ifndef _QUEUE_H_
|
||||
#define _QUEUE_H_
|
||||
|
||||
/*
|
||||
* This file defines three types of data structures: lists, tail queues,
|
||||
* and circular queues.
|
||||
*
|
||||
* A list is headed by a single forward pointer (or an array of forward
|
||||
* pointers for a hash table header). The elements are doubly linked
|
||||
* so that an arbitrary element can be removed without a need to
|
||||
* traverse the list. New elements can be added to the list after
|
||||
* an existing element or at the head of the list. A list may only be
|
||||
* traversed in the forward direction.
|
||||
*
|
||||
* A tail queue is headed by a pair of pointers, one to the head of the
|
||||
* list and the other to the tail of the list. The elements are doubly
|
||||
* linked so that an arbitrary element can be removed without a need to
|
||||
* traverse the list. New elements can be added to the list after
|
||||
* an existing element, at the head of the list, or at the end of the
|
||||
* list. A tail queue may only be traversed in the forward direction.
|
||||
*
|
||||
* A circle queue is headed by a pair of pointers, one to the head of the
|
||||
* list and the other to the tail of the list. The elements are doubly
|
||||
* linked so that an arbitrary element can be removed without a need to
|
||||
* traverse the list. New elements can be added to the list before or after
|
||||
* an existing element, at the head of the list, or at the end of the list.
|
||||
* A circle queue may be traversed in either direction, but has a more
|
||||
* complex end of list detection.
|
||||
*
|
||||
* For details on the use of these macros, see the queue(3) manual page.
|
||||
*/
|
||||
|
||||
/*
|
||||
* List definitions.
|
||||
*/
|
||||
#define LIST_HEAD(name, type) \
|
||||
struct name { \
|
||||
struct type *lh_first; /* first element */ \
|
||||
}
|
||||
|
||||
#define LIST_ENTRY(type) \
|
||||
struct { \
|
||||
struct type *le_next; /* next element */ \
|
||||
struct type **le_prev; /* address of previous next element */ \
|
||||
}
|
||||
|
||||
/*
|
||||
* List functions.
|
||||
*/
|
||||
#define LIST_INIT(head) { \
|
||||
(head)->lh_first = NULL; \
|
||||
}
|
||||
|
||||
#define LIST_INSERT_AFTER(listelm, elm, field) { \
|
||||
if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \
|
||||
(listelm)->field.le_next->field.le_prev = \
|
||||
&(elm)->field.le_next; \
|
||||
(listelm)->field.le_next = (elm); \
|
||||
(elm)->field.le_prev = &(listelm)->field.le_next; \
|
||||
}
|
||||
|
||||
#define LIST_INSERT_HEAD(head, elm, field) { \
|
||||
if (((elm)->field.le_next = (head)->lh_first) != NULL) \
|
||||
(head)->lh_first->field.le_prev = &(elm)->field.le_next;\
|
||||
(head)->lh_first = (elm); \
|
||||
(elm)->field.le_prev = &(head)->lh_first; \
|
||||
}
|
||||
|
||||
#define LIST_REMOVE(elm, field) { \
|
||||
if ((elm)->field.le_next != NULL) \
|
||||
(elm)->field.le_next->field.le_prev = \
|
||||
(elm)->field.le_prev; \
|
||||
*(elm)->field.le_prev = (elm)->field.le_next; \
|
||||
}
|
||||
|
||||
/*
|
||||
* Tail queue definitions.
|
||||
*/
|
||||
#define TAILQ_HEAD(name, type) \
|
||||
struct name { \
|
||||
struct type *tqh_first; /* first element */ \
|
||||
struct type **tqh_last; /* addr of last next element */ \
|
||||
}
|
||||
|
||||
#define TAILQ_ENTRY(type) \
|
||||
struct { \
|
||||
struct type *tqe_next; /* next element */ \
|
||||
struct type **tqe_prev; /* address of previous next element */ \
|
||||
}
|
||||
|
||||
/*
|
||||
* Tail queue functions.
|
||||
*/
|
||||
#define TAILQ_INIT(head) { \
|
||||
(head)->tqh_first = NULL; \
|
||||
(head)->tqh_last = &(head)->tqh_first; \
|
||||
}
|
||||
|
||||
#define TAILQ_INSERT_HEAD(head, elm, field) { \
|
||||
if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \
|
||||
(elm)->field.tqe_next->field.tqe_prev = \
|
||||
&(elm)->field.tqe_next; \
|
||||
else \
|
||||
(head)->tqh_last = &(elm)->field.tqe_next; \
|
||||
(head)->tqh_first = (elm); \
|
||||
(elm)->field.tqe_prev = &(head)->tqh_first; \
|
||||
}
|
||||
|
||||
#define TAILQ_INSERT_TAIL(head, elm, field) { \
|
||||
(elm)->field.tqe_next = NULL; \
|
||||
(elm)->field.tqe_prev = (head)->tqh_last; \
|
||||
*(head)->tqh_last = (elm); \
|
||||
(head)->tqh_last = &(elm)->field.tqe_next; \
|
||||
}
|
||||
|
||||
#define TAILQ_INSERT_AFTER(head, listelm, elm, field) { \
|
||||
if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
|
||||
(elm)->field.tqe_next->field.tqe_prev = \
|
||||
&(elm)->field.tqe_next; \
|
||||
else \
|
||||
(head)->tqh_last = &(elm)->field.tqe_next; \
|
||||
(listelm)->field.tqe_next = (elm); \
|
||||
(elm)->field.tqe_prev = &(listelm)->field.tqe_next; \
|
||||
}
|
||||
|
||||
#define TAILQ_REMOVE(head, elm, field) { \
|
||||
if (((elm)->field.tqe_next) != NULL) \
|
||||
(elm)->field.tqe_next->field.tqe_prev = \
|
||||
(elm)->field.tqe_prev; \
|
||||
else \
|
||||
(head)->tqh_last = (elm)->field.tqe_prev; \
|
||||
*(elm)->field.tqe_prev = (elm)->field.tqe_next; \
|
||||
}
|
||||
|
||||
/*
|
||||
* Circular queue definitions.
|
||||
*/
|
||||
#define CIRCLEQ_HEAD(name, type) \
|
||||
struct name { \
|
||||
struct type *cqh_first; /* first element */ \
|
||||
struct type *cqh_last; /* last element */ \
|
||||
}
|
||||
|
||||
#define CIRCLEQ_ENTRY(type) \
|
||||
struct { \
|
||||
struct type *cqe_next; /* next element */ \
|
||||
struct type *cqe_prev; /* previous element */ \
|
||||
}
|
||||
|
||||
/*
|
||||
* Circular queue functions.
|
||||
*/
|
||||
#define CIRCLEQ_INIT(head) { \
|
||||
(head)->cqh_first = (void *)(head); \
|
||||
(head)->cqh_last = (void *)(head); \
|
||||
}
|
||||
|
||||
#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) { \
|
||||
(elm)->field.cqe_next = (listelm)->field.cqe_next; \
|
||||
(elm)->field.cqe_prev = (listelm); \
|
||||
if ((listelm)->field.cqe_next == (void *)(head)) \
|
||||
(head)->cqh_last = (elm); \
|
||||
else \
|
||||
(listelm)->field.cqe_next->field.cqe_prev = (elm); \
|
||||
(listelm)->field.cqe_next = (elm); \
|
||||
}
|
||||
|
||||
#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) { \
|
||||
(elm)->field.cqe_next = (listelm); \
|
||||
(elm)->field.cqe_prev = (listelm)->field.cqe_prev; \
|
||||
if ((listelm)->field.cqe_prev == (void *)(head)) \
|
||||
(head)->cqh_first = (elm); \
|
||||
else \
|
||||
(listelm)->field.cqe_prev->field.cqe_next = (elm); \
|
||||
(listelm)->field.cqe_prev = (elm); \
|
||||
}
|
||||
|
||||
#define CIRCLEQ_INSERT_HEAD(head, elm, field) { \
|
||||
(elm)->field.cqe_next = (head)->cqh_first; \
|
||||
(elm)->field.cqe_prev = (void *)(head); \
|
||||
if ((head)->cqh_last == (void *)(head)) \
|
||||
(head)->cqh_last = (elm); \
|
||||
else \
|
||||
(head)->cqh_first->field.cqe_prev = (elm); \
|
||||
(head)->cqh_first = (elm); \
|
||||
}
|
||||
|
||||
#define CIRCLEQ_INSERT_TAIL(head, elm, field) { \
|
||||
(elm)->field.cqe_next = (void *)(head); \
|
||||
(elm)->field.cqe_prev = (head)->cqh_last; \
|
||||
if ((head)->cqh_first == (void *)(head)) \
|
||||
(head)->cqh_first = (elm); \
|
||||
else \
|
||||
(head)->cqh_last->field.cqe_next = (elm); \
|
||||
(head)->cqh_last = (elm); \
|
||||
}
|
||||
|
||||
#define CIRCLEQ_REMOVE(head, elm, field) { \
|
||||
if ((elm)->field.cqe_next == (void *)(head)) \
|
||||
(head)->cqh_last = (elm)->field.cqe_prev; \
|
||||
else \
|
||||
(elm)->field.cqe_next->field.cqe_prev = \
|
||||
(elm)->field.cqe_prev; \
|
||||
if ((elm)->field.cqe_prev == (void *)(head)) \
|
||||
(head)->cqh_first = (elm)->field.cqe_next; \
|
||||
else \
|
||||
(elm)->field.cqe_prev->field.cqe_next = \
|
||||
(elm)->field.cqe_next; \
|
||||
}
|
||||
#endif /* !_QUEUE_H_ */
|
||||
@@ -1,49 +0,0 @@
|
||||
/*-
|
||||
* 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*
|
||||
* @(#)search.h 8.1 (Berkeley) 6/4/93
|
||||
*/
|
||||
|
||||
/* Backward compatibility to hsearch interface. */
|
||||
typedef struct entry {
|
||||
char *key;
|
||||
char *data;
|
||||
} ENTRY;
|
||||
|
||||
typedef enum {
|
||||
FIND, ENTER
|
||||
} ACTION;
|
||||
|
||||
int hcreate (unsigned int);
|
||||
void hdestroy (void);
|
||||
ENTRY *hsearch (ENTRY, ACTION);
|
||||
@@ -1,26 +0,0 @@
|
||||
#if defined(__WATCOMC__) || defined(__WATCOM_CPLUSPLUS__)
|
||||
#ifndef __WATCOM_FIX_H__
|
||||
#define __WATCOM_FIX_H__ 1
|
||||
/*
|
||||
* WATCOM's C compiler doesn't default to "__cdecl" conventions for external
|
||||
* symbols and functions. Rather than adding an explicit __cdecl modifier to
|
||||
* every external symbol and function declaration and definition, we use the
|
||||
* following pragma to (attempt to) change WATCOM c's default to __cdecl.
|
||||
* These pragmas were taken from pages 180-181, 266 & 269 of the
|
||||
* Watcom C/C++ version 11 User's Guide, 3rd edition.
|
||||
*/
|
||||
#if defined(XP_WIN16) || defined(WIN16)
|
||||
#pragma aux default "_*" \
|
||||
parm caller [] \
|
||||
value struct float struct routine [ax] \
|
||||
modify [ax bx cx dx es]
|
||||
#else
|
||||
#pragma aux default "_*" \
|
||||
parm caller [] \
|
||||
value struct float struct routine [eax] \
|
||||
modify [eax ecx edx]
|
||||
#endif
|
||||
#pragma aux default far
|
||||
|
||||
#endif /* once */
|
||||
#endif /* WATCOM compiler */
|
||||
@@ -1,112 +0,0 @@
|
||||
|
||||
/* ---------------------------------------------------------------------------
|
||||
Stuff to fake unix file I/O on windows boxes
|
||||
------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef WINFILE_H
|
||||
#define WINFILE_H
|
||||
|
||||
#ifdef _WINDOWS
|
||||
/* hacked out of <dirent.h> on an SGI */
|
||||
#if defined(XP_WIN32) || defined(_WIN32)
|
||||
/* 32-bit stuff here */
|
||||
#include <windows.h>
|
||||
#include <stdlib.h>
|
||||
#ifdef __MINGW32__
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#else
|
||||
#include <sys\types.h>
|
||||
#include <sys\stat.h>
|
||||
#endif
|
||||
|
||||
typedef struct DIR_Struct {
|
||||
void * directoryPtr;
|
||||
WIN32_FIND_DATA data;
|
||||
} DIR;
|
||||
|
||||
#define _ST_FSTYPSZ 16
|
||||
|
||||
#if !defined(__BORLANDC__) && !defined(__GNUC__)
|
||||
typedef unsigned long mode_t;
|
||||
typedef long uid_t;
|
||||
typedef long gid_t;
|
||||
|
||||
#ifdef WINCE
|
||||
typedef long ino_t;
|
||||
#else
|
||||
typedef long off_t;
|
||||
#endif
|
||||
|
||||
typedef unsigned long nlink_t;
|
||||
#endif
|
||||
|
||||
typedef struct timestruc {
|
||||
time_t tv_sec; /* seconds */
|
||||
long tv_nsec; /* and nanoseconds */
|
||||
} timestruc_t;
|
||||
|
||||
|
||||
struct dirent { /* data from readdir() */
|
||||
ino_t d_ino; /* inode number of entry */
|
||||
off_t d_off; /* offset of disk direntory entry */
|
||||
unsigned short d_reclen; /* length of this record */
|
||||
char d_name[_MAX_FNAME]; /* name of file */
|
||||
};
|
||||
|
||||
#if !defined(__BORLANDC__) && !defined (__GNUC__)
|
||||
#define S_ISDIR(s) ((s) & _S_IFDIR)
|
||||
#endif
|
||||
|
||||
#else /* _WIN32 */
|
||||
/* 16-bit windows stuff */
|
||||
|
||||
#include <sys\types.h>
|
||||
#include <sys\stat.h>
|
||||
#include <dos.h>
|
||||
|
||||
|
||||
|
||||
/* Getting cocky to support multiple file systems */
|
||||
typedef struct dirStruct_tag {
|
||||
struct _find_t file_data;
|
||||
char c_checkdrive;
|
||||
} dirStruct;
|
||||
|
||||
typedef struct DIR_Struct {
|
||||
void * directoryPtr;
|
||||
dirStruct data;
|
||||
} DIR;
|
||||
|
||||
#define _ST_FSTYPSZ 16
|
||||
typedef unsigned long mode_t;
|
||||
typedef long uid_t;
|
||||
typedef long gid_t;
|
||||
typedef long off_t;
|
||||
typedef unsigned long nlink_t;
|
||||
|
||||
typedef struct timestruc {
|
||||
time_t tv_sec; /* seconds */
|
||||
long tv_nsec; /* and nanoseconds */
|
||||
} timestruc_t;
|
||||
|
||||
struct dirent { /* data from readdir() */
|
||||
ino_t d_ino; /* inode number of entry */
|
||||
off_t d_off; /* offset of disk direntory entry */
|
||||
unsigned short d_reclen; /* length of this record */
|
||||
#ifdef XP_WIN32
|
||||
char d_name[_MAX_FNAME]; /* name of file */
|
||||
#else
|
||||
char d_name[20]; /* name of file */
|
||||
#endif
|
||||
};
|
||||
|
||||
#define S_ISDIR(s) ((s) & _S_IFDIR)
|
||||
|
||||
#endif /* 16-bit windows */
|
||||
|
||||
#define CONST const
|
||||
|
||||
#endif /* _WINDOWS */
|
||||
|
||||
#endif /* WINFILE_H */
|
||||
@@ -1,95 +0,0 @@
|
||||
#
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Netscape Communications Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 1998
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
DEPTH = ../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
LIBRARY_NAME = mozdbm_s
|
||||
LIB_IS_C_ONLY = 1
|
||||
|
||||
ifeq ($(OS_ARCH),WINNT)
|
||||
LIBRARY_NAME = dbm$(MOZ_BITS)
|
||||
endif
|
||||
|
||||
CSRCS = \
|
||||
db.c \
|
||||
h_bigkey.c \
|
||||
h_func.c \
|
||||
h_log2.c \
|
||||
h_page.c \
|
||||
hash.c \
|
||||
hash_buf.c \
|
||||
hsearch.c \
|
||||
mktemp.c \
|
||||
ndbm.c \
|
||||
strerror.c \
|
||||
nsres.c \
|
||||
$(NULL)
|
||||
|
||||
ifeq ($(OS_ARCH),WINNT)
|
||||
CSRCS += memmove.c snprintf.c
|
||||
else
|
||||
ifeq (,$(filter -DHAVE_MEMMOVE=1,$(ACDEFINES)))
|
||||
CSRCS += memmove.c
|
||||
endif
|
||||
|
||||
ifeq (,$(filter -DHAVE_SNPRINTF=1,$(ACDEFINES)))
|
||||
CSRCS += snprintf.c
|
||||
endif
|
||||
endif # WINNT
|
||||
|
||||
LOCAL_INCLUDES = -I$(srcdir)/../include
|
||||
|
||||
FORCE_STATIC_LIB = 1
|
||||
FORCE_USE_PIC = 1
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
DEFINES += -DMEMMOVE -D__DBINTERFACE_PRIVATE $(SECURITY_FLAG)
|
||||
|
||||
ifeq ($(OS_ARCH),WINCE)
|
||||
DEFINES += -D__STDC__ -DDBM_REOPEN_ON_FLUSH
|
||||
endif
|
||||
|
||||
ifeq ($(OS_ARCH),AIX)
|
||||
OS_LIBS += -lc_r
|
||||
endif
|
||||
|
||||
@@ -1,113 +0,0 @@
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Netscape Communications Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 1998
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
|
||||
#//------------------------------------------------------------------------
|
||||
#//
|
||||
#// Makefile to build the cert library
|
||||
#//
|
||||
#//------------------------------------------------------------------------
|
||||
|
||||
!if "$(MOZ_BITS)" == "16"
|
||||
!ifndef MOZ_DEBUG
|
||||
OPTIMIZER=-Os -UDEBUG -DNDEBUG
|
||||
!endif
|
||||
!endif
|
||||
|
||||
#//------------------------------------------------------------------------
|
||||
#//
|
||||
#// Specify the depth of the current directory relative to the
|
||||
#// root of NS
|
||||
#//
|
||||
#//------------------------------------------------------------------------
|
||||
DEPTH= ..\..
|
||||
|
||||
!ifndef MAKE_OBJ_TYPE
|
||||
MAKE_OBJ_TYPE=EXE
|
||||
!endif
|
||||
|
||||
#//------------------------------------------------------------------------
|
||||
#//
|
||||
#// Define any Public Make Variables here: (ie. PDFFILE, MAPFILE, ...)
|
||||
#//
|
||||
#//------------------------------------------------------------------------
|
||||
LIBNAME=dbm$(MOZ_BITS)
|
||||
PDBFILE=$(LIBNAME).pdb
|
||||
|
||||
#//------------------------------------------------------------------------
|
||||
#//
|
||||
#// Define the files necessary to build the target (ie. OBJS)
|
||||
#//
|
||||
#//------------------------------------------------------------------------
|
||||
OBJS= \
|
||||
.\$(OBJDIR)\db.obj \
|
||||
.\$(OBJDIR)\h_bigkey.obj \
|
||||
.\$(OBJDIR)\h_func.obj \
|
||||
.\$(OBJDIR)\h_log2.obj \
|
||||
.\$(OBJDIR)\h_page.obj \
|
||||
.\$(OBJDIR)\hash.obj \
|
||||
.\$(OBJDIR)\hash_buf.obj \
|
||||
.\$(OBJDIR)\hsearch.obj \
|
||||
.\$(OBJDIR)\memmove.obj \
|
||||
.\$(OBJDIR)\mktemp.obj \
|
||||
.\$(OBJDIR)\ndbm.obj \
|
||||
.\$(OBJDIR)\snprintf.obj \
|
||||
.\$(OBJDIR)\strerror.obj \
|
||||
.\$(OBJDIR)\nsres.obj \
|
||||
$(NULL)
|
||||
|
||||
#//------------------------------------------------------------------------
|
||||
#//
|
||||
#// Define any Public Targets here (ie. PROGRAM, LIBRARY, DLL, ...)
|
||||
#// (these must be defined before the common makefiles are included)
|
||||
#//
|
||||
#//------------------------------------------------------------------------
|
||||
LIBRARY = .\$(OBJDIR)\$(LIBNAME).lib
|
||||
LINCS = -I..\include
|
||||
|
||||
#//------------------------------------------------------------------------
|
||||
#//
|
||||
#// Include the common makefile rules
|
||||
#//
|
||||
#//------------------------------------------------------------------------
|
||||
include <$(DEPTH)/config/rules.mak>
|
||||
|
||||
CFLAGS = $(CFLAGS) -DMOZILLA_CLIENT -D__DBINTERFACE_PRIVATE
|
||||
|
||||
install:: $(LIBRARY)
|
||||
$(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib
|
||||
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
/*-
|
||||
* 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static char sccsid[] = "@(#)db.c 8.4 (Berkeley) 2/21/94";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "watcomfx.h"
|
||||
|
||||
#ifndef __DBINTERFACE_PRIVATE
|
||||
#define __DBINTERFACE_PRIVATE
|
||||
#endif
|
||||
#ifdef macintosh
|
||||
#include <unix.h>
|
||||
#else
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "mcom_db.h"
|
||||
|
||||
/* a global flag that locks closed all databases */
|
||||
int all_databases_locked_closed = 0;
|
||||
|
||||
/* set or unset a global lock flag to disable the
|
||||
* opening of any DBM file
|
||||
*/
|
||||
void
|
||||
dbSetOrClearDBLock(DBLockFlagEnum type)
|
||||
{
|
||||
if(type == LockOutDatabase)
|
||||
all_databases_locked_closed = 1;
|
||||
else
|
||||
all_databases_locked_closed = 0;
|
||||
}
|
||||
|
||||
#if defined(__WATCOMC__) || defined(__WATCOM_CPLUSPLUS__)
|
||||
DB *
|
||||
#else
|
||||
PR_IMPLEMENT(DB *)
|
||||
#endif
|
||||
dbopen(const char *fname, int flags,int mode, DBTYPE type, const void *openinfo)
|
||||
{
|
||||
|
||||
/* lock out all file databases. Let in-memory databases through
|
||||
*/
|
||||
if(all_databases_locked_closed && fname)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
#define DB_FLAGS (DB_LOCK | DB_SHMEM | DB_TXN)
|
||||
|
||||
|
||||
#if 0 /* most systems don't have EXLOCK and SHLOCK */
|
||||
#define USE_OPEN_FLAGS \
|
||||
(O_CREAT | O_EXCL | O_EXLOCK | O_NONBLOCK | O_RDONLY | \
|
||||
O_RDWR | O_SHLOCK | O_TRUNC)
|
||||
#else
|
||||
#define USE_OPEN_FLAGS \
|
||||
(O_CREAT | O_EXCL | O_RDONLY | \
|
||||
O_RDWR | O_TRUNC)
|
||||
#endif
|
||||
|
||||
if ((flags & ~(USE_OPEN_FLAGS | DB_FLAGS)) == 0)
|
||||
switch (type) {
|
||||
/* we don't need btree and recno right now */
|
||||
#if 0
|
||||
case DB_BTREE:
|
||||
return (__bt_open(fname, flags & USE_OPEN_FLAGS,
|
||||
mode, openinfo, flags & DB_FLAGS));
|
||||
case DB_RECNO:
|
||||
return (__rec_open(fname, flags & USE_OPEN_FLAGS,
|
||||
mode, openinfo, flags & DB_FLAGS));
|
||||
#endif
|
||||
|
||||
case DB_HASH:
|
||||
return (__hash_open(fname, flags & USE_OPEN_FLAGS,
|
||||
mode, (const HASHINFO *)openinfo, flags & DB_FLAGS));
|
||||
default:
|
||||
break;
|
||||
}
|
||||
errno = EINVAL;
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
static int
|
||||
__dberr()
|
||||
{
|
||||
return (RET_ERROR);
|
||||
}
|
||||
|
||||
/*
|
||||
* __DBPANIC -- Stop.
|
||||
*
|
||||
* Parameters:
|
||||
* dbp: pointer to the DB structure.
|
||||
*/
|
||||
void
|
||||
__dbpanic(DB *dbp)
|
||||
{
|
||||
/* The only thing that can succeed is a close. */
|
||||
dbp->del = (int (*)(const struct __db *, const DBT *, uint))__dberr;
|
||||
dbp->fd = (int (*)(const struct __db *))__dberr;
|
||||
dbp->get = (int (*)(const struct __db *, const DBT *, DBT *, uint))__dberr;
|
||||
dbp->put = (int (*)(const struct __db *, DBT *, const DBT *, uint))__dberr;
|
||||
dbp->seq = (int (*)(const struct __db *, DBT *, DBT *, uint))__dberr;
|
||||
dbp->sync = (int (*)(const struct __db *, uint))__dberr;
|
||||
}
|
||||
@@ -1,711 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993, 1994
|
||||
* 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static char sccsid[] = "@(#)hash_bigkey.c 8.3 (Berkeley) 5/31/94";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "watcomfx.h"
|
||||
|
||||
/*
|
||||
* PACKAGE: hash
|
||||
* DESCRIPTION:
|
||||
* Big key/data handling for the hashing package.
|
||||
*
|
||||
* ROUTINES:
|
||||
* External
|
||||
* __big_keydata
|
||||
* __big_split
|
||||
* __big_insert
|
||||
* __big_return
|
||||
* __big_delete
|
||||
* __find_last_page
|
||||
* Internal
|
||||
* collect_key
|
||||
* collect_data
|
||||
*/
|
||||
|
||||
#if !defined(_WIN32) && !defined(_WINDOWS) && !defined(macintosh) && !defined(XP_OS2_VACPP)
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef DEBUG
|
||||
#include <assert.h>
|
||||
#endif
|
||||
|
||||
#include "mcom_db.h"
|
||||
#include "hash.h"
|
||||
#include "page.h"
|
||||
/* #include "extern.h" */
|
||||
|
||||
static int collect_key __P((HTAB *, BUFHEAD *, int, DBT *, int));
|
||||
static int collect_data __P((HTAB *, BUFHEAD *, int, int));
|
||||
|
||||
/*
|
||||
* Big_insert
|
||||
*
|
||||
* You need to do an insert and the key/data pair is too big
|
||||
*
|
||||
* Returns:
|
||||
* 0 ==> OK
|
||||
*-1 ==> ERROR
|
||||
*/
|
||||
extern int
|
||||
__big_insert(HTAB *hashp, BUFHEAD *bufp, const DBT *key, const DBT *val)
|
||||
{
|
||||
register uint16 *p;
|
||||
uint key_size, n, val_size;
|
||||
uint16 space, move_bytes, off;
|
||||
char *cp, *key_data, *val_data;
|
||||
|
||||
cp = bufp->page; /* Character pointer of p. */
|
||||
p = (uint16 *)cp;
|
||||
|
||||
key_data = (char *)key->data;
|
||||
key_size = key->size;
|
||||
val_data = (char *)val->data;
|
||||
val_size = val->size;
|
||||
|
||||
/* First move the Key */
|
||||
for (space = FREESPACE(p) - BIGOVERHEAD; key_size;
|
||||
space = FREESPACE(p) - BIGOVERHEAD) {
|
||||
move_bytes = PR_MIN(space, key_size);
|
||||
off = OFFSET(p) - move_bytes;
|
||||
memmove(cp + off, key_data, move_bytes);
|
||||
key_size -= move_bytes;
|
||||
key_data += move_bytes;
|
||||
n = p[0];
|
||||
p[++n] = off;
|
||||
p[0] = ++n;
|
||||
FREESPACE(p) = off - PAGE_META(n);
|
||||
OFFSET(p) = off;
|
||||
p[n] = PARTIAL_KEY;
|
||||
bufp = __add_ovflpage(hashp, bufp);
|
||||
if (!bufp)
|
||||
return (-1);
|
||||
n = p[0];
|
||||
if (!key_size) {
|
||||
if (FREESPACE(p)) {
|
||||
move_bytes = PR_MIN(FREESPACE(p), val_size);
|
||||
off = OFFSET(p) - move_bytes;
|
||||
p[n] = off;
|
||||
memmove(cp + off, val_data, move_bytes);
|
||||
val_data += move_bytes;
|
||||
val_size -= move_bytes;
|
||||
p[n - 2] = FULL_KEY_DATA;
|
||||
FREESPACE(p) = FREESPACE(p) - move_bytes;
|
||||
OFFSET(p) = off;
|
||||
} else
|
||||
p[n - 2] = FULL_KEY;
|
||||
}
|
||||
p = (uint16 *)bufp->page;
|
||||
cp = bufp->page;
|
||||
bufp->flags |= BUF_MOD;
|
||||
}
|
||||
|
||||
/* Now move the data */
|
||||
for (space = FREESPACE(p) - BIGOVERHEAD; val_size;
|
||||
space = FREESPACE(p) - BIGOVERHEAD) {
|
||||
move_bytes = PR_MIN(space, val_size);
|
||||
/*
|
||||
* Here's the hack to make sure that if the data ends on the
|
||||
* same page as the key ends, FREESPACE is at least one.
|
||||
*/
|
||||
if (space == val_size && val_size == val->size)
|
||||
move_bytes--;
|
||||
off = OFFSET(p) - move_bytes;
|
||||
memmove(cp + off, val_data, move_bytes);
|
||||
val_size -= move_bytes;
|
||||
val_data += move_bytes;
|
||||
n = p[0];
|
||||
p[++n] = off;
|
||||
p[0] = ++n;
|
||||
FREESPACE(p) = off - PAGE_META(n);
|
||||
OFFSET(p) = off;
|
||||
if (val_size) {
|
||||
p[n] = FULL_KEY;
|
||||
bufp = __add_ovflpage(hashp, bufp);
|
||||
if (!bufp)
|
||||
return (-1);
|
||||
cp = bufp->page;
|
||||
p = (uint16 *)cp;
|
||||
} else
|
||||
p[n] = FULL_KEY_DATA;
|
||||
bufp->flags |= BUF_MOD;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Called when bufp's page contains a partial key (index should be 1)
|
||||
*
|
||||
* All pages in the big key/data pair except bufp are freed. We cannot
|
||||
* free bufp because the page pointing to it is lost and we can't get rid
|
||||
* of its pointer.
|
||||
*
|
||||
* Returns:
|
||||
* 0 => OK
|
||||
*-1 => ERROR
|
||||
*/
|
||||
extern int
|
||||
__big_delete(HTAB *hashp, BUFHEAD *bufp)
|
||||
{
|
||||
register BUFHEAD *last_bfp, *rbufp;
|
||||
uint16 *bp, pageno;
|
||||
int key_done, n;
|
||||
|
||||
rbufp = bufp;
|
||||
last_bfp = NULL;
|
||||
bp = (uint16 *)bufp->page;
|
||||
pageno = 0;
|
||||
key_done = 0;
|
||||
|
||||
while (!key_done || (bp[2] != FULL_KEY_DATA)) {
|
||||
if (bp[2] == FULL_KEY || bp[2] == FULL_KEY_DATA)
|
||||
key_done = 1;
|
||||
|
||||
/*
|
||||
* If there is freespace left on a FULL_KEY_DATA page, then
|
||||
* the data is short and fits entirely on this page, and this
|
||||
* is the last page.
|
||||
*/
|
||||
if (bp[2] == FULL_KEY_DATA && FREESPACE(bp))
|
||||
break;
|
||||
pageno = bp[bp[0] - 1];
|
||||
rbufp->flags |= BUF_MOD;
|
||||
rbufp = __get_buf(hashp, pageno, rbufp, 0);
|
||||
if (last_bfp)
|
||||
__free_ovflpage(hashp, last_bfp);
|
||||
last_bfp = rbufp;
|
||||
if (!rbufp)
|
||||
return (-1); /* Error. */
|
||||
bp = (uint16 *)rbufp->page;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we get here then rbufp points to the last page of the big
|
||||
* key/data pair. Bufp points to the first one -- it should now be
|
||||
* empty pointing to the next page after this pair. Can't free it
|
||||
* because we don't have the page pointing to it.
|
||||
*/
|
||||
|
||||
/* This is information from the last page of the pair. */
|
||||
n = bp[0];
|
||||
pageno = bp[n - 1];
|
||||
|
||||
/* Now, bp is the first page of the pair. */
|
||||
bp = (uint16 *)bufp->page;
|
||||
if (n > 2) {
|
||||
/* There is an overflow page. */
|
||||
bp[1] = pageno;
|
||||
bp[2] = OVFLPAGE;
|
||||
bufp->ovfl = rbufp->ovfl;
|
||||
} else
|
||||
/* This is the last page. */
|
||||
bufp->ovfl = NULL;
|
||||
n -= 2;
|
||||
bp[0] = n;
|
||||
FREESPACE(bp) = hashp->BSIZE - PAGE_META(n);
|
||||
OFFSET(bp) = hashp->BSIZE - 1;
|
||||
|
||||
bufp->flags |= BUF_MOD;
|
||||
if (rbufp)
|
||||
__free_ovflpage(hashp, rbufp);
|
||||
if (last_bfp != rbufp)
|
||||
__free_ovflpage(hashp, last_bfp);
|
||||
|
||||
hashp->NKEYS--;
|
||||
return (0);
|
||||
}
|
||||
/*
|
||||
* Returns:
|
||||
* 0 = key not found
|
||||
* -1 = get next overflow page
|
||||
* -2 means key not found and this is big key/data
|
||||
* -3 error
|
||||
*/
|
||||
extern int
|
||||
__find_bigpair(HTAB *hashp, BUFHEAD *bufp, int ndx, char *key, int size)
|
||||
{
|
||||
register uint16 *bp;
|
||||
register char *p;
|
||||
int ksize;
|
||||
uint16 bytes;
|
||||
char *kkey;
|
||||
|
||||
bp = (uint16 *)bufp->page;
|
||||
p = bufp->page;
|
||||
ksize = size;
|
||||
kkey = key;
|
||||
|
||||
for (bytes = hashp->BSIZE - bp[ndx];
|
||||
bytes <= size && bp[ndx + 1] == PARTIAL_KEY;
|
||||
bytes = hashp->BSIZE - bp[ndx]) {
|
||||
if (memcmp(p + bp[ndx], kkey, bytes))
|
||||
return (-2);
|
||||
kkey += bytes;
|
||||
ksize -= bytes;
|
||||
bufp = __get_buf(hashp, bp[ndx + 2], bufp, 0);
|
||||
if (!bufp)
|
||||
return (-3);
|
||||
p = bufp->page;
|
||||
bp = (uint16 *)p;
|
||||
ndx = 1;
|
||||
}
|
||||
|
||||
if (bytes != ksize || memcmp(p + bp[ndx], kkey, bytes)) {
|
||||
#ifdef HASH_STATISTICS
|
||||
++hash_collisions;
|
||||
#endif
|
||||
return (-2);
|
||||
} else
|
||||
return (ndx);
|
||||
}
|
||||
|
||||
/*
|
||||
* Given the buffer pointer of the first overflow page of a big pair,
|
||||
* find the end of the big pair
|
||||
*
|
||||
* This will set bpp to the buffer header of the last page of the big pair.
|
||||
* It will return the pageno of the overflow page following the last page
|
||||
* of the pair; 0 if there isn't any (i.e. big pair is the last key in the
|
||||
* bucket)
|
||||
*/
|
||||
extern uint16
|
||||
__find_last_page(HTAB *hashp, BUFHEAD **bpp)
|
||||
{
|
||||
BUFHEAD *bufp;
|
||||
uint16 *bp, pageno;
|
||||
uint n;
|
||||
|
||||
bufp = *bpp;
|
||||
bp = (uint16 *)bufp->page;
|
||||
for (;;) {
|
||||
n = bp[0];
|
||||
|
||||
/*
|
||||
* This is the last page if: the tag is FULL_KEY_DATA and
|
||||
* either only 2 entries OVFLPAGE marker is explicit there
|
||||
* is freespace on the page.
|
||||
*/
|
||||
if (bp[2] == FULL_KEY_DATA &&
|
||||
((n == 2) || (bp[n] == OVFLPAGE) || (FREESPACE(bp))))
|
||||
break;
|
||||
|
||||
/* LJM bound the size of n to reasonable limits
|
||||
*/
|
||||
if(n > hashp->BSIZE/sizeof(uint16))
|
||||
return(0);
|
||||
|
||||
pageno = bp[n - 1];
|
||||
bufp = __get_buf(hashp, pageno, bufp, 0);
|
||||
if (!bufp)
|
||||
return (0); /* Need to indicate an error! */
|
||||
bp = (uint16 *)bufp->page;
|
||||
}
|
||||
|
||||
*bpp = bufp;
|
||||
if (bp[0] > 2)
|
||||
return (bp[3]);
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the data for the key/data pair that begins on this page at this
|
||||
* index (index should always be 1).
|
||||
*/
|
||||
extern int
|
||||
__big_return(
|
||||
HTAB *hashp,
|
||||
BUFHEAD *bufp,
|
||||
int ndx,
|
||||
DBT *val,
|
||||
int set_current)
|
||||
{
|
||||
BUFHEAD *save_p;
|
||||
uint16 *bp, len, off, save_addr;
|
||||
char *tp;
|
||||
int save_flags;
|
||||
|
||||
bp = (uint16 *)bufp->page;
|
||||
while (bp[ndx + 1] == PARTIAL_KEY) {
|
||||
bufp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0);
|
||||
if (!bufp)
|
||||
return (-1);
|
||||
bp = (uint16 *)bufp->page;
|
||||
ndx = 1;
|
||||
}
|
||||
|
||||
if (bp[ndx + 1] == FULL_KEY) {
|
||||
bufp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0);
|
||||
if (!bufp)
|
||||
return (-1);
|
||||
bp = (uint16 *)bufp->page;
|
||||
save_p = bufp;
|
||||
save_addr = save_p->addr;
|
||||
off = bp[1];
|
||||
len = 0;
|
||||
} else
|
||||
if (!FREESPACE(bp)) {
|
||||
/*
|
||||
* This is a hack. We can't distinguish between
|
||||
* FULL_KEY_DATA that contains complete data or
|
||||
* incomplete data, so we require that if the data
|
||||
* is complete, there is at least 1 byte of free
|
||||
* space left.
|
||||
*/
|
||||
off = bp[bp[0]];
|
||||
len = bp[1] - off;
|
||||
save_p = bufp;
|
||||
save_addr = bufp->addr;
|
||||
bufp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0);
|
||||
if (!bufp)
|
||||
return (-1);
|
||||
bp = (uint16 *)bufp->page;
|
||||
} else {
|
||||
/* The data is all on one page. */
|
||||
tp = (char *)bp;
|
||||
off = bp[bp[0]];
|
||||
val->data = (uint8 *)tp + off;
|
||||
val->size = bp[1] - off;
|
||||
if (set_current) {
|
||||
if (bp[0] == 2) { /* No more buckets in
|
||||
* chain */
|
||||
hashp->cpage = NULL;
|
||||
hashp->cbucket++;
|
||||
hashp->cndx = 1;
|
||||
} else {
|
||||
hashp->cpage = __get_buf(hashp,
|
||||
bp[bp[0] - 1], bufp, 0);
|
||||
if (!hashp->cpage)
|
||||
return (-1);
|
||||
hashp->cndx = 1;
|
||||
if (!((uint16 *)
|
||||
hashp->cpage->page)[0]) {
|
||||
hashp->cbucket++;
|
||||
hashp->cpage = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* pin our saved buf so that we don't lose if
|
||||
* we run out of buffers */
|
||||
save_flags = save_p->flags;
|
||||
save_p->flags |= BUF_PIN;
|
||||
val->size = collect_data(hashp, bufp, (int)len, set_current);
|
||||
save_p->flags = save_flags;
|
||||
if (val->size == (size_t)-1)
|
||||
return (-1);
|
||||
if (save_p->addr != save_addr) {
|
||||
/* We are pretty short on buffers. */
|
||||
errno = EINVAL; /* OUT OF BUFFERS */
|
||||
return (-1);
|
||||
}
|
||||
memmove(hashp->tmp_buf, (save_p->page) + off, len);
|
||||
val->data = (uint8 *)hashp->tmp_buf;
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Count how big the total datasize is by looping through the pages. Then
|
||||
* allocate a buffer and copy the data in the second loop. NOTE: Our caller
|
||||
* may already have a bp which it is holding onto. The caller is
|
||||
* responsible for copying that bp into our temp buffer. 'len' is how much
|
||||
* space to reserve for that buffer.
|
||||
*/
|
||||
static int
|
||||
collect_data(
|
||||
HTAB *hashp,
|
||||
BUFHEAD *bufp,
|
||||
int len, int set)
|
||||
{
|
||||
register uint16 *bp;
|
||||
BUFHEAD *save_bufp;
|
||||
int save_flags;
|
||||
int mylen, totlen;
|
||||
|
||||
/*
|
||||
* save the input buf head because we need to walk the list twice.
|
||||
* pin it to make sure it doesn't leave the buffer pool.
|
||||
* This has the effect of growing the buffer pool if necessary.
|
||||
*/
|
||||
save_bufp = bufp;
|
||||
save_flags = save_bufp->flags;
|
||||
save_bufp->flags |= BUF_PIN;
|
||||
|
||||
/* read the length of the buffer */
|
||||
for (totlen = len; bufp ; bufp = __get_buf(hashp, bp[bp[0]-1], bufp, 0)) {
|
||||
bp = (uint16 *)bufp->page;
|
||||
mylen = hashp->BSIZE - bp[1];
|
||||
|
||||
/* if mylen ever goes negative it means that the
|
||||
* page is screwed up.
|
||||
*/
|
||||
if (mylen < 0) {
|
||||
save_bufp->flags = save_flags;
|
||||
return (-1);
|
||||
}
|
||||
totlen += mylen;
|
||||
if (bp[2] == FULL_KEY_DATA) { /* End of Data */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bufp) {
|
||||
save_bufp->flags = save_flags;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* allocate a temp buf */
|
||||
if (hashp->tmp_buf)
|
||||
free(hashp->tmp_buf);
|
||||
if ((hashp->tmp_buf = (char *)malloc((size_t)totlen)) == NULL) {
|
||||
save_bufp->flags = save_flags;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* copy the buffers back into temp buf */
|
||||
for (bufp = save_bufp; bufp ;
|
||||
bufp = __get_buf(hashp, bp[bp[0]-1], bufp, 0)) {
|
||||
bp = (uint16 *)bufp->page;
|
||||
mylen = hashp->BSIZE - bp[1];
|
||||
memmove(&hashp->tmp_buf[len], (bufp->page) + bp[1], (size_t)mylen);
|
||||
len += mylen;
|
||||
if (bp[2] == FULL_KEY_DATA) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* 'clear' the pin flags */
|
||||
save_bufp->flags = save_flags;
|
||||
|
||||
/* update the database cursor */
|
||||
if (set) {
|
||||
hashp->cndx = 1;
|
||||
if (bp[0] == 2) { /* No more buckets in chain */
|
||||
hashp->cpage = NULL;
|
||||
hashp->cbucket++;
|
||||
} else {
|
||||
hashp->cpage = __get_buf(hashp, bp[bp[0] - 1], bufp, 0);
|
||||
if (!hashp->cpage)
|
||||
return (-1);
|
||||
else if (!((uint16 *)hashp->cpage->page)[0]) {
|
||||
hashp->cbucket++;
|
||||
hashp->cpage = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
return (totlen);
|
||||
}
|
||||
|
||||
/*
|
||||
* Fill in the key and data for this big pair.
|
||||
*/
|
||||
extern int
|
||||
__big_keydata(
|
||||
HTAB *hashp,
|
||||
BUFHEAD *bufp,
|
||||
DBT *key, DBT *val,
|
||||
int set)
|
||||
{
|
||||
key->size = collect_key(hashp, bufp, 0, val, set);
|
||||
if (key->size == (size_t)-1)
|
||||
return (-1);
|
||||
key->data = (uint8 *)hashp->tmp_key;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Count how big the total key size is by recursing through the pages. Then
|
||||
* collect the data, allocate a buffer and copy the key as you recurse up.
|
||||
*/
|
||||
static int
|
||||
collect_key(
|
||||
HTAB *hashp,
|
||||
BUFHEAD *bufp,
|
||||
int len,
|
||||
DBT *val,
|
||||
int set)
|
||||
{
|
||||
BUFHEAD *xbp;
|
||||
char *p;
|
||||
int mylen, totlen;
|
||||
uint16 *bp, save_addr;
|
||||
|
||||
p = bufp->page;
|
||||
bp = (uint16 *)p;
|
||||
mylen = hashp->BSIZE - bp[1];
|
||||
|
||||
save_addr = bufp->addr;
|
||||
totlen = len + mylen;
|
||||
if (bp[2] == FULL_KEY || bp[2] == FULL_KEY_DATA) { /* End of Key. */
|
||||
if (hashp->tmp_key != NULL)
|
||||
free(hashp->tmp_key);
|
||||
if ((hashp->tmp_key = (char *)malloc((size_t)totlen)) == NULL)
|
||||
return (-1);
|
||||
if (__big_return(hashp, bufp, 1, val, set))
|
||||
return (-1);
|
||||
} else {
|
||||
xbp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0);
|
||||
if (!xbp || ((totlen =
|
||||
collect_key(hashp, xbp, totlen, val, set)) < 1))
|
||||
return (-1);
|
||||
}
|
||||
if (bufp->addr != save_addr) {
|
||||
errno = EINVAL; /* MIS -- OUT OF BUFFERS */
|
||||
return (-1);
|
||||
}
|
||||
memmove(&hashp->tmp_key[len], (bufp->page) + bp[1], (size_t)mylen);
|
||||
return (totlen);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns:
|
||||
* 0 => OK
|
||||
* -1 => error
|
||||
*/
|
||||
extern int
|
||||
__big_split(
|
||||
HTAB *hashp,
|
||||
BUFHEAD *op, /* Pointer to where to put keys that go in old bucket */
|
||||
BUFHEAD *np, /* Pointer to new bucket page */
|
||||
/* Pointer to first page containing the big key/data */
|
||||
BUFHEAD *big_keyp,
|
||||
uint32 addr, /* Address of big_keyp */
|
||||
uint32 obucket,/* Old Bucket */
|
||||
SPLIT_RETURN *ret)
|
||||
{
|
||||
register BUFHEAD *tmpp;
|
||||
register uint16 *tp;
|
||||
BUFHEAD *bp;
|
||||
DBT key, val;
|
||||
uint32 change;
|
||||
uint16 free_space, n, off;
|
||||
|
||||
bp = big_keyp;
|
||||
|
||||
/* Now figure out where the big key/data goes */
|
||||
if (__big_keydata(hashp, big_keyp, &key, &val, 0))
|
||||
return (-1);
|
||||
change = (__call_hash(hashp,(char*) key.data, key.size) != obucket);
|
||||
|
||||
if ((ret->next_addr = __find_last_page(hashp, &big_keyp))) {
|
||||
if (!(ret->nextp =
|
||||
__get_buf(hashp, ret->next_addr, big_keyp, 0)))
|
||||
return (-1);;
|
||||
} else
|
||||
ret->nextp = NULL;
|
||||
|
||||
/* Now make one of np/op point to the big key/data pair */
|
||||
#ifdef DEBUG
|
||||
assert(np->ovfl == NULL);
|
||||
#endif
|
||||
if (change)
|
||||
tmpp = np;
|
||||
else
|
||||
tmpp = op;
|
||||
|
||||
tmpp->flags |= BUF_MOD;
|
||||
#ifdef DEBUG1
|
||||
(void)fprintf(stderr,
|
||||
"BIG_SPLIT: %d->ovfl was %d is now %d\n", tmpp->addr,
|
||||
(tmpp->ovfl ? tmpp->ovfl->addr : 0), (bp ? bp->addr : 0));
|
||||
#endif
|
||||
tmpp->ovfl = bp; /* one of op/np point to big_keyp */
|
||||
tp = (uint16 *)tmpp->page;
|
||||
|
||||
|
||||
#if 0 /* this get's tripped on database corrupted error */
|
||||
assert(FREESPACE(tp) >= OVFLSIZE);
|
||||
#endif
|
||||
if(FREESPACE(tp) < OVFLSIZE)
|
||||
return(DATABASE_CORRUPTED_ERROR);
|
||||
|
||||
n = tp[0];
|
||||
off = OFFSET(tp);
|
||||
free_space = FREESPACE(tp);
|
||||
tp[++n] = (uint16)addr;
|
||||
tp[++n] = OVFLPAGE;
|
||||
tp[0] = n;
|
||||
OFFSET(tp) = off;
|
||||
FREESPACE(tp) = free_space - OVFLSIZE;
|
||||
|
||||
/*
|
||||
* Finally, set the new and old return values. BIG_KEYP contains a
|
||||
* pointer to the last page of the big key_data pair. Make sure that
|
||||
* big_keyp has no following page (2 elements) or create an empty
|
||||
* following page.
|
||||
*/
|
||||
|
||||
ret->newp = np;
|
||||
ret->oldp = op;
|
||||
|
||||
tp = (uint16 *)big_keyp->page;
|
||||
big_keyp->flags |= BUF_MOD;
|
||||
if (tp[0] > 2) {
|
||||
/*
|
||||
* There may be either one or two offsets on this page. If
|
||||
* there is one, then the overflow page is linked on normally
|
||||
* and tp[4] is OVFLPAGE. If there are two, tp[4] contains
|
||||
* the second offset and needs to get stuffed in after the
|
||||
* next overflow page is added.
|
||||
*/
|
||||
n = tp[4];
|
||||
free_space = FREESPACE(tp);
|
||||
off = OFFSET(tp);
|
||||
tp[0] -= 2;
|
||||
FREESPACE(tp) = free_space + OVFLSIZE;
|
||||
OFFSET(tp) = off;
|
||||
tmpp = __add_ovflpage(hashp, big_keyp);
|
||||
if (!tmpp)
|
||||
return (-1);
|
||||
tp[4] = n;
|
||||
} else
|
||||
tmpp = big_keyp;
|
||||
|
||||
if (change)
|
||||
ret->newp = tmpp;
|
||||
else
|
||||
ret->oldp = tmpp;
|
||||
return (0);
|
||||
}
|
||||
@@ -1,209 +0,0 @@
|
||||
/*-
|
||||
* 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static char sccsid[] = "@(#)hash_func.c 8.2 (Berkeley) 2/21/94";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "watcomfx.h"
|
||||
|
||||
#ifndef macintosh
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#include "mcom_db.h"
|
||||
#include "hash.h"
|
||||
#include "page.h"
|
||||
/* #include "extern.h" */
|
||||
|
||||
#if 0
|
||||
static uint32 hash1 __P((const void *, size_t));
|
||||
static uint32 hash2 __P((const void *, size_t));
|
||||
static uint32 hash3 __P((const void *, size_t));
|
||||
#endif
|
||||
static uint32 hash4 __P((const void *, size_t));
|
||||
|
||||
/* Global default hash function */
|
||||
uint32 (*__default_hash) __P((const void *, size_t)) = hash4;
|
||||
|
||||
/*
|
||||
* HASH FUNCTIONS
|
||||
*
|
||||
* Assume that we've already split the bucket to which this key hashes,
|
||||
* calculate that bucket, and check that in fact we did already split it.
|
||||
*
|
||||
* This came from ejb's hsearch.
|
||||
*/
|
||||
|
||||
#define PRIME1 37
|
||||
#define PRIME2 1048583
|
||||
|
||||
#if 0
|
||||
static uint32
|
||||
hash1(const void *keyarg, register size_t len)
|
||||
{
|
||||
register const uint8 *key;
|
||||
register uint32 h;
|
||||
|
||||
/* Convert string to integer */
|
||||
for (key = (const uint8 *)keyarg, h = 0; len--;)
|
||||
h = h * PRIME1 ^ (*key++ - ' ');
|
||||
h %= PRIME2;
|
||||
return (h);
|
||||
}
|
||||
|
||||
/*
|
||||
* Phong's linear congruential hash
|
||||
*/
|
||||
#define dcharhash(h, c) ((h) = 0x63c63cd9*(h) + 0x9c39c33d + (c))
|
||||
|
||||
static uint32
|
||||
hash2(const void *keyarg, size_t len)
|
||||
{
|
||||
register const uint8 *e, *key;
|
||||
register uint32 h;
|
||||
register uint8 c;
|
||||
|
||||
key = (const uint8 *)keyarg;
|
||||
e = key + len;
|
||||
for (h = 0; key != e;) {
|
||||
c = *key++;
|
||||
if (!c && key > e)
|
||||
break;
|
||||
dcharhash(h, c);
|
||||
}
|
||||
return (h);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is INCREDIBLY ugly, but fast. We break the string up into 8 byte
|
||||
* units. On the first time through the loop we get the "leftover bytes"
|
||||
* (strlen % 8). On every other iteration, we perform 8 HASHC's so we handle
|
||||
* all 8 bytes. Essentially, this saves us 7 cmp & branch instructions. If
|
||||
* this routine is heavily used enough, it's worth the ugly coding.
|
||||
*
|
||||
* OZ's original sdbm hash
|
||||
*/
|
||||
static uint32
|
||||
hash3(const void *keyarg, register size_t len)
|
||||
{
|
||||
register const uint8 *key;
|
||||
register size_t loop;
|
||||
register uint32 h;
|
||||
|
||||
#define HASHC h = *key++ + 65599 * h
|
||||
|
||||
h = 0;
|
||||
key = (const uint8 *)keyarg;
|
||||
if (len > 0) {
|
||||
loop = (len + 8 - 1) >> 3;
|
||||
|
||||
switch (len & (8 - 1)) {
|
||||
case 0:
|
||||
do {
|
||||
HASHC;
|
||||
/* FALLTHROUGH */
|
||||
case 7:
|
||||
HASHC;
|
||||
/* FALLTHROUGH */
|
||||
case 6:
|
||||
HASHC;
|
||||
/* FALLTHROUGH */
|
||||
case 5:
|
||||
HASHC;
|
||||
/* FALLTHROUGH */
|
||||
case 4:
|
||||
HASHC;
|
||||
/* FALLTHROUGH */
|
||||
case 3:
|
||||
HASHC;
|
||||
/* FALLTHROUGH */
|
||||
case 2:
|
||||
HASHC;
|
||||
/* FALLTHROUGH */
|
||||
case 1:
|
||||
HASHC;
|
||||
} while (--loop);
|
||||
}
|
||||
}
|
||||
return (h);
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
/* Hash function from Chris Torek. */
|
||||
static uint32
|
||||
hash4(const void *keyarg, register size_t len)
|
||||
{
|
||||
register const uint8 *key;
|
||||
register size_t loop;
|
||||
register uint32 h;
|
||||
|
||||
#define HASH4a h = (h << 5) - h + *key++;
|
||||
#define HASH4b h = (h << 5) + h + *key++;
|
||||
#define HASH4 HASH4b
|
||||
|
||||
h = 0;
|
||||
key = (const uint8 *)keyarg;
|
||||
if (len > 0) {
|
||||
loop = (len + 8 - 1) >> 3;
|
||||
|
||||
switch (len & (8 - 1)) {
|
||||
case 0:
|
||||
do {
|
||||
HASH4;
|
||||
/* FALLTHROUGH */
|
||||
case 7:
|
||||
HASH4;
|
||||
/* FALLTHROUGH */
|
||||
case 6:
|
||||
HASH4;
|
||||
/* FALLTHROUGH */
|
||||
case 5:
|
||||
HASH4;
|
||||
/* FALLTHROUGH */
|
||||
case 4:
|
||||
HASH4;
|
||||
/* FALLTHROUGH */
|
||||
case 3:
|
||||
HASH4;
|
||||
/* FALLTHROUGH */
|
||||
case 2:
|
||||
HASH4;
|
||||
/* FALLTHROUGH */
|
||||
case 1:
|
||||
HASH4;
|
||||
} while (--loop);
|
||||
}
|
||||
}
|
||||
return (h);
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993, 1994
|
||||
* 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static char sccsid[] = "@(#)hash_log2.c 8.2 (Berkeley) 5/31/94";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "watcomfx.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#ifndef macintosh
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#include "mcom_db.h"
|
||||
|
||||
uint32 __log2(uint32 num)
|
||||
{
|
||||
register uint32 i, limit;
|
||||
|
||||
limit = 1;
|
||||
for (i = 0; limit < num; limit = limit << 1, i++) {}
|
||||
return (i);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,412 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993, 1994
|
||||
* 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static char sccsid[] = "@(#)hash_buf.c 8.5 (Berkeley) 7/15/94";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "watcomfx.h"
|
||||
|
||||
/*
|
||||
* PACKAGE: hash
|
||||
*
|
||||
* DESCRIPTION:
|
||||
* Contains buffer management
|
||||
*
|
||||
* ROUTINES:
|
||||
* External
|
||||
* __buf_init
|
||||
* __get_buf
|
||||
* __buf_free
|
||||
* __reclaim_buf
|
||||
* Internal
|
||||
* newbuf
|
||||
*/
|
||||
#if !defined(_WIN32) && !defined(_WINDOWS) && !defined(macintosh) && !defined(XP_OS2_VACPP)
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef DEBUG
|
||||
#include <assert.h>
|
||||
#endif
|
||||
|
||||
#include "mcom_db.h"
|
||||
#include "hash.h"
|
||||
#include "page.h"
|
||||
/* #include "extern.h" */
|
||||
|
||||
static BUFHEAD *newbuf __P((HTAB *, uint32, BUFHEAD *));
|
||||
|
||||
/* Unlink B from its place in the lru */
|
||||
#define BUF_REMOVE(B) { \
|
||||
(B)->prev->next = (B)->next; \
|
||||
(B)->next->prev = (B)->prev; \
|
||||
}
|
||||
|
||||
/* Insert B after P */
|
||||
#define BUF_INSERT(B, P) { \
|
||||
(B)->next = (P)->next; \
|
||||
(B)->prev = (P); \
|
||||
(P)->next = (B); \
|
||||
(B)->next->prev = (B); \
|
||||
}
|
||||
|
||||
#define MRU hashp->bufhead.next
|
||||
#define LRU hashp->bufhead.prev
|
||||
|
||||
#define MRU_INSERT(B) BUF_INSERT((B), &hashp->bufhead)
|
||||
#define LRU_INSERT(B) BUF_INSERT((B), LRU)
|
||||
|
||||
/*
|
||||
* We are looking for a buffer with address "addr". If prev_bp is NULL, then
|
||||
* address is a bucket index. If prev_bp is not NULL, then it points to the
|
||||
* page previous to an overflow page that we are trying to find.
|
||||
*
|
||||
* CAVEAT: The buffer header accessed via prev_bp's ovfl field may no longer
|
||||
* be valid. Therefore, you must always verify that its address matches the
|
||||
* address you are seeking.
|
||||
*/
|
||||
extern BUFHEAD *
|
||||
__get_buf(HTAB *hashp, uint32 addr, BUFHEAD *prev_bp, int newpage)
|
||||
/* If prev_bp set, indicates a new overflow page. */
|
||||
{
|
||||
register BUFHEAD *bp;
|
||||
register uint32 is_disk_mask;
|
||||
register int is_disk, segment_ndx = 0;
|
||||
SEGMENT segp = 0;
|
||||
|
||||
is_disk = 0;
|
||||
is_disk_mask = 0;
|
||||
if (prev_bp) {
|
||||
bp = prev_bp->ovfl;
|
||||
if (!bp || (bp->addr != addr))
|
||||
bp = NULL;
|
||||
if (!newpage)
|
||||
is_disk = BUF_DISK;
|
||||
} else {
|
||||
/* Grab buffer out of directory */
|
||||
segment_ndx = addr & (hashp->SGSIZE - 1);
|
||||
|
||||
/* valid segment ensured by __call_hash() */
|
||||
segp = hashp->dir[addr >> hashp->SSHIFT];
|
||||
#ifdef DEBUG
|
||||
assert(segp != NULL);
|
||||
#endif
|
||||
|
||||
bp = PTROF(segp[segment_ndx]);
|
||||
|
||||
is_disk_mask = ISDISK(segp[segment_ndx]);
|
||||
is_disk = is_disk_mask || !hashp->new_file;
|
||||
}
|
||||
|
||||
if (!bp) {
|
||||
bp = newbuf(hashp, addr, prev_bp);
|
||||
if (!bp)
|
||||
return(NULL);
|
||||
if(__get_page(hashp, bp->page, addr, !prev_bp, is_disk, 0))
|
||||
{
|
||||
/* free bp and its page */
|
||||
if(prev_bp)
|
||||
{
|
||||
/* if prev_bp is set then the new page that
|
||||
* failed is hooked onto prev_bp as an overflow page.
|
||||
* if we don't remove the pointer to the bad page
|
||||
* we may try and access it later and we will die
|
||||
* horribly because it will have already been
|
||||
* free'd and overwritten with bogus data.
|
||||
*/
|
||||
prev_bp->ovfl = NULL;
|
||||
}
|
||||
BUF_REMOVE(bp);
|
||||
free(bp->page);
|
||||
free(bp);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (!prev_bp)
|
||||
{
|
||||
#if 0
|
||||
/* 16 bit windows and mac can't handle the
|
||||
* oring of the is disk flag.
|
||||
*/
|
||||
segp[segment_ndx] =
|
||||
(BUFHEAD *)((ptrdiff_t)bp | is_disk_mask);
|
||||
#else
|
||||
/* set the is_disk thing inside the structure
|
||||
*/
|
||||
bp->is_disk = is_disk_mask;
|
||||
segp[segment_ndx] = bp;
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
BUF_REMOVE(bp);
|
||||
MRU_INSERT(bp);
|
||||
}
|
||||
return (bp);
|
||||
}
|
||||
|
||||
/*
|
||||
* We need a buffer for this page. Either allocate one, or evict a resident
|
||||
* one (if we have as many buffers as we're allowed) and put this one in.
|
||||
*
|
||||
* If newbuf finds an error (returning NULL), it also sets errno.
|
||||
*/
|
||||
static BUFHEAD *
|
||||
newbuf(HTAB *hashp, uint32 addr, BUFHEAD *prev_bp)
|
||||
{
|
||||
register BUFHEAD *bp; /* The buffer we're going to use */
|
||||
register BUFHEAD *xbp; /* Temp pointer */
|
||||
register BUFHEAD *next_xbp;
|
||||
SEGMENT segp;
|
||||
int segment_ndx;
|
||||
uint16 oaddr, *shortp;
|
||||
|
||||
oaddr = 0;
|
||||
bp = LRU;
|
||||
/*
|
||||
* If LRU buffer is pinned, the buffer pool is too small. We need to
|
||||
* allocate more buffers.
|
||||
*/
|
||||
if (hashp->nbufs || (bp->flags & BUF_PIN)) {
|
||||
/* Allocate a new one */
|
||||
if ((bp = (BUFHEAD *)malloc(sizeof(BUFHEAD))) == NULL)
|
||||
return (NULL);
|
||||
|
||||
/* this memset is supposedly unnecessary but lets add
|
||||
* it anyways.
|
||||
*/
|
||||
memset(bp, 0xff, sizeof(BUFHEAD));
|
||||
|
||||
if ((bp->page = (char *)malloc((size_t)hashp->BSIZE)) == NULL) {
|
||||
free(bp);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* this memset is supposedly unnecessary but lets add
|
||||
* it anyways.
|
||||
*/
|
||||
memset(bp->page, 0xff, (size_t)hashp->BSIZE);
|
||||
|
||||
if (hashp->nbufs)
|
||||
hashp->nbufs--;
|
||||
} else {
|
||||
/* Kick someone out */
|
||||
BUF_REMOVE(bp);
|
||||
/*
|
||||
* If this is an overflow page with addr 0, it's already been
|
||||
* flushed back in an overflow chain and initialized.
|
||||
*/
|
||||
if ((bp->addr != 0) || (bp->flags & BUF_BUCKET)) {
|
||||
/*
|
||||
* Set oaddr before __put_page so that you get it
|
||||
* before bytes are swapped.
|
||||
*/
|
||||
shortp = (uint16 *)bp->page;
|
||||
if (shortp[0])
|
||||
{
|
||||
if(shortp[0] > (hashp->BSIZE / sizeof(uint16)))
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
oaddr = shortp[shortp[0] - 1];
|
||||
}
|
||||
if ((bp->flags & BUF_MOD) && __put_page(hashp, bp->page,
|
||||
bp->addr, (int)IS_BUCKET(bp->flags), 0))
|
||||
return (NULL);
|
||||
/*
|
||||
* Update the pointer to this page (i.e. invalidate it).
|
||||
*
|
||||
* If this is a new file (i.e. we created it at open
|
||||
* time), make sure that we mark pages which have been
|
||||
* written to disk so we retrieve them from disk later,
|
||||
* rather than allocating new pages.
|
||||
*/
|
||||
if (IS_BUCKET(bp->flags)) {
|
||||
segment_ndx = bp->addr & (hashp->SGSIZE - 1);
|
||||
segp = hashp->dir[bp->addr >> hashp->SSHIFT];
|
||||
#ifdef DEBUG
|
||||
assert(segp != NULL);
|
||||
#endif
|
||||
|
||||
if (hashp->new_file &&
|
||||
((bp->flags & BUF_MOD) ||
|
||||
ISDISK(segp[segment_ndx])))
|
||||
segp[segment_ndx] = (BUFHEAD *)BUF_DISK;
|
||||
else
|
||||
segp[segment_ndx] = NULL;
|
||||
}
|
||||
/*
|
||||
* Since overflow pages can only be access by means of
|
||||
* their bucket, free overflow pages associated with
|
||||
* this bucket.
|
||||
*/
|
||||
for (xbp = bp; xbp->ovfl;) {
|
||||
next_xbp = xbp->ovfl;
|
||||
xbp->ovfl = 0;
|
||||
xbp = next_xbp;
|
||||
|
||||
/* leave pinned pages alone, we are still using
|
||||
* them. */
|
||||
if (xbp->flags & BUF_PIN) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check that ovfl pointer is up date. */
|
||||
if (IS_BUCKET(xbp->flags) ||
|
||||
(oaddr != xbp->addr))
|
||||
break;
|
||||
|
||||
shortp = (uint16 *)xbp->page;
|
||||
if (shortp[0])
|
||||
{
|
||||
/* LJM is the number of reported
|
||||
* pages way too much?
|
||||
*/
|
||||
if(shortp[0] > hashp->BSIZE/sizeof(uint16))
|
||||
return NULL;
|
||||
/* set before __put_page */
|
||||
oaddr = shortp[shortp[0] - 1];
|
||||
}
|
||||
if ((xbp->flags & BUF_MOD) && __put_page(hashp,
|
||||
xbp->page, xbp->addr, 0, 0))
|
||||
return (NULL);
|
||||
xbp->addr = 0;
|
||||
xbp->flags = 0;
|
||||
BUF_REMOVE(xbp);
|
||||
LRU_INSERT(xbp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Now assign this buffer */
|
||||
bp->addr = addr;
|
||||
#ifdef DEBUG1
|
||||
(void)fprintf(stderr, "NEWBUF1: %d->ovfl was %d is now %d\n",
|
||||
bp->addr, (bp->ovfl ? bp->ovfl->addr : 0), 0);
|
||||
#endif
|
||||
bp->ovfl = NULL;
|
||||
if (prev_bp) {
|
||||
/*
|
||||
* If prev_bp is set, this is an overflow page, hook it in to
|
||||
* the buffer overflow links.
|
||||
*/
|
||||
#ifdef DEBUG1
|
||||
(void)fprintf(stderr, "NEWBUF2: %d->ovfl was %d is now %d\n",
|
||||
prev_bp->addr, (prev_bp->ovfl ? bp->ovfl->addr : 0),
|
||||
(bp ? bp->addr : 0));
|
||||
#endif
|
||||
prev_bp->ovfl = bp;
|
||||
bp->flags = 0;
|
||||
} else
|
||||
bp->flags = BUF_BUCKET;
|
||||
MRU_INSERT(bp);
|
||||
return (bp);
|
||||
}
|
||||
|
||||
extern void __buf_init(HTAB *hashp, int32 nbytes)
|
||||
{
|
||||
BUFHEAD *bfp;
|
||||
int npages;
|
||||
|
||||
bfp = &(hashp->bufhead);
|
||||
npages = (nbytes + hashp->BSIZE - 1) >> hashp->BSHIFT;
|
||||
npages = PR_MAX(npages, MIN_BUFFERS);
|
||||
|
||||
hashp->nbufs = npages;
|
||||
bfp->next = bfp;
|
||||
bfp->prev = bfp;
|
||||
/*
|
||||
* This space is calloc'd so these are already null.
|
||||
*
|
||||
* bfp->ovfl = NULL;
|
||||
* bfp->flags = 0;
|
||||
* bfp->page = NULL;
|
||||
* bfp->addr = 0;
|
||||
*/
|
||||
}
|
||||
|
||||
extern int
|
||||
__buf_free(HTAB *hashp, int do_free, int to_disk)
|
||||
{
|
||||
BUFHEAD *bp;
|
||||
int status = -1;
|
||||
|
||||
/* Need to make sure that buffer manager has been initialized */
|
||||
if (!LRU)
|
||||
return (0);
|
||||
for (bp = LRU; bp != &hashp->bufhead;) {
|
||||
/* Check that the buffer is valid */
|
||||
if (bp->addr || IS_BUCKET(bp->flags)) {
|
||||
if (to_disk && (bp->flags & BUF_MOD) &&
|
||||
(status = __put_page(hashp, bp->page,
|
||||
bp->addr, IS_BUCKET(bp->flags), 0))) {
|
||||
|
||||
if (do_free) {
|
||||
if (bp->page)
|
||||
free(bp->page);
|
||||
BUF_REMOVE(bp);
|
||||
free(bp);
|
||||
}
|
||||
|
||||
return (status);
|
||||
}
|
||||
}
|
||||
/* Check if we are freeing stuff */
|
||||
if (do_free) {
|
||||
if (bp->page)
|
||||
free(bp->page);
|
||||
BUF_REMOVE(bp);
|
||||
free(bp);
|
||||
bp = LRU;
|
||||
} else
|
||||
bp = bp->prev;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
extern void
|
||||
__reclaim_buf(HTAB *hashp, BUFHEAD *bp)
|
||||
{
|
||||
bp->ovfl = 0;
|
||||
bp->addr = 0;
|
||||
bp->flags = 0;
|
||||
BUF_REMOVE(bp);
|
||||
LRU_INSERT(bp);
|
||||
}
|
||||
@@ -1,148 +0,0 @@
|
||||
#if defined(__sun) && !defined(__SVR4)
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Chris Torek.
|
||||
*
|
||||
* 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static char sccsid[] = "@(#)bcopy.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "watcomfx.h"
|
||||
|
||||
#ifdef HAVE_SYS_CDEFS_H
|
||||
#include <sys/cdefs.h>
|
||||
#else
|
||||
#include "cdefs.h"
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* sizeof(word) MUST BE A POWER OF TWO
|
||||
* SO THAT wmask BELOW IS ALL ONES
|
||||
*/
|
||||
typedef int word; /* "word" used for optimal copy speed */
|
||||
|
||||
#define wsize sizeof(word)
|
||||
#define wmask (wsize - 1)
|
||||
|
||||
/*
|
||||
* Copy a block of memory, handling overlap.
|
||||
* This is the routine that actually implements
|
||||
* (the portable versions of) bcopy, memcpy, and memmove.
|
||||
*/
|
||||
#ifdef MEMCOPY
|
||||
void *
|
||||
memcpy(dst0, src0, length)
|
||||
#else
|
||||
#ifdef MEMMOVE
|
||||
void *
|
||||
memmove(dst0, src0, length)
|
||||
#else
|
||||
void
|
||||
bcopy(src0, dst0, length)
|
||||
#endif
|
||||
#endif
|
||||
void *dst0;
|
||||
const void *src0;
|
||||
register size_t length;
|
||||
{
|
||||
register char *dst = dst0;
|
||||
register const char *src = src0;
|
||||
register size_t t;
|
||||
|
||||
if (length == 0 || dst == src) /* nothing to do */
|
||||
goto done;
|
||||
|
||||
/*
|
||||
* Macros: loop-t-times; and loop-t-times, t>0
|
||||
*/
|
||||
#define TLOOP(s) if (t) TLOOP1(s)
|
||||
#define TLOOP1(s) do { s; } while (--t)
|
||||
|
||||
if ((unsigned long)dst < (unsigned long)src) {
|
||||
/*
|
||||
* Copy forward.
|
||||
*/
|
||||
t = (int)src; /* only need low bits */
|
||||
if ((t | (int)dst) & wmask) {
|
||||
/*
|
||||
* Try to align operands. This cannot be done
|
||||
* unless the low bits match.
|
||||
*/
|
||||
if ((t ^ (int)dst) & wmask || length < wsize)
|
||||
t = length;
|
||||
else
|
||||
t = wsize - (t & wmask);
|
||||
length -= t;
|
||||
TLOOP1(*dst++ = *src++);
|
||||
}
|
||||
/*
|
||||
* Copy whole words, then mop up any trailing bytes.
|
||||
*/
|
||||
t = length / wsize;
|
||||
TLOOP(*(word *)dst = *(word *)src; src += wsize; dst += wsize);
|
||||
t = length & wmask;
|
||||
TLOOP(*dst++ = *src++);
|
||||
} else {
|
||||
/*
|
||||
* Copy backwards. Otherwise essentially the same.
|
||||
* Alignment works as before, except that it takes
|
||||
* (t&wmask) bytes to align, not wsize-(t&wmask).
|
||||
*/
|
||||
src += length;
|
||||
dst += length;
|
||||
t = (int)src;
|
||||
if ((t | (int)dst) & wmask) {
|
||||
if ((t ^ (int)dst) & wmask || length <= wsize)
|
||||
t = length;
|
||||
else
|
||||
t &= wmask;
|
||||
length -= t;
|
||||
TLOOP1(*--dst = *--src);
|
||||
}
|
||||
t = length / wsize;
|
||||
TLOOP(src -= wsize; dst -= wsize; *(word *)dst = *(word *)src);
|
||||
t = length & wmask;
|
||||
TLOOP(*--dst = *--src);
|
||||
}
|
||||
done:
|
||||
#if defined(MEMCOPY) || defined(MEMMOVE)
|
||||
return (dst0);
|
||||
#else
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
#endif /* no __sgi */
|
||||
|
||||
/* Some compilers don't like an empty source file. */
|
||||
static int dummy = 0;
|
||||
@@ -1,164 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1987, 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static char sccsid[] = "@(#)mktemp.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "watcomfx.h"
|
||||
|
||||
#ifdef macintosh
|
||||
#include <unix.h>
|
||||
#else
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include "mcom_db.h"
|
||||
|
||||
#if !defined(_WINDOWS) && !defined(XP_OS2_VACPP)
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#ifdef XP_OS2_VACPP
|
||||
#include <process.h>
|
||||
#endif
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <process.h>
|
||||
#include "winfile.h"
|
||||
#endif
|
||||
|
||||
static int _gettemp(char *path, register int *doopen, int extraFlags);
|
||||
|
||||
int
|
||||
mkstemp(char *path)
|
||||
{
|
||||
#ifdef XP_OS2
|
||||
FILE *temp = tmpfile();
|
||||
|
||||
return (temp ? fileno(temp) : -1);
|
||||
#else
|
||||
int fd;
|
||||
|
||||
return (_gettemp(path, &fd, 0) ? fd : -1);
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
mkstempflags(char *path, int extraFlags)
|
||||
{
|
||||
int fd;
|
||||
|
||||
return (_gettemp(path, &fd, extraFlags) ? fd : -1);
|
||||
}
|
||||
|
||||
char *
|
||||
mktemp(char *path)
|
||||
{
|
||||
return(_gettemp(path, (int *)NULL, 0) ? path : (char *)NULL);
|
||||
}
|
||||
|
||||
/* NB: This routine modifies its input string, and does not always restore it.
|
||||
** returns 1 on success, 0 on failure.
|
||||
*/
|
||||
static int
|
||||
_gettemp(char *path, register int *doopen, int extraFlags)
|
||||
{
|
||||
#if !defined(_WINDOWS) || defined(_WIN32)
|
||||
extern int errno;
|
||||
#endif
|
||||
register char *start, *trv;
|
||||
struct stat sbuf;
|
||||
unsigned int pid;
|
||||
|
||||
pid = getpid();
|
||||
for (trv = path; *trv; ++trv); /* extra X's get set to 0's */
|
||||
while (*--trv == 'X') {
|
||||
*trv = (pid % 10) + '0';
|
||||
pid /= 10;
|
||||
}
|
||||
|
||||
/*
|
||||
* check the target directory; if you have six X's and it
|
||||
* doesn't exist this runs for a *very* long time.
|
||||
*/
|
||||
for (start = trv + 1;; --trv) {
|
||||
char saved;
|
||||
if (trv <= path)
|
||||
break;
|
||||
saved = *trv;
|
||||
if (saved == '/' || saved == '\\') {
|
||||
int rv;
|
||||
*trv = '\0';
|
||||
rv = stat(path, &sbuf);
|
||||
*trv = saved;
|
||||
if (rv)
|
||||
return(0);
|
||||
if (!S_ISDIR(sbuf.st_mode)) {
|
||||
errno = ENOTDIR;
|
||||
return(0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
if (doopen) {
|
||||
if ((*doopen =
|
||||
open(path, O_CREAT|O_EXCL|O_RDWR|extraFlags, 0600)) >= 0)
|
||||
return(1);
|
||||
if (errno != EEXIST)
|
||||
return(0);
|
||||
}
|
||||
else if (stat(path, &sbuf))
|
||||
return(errno == ENOENT ? 1 : 0);
|
||||
|
||||
/* tricky little algorithm for backward compatibility */
|
||||
for (trv = start;;) {
|
||||
if (!*trv)
|
||||
return(0);
|
||||
if (*trv == 'z')
|
||||
*trv++ = 'a';
|
||||
else {
|
||||
if (isdigit(*trv))
|
||||
*trv = 'a';
|
||||
else
|
||||
++*trv;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
@@ -1,75 +0,0 @@
|
||||
#ifndef HAVE_SNPRINTF
|
||||
|
||||
#include "watcomfx.h"
|
||||
#include <sys/types.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef HAVE_SYS_CDEFS_H
|
||||
#include <sys/cdefs.h>
|
||||
#else
|
||||
#include "cdefs.h"
|
||||
#endif
|
||||
|
||||
#include "prtypes.h"
|
||||
|
||||
#include <ncompat.h>
|
||||
|
||||
/* The OS/2 VAC compiler doesn't appear to define __STDC__ and won't let us define it either */
|
||||
#if defined(__STDC__) || defined(XP_OS2_VACPP)
|
||||
#include <stdarg.h>
|
||||
#else
|
||||
#include <varargs.h>
|
||||
#endif
|
||||
|
||||
int
|
||||
#if defined(__STDC__) || defined(XP_OS2_VACPP)
|
||||
snprintf(char *str, size_t n, const char *fmt, ...)
|
||||
#else
|
||||
snprintf(str, n, fmt, va_alist)
|
||||
char *str;
|
||||
size_t n;
|
||||
const char *fmt;
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list ap;
|
||||
#ifdef VSPRINTF_CHARSTAR
|
||||
char *rp;
|
||||
#else
|
||||
int rval;
|
||||
#endif
|
||||
#if defined(__STDC__) || defined(XP_OS2_VACPP)
|
||||
va_start(ap, fmt);
|
||||
#else
|
||||
va_start(ap);
|
||||
#endif
|
||||
#ifdef VSPRINTF_CHARSTAR
|
||||
rp = vsprintf(str, fmt, ap);
|
||||
va_end(ap);
|
||||
return (strlen(rp));
|
||||
#else
|
||||
rval = vsprintf(str, fmt, ap);
|
||||
va_end(ap);
|
||||
return (rval);
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
vsnprintf(str, n, fmt, ap)
|
||||
char *str;
|
||||
size_t n;
|
||||
const char *fmt;
|
||||
va_list ap;
|
||||
{
|
||||
#ifdef VSPRINTF_CHARSTAR
|
||||
return (strlen(vsprintf(str, fmt, ap)));
|
||||
#else
|
||||
return (vsprintf(str, fmt, ap));
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* HAVE_SNPRINTF */
|
||||
|
||||
/* Some compilers don't like an empty source file. */
|
||||
static int dummy = 0;
|
||||
@@ -1,76 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1988, 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. ***REMOVED*** - see
|
||||
* ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
static char sccsid[] = "@(#)strerror.c 8.1 (Berkeley) 6/4/93";
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "watcomfx.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#ifdef _DLL
|
||||
#define sys_nerr (*_sys_nerr_dll)
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRERROR
|
||||
#ifndef _AFXDLL
|
||||
char *
|
||||
strerror(num)
|
||||
int num;
|
||||
{
|
||||
extern int sys_nerr;
|
||||
extern char *sys_errlist[];
|
||||
#define UPREFIX "Unknown error: "
|
||||
static char ebuf[40] = UPREFIX; /* 64-bit number + slop */
|
||||
register unsigned int errnum;
|
||||
register char *p, *t;
|
||||
char tmp[40];
|
||||
|
||||
errnum = num; /* convert to unsigned */
|
||||
if (errnum < sys_nerr)
|
||||
return(sys_errlist[errnum]);
|
||||
|
||||
/* Do this by hand, so we don't include stdio(3). */
|
||||
t = tmp;
|
||||
do {
|
||||
*t++ = "0123456789"[errnum % 10];
|
||||
} while (errnum /= 10);
|
||||
for (p = ebuf + sizeof(UPREFIX) - 1;;) {
|
||||
*p++ = *--t;
|
||||
if (t <= tmp)
|
||||
break;
|
||||
}
|
||||
return(ebuf);
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* !HAVE_STRERROR */
|
||||
@@ -1,62 +0,0 @@
|
||||
#
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Netscape Communications Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 1998
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
DEPTH = ../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = dbm
|
||||
|
||||
PACKAGE_FILE = dbmtest.pkg
|
||||
|
||||
PROGRAM = lots$(BIN_SUFFIX)
|
||||
|
||||
CSRCS = lots.c
|
||||
|
||||
ifeq ($(OS_ARCH),WINNT)
|
||||
EXTRA_DSO_LIBS = dbm$(MOZ_BITS)
|
||||
else
|
||||
EXTRA_DSO_LIBS = mozdbm_s
|
||||
endif
|
||||
|
||||
LIBS = $(EXTRA_DSO_LIBS)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
[gecko-tests]
|
||||
dist/bin/lots@BINS@
|
||||
@@ -1,638 +0,0 @@
|
||||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/* use sequental numbers printed to strings
|
||||
* to store lots and lots of entries in the
|
||||
* database.
|
||||
*
|
||||
* Start with 100 entries, put them and then
|
||||
* read them out. Then delete the first
|
||||
* half and verify that all of the first half
|
||||
* is gone and then verify that the second
|
||||
* half is still there.
|
||||
* Then add the first half back and verify
|
||||
* again. Then delete the middle third
|
||||
* and verify again.
|
||||
* Then increase the size by 1000 and do
|
||||
* the whole add delete thing again.
|
||||
*
|
||||
* The data for each object is the number string translated
|
||||
* to hex and replicated a random number of times. The
|
||||
* number of times that the data is replicated is the first
|
||||
* int32 in the data.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#ifdef STDC_HEADERS
|
||||
#include <stdarg.h>
|
||||
#else
|
||||
#include <varargs.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_MEMORY_H
|
||||
#include <memory.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include "mcom_db.h"
|
||||
|
||||
DB *database=0;
|
||||
int MsgPriority=5;
|
||||
|
||||
#if defined(_WINDOWS) && !defined(WIN32)
|
||||
#define int32 long
|
||||
#define uint32 unsigned long
|
||||
#else
|
||||
#define int32 int
|
||||
#define uint32 unsigned int
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
USE_LARGE_KEY,
|
||||
USE_SMALL_KEY
|
||||
} key_type_enum;
|
||||
|
||||
#define TraceMe(priority, msg) \
|
||||
do { \
|
||||
if(priority <= MsgPriority) \
|
||||
{ \
|
||||
ReportStatus msg; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
int
|
||||
ReportStatus(char *string, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
va_start(args, string);
|
||||
#else
|
||||
va_start(args);
|
||||
#endif
|
||||
vfprintf(stderr, string, args);
|
||||
va_end(args);
|
||||
|
||||
fprintf (stderr, "\n");
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
int
|
||||
ReportError(char *string, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
va_start(args, string);
|
||||
#else
|
||||
va_start(args);
|
||||
#endif
|
||||
fprintf (stderr, "\n ");
|
||||
vfprintf(stderr, string, args);
|
||||
fprintf (stderr, "\n");
|
||||
va_end(args);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
DBT * MakeLargeKey(int32 num)
|
||||
{
|
||||
int32 low_bits;
|
||||
static DBT rv;
|
||||
static char *string_rv=0;
|
||||
int rep_char;
|
||||
size_t size;
|
||||
|
||||
if(string_rv)
|
||||
free(string_rv);
|
||||
|
||||
/* generate a really large text key derived from
|
||||
* an int32
|
||||
*/
|
||||
low_bits = (num % 10000) + 1;
|
||||
|
||||
/* get the repeat char from the low 26 */
|
||||
rep_char = (char) ((low_bits % 26) + 'a');
|
||||
|
||||
/* malloc a string low_bits wide */
|
||||
size = low_bits*sizeof(char);
|
||||
string_rv = (char *)malloc(size);
|
||||
|
||||
memset(string_rv, rep_char, size);
|
||||
|
||||
rv.data = string_rv;
|
||||
rv.size = size;
|
||||
|
||||
return(&rv);
|
||||
}
|
||||
|
||||
DBT * MakeSmallKey(int32 num)
|
||||
{
|
||||
static DBT rv;
|
||||
static char data_string[64];
|
||||
|
||||
rv.data = data_string;
|
||||
|
||||
sprintf(data_string, "%ld", (long)num);
|
||||
rv.size = strlen(data_string);
|
||||
|
||||
return(&rv);
|
||||
|
||||
}
|
||||
|
||||
DBT * GenKey(int32 num, key_type_enum key_type)
|
||||
{
|
||||
DBT *key;
|
||||
|
||||
switch(key_type)
|
||||
{
|
||||
case USE_LARGE_KEY:
|
||||
key = MakeLargeKey(num);
|
||||
break;
|
||||
case USE_SMALL_KEY:
|
||||
key = MakeSmallKey(num);
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
break;
|
||||
}
|
||||
|
||||
return(key);
|
||||
}
|
||||
|
||||
int
|
||||
SeqDatabase()
|
||||
{
|
||||
int status;
|
||||
DBT key, data;
|
||||
|
||||
ReportStatus("SEQuencing through database...");
|
||||
|
||||
/* seq throught the whole database */
|
||||
if(!(status = (*database->seq)(database, &key, &data, R_FIRST)))
|
||||
{
|
||||
while(!(status = (database->seq) (database, &key, &data, R_NEXT)));
|
||||
; /* null body */
|
||||
}
|
||||
|
||||
if(status < 0)
|
||||
ReportError("Error seq'ing database");
|
||||
|
||||
return(status);
|
||||
}
|
||||
|
||||
int
|
||||
VerifyData(DBT *data, int32 num, key_type_enum key_type)
|
||||
{
|
||||
int32 count, compare_num;
|
||||
size_t size;
|
||||
int32 *int32_array;
|
||||
|
||||
/* The first int32 is count
|
||||
* The other n entries should
|
||||
* all equal num
|
||||
*/
|
||||
if(data->size < sizeof(int32))
|
||||
{
|
||||
ReportError("Data size corrupted");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memcpy(&count, data->data, sizeof(int32));
|
||||
|
||||
size = sizeof(int32)*(count+1);
|
||||
|
||||
if(size != data->size)
|
||||
{
|
||||
ReportError("Data size corrupted");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int32_array = (int32*)data->data;
|
||||
|
||||
for(;count > 0; count--)
|
||||
{
|
||||
memcpy(&compare_num, &int32_array[count], sizeof(int32));
|
||||
|
||||
if(compare_num != num)
|
||||
{
|
||||
ReportError("Data corrupted");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/* verify that a range of number strings exist
|
||||
* or don't exist. And that the data is valid
|
||||
*/
|
||||
#define SHOULD_EXIST 1
|
||||
#define SHOULD_NOT_EXIST 0
|
||||
int
|
||||
VerifyRange(int32 low, int32 high, int32 should_exist, key_type_enum key_type)
|
||||
{
|
||||
DBT *key, data;
|
||||
int32 num;
|
||||
int status;
|
||||
|
||||
TraceMe(1, ("Verifying: %ld to %ld, using %s keys",
|
||||
low, high, key_type == USE_SMALL_KEY ? "SMALL" : "LARGE"));
|
||||
|
||||
for(num = low; num <= high; num++)
|
||||
{
|
||||
|
||||
key = GenKey(num, key_type);
|
||||
|
||||
status = (*database->get)(database, key, &data, 0);
|
||||
|
||||
if(status == 0)
|
||||
{
|
||||
/* got the item */
|
||||
if(!should_exist)
|
||||
{
|
||||
ReportError("Item exists but shouldn't: %ld", num);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* else verify the data */
|
||||
VerifyData(&data, num, key_type);
|
||||
}
|
||||
}
|
||||
else if(status > 0)
|
||||
{
|
||||
/* item not found */
|
||||
if(should_exist)
|
||||
{
|
||||
ReportError("Item not found but should be: %ld", num);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* database error */
|
||||
ReportError("Database error");
|
||||
return(-1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TraceMe(1, ("Correctly verified: %ld to %ld", low, high));
|
||||
|
||||
return(0);
|
||||
|
||||
}
|
||||
|
||||
DBT *
|
||||
GenData(int32 num)
|
||||
{
|
||||
int32 n;
|
||||
static DBT *data=0;
|
||||
int32 *int32_array;
|
||||
size_t size;
|
||||
|
||||
if(!data)
|
||||
{
|
||||
data = (DBT*)malloc(sizeof(DBT));
|
||||
data->size = 0;
|
||||
data->data = 0;
|
||||
}
|
||||
else if(data->data)
|
||||
{
|
||||
free(data->data);
|
||||
}
|
||||
|
||||
n = rand();
|
||||
|
||||
n = n % 512; /* bound to a 2K size */
|
||||
|
||||
|
||||
size = sizeof(int32)*(n+1);
|
||||
int32_array = (int32 *) malloc(size);
|
||||
|
||||
memcpy(&int32_array[0], &n, sizeof(int32));
|
||||
|
||||
for(; n > 0; n--)
|
||||
{
|
||||
memcpy(&int32_array[n], &num, sizeof(int32));
|
||||
}
|
||||
|
||||
data->data = (void*)int32_array;
|
||||
data->size = size;
|
||||
|
||||
return(data);
|
||||
}
|
||||
|
||||
#define ADD_RANGE 1
|
||||
#define DELETE_RANGE 2
|
||||
|
||||
int
|
||||
AddOrDelRange(int32 low, int32 high, int action, key_type_enum key_type)
|
||||
{
|
||||
DBT *key, *data;
|
||||
#if 0 /* only do this if your really analy checking the puts */
|
||||
DBT tmp_data;
|
||||
#endif
|
||||
int32 num;
|
||||
int status;
|
||||
|
||||
if(action != ADD_RANGE && action != DELETE_RANGE)
|
||||
assert(0);
|
||||
|
||||
if(action == ADD_RANGE)
|
||||
{
|
||||
TraceMe(1, ("Adding: %ld to %ld: %s keys", low, high,
|
||||
key_type == USE_SMALL_KEY ? "SMALL" : "LARGE"));
|
||||
}
|
||||
else
|
||||
{
|
||||
TraceMe(1, ("Deleting: %ld to %ld: %s keys", low, high,
|
||||
key_type == USE_SMALL_KEY ? "SMALL" : "LARGE"));
|
||||
}
|
||||
|
||||
for(num = low; num <= high; num++)
|
||||
{
|
||||
|
||||
key = GenKey(num, key_type);
|
||||
|
||||
if(action == ADD_RANGE)
|
||||
{
|
||||
data = GenData(num);
|
||||
status = (*database->put)(database, key, data, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
status = (*database->del)(database, key, 0);
|
||||
}
|
||||
|
||||
if(status < 0)
|
||||
{
|
||||
ReportError("Database error %s item: %ld",
|
||||
action == ADD_RANGE ? "ADDING" : "DELETING",
|
||||
num);
|
||||
}
|
||||
else if(status > 0)
|
||||
{
|
||||
ReportError("Could not %s item: %ld",
|
||||
action == ADD_RANGE ? "ADD" : "DELETE",
|
||||
num);
|
||||
}
|
||||
else if(action == ADD_RANGE)
|
||||
{
|
||||
#define SYNC_EVERY_TIME
|
||||
#ifdef SYNC_EVERY_TIME
|
||||
status = (*database->sync)(database, 0);
|
||||
if(status != 0)
|
||||
ReportError("Database error syncing after add");
|
||||
#endif
|
||||
|
||||
#if 0 /* only do this if your really analy checking the puts */
|
||||
|
||||
/* make sure we can still get it
|
||||
*/
|
||||
status = (*database->get)(database, key, &tmp_data, 0);
|
||||
|
||||
if(status != 0)
|
||||
{
|
||||
ReportError("Database error checking item just added: %d",
|
||||
num);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* now verify that none of the ones we already
|
||||
* put in have disappeared
|
||||
*/
|
||||
VerifyRange(low, num, SHOULD_EXIST, key_type);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(action == ADD_RANGE)
|
||||
{
|
||||
TraceMe(1, ("Successfully added: %ld to %ld", low, high));
|
||||
}
|
||||
else
|
||||
{
|
||||
TraceMe(1, ("Successfully deleted: %ld to %ld", low, high));
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
int
|
||||
TestRange(int32 low, int32 range, key_type_enum key_type)
|
||||
{
|
||||
int status; int32 low_of_range1, high_of_range1; int32 low_of_range2, high_of_range2;
|
||||
int32 low_of_range3, high_of_range3;
|
||||
|
||||
status = AddOrDelRange(low, low+range, ADD_RANGE, key_type);
|
||||
status = VerifyRange(low, low+range, SHOULD_EXIST, key_type);
|
||||
|
||||
TraceMe(1, ("Finished with sub test 1"));
|
||||
|
||||
SeqDatabase();
|
||||
|
||||
low_of_range1 = low;
|
||||
high_of_range1 = low+(range/2);
|
||||
low_of_range2 = high_of_range1+1;
|
||||
high_of_range2 = low+range;
|
||||
status = AddOrDelRange(low_of_range1, high_of_range1, DELETE_RANGE, key_type);
|
||||
status = VerifyRange(low_of_range1, high_of_range1, SHOULD_NOT_EXIST, key_type);
|
||||
status = VerifyRange(low_of_range2, low_of_range2, SHOULD_EXIST, key_type);
|
||||
|
||||
TraceMe(1, ("Finished with sub test 2"));
|
||||
|
||||
SeqDatabase();
|
||||
|
||||
status = AddOrDelRange(low_of_range1, high_of_range1, ADD_RANGE, key_type);
|
||||
/* the whole thing should exist now */
|
||||
status = VerifyRange(low, low+range, SHOULD_EXIST, key_type);
|
||||
|
||||
TraceMe(1, ("Finished with sub test 3"));
|
||||
|
||||
SeqDatabase();
|
||||
|
||||
status = AddOrDelRange(low_of_range2, high_of_range2, DELETE_RANGE, key_type);
|
||||
status = VerifyRange(low_of_range1, high_of_range1, SHOULD_EXIST, key_type);
|
||||
status = VerifyRange(low_of_range2, high_of_range2, SHOULD_NOT_EXIST, key_type);
|
||||
|
||||
TraceMe(1, ("Finished with sub test 4"));
|
||||
|
||||
SeqDatabase();
|
||||
|
||||
status = AddOrDelRange(low_of_range2, high_of_range2, ADD_RANGE, key_type);
|
||||
/* the whole thing should exist now */
|
||||
status = VerifyRange(low, low+range, SHOULD_EXIST, key_type);
|
||||
|
||||
TraceMe(1, ("Finished with sub test 5"));
|
||||
|
||||
SeqDatabase();
|
||||
|
||||
low_of_range1 = low;
|
||||
high_of_range1 = low+(range/3);
|
||||
low_of_range2 = high_of_range1+1;
|
||||
high_of_range2 = high_of_range1+(range/3);
|
||||
low_of_range3 = high_of_range2+1;
|
||||
high_of_range3 = low+range;
|
||||
/* delete range 2 */
|
||||
status = AddOrDelRange(low_of_range2, high_of_range2, DELETE_RANGE, key_type);
|
||||
status = VerifyRange(low_of_range1, high_of_range1, SHOULD_EXIST, key_type);
|
||||
status = VerifyRange(low_of_range2, low_of_range2, SHOULD_NOT_EXIST, key_type);
|
||||
status = VerifyRange(low_of_range3, low_of_range2, SHOULD_EXIST, key_type);
|
||||
|
||||
TraceMe(1, ("Finished with sub test 6"));
|
||||
|
||||
SeqDatabase();
|
||||
|
||||
status = AddOrDelRange(low_of_range2, high_of_range2, ADD_RANGE, key_type);
|
||||
/* the whole thing should exist now */
|
||||
status = VerifyRange(low, low+range, SHOULD_EXIST, key_type);
|
||||
|
||||
TraceMe(1, ("Finished with sub test 7"));
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
#define START_RANGE 109876
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int32 i, j=0;
|
||||
int quick_exit = 0;
|
||||
int large_keys = 0;
|
||||
HASHINFO hash_info = {
|
||||
16*1024,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0};
|
||||
|
||||
|
||||
if(argc > 1)
|
||||
{
|
||||
while(argc > 1)
|
||||
{
|
||||
if(!strcmp(argv[argc-1], "-quick"))
|
||||
quick_exit = 1;
|
||||
else if(!strcmp(argv[argc-1], "-large"))
|
||||
{
|
||||
large_keys = 1;
|
||||
}
|
||||
argc--;
|
||||
}
|
||||
}
|
||||
|
||||
database = dbopen("test.db", O_RDWR | O_CREAT, 0644, DB_HASH, &hash_info);
|
||||
|
||||
if(!database)
|
||||
{
|
||||
ReportError("Could not open database");
|
||||
#ifdef unix
|
||||
perror("");
|
||||
#endif
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if(quick_exit)
|
||||
{
|
||||
if(large_keys)
|
||||
TestRange(START_RANGE, 200, USE_LARGE_KEY);
|
||||
else
|
||||
TestRange(START_RANGE, 200, USE_SMALL_KEY);
|
||||
|
||||
(*database->sync)(database, 0);
|
||||
(*database->close)(database);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
for(i=100; i < 10000000; i+=200)
|
||||
{
|
||||
if(1 || j)
|
||||
{
|
||||
TestRange(START_RANGE, i, USE_LARGE_KEY);
|
||||
j = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
TestRange(START_RANGE, i, USE_SMALL_KEY);
|
||||
j = 1;
|
||||
}
|
||||
|
||||
if(1 == rand() % 3)
|
||||
{
|
||||
(*database->sync)(database, 0);
|
||||
}
|
||||
|
||||
if(1 == rand() % 3)
|
||||
{
|
||||
/* close and reopen */
|
||||
(*database->close)(database);
|
||||
database = dbopen("test.db", O_RDWR | O_CREAT, 0644, DB_HASH, 0);
|
||||
if(!database)
|
||||
{
|
||||
ReportError("Could not reopen database");
|
||||
#ifdef unix
|
||||
perror("");
|
||||
#endif
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* reopen database without closeing the other */
|
||||
database = dbopen("test.db", O_RDWR | O_CREAT, 0644, DB_HASH, 0);
|
||||
if(!database)
|
||||
{
|
||||
ReportError("Could not reopen database "
|
||||
"after not closing the other");
|
||||
#ifdef unix
|
||||
perror("");
|
||||
#endif
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
28
mozilla/mailnews/mapi/makefile.win
Normal file
28
mozilla/mailnews/mapi/makefile.win
Normal file
@@ -0,0 +1,28 @@
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 2001 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Srilatha Moturi <srilatha@netscape.com>
|
||||
# Krishna Mohan Khandrika <kkhandrika@netscape.com>
|
||||
#
|
||||
|
||||
DEPTH=..\..
|
||||
|
||||
DIRS=mapihook resources mapiDll
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
@@ -1,4 +1,3 @@
|
||||
;
|
||||
; ***** BEGIN LICENSE BLOCK *****
|
||||
; Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
;
|
||||
@@ -12,14 +11,14 @@
|
||||
; for the specific language governing rights and limitations under the
|
||||
; License.
|
||||
;
|
||||
; The Original Code is the Netscape Portable Runtime (NSPR).
|
||||
; The Original Code is Mozilla.
|
||||
;
|
||||
; The Initial Developer of the Original Code is
|
||||
; Netscape Communications Corporation.
|
||||
; Portions created by the Initial Developer are Copyright (C) 1998-2000
|
||||
; Netscape Communications Corp.
|
||||
; Portions created by the Initial Developer are Copyright (C) 2001
|
||||
; the Initial Developer. All Rights Reserved.
|
||||
;
|
||||
; Contributor(s):
|
||||
; Contributor(s): Krishna Mohan Khandrika (kkhandrika@netscape.com)
|
||||
;
|
||||
; Alternatively, the contents of this file may be used under the terms of
|
||||
; either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
@@ -33,26 +32,23 @@
|
||||
; the provisions above, a recipient may use your version of this file under
|
||||
; the terms of any one of the MPL, the GPL or the LGPL.
|
||||
;
|
||||
; ***** END LICENSE BLOCK *****
|
||||
; ***** END LICENSE BLOCK *****
|
||||
|
||||
#ifdef __LP64__
|
||||
.LEVEL 2.0W
|
||||
#else
|
||||
.LEVEL 1.1
|
||||
#endif
|
||||
LIBRARY mozMapi32.dll
|
||||
DESCRIPTION 'Mozilla Simple MAPI Support'
|
||||
|
||||
.CODE ; equivalent to the following two lines
|
||||
; .SPACE $TEXT$,SORT=8
|
||||
; .SUBSPA $CODE$,QUAD=0,ALIGN=4,ACCESS=0x2c,CODE_ONLY,SORT=24
|
||||
EXPORTS
|
||||
MAPILogon
|
||||
MAPILogoff
|
||||
MAPISendMail
|
||||
MAPISendDocuments
|
||||
MAPIFindNext
|
||||
MAPIReadMail
|
||||
MAPISaveMail
|
||||
MAPIDeleteMail
|
||||
MAPIAddress
|
||||
MAPIDetails
|
||||
MAPIResolveName
|
||||
MAPIFreeBuffer
|
||||
GetMapiDllVersion
|
||||
|
||||
ret_cr16
|
||||
.PROC
|
||||
.CALLINFO FRAME=0, NO_CALLS
|
||||
.EXPORT ret_cr16,ENTRY
|
||||
.ENTER
|
||||
; BV %r0(%rp)
|
||||
BV 0(%rp)
|
||||
MFCTL %cr16,%ret0
|
||||
.LEAVE
|
||||
.PROCEND
|
||||
.END
|
||||
335
mozilla/mailnews/mapi/mapiDll/MapiDll.cpp
Normal file
335
mozilla/mailnews/mapi/mapiDll/MapiDll.cpp
Normal file
@@ -0,0 +1,335 @@
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Mozilla
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corp.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2001
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Krishna Mohan Khandrika (kkhandrika@netscape.com)
|
||||
* Contributor(s): Rajiv Dayal (rdayal@netscape.com)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include <windows.h>
|
||||
#include <tchar.h>
|
||||
#include <assert.h>
|
||||
#include <mapidefs.h>
|
||||
#include <mapi.h>
|
||||
#include "msgMapi.h"
|
||||
#include "msgMapiMain.h"
|
||||
|
||||
#define MAX_RECIPS 100
|
||||
#define MAX_FILES 100
|
||||
|
||||
const CLSID CLSID_nsMapiImp = {0x29f458be, 0x8866, 0x11d5,
|
||||
{0xa3, 0xdd, 0x0, 0xb0, 0xd0, 0xf3, 0xba, 0xa7}};
|
||||
const IID IID_nsIMapi = {0x6EDCD38E,0x8861,0x11d5,
|
||||
{0xA3,0xDD,0x00,0xB0,0xD0,0xF3,0xBA,0xA7}};
|
||||
|
||||
DWORD tId = 0;
|
||||
|
||||
BOOL WINAPI DllMain(HINSTANCE aInstance, DWORD aReason, LPVOID aReserved)
|
||||
{
|
||||
switch (aReason)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH : tId = TlsAlloc();
|
||||
if (tId == 0xFFFFFFFF)
|
||||
return FALSE;
|
||||
break;
|
||||
|
||||
case DLL_PROCESS_DETACH : TlsFree(tId);
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL InitMozillaReference(nsIMapi **aRetValue)
|
||||
{
|
||||
// Check wehther this thread has a valid Interface
|
||||
// by looking into thread-specific-data variable
|
||||
|
||||
*aRetValue = (nsIMapi *)TlsGetValue(tId);
|
||||
|
||||
// Check whether the pointer actually resolves to
|
||||
// a valid method call; otherwise mozilla is not running
|
||||
|
||||
if ((*aRetValue) && (*aRetValue)->IsValid() == S_OK)
|
||||
return TRUE;
|
||||
|
||||
HRESULT hRes = CoInitialize(NULL);
|
||||
|
||||
hRes = ::CoCreateInstance(CLSID_nsMapiImp, NULL, CLSCTX_LOCAL_SERVER,
|
||||
IID_nsIMapi, (LPVOID *)aRetValue);
|
||||
|
||||
if (hRes == S_OK && (*aRetValue)->Initialize() == S_OK)
|
||||
if (TlsSetValue(tId, (LPVOID)(*aRetValue)))
|
||||
return TRUE;
|
||||
|
||||
// Either CoCreate or TlsSetValue failed; so return FALSE
|
||||
|
||||
if ((*aRetValue))
|
||||
(*aRetValue)->Release();
|
||||
|
||||
::CoUninitialize();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
// The MAPILogon function begins a Simple MAPI session, loading the default message ////
|
||||
// store and address book providers ////
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ULONG FAR PASCAL MAPILogon(ULONG aUIParam, LPTSTR aProfileName,
|
||||
LPTSTR aPassword, FLAGS aFlags,
|
||||
ULONG aReserved, LPLHANDLE aSession)
|
||||
{
|
||||
HRESULT hr = 0;
|
||||
ULONG nSessionId = 0;
|
||||
nsIMapi *pNsMapi = NULL;
|
||||
|
||||
if (!InitMozillaReference(&pNsMapi))
|
||||
return MAPI_E_FAILURE;
|
||||
|
||||
if (!(aFlags & MAPI_UNICODE))
|
||||
{
|
||||
// Need to convert the parameters to Unicode.
|
||||
|
||||
char *pUserName = (char *) aProfileName;
|
||||
char *pPassWord = (char *) aPassword;
|
||||
|
||||
TCHAR ProfileName[MAX_NAME_LEN] = {0};
|
||||
TCHAR PassWord[MAX_PW_LEN] = {0};
|
||||
|
||||
if (pUserName != NULL)
|
||||
{
|
||||
if (!MultiByteToWideChar(CP_ACP, 0, pUserName, -1, ProfileName,
|
||||
MAX_NAME_LEN))
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
if (pPassWord != NULL)
|
||||
{
|
||||
if (!MultiByteToWideChar(CP_ACP, 0, pPassWord, -1, PassWord,
|
||||
MAX_NAME_LEN))
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
hr = pNsMapi->Login(aUIParam, ProfileName, PassWord, aFlags,
|
||||
&nSessionId);
|
||||
}
|
||||
else
|
||||
hr = pNsMapi->Login(aUIParam, aProfileName, aPassword,
|
||||
aFlags, &nSessionId);
|
||||
if (hr == S_OK)
|
||||
(*aSession) = (LHANDLE) nSessionId;
|
||||
else
|
||||
return nSessionId;
|
||||
|
||||
return SUCCESS_SUCCESS;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPILogoff (LHANDLE aSession, ULONG aUIParam,
|
||||
FLAGS aFlags, ULONG aReserved)
|
||||
{
|
||||
nsIMapi *pNsMapi = (nsIMapi *)TlsGetValue(tId);
|
||||
if (pNsMapi != NULL)
|
||||
{
|
||||
if (pNsMapi->Logoff((ULONG) aSession) == S_OK)
|
||||
pNsMapi->Release();
|
||||
pNsMapi = NULL;
|
||||
}
|
||||
|
||||
TlsSetValue(tId, NULL);
|
||||
|
||||
::CoUninitialize();
|
||||
|
||||
return SUCCESS_SUCCESS;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPISendMail (LHANDLE lhSession, ULONG ulUIParam, lpnsMapiMessage lpMessage,
|
||||
FLAGS flFlags, ULONG ulReserved )
|
||||
{
|
||||
HRESULT hr = 0;
|
||||
BOOL bTempSession = FALSE ;
|
||||
nsIMapi *pNsMapi = NULL;
|
||||
|
||||
if (!InitMozillaReference(&pNsMapi))
|
||||
return MAPI_E_FAILURE;
|
||||
|
||||
if (lpMessage->nRecipCount > MAX_RECIPS)
|
||||
return MAPI_E_TOO_MANY_RECIPIENTS ;
|
||||
|
||||
if (lpMessage->nFileCount > MAX_FILES)
|
||||
return MAPI_E_TOO_MANY_FILES ;
|
||||
|
||||
if ( (!(flFlags & MAPI_DIALOG)) && (lpMessage->lpRecips == NULL) )
|
||||
return MAPI_E_UNKNOWN_RECIPIENT ;
|
||||
|
||||
if (!lhSession || pNsMapi->IsValidSession(lhSession) != S_OK)
|
||||
{
|
||||
FLAGS LoginFlag ;
|
||||
if ( (flFlags & MAPI_LOGON_UI) && (flFlags & MAPI_NEW_SESSION) )
|
||||
LoginFlag = MAPI_LOGON_UI | MAPI_NEW_SESSION ;
|
||||
else if (flFlags & MAPI_LOGON_UI)
|
||||
LoginFlag = MAPI_LOGON_UI ;
|
||||
|
||||
hr = MAPILogon (ulUIParam, (LPTSTR) NULL, (LPTSTR) NULL, LoginFlag, 0, &lhSession) ;
|
||||
if (hr != SUCCESS_SUCCESS)
|
||||
return MAPI_E_LOGIN_FAILURE ;
|
||||
bTempSession = TRUE ;
|
||||
}
|
||||
|
||||
// we need to deal with null data passed in by MAPI clients, specially when MAPI_DIALOG is set.
|
||||
// The MS COM type lib code generated by MIDL for the MS COM interfaces checks for these parameters
|
||||
// to be non null, although null is a valid value for them here.
|
||||
nsMapiRecipDesc * lpRecips ;
|
||||
nsMapiFileDesc * lpFiles ;
|
||||
|
||||
nsMapiMessage Message ;
|
||||
memset (&Message, 0, sizeof (nsMapiMessage) ) ;
|
||||
nsMapiRecipDesc Recipient ;
|
||||
memset (&Recipient, 0, sizeof (nsMapiRecipDesc) );
|
||||
nsMapiFileDesc Files ;
|
||||
memset (&Files, 0, sizeof (nsMapiFileDesc) ) ;
|
||||
|
||||
if(!lpMessage)
|
||||
{
|
||||
lpMessage = &Message ;
|
||||
}
|
||||
if(!lpMessage->lpRecips)
|
||||
{
|
||||
lpRecips = &Recipient ;
|
||||
}
|
||||
else
|
||||
lpRecips = lpMessage->lpRecips ;
|
||||
if(!lpMessage->lpFiles)
|
||||
{
|
||||
lpFiles = &Files ;
|
||||
}
|
||||
else
|
||||
lpFiles = lpMessage->lpFiles ;
|
||||
|
||||
hr = pNsMapi->SendMail (lhSession, lpMessage,
|
||||
(short) lpMessage->nRecipCount, lpRecips,
|
||||
(short) lpMessage->nFileCount, lpFiles,
|
||||
flFlags, ulReserved);
|
||||
|
||||
if (bTempSession)
|
||||
MAPILogoff (lhSession, ulUIParam, 0,0) ;
|
||||
|
||||
// we are seeing a problem when using Word, although we return success from the MAPI support
|
||||
// MS COM interface in mozilla, we are getting this error here. This is a temporary hack !!
|
||||
if (hr == 0x800703e6)
|
||||
return SUCCESS_SUCCESS;
|
||||
|
||||
return hr ;
|
||||
}
|
||||
|
||||
|
||||
ULONG FAR PASCAL MAPISendDocuments(ULONG ulUIParam, LPTSTR lpszDelimChar, LPTSTR lpszFilePaths,
|
||||
LPTSTR lpszFileNames, ULONG ulReserved)
|
||||
{
|
||||
LHANDLE lhSession ;
|
||||
nsIMapi *pNsMapi = NULL;
|
||||
|
||||
if (!InitMozillaReference(&pNsMapi))
|
||||
return MAPI_E_FAILURE;
|
||||
|
||||
unsigned long result = MAPILogon (ulUIParam, (LPTSTR) NULL, (LPTSTR) NULL, MAPI_LOGON_UI, 0, &lhSession) ;
|
||||
if (result != SUCCESS_SUCCESS)
|
||||
return MAPI_E_LOGIN_FAILURE ;
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
hr = pNsMapi->SendDocuments(lhSession, (LPTSTR) lpszDelimChar, (LPTSTR) lpszFilePaths,
|
||||
(LPTSTR) lpszFileNames, ulReserved) ;
|
||||
|
||||
MAPILogoff (lhSession, ulUIParam, 0,0) ;
|
||||
|
||||
return hr ;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPIFindNext(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszMessageType,
|
||||
LPTSTR lpszSeedMessageID, FLAGS flFlags, ULONG ulReserved,
|
||||
LPTSTR lpszMessageID)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPIReadMail(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszMessageID,
|
||||
FLAGS flFlags, ULONG ulReserved, lpMapiMessage FAR *lppMessage)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPISaveMail(LHANDLE lhSession, ULONG ulUIParam, lpMapiMessage lpMessage,
|
||||
FLAGS flFlags, ULONG ulReserved, LPTSTR lpszMessageID)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPIDeleteMail(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszMessageID,
|
||||
FLAGS flFlags, ULONG ulReserved)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPIAddress(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszCaption,
|
||||
ULONG nEditFields, LPTSTR lpszLabels, ULONG nRecips,
|
||||
lpMapiRecipDesc lpRecips, FLAGS flFlags,
|
||||
ULONG ulReserved, LPULONG lpnNewRecips,
|
||||
lpMapiRecipDesc FAR *lppNewRecips)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPIDetails(LHANDLE lhSession, ULONG ulUIParam, lpMapiRecipDesc lpRecip,
|
||||
FLAGS flFlags, ULONG ulReserved)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPIResolveName(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszName,
|
||||
FLAGS flFlags, ULONG ulReserved, lpMapiRecipDesc FAR *lppRecip)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPIFreeBuffer(LPVOID pv)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL GetMapiDllVersion()
|
||||
{
|
||||
return 94;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
@@ -12,14 +11,14 @@
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is the Netscape security libraries.
|
||||
# The Original Code is Mozilla.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Netscape Communications Corporation.
|
||||
# Netscape Communications Corp.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2001
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Contributor(s): Krishna Mohan Khandrika (kkhandrika@netscape.com)
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
@@ -33,20 +32,30 @@
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
# On OSF1 V5.0, pthreads is the default implementation strategy.
|
||||
# Classic nspr is also available.
|
||||
DEPTH=..\..\..
|
||||
|
||||
ifneq ($(OS_RELEASE),V3.2)
|
||||
USE_PTHREADS = 1
|
||||
ifeq ($(CLASSIC_NSPR), 1)
|
||||
USE_PTHREADS =
|
||||
IMPL_STRATEGY := _CLASSIC
|
||||
endif
|
||||
endif
|
||||
MODULE = mozMapi32
|
||||
EXPORT_LIBRARY = $(MODULE)
|
||||
LIBRARY_NAME = $(MODULE)
|
||||
DEFFILE = Mapi32.def
|
||||
|
||||
REQUIRES = MapiProxy \
|
||||
msgMapi \
|
||||
xpcom \
|
||||
string \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\config.mak>
|
||||
###############################################################
|
||||
|
||||
LCFLAGS=-DUNICODE -D_UNICODE
|
||||
|
||||
|
||||
OBJS= .\$(OBJDIR)\MapiDll.obj
|
||||
|
||||
WIN_LIBS= ole32.lib
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
#
|
||||
# Config stuff for DEC OSF/1 V5.1
|
||||
#
|
||||
include $(CORE_DEPTH)/coreconf/OSF1.mk
|
||||
26
mozilla/mailnews/mapi/mapihook/makefile.win
Normal file
26
mozilla/mailnews/mapi/mapihook/makefile.win
Normal file
@@ -0,0 +1,26 @@
|
||||
#!nmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): kkhandrika@netscape.com
|
||||
|
||||
DEPTH=..\..\..
|
||||
|
||||
DIRS= build public src
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
@@ -11,7 +11,7 @@
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is the Netscape security libraries.
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
@@ -19,6 +19,7 @@
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Krishna Mohan Khandrika <kkhandrika@netscape.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
@@ -34,23 +35,30 @@
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/* Library identity and versioning */
|
||||
#include "nsISupports.idl"
|
||||
|
||||
#include "nss.h"
|
||||
|
||||
#if defined(DEBUG)
|
||||
#define _DEBUG_STRING " (debug)"
|
||||
#else
|
||||
#define _DEBUG_STRING ""
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Version information for the 'ident' and 'what commands
|
||||
*
|
||||
* NOTE: the first component of the concatenated rcsid string
|
||||
* must not end in a '$' to prevent rcs keyword substitution.
|
||||
/**
|
||||
* This interface provides support for registering Mozilla as a COM component
|
||||
* for extending the use of Mail/News through Simple MAPI.
|
||||
*
|
||||
*/
|
||||
const char __nss_ssl_rcsid[] = "$Header: NSS " NSS_VERSION _DEBUG_STRING
|
||||
" " __DATE__ " " __TIME__ " $";
|
||||
const char __nss_ssl_sccsid[] = "@(#)NSS " NSS_VERSION _DEBUG_STRING
|
||||
" " __DATE__ " " __TIME__;
|
||||
|
||||
[noscript, uuid(8967fed2-c8bb-11d5-a3e9-00b0d0f3baa7)]
|
||||
interface nsIMapiSupport : nsISupports {
|
||||
|
||||
/** Initiates MAPI support
|
||||
*/
|
||||
|
||||
void initializeMAPISupport();
|
||||
|
||||
/** Shuts down the MAPI support
|
||||
*/
|
||||
|
||||
void shutdownMAPISupport();
|
||||
};
|
||||
|
||||
%{C++
|
||||
#define NS_IMAPISUPPORT_CONTRACTID "@mozilla.org/mapisupport;1"
|
||||
#define NS_IMAPISUPPORT_CLASSNAME "Mozilla MAPI Support"
|
||||
%}
|
||||
|
||||
174
mozilla/mailnews/mapi/mapihook/src/nsMapiSupport.cpp
Normal file
174
mozilla/mailnews/mapi/mapihook/src/nsMapiSupport.cpp
Normal file
@@ -0,0 +1,174 @@
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Mozilla
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corp.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2001
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Krishna Mohan Khandrika (kkhandrika@netscape.com)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsComPtr.h"
|
||||
#include "nsMapiSupport.h"
|
||||
#include "nsISupports.h"
|
||||
#include "nsMapiRegistry.h"
|
||||
#include "nsIGenericFactory.h"
|
||||
#include "nsIObserverService.h"
|
||||
#include "nsIAppStartupNotifier.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsICategoryManager.h"
|
||||
|
||||
const CLSID CLSID_nsMapiImp = {0x29f458be, 0x8866, 0x11d5, \
|
||||
{0xa3, 0xdd, 0x0, 0xb0, 0xd0, 0xf3, 0xba, 0xa7}};
|
||||
|
||||
/** Implementation of the nsIMapiSupport interface.
|
||||
* Use standard implementation of nsISupports stuff.
|
||||
*/
|
||||
|
||||
NS_IMPL_THREADSAFE_ISUPPORTS2(nsMapiSupport, nsIMapiSupport, nsIObserver);
|
||||
|
||||
static NS_METHOD nsMapiRegistrationProc(nsIComponentManager *aCompMgr,
|
||||
nsIFile *aPath, const char *registryLocation, const char *componentType,
|
||||
const nsModuleComponentInfo *info)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsCOMPtr<nsICategoryManager> categoryManager(do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv));
|
||||
if (NS_SUCCEEDED(rv))
|
||||
rv = categoryManager->AddCategoryEntry(APPSTARTUP_CATEGORY, "Mapi Support",
|
||||
"service," NS_IMAPISUPPORT_CONTRACTID, PR_TRUE, PR_TRUE, nsnull);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMapiSupport::Observe(nsISupports *aSubject, const char *aTopic, const PRUnichar *aData)
|
||||
{
|
||||
if (!nsCRT::strcmp(aTopic, "profile-after-change"))
|
||||
return InitializeMAPISupport();
|
||||
|
||||
if (!nsCRT::strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID))
|
||||
return ShutdownMAPISupport();
|
||||
|
||||
nsresult rv;
|
||||
|
||||
nsCOMPtr<nsIObserverService> observerService(do_GetService("@mozilla.org/observer-service;1", &rv));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = observerService->AddObserver(this,"profile-after-change", PR_FALSE);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = observerService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, PR_FALSE);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsMapiSupport::nsMapiSupport()
|
||||
: m_dwRegister(0),
|
||||
m_nsMapiFactory(nsnull)
|
||||
{
|
||||
NS_INIT_ISUPPORTS();
|
||||
}
|
||||
|
||||
nsMapiSupport::~nsMapiSupport()
|
||||
{
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMapiSupport::InitializeMAPISupport()
|
||||
{
|
||||
::CoInitialize(nsnull);
|
||||
if (m_nsMapiFactory == nsnull) // No Registering if already done. Sanity Check!!
|
||||
{
|
||||
m_nsMapiFactory = new nsMapiFactory();
|
||||
|
||||
if (m_nsMapiFactory != nsnull)
|
||||
{
|
||||
HRESULT hr = ::CoRegisterClassObject(CLSID_nsMapiImp, \
|
||||
m_nsMapiFactory, \
|
||||
CLSCTX_LOCAL_SERVER, \
|
||||
REGCLS_MULTIPLEUSE, \
|
||||
&m_dwRegister);
|
||||
|
||||
if (FAILED(hr))
|
||||
{
|
||||
m_nsMapiFactory->Release() ;
|
||||
m_nsMapiFactory = nsnull;
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMapiSupport::ShutdownMAPISupport()
|
||||
{
|
||||
if (m_dwRegister != 0)
|
||||
::CoRevokeClassObject(m_dwRegister);
|
||||
|
||||
if (m_nsMapiFactory != nsnull)
|
||||
{
|
||||
m_nsMapiFactory->Release();
|
||||
m_nsMapiFactory = nsnull;
|
||||
}
|
||||
|
||||
::CoUninitialize();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsMapiRegistry);
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsMapiSupport);
|
||||
|
||||
// The list of components we register
|
||||
static nsModuleComponentInfo components[] =
|
||||
{
|
||||
{
|
||||
NS_IMAPIREGISTRY_CLASSNAME,
|
||||
NS_IMAPIREGISTRY_CID,
|
||||
NS_IMAPIREGISTRY_CONTRACTID,
|
||||
nsMapiRegistryConstructor
|
||||
},
|
||||
|
||||
{
|
||||
NS_IMAPISUPPORT_CLASSNAME,
|
||||
NS_IMAPISUPPORT_CID,
|
||||
NS_IMAPISUPPORT_CONTRACTID,
|
||||
nsMapiSupportConstructor,
|
||||
nsMapiRegistrationProc,
|
||||
nsnull
|
||||
}
|
||||
};
|
||||
|
||||
NS_IMPL_NSGETMODULE(msgMapiModule, components);
|
||||
|
||||
@@ -11,14 +11,14 @@
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is the Netscape security libraries.
|
||||
* The Original Code is Mozilla
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* The Initial Developer of the Original Code is
|
||||
# Netscape Communications Corp.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2001
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Contributor(s): Krishna Mohan Khandrika (kkhandrika@netscape.com)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
@@ -34,23 +34,34 @@
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/* Library identity and versioning */
|
||||
#ifndef NS_MAPI_SUPPORT_H_
|
||||
#define NS_MAPI_SUPPORT_H_
|
||||
|
||||
#include "nss.h"
|
||||
#include <nsIObserver.h>
|
||||
#include <nsIMapiSupport.h>
|
||||
#include "msgMapiFactory.h"
|
||||
|
||||
#if defined(DEBUG)
|
||||
#define _DEBUG_STRING " (debug)"
|
||||
#else
|
||||
#define _DEBUG_STRING ""
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Version information for the 'ident' and 'what commands
|
||||
*
|
||||
* NOTE: the first component of the concatenated rcsid string
|
||||
* must not end in a '$' to prevent rcs keyword substitution.
|
||||
*/
|
||||
const char __nss_smime_rcsid[] = "$Header: NSS " NSS_VERSION _DEBUG_STRING
|
||||
" " __DATE__ " " __TIME__ " $";
|
||||
const char __nss_smime_sccsid[] = "@(#)NSS " NSS_VERSION _DEBUG_STRING
|
||||
" " __DATE__ " " __TIME__;
|
||||
#define NS_IMAPISUPPORT_CID \
|
||||
{0x8967fed2, 0xc8bb, 0x11d5, \
|
||||
{ 0xa3, 0xe9, 0x00, 0xb0, 0xd0, 0xf3, 0xba, 0xa7 }}
|
||||
|
||||
class nsMapiSupport : public nsIMapiSupport, public nsIObserver
|
||||
{
|
||||
public :
|
||||
|
||||
nsMapiSupport();
|
||||
~nsMapiSupport();
|
||||
|
||||
// Declare all interface methods we must implement.
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSIOBSERVER
|
||||
NS_DECL_NSIMAPISUPPORT
|
||||
|
||||
private :
|
||||
|
||||
DWORD m_dwRegister;
|
||||
nsMapiFactory *m_nsMapiFactory;
|
||||
};
|
||||
|
||||
#endif // NS_MAPI_SUPPORT_H_
|
||||
64
mozilla/mailnews/mapi/old/hook/makefile.win
Normal file
64
mozilla/mailnews/mapi/old/hook/makefile.win
Normal file
@@ -0,0 +1,64 @@
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
|
||||
DEPTH=..\..\..
|
||||
MODULE=mapiguts
|
||||
|
||||
################################################################################
|
||||
## exports
|
||||
|
||||
#EXPORTS =
|
||||
|
||||
|
||||
################################################################################
|
||||
## library
|
||||
|
||||
LIBNAME = .\$(OBJDIR)\mapiguts
|
||||
|
||||
!ifdef MOZ_STATIC_COMPONENT_LIBS
|
||||
LIB = $(LIBNAME).lib
|
||||
!else
|
||||
DLL = $(LIBNAME).dll
|
||||
!endif
|
||||
|
||||
DEFINES= -NS_DEBUG
|
||||
|
||||
OBJS= \
|
||||
.\$(OBJDIR)\mapihook.obj \
|
||||
.\$(OBJDIR)\mapimail.obj \
|
||||
$(NULL)
|
||||
|
||||
LLIBS= \
|
||||
$(LLIBS) \
|
||||
$(LIBNSPR) \
|
||||
$(DIST)\lib\xppref32.lib \
|
||||
$(DIST)\lib\xpcom.lib \
|
||||
$(DIST)\lib\mapiutils_s.lib \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
!ifdef MOZ_STATIC_COMPONENT_LIBS
|
||||
install:: $(LIb)
|
||||
$(MAKE_INSTALL) $(LIBNAME).$(LIB_SUFFIX) $(DIST)\bin\components
|
||||
!else
|
||||
install:: $(DLL)
|
||||
$(MAKE_INSTALL) $(LIBNAME).$(DLL_SUFFIX) $(DIST)\bin\components
|
||||
!endif
|
||||
1579
mozilla/mailnews/mapi/old/hook/mapihook.cpp
Normal file
1579
mozilla/mailnews/mapi/old/hook/mapihook.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,51 +1,48 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is the Netscape Portable Runtime (NSPR).
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998-2000
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#ifndef _MAPI_HOOK_H_
|
||||
#define _MAPI_HOOK_H_
|
||||
|
||||
#include <structs.h> // for MWContext
|
||||
|
||||
#ifndef mactime_h__
|
||||
#define mactime_h__
|
||||
//
|
||||
// This is the entry point to the MAPI session manager that lives
|
||||
// inside of Communicator.
|
||||
//
|
||||
LONG ProcessNetscapeMAPIHook(WPARAM wParam, LPARAM lParam);
|
||||
|
||||
|
||||
PR_BEGIN_EXTERN_C
|
||||
|
||||
void MacintoshInitializeTime(void);
|
||||
|
||||
|
||||
PR_END_EXTERN_C
|
||||
|
||||
|
||||
#endif /* mactime_h__ */
|
||||
#endif // _MAPI_HOOK_H_
|
||||
853
mozilla/mailnews/mapi/old/hook/mapimail.cpp
Normal file
853
mozilla/mailnews/mapi/old/hook/mapimail.cpp
Normal file
@@ -0,0 +1,853 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// More MAPI Hooks for Communicator
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#include "windows.h"
|
||||
#include "template.h"
|
||||
#include "msgcom.h"
|
||||
#include "wfemsg.h"
|
||||
#include "compstd.h"
|
||||
#include "compbar.h"
|
||||
#include "compmisc.h"
|
||||
#include "compfrm.h"
|
||||
#include "prefapi.h"
|
||||
#include "intl_csi.h"
|
||||
#include "dlghtmrp.h"
|
||||
#include "dlghtmmq.h"
|
||||
|
||||
// rhp - was breaking the optimized build!
|
||||
//#include "edt.h"
|
||||
//#include "edview.h"
|
||||
//#include "postal.h"
|
||||
//#include "apiaddr.h"
|
||||
//#include "mailmisc.h"
|
||||
|
||||
extern "C" {
|
||||
#include "xpgetstr.h"
|
||||
extern int MK_MSG_MSG_COMPOSITION;
|
||||
};
|
||||
|
||||
#include "mapimail.h"
|
||||
#include "nscpmapi.h"
|
||||
#include "mailpriv.h"
|
||||
#include "nsstrseq.h"
|
||||
|
||||
MWContext
|
||||
*GetUsableContext(void)
|
||||
{
|
||||
CGenericFrame *pFrame = (CGenericFrame * )FEU_GetLastActiveFrame();
|
||||
|
||||
ASSERT(pFrame != NULL);
|
||||
if (pFrame == NULL)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
// Now return the context...
|
||||
return((MWContext *) pFrame->GetMainContext());
|
||||
}
|
||||
|
||||
//
|
||||
// This function will create a composition window and either do
|
||||
// a blind send or pop up the compose window for the user to
|
||||
// complete the operation
|
||||
//
|
||||
// Return: appropriate MAPI return code...
|
||||
//
|
||||
//
|
||||
extern "C" LONG
|
||||
DoFullMAPIMailOperation(MAPISendMailType *sendMailPtr,
|
||||
const char *pInitialText,
|
||||
BOOL winShowFlag)
|
||||
{
|
||||
CGenericDoc *pDocument;
|
||||
LPSTR subject;
|
||||
NSstringSeq mailInfoSeq;
|
||||
DWORD stringCount = 6;
|
||||
DWORD i;
|
||||
CString csDefault;
|
||||
|
||||
// Get a context to use for this call...
|
||||
MWContext *pOldContext = GetUsableContext();
|
||||
if (!pOldContext)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
// Don't allow a compose window to be created if the user hasn't
|
||||
// specified an email address
|
||||
const char *real_addr = FE_UsersMailAddress();
|
||||
if (MISC_ValidateReturnAddress(pOldContext, real_addr) < 0)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
//
|
||||
// Now, we must build the fields object...
|
||||
//
|
||||
mailInfoSeq = (NSstringSeq) &(sendMailPtr->dataBuf[0]);
|
||||
subject = NSStrSeqGet(mailInfoSeq, 0);
|
||||
|
||||
// We should give it a subject to preven the prompt from coming
|
||||
// up...
|
||||
if ((!subject) || !(*subject))
|
||||
{
|
||||
csDefault.LoadString(IDS_COMPOSE_DEFAULTNOSUBJECT);
|
||||
subject = csDefault.GetBuffer(2);
|
||||
}
|
||||
|
||||
TRACE("MAPI: ProcessMAPISendMail() Subject = [%s]\n", subject);
|
||||
TRACE("MAPI: ProcessMAPISendMail() Text Size = [%d]\n", strlen((const char *)pInitialText));
|
||||
TRACE("MAPI: ProcessMAPISendMail() # of Recipients = [%d]\n", sendMailPtr->MSG_nRecipCount);
|
||||
|
||||
|
||||
char toString[1024] = "";
|
||||
char ccString[1024] = "";
|
||||
char bccString[1024] = "";
|
||||
|
||||
for (i=0; i<sendMailPtr->MSG_nRecipCount; i++)
|
||||
{
|
||||
LPSTR ptr;
|
||||
UCHAR tempString[256];
|
||||
|
||||
ULONG addrType = atoi(NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
|
||||
// figure which type of address this is?
|
||||
if (addrType == MAPI_CC)
|
||||
ptr = ccString;
|
||||
else if (addrType == MAPI_BCC)
|
||||
ptr = bccString;
|
||||
else
|
||||
ptr = toString;
|
||||
|
||||
LPSTR namePtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
|
||||
LPSTR emailPtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
|
||||
if ( (lstrlen(emailPtr) > 5) && (*(emailPtr + 4) == ':') )
|
||||
{
|
||||
emailPtr += 5;
|
||||
}
|
||||
|
||||
// Now build the temp string to tack on in the format
|
||||
// "Rich Pizzarro" <rhp@netscape.com>
|
||||
wsprintf((LPSTR) tempString, "\"%s\" <%s>", namePtr, emailPtr);
|
||||
|
||||
// add a comma if not the first one
|
||||
if (ptr[0] != '\0')
|
||||
lstrcat(ptr, ",");
|
||||
|
||||
// tack on string!
|
||||
lstrcat(ptr, (LPSTR) tempString);
|
||||
}
|
||||
|
||||
BOOL bEncrypt = FALSE;
|
||||
BOOL bSign = FALSE;
|
||||
|
||||
PREF_GetBoolPref("mail.crypto_sign_outgoing_mail", &bSign);
|
||||
PREF_GetBoolPref("mail.encrypt_outgoing_mail", &bEncrypt);
|
||||
MSG_CompositionFields *fields =
|
||||
MSG_CreateCompositionFields(real_addr, real_addr,
|
||||
toString,
|
||||
ccString,
|
||||
bccString,
|
||||
"", "", "",
|
||||
"", subject, "",
|
||||
"", "", "",
|
||||
"",
|
||||
bEncrypt,
|
||||
bSign);
|
||||
if (!fields)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
// RICHIE
|
||||
// INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(pOldContext);
|
||||
// int16 win_csid = INTL_GetCSIWinCSID(csi);
|
||||
|
||||
pDocument = (CGenericDoc*)theApp.m_TextComposeTemplate->OpenDocumentFile(NULL, NULL, /*win_csid RICHIE*/ winShowFlag);
|
||||
if ( !pDocument )
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
CWinCX * pContext = (CWinCX*) pDocument->GetContext();
|
||||
if ( !pContext )
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
MSG_CompositionPaneCallbacks Callbacks;
|
||||
Callbacks.CreateRecipientsDialog = CreateRecipientsDialog;
|
||||
Callbacks.CreateAskHTMLDialog = CreateAskHTMLDialog;
|
||||
|
||||
int16 doccsid;
|
||||
MWContext *context = pContext->GetContext();
|
||||
CComposeFrame *pCompose = (CComposeFrame *) pContext->GetFrame()->GetFrameWnd();
|
||||
|
||||
pCompose->SetComposeStuff(context, fields); // squirl away stuff for post-create
|
||||
|
||||
// This needs to be set TRUE if using the old non-HTML text frame
|
||||
// to prevent dropping dragged URLs
|
||||
pContext->m_bDragging = !pCompose->UseHtml();
|
||||
if (!pCompose->UseHtml())
|
||||
{
|
||||
pCompose->SetMsgPane(
|
||||
MSG_CreateCompositionPane(pContext->GetContext(),
|
||||
context,
|
||||
g_MsgPrefs.m_pMsgPrefs,
|
||||
fields,
|
||||
WFE_MSGGetMaster())
|
||||
);
|
||||
}
|
||||
|
||||
ASSERT(pCompose->GetMsgPane());
|
||||
MSG_SetFEData(pCompose->GetMsgPane(),(void *)pCompose);
|
||||
pCompose->UpdateAttachmentInfo();
|
||||
|
||||
// Pass doccsid info to new context for MailToWin conversion
|
||||
doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context));
|
||||
INTL_SetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context),
|
||||
(doccsid ? doccsid : INTL_DefaultDocCharSetID(context)));
|
||||
|
||||
pCompose->DisplayHeaders(NULL);
|
||||
|
||||
CComposeBar * pBar = pCompose->GetComposeBar();
|
||||
ASSERT(pBar);
|
||||
LPADDRESSCONTROL pIAddressList = pBar->GetAddressWidgetInterface();
|
||||
|
||||
if (!pIAddressList->IsCreated())
|
||||
{
|
||||
pBar->CreateAddressingBlock();
|
||||
}
|
||||
|
||||
// rhp - Deal with addressing the brute force way! This is a
|
||||
// "fix" for bad behavior when creating these windows and not
|
||||
// showing them on the desktop.
|
||||
if (!winShowFlag) // Hack to fix the window not being mapped
|
||||
{
|
||||
pCompose->AppendAddress(MSG_TO_HEADER_MASK, "");
|
||||
pCompose->AppendAddress(MSG_CC_HEADER_MASK, "");
|
||||
pCompose->AppendAddress(MSG_BCC_HEADER_MASK, "");
|
||||
}
|
||||
|
||||
// Always do plain text composition!
|
||||
pCompose->CompleteComposeInitialization();
|
||||
|
||||
// Do this so we don't get popups on "empty" messages
|
||||
if ( (!pInitialText) || (!(*pInitialText)) )
|
||||
pInitialText = " ";
|
||||
|
||||
const char * pBody = pInitialText ? pInitialText : MSG_GetCompBody(pCompose->GetMsgPane());
|
||||
if (pBody)
|
||||
{
|
||||
FE_InsertMessageCompositionText(context,pBody,TRUE);
|
||||
}
|
||||
|
||||
//
|
||||
// Now set the message as being edited!
|
||||
//
|
||||
pCompose->SetModified(TRUE);
|
||||
|
||||
//
|
||||
// Finally deal with the attachments...
|
||||
//
|
||||
if (sendMailPtr->MSG_nFileCount > 0)
|
||||
{
|
||||
// Send this puppy when done with the attachments...
|
||||
if (!winShowFlag)
|
||||
{
|
||||
pCompose->SetMAPISendMode(MAPI_SEND);
|
||||
}
|
||||
|
||||
MSG_AttachmentData *pAttach = (MSG_AttachmentData *)
|
||||
XP_CALLOC((sendMailPtr->MSG_nFileCount + 1),
|
||||
sizeof(MSG_AttachmentData));
|
||||
if (!pAttach)
|
||||
{
|
||||
return(MAPI_E_INSUFFICIENT_MEMORY);
|
||||
}
|
||||
|
||||
memset(pAttach, 0, (sendMailPtr->MSG_nFileCount + 1) *
|
||||
sizeof(MSG_AttachmentData));
|
||||
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
|
||||
{
|
||||
CString cs;
|
||||
// Create URL from filename...
|
||||
WFE_ConvertFile2Url(cs,
|
||||
(const char *)NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
pAttach[i].url = XP_STRDUP(cs);
|
||||
|
||||
// Now also include the "display" name...
|
||||
StrAllocCopy(pAttach[i].real_name, NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
}
|
||||
|
||||
// Set the list!
|
||||
MSG_SetAttachmentList(pCompose->GetMsgPane(), pAttach);
|
||||
|
||||
// Now free everything...
|
||||
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
|
||||
{
|
||||
if (pAttach[i].url)
|
||||
XP_FREE(pAttach[i].url);
|
||||
|
||||
if (pAttach[i].real_name)
|
||||
XP_FREE(pAttach[i].real_name);
|
||||
}
|
||||
|
||||
XP_FREE(pAttach);
|
||||
}
|
||||
|
||||
//
|
||||
// Now, if we were supposed to do the blind send...do it, otherwise,
|
||||
// just popup the window...
|
||||
//
|
||||
if (winShowFlag)
|
||||
{
|
||||
// Post message to compose window to set the initial focus.
|
||||
pCompose->PostMessage(WM_COMP_SET_INITIAL_FOCUS);
|
||||
}
|
||||
else if (sendMailPtr->MSG_nFileCount <= 0) // Send NOW if no attachments!
|
||||
{
|
||||
pCompose->PostMessage(WM_COMMAND, IDM_SEND);
|
||||
}
|
||||
|
||||
return(SUCCESS_SUCCESS);
|
||||
}
|
||||
|
||||
//
|
||||
// This function will create a composition window and just attach
|
||||
// the attachments of interest and pop up the window...
|
||||
//
|
||||
// Return: appropriate MAPI return code...
|
||||
//
|
||||
//
|
||||
extern "C" LONG
|
||||
DoPartialMAPIMailOperation(MAPISendDocumentsType *sendDocPtr)
|
||||
{
|
||||
CGenericDoc *pDocument;
|
||||
|
||||
// Get a context to use for this call...
|
||||
MWContext *pOldContext = GetUsableContext();
|
||||
if (!pOldContext)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
// Don't allow a compose window to be created if the user hasn't
|
||||
// specified an email address
|
||||
const char *real_addr = FE_UsersMailAddress();
|
||||
if (MISC_ValidateReturnAddress(pOldContext, real_addr) < 0)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
//
|
||||
// Now, build the fields object w/o much info...
|
||||
//
|
||||
BOOL bEncrypt = FALSE;
|
||||
BOOL bSign = FALSE;
|
||||
|
||||
PREF_GetBoolPref("mail.crypto_sign_outgoing_mail", &bSign);
|
||||
PREF_GetBoolPref("mail.encrypt_outgoing_mail", &bEncrypt);
|
||||
|
||||
MSG_CompositionFields *fields =
|
||||
MSG_CreateCompositionFields(real_addr, real_addr, NULL,
|
||||
"", "",
|
||||
"", "", "",
|
||||
"", "", "",
|
||||
"", "", "",
|
||||
"",
|
||||
bEncrypt,
|
||||
bSign);
|
||||
if (!fields)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
// RICHIE - INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(pOldContext);
|
||||
// int16 win_csid = INTL_GetCSIWinCSID(csi);
|
||||
|
||||
pDocument = (CGenericDoc*)theApp.m_TextComposeTemplate->OpenDocumentFile(NULL, NULL, /*RICHIE win_csid,*/ TRUE);
|
||||
if ( !pDocument )
|
||||
{
|
||||
// cleanup fields object
|
||||
MSG_DestroyCompositionFields(fields);
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
CWinCX * pContext = (CWinCX*) pDocument->GetContext();
|
||||
if ( !pContext )
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
MSG_CompositionPaneCallbacks Callbacks;
|
||||
Callbacks.CreateRecipientsDialog = CreateRecipientsDialog;
|
||||
Callbacks.CreateAskHTMLDialog = CreateAskHTMLDialog;
|
||||
|
||||
MWContext *context = pContext->GetContext();
|
||||
CComposeFrame *pCompose = (CComposeFrame *) pContext->GetFrame()->GetFrameWnd();
|
||||
pCompose->SetComposeStuff(context,fields); // squirl away stuff for post-create
|
||||
|
||||
// This needs to be set TRUE if using the old non-HTML text frame
|
||||
// to prevent dropping dragged URLs
|
||||
pContext->m_bDragging = !pCompose->UseHtml();
|
||||
if (!pCompose->UseHtml())
|
||||
{
|
||||
pCompose->SetMsgPane(MSG_CreateCompositionPane(
|
||||
pContext->GetContext(),
|
||||
context,
|
||||
g_MsgPrefs.m_pMsgPrefs, fields,
|
||||
WFE_MSGGetMaster()));
|
||||
}
|
||||
|
||||
ASSERT(pCompose->GetMsgPane());
|
||||
MSG_SetFEData(pCompose->GetMsgPane(),(void *)pCompose);
|
||||
|
||||
pCompose->UpdateAttachmentInfo();
|
||||
|
||||
// Pass doccsid info to new context for MailToWin conversion
|
||||
/***
|
||||
doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(pOldContext));
|
||||
|
||||
INTL_SetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context),
|
||||
(doccsid ? doccsid : INTL_DefaultDocCharSetID(pOldContext)));
|
||||
****/
|
||||
|
||||
pCompose->DisplayHeaders(NULL);
|
||||
|
||||
CComposeBar * pBar = pCompose->GetComposeBar();
|
||||
ASSERT(pBar);
|
||||
LPADDRESSCONTROL pIAddressList = pBar->GetAddressWidgetInterface();
|
||||
|
||||
if (!pIAddressList->IsCreated())
|
||||
{
|
||||
pBar->CreateAddressingBlock();
|
||||
}
|
||||
|
||||
// Always do plain text composition!
|
||||
pCompose->CompleteComposeInitialization();
|
||||
|
||||
//
|
||||
// Finally deal with the attachments...
|
||||
//
|
||||
NSstringSeq mailInfoSeq = (NSstringSeq) &(sendDocPtr->dataBuf[0]);
|
||||
DWORD stringCount = 0;
|
||||
DWORD i;
|
||||
|
||||
TRACE("MAPI: ProcessMAPISendDocuments() # of Attachments = [%d]\n", sendDocPtr->nFileCount);
|
||||
|
||||
if (sendDocPtr->nFileCount > 0)
|
||||
{
|
||||
MSG_AttachmentData *pAttach = (MSG_AttachmentData *)
|
||||
XP_CALLOC((sendDocPtr->nFileCount + 1),
|
||||
sizeof(MSG_AttachmentData));
|
||||
if (!pAttach)
|
||||
{
|
||||
return(MAPI_E_INSUFFICIENT_MEMORY);
|
||||
}
|
||||
|
||||
memset(pAttach, 0, (sendDocPtr->nFileCount + 1) *
|
||||
sizeof(MSG_AttachmentData));
|
||||
for (i=0; i<sendDocPtr->nFileCount; i++)
|
||||
{
|
||||
CString cs;
|
||||
// Create URL from filename...
|
||||
WFE_ConvertFile2Url(cs,
|
||||
(const char *)NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
pAttach[i].url = XP_STRDUP(cs);
|
||||
|
||||
// Now also include the "display" name...
|
||||
StrAllocCopy(pAttach[i].real_name, NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
}
|
||||
|
||||
// Set the list!
|
||||
MSG_SetAttachmentList(pCompose->GetMsgPane(), pAttach);
|
||||
|
||||
// Now free everything...
|
||||
for (i=0; i<sendDocPtr->nFileCount; i++)
|
||||
{
|
||||
if (pAttach[i].url)
|
||||
XP_FREE(pAttach[i].url);
|
||||
|
||||
if (pAttach[i].real_name)
|
||||
XP_FREE(pAttach[i].real_name);
|
||||
}
|
||||
|
||||
XP_FREE(pAttach);
|
||||
}
|
||||
|
||||
//
|
||||
// Now some checking for ... well I'm not sure...
|
||||
//
|
||||
if (MSG_GetAttachmentList(pCompose->GetMsgPane()))
|
||||
pCompose->SetModified(TRUE);
|
||||
else
|
||||
pCompose->SetModified(FALSE);
|
||||
|
||||
// Post message to compose window to set the initial focus.
|
||||
pCompose->PostMessage(WM_COMP_SET_INITIAL_FOCUS);
|
||||
|
||||
//
|
||||
// Now, just popup the window...
|
||||
//
|
||||
pCompose->ShowWindow(TRUE);
|
||||
|
||||
// return pCompose->GetMsgPane(); rhp - used to return the MsgPane
|
||||
return(SUCCESS_SUCCESS);
|
||||
}
|
||||
|
||||
static void _GetMailCallback(HWND hwnd, MSG_Pane *pane, void *closure)
|
||||
{
|
||||
if (pane != NULL)
|
||||
{
|
||||
ShowWindow(hwnd, SW_HIDE);
|
||||
MSG_Command( pane, MSG_GetNewMail, NULL, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
static void _GetMailDoneCallback(HWND hwnd, MSG_Pane *pane, void *closure)
|
||||
{
|
||||
for(CGenericFrame * f = theApp.m_pFrameList; f; f = f->m_pNext)
|
||||
f->PostMessage(WM_COMMAND, (WPARAM) ID_DONEGETTINGMAIL, (LPARAM) 0);
|
||||
}
|
||||
|
||||
//
|
||||
// This will fire off a "get mail in background operation" in an
|
||||
// async. fashion.
|
||||
//
|
||||
extern "C" void
|
||||
MAPIGetNewMessagesInBackground(void)
|
||||
{
|
||||
CGenericFrame *pFrame = (CGenericFrame * )FEU_GetLastActiveFrame();
|
||||
|
||||
// rhp - we should not hit the net if we are offline!
|
||||
if (NET_IsOffline())
|
||||
return;
|
||||
|
||||
if (!pFrame)
|
||||
return;
|
||||
|
||||
MWContext *pOldContext = GetUsableContext();
|
||||
if (!pOldContext)
|
||||
return;
|
||||
|
||||
TRACE("MAPI: DOWNLOAD MAIL IN BACKGROUND\n");
|
||||
new CProgressDialog(
|
||||
pFrame->GetFrameWnd(),
|
||||
NULL,
|
||||
_GetMailCallback, NULL, NULL,
|
||||
_GetMailDoneCallback);
|
||||
}
|
||||
|
||||
//
|
||||
// This function will save a message into the Communicator "Drafts"
|
||||
// folder with no UI showing.
|
||||
//
|
||||
// Return: appropriate MAPI return code...
|
||||
//
|
||||
//
|
||||
extern "C" LONG
|
||||
DoMAPISaveMailOperation(MAPISendMailType *sendMailPtr,
|
||||
const char *pInitialText)
|
||||
{
|
||||
CGenericDoc *pDocument;
|
||||
LPSTR subject;
|
||||
NSstringSeq mailInfoSeq;
|
||||
DWORD stringCount = 6;
|
||||
DWORD i;
|
||||
BOOL winShowFlag = FALSE;
|
||||
|
||||
// Get a context to use for this call...
|
||||
MWContext *pOldContext = GetUsableContext();
|
||||
if (!pOldContext)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
// Don't allow a compose window to be created if the user hasn't
|
||||
// specified an email address
|
||||
const char *real_addr = FE_UsersMailAddress();
|
||||
if (MISC_ValidateReturnAddress(pOldContext, real_addr) < 0)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
//
|
||||
// Now, we must build the fields object...
|
||||
//
|
||||
mailInfoSeq = (NSstringSeq) &(sendMailPtr->dataBuf[0]);
|
||||
subject = NSStrSeqGet(mailInfoSeq, 0);
|
||||
|
||||
TRACE("MAPI: ProcessMAPISendMail() Subject = [%s]\n", subject);
|
||||
TRACE("MAPI: ProcessMAPISendMail() Text Size = [%d]\n", strlen((const char *)pInitialText));
|
||||
TRACE("MAPI: ProcessMAPISendMail() # of Recipients = [%d]\n", sendMailPtr->MSG_nRecipCount);
|
||||
|
||||
|
||||
char toString[1024] = "";
|
||||
char ccString[1024] = "";
|
||||
char bccString[1024] = "";
|
||||
|
||||
for (i=0; i<sendMailPtr->MSG_nRecipCount; i++)
|
||||
{
|
||||
LPSTR ptr;
|
||||
UCHAR tempString[256];
|
||||
|
||||
ULONG addrType = atoi(NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
|
||||
// figure which type of address this is?
|
||||
if (addrType == MAPI_CC)
|
||||
ptr = ccString;
|
||||
else if (addrType == MAPI_BCC)
|
||||
ptr = bccString;
|
||||
else
|
||||
ptr = toString;
|
||||
|
||||
LPSTR namePtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
|
||||
LPSTR emailPtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
|
||||
|
||||
if ( (!emailPtr) && (!namePtr))
|
||||
{
|
||||
return(MAPI_E_INVALID_RECIPS);
|
||||
}
|
||||
|
||||
if (!emailPtr)
|
||||
emailPtr = namePtr;
|
||||
|
||||
char *tptr = strchr(emailPtr, ':');
|
||||
if (tptr != NULL)
|
||||
{
|
||||
if ( (*tptr != '\0') && (*(tptr+1) != '\0') )
|
||||
{
|
||||
emailPtr = (tptr + 1);
|
||||
}
|
||||
}
|
||||
/**
|
||||
if ( (lstrlen(emailPtr) > 5) && (*(emailPtr + 4) == ':') )
|
||||
{
|
||||
emailPtr += 5;
|
||||
}
|
||||
**/
|
||||
// Now build the temp string to tack on in the format
|
||||
// "Rich Pizzarro" <rhp@netscape.com>
|
||||
wsprintf((LPSTR) tempString, "\"%s\" <%s>", namePtr, emailPtr);
|
||||
|
||||
// add a comma if not the first one
|
||||
if (ptr[0] != '\0')
|
||||
lstrcat(ptr, ",");
|
||||
|
||||
// tack on string!
|
||||
lstrcat(ptr, (LPSTR) tempString);
|
||||
}
|
||||
|
||||
BOOL bEncrypt = FALSE;
|
||||
BOOL bSign = FALSE;
|
||||
|
||||
PREF_GetBoolPref("mail.crypto_sign_outgoing_mail", &bSign);
|
||||
PREF_GetBoolPref("mail.encrypt_outgoing_mail", &bEncrypt);
|
||||
MSG_CompositionFields *fields =
|
||||
MSG_CreateCompositionFields(real_addr, real_addr,
|
||||
toString,
|
||||
ccString,
|
||||
bccString,
|
||||
"", "", "",
|
||||
"", subject, "",
|
||||
"", "", "",
|
||||
"",
|
||||
bEncrypt,
|
||||
bSign);
|
||||
if (!fields)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
// RICHIE
|
||||
// INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(pOldContext);
|
||||
// int16 win_csid = INTL_GetCSIWinCSID(csi);
|
||||
|
||||
pDocument = (CGenericDoc*)theApp.m_TextComposeTemplate->OpenDocumentFile(NULL, NULL, /*win_csid RICHIE*/ winShowFlag);
|
||||
if ( !pDocument )
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
CWinCX * pContext = (CWinCX*) pDocument->GetContext();
|
||||
if ( !pContext )
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
MSG_CompositionPaneCallbacks Callbacks;
|
||||
Callbacks.CreateRecipientsDialog = CreateRecipientsDialog;
|
||||
Callbacks.CreateAskHTMLDialog = CreateAskHTMLDialog;
|
||||
|
||||
int16 doccsid;
|
||||
MWContext *context = pContext->GetContext();
|
||||
CComposeFrame *pCompose = (CComposeFrame *) pContext->GetFrame()->GetFrameWnd();
|
||||
|
||||
pCompose->SetComposeStuff(context, fields); // squirl away stuff for post-create
|
||||
|
||||
// This needs to be set TRUE if using the old non-HTML text frame
|
||||
// to prevent dropping dragged URLs
|
||||
pContext->m_bDragging = !pCompose->UseHtml();
|
||||
if (!pCompose->UseHtml())
|
||||
{
|
||||
pCompose->SetMsgPane(
|
||||
MSG_CreateCompositionPane(pContext->GetContext(),
|
||||
context,
|
||||
g_MsgPrefs.m_pMsgPrefs,
|
||||
fields,
|
||||
WFE_MSGGetMaster())
|
||||
);
|
||||
}
|
||||
|
||||
ASSERT(pCompose->GetMsgPane());
|
||||
MSG_SetFEData(pCompose->GetMsgPane(),(void *)pCompose);
|
||||
pCompose->UpdateAttachmentInfo();
|
||||
|
||||
// Pass doccsid info to new context for MailToWin conversion
|
||||
doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context));
|
||||
INTL_SetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context),
|
||||
(doccsid ? doccsid : INTL_DefaultDocCharSetID(context)));
|
||||
|
||||
pCompose->DisplayHeaders(NULL);
|
||||
|
||||
CComposeBar * pBar = pCompose->GetComposeBar();
|
||||
ASSERT(pBar);
|
||||
LPADDRESSCONTROL pIAddressList = pBar->GetAddressWidgetInterface();
|
||||
|
||||
if (!pIAddressList->IsCreated())
|
||||
{
|
||||
pBar->CreateAddressingBlock();
|
||||
}
|
||||
|
||||
// rhp - Deal with addressing the brute force way! This is a
|
||||
// "fix" for bad behavior when creating these windows and not
|
||||
// showing them on the desktop.
|
||||
if (!winShowFlag) // Hack to fix the window not being mapped
|
||||
{
|
||||
pCompose->AppendAddress(MSG_TO_HEADER_MASK, "");
|
||||
pCompose->AppendAddress(MSG_CC_HEADER_MASK, "");
|
||||
pCompose->AppendAddress(MSG_BCC_HEADER_MASK, "");
|
||||
}
|
||||
|
||||
// Always do plain text composition!
|
||||
pCompose->CompleteComposeInitialization();
|
||||
|
||||
// Do this so we don't get popups on "empty" messages
|
||||
if ( (!pInitialText) || (!(*pInitialText)) )
|
||||
pInitialText = " ";
|
||||
|
||||
const char * pBody = pInitialText ? pInitialText : MSG_GetCompBody(pCompose->GetMsgPane());
|
||||
if (pBody)
|
||||
{
|
||||
FE_InsertMessageCompositionText(context,pBody,TRUE);
|
||||
}
|
||||
|
||||
//
|
||||
// Now set the message as being edited!
|
||||
//
|
||||
pCompose->SetModified(TRUE);
|
||||
|
||||
//
|
||||
// Finally deal with the attachments...
|
||||
//
|
||||
if (sendMailPtr->MSG_nFileCount > 0)
|
||||
{
|
||||
// Send this puppy when done with the attachments...
|
||||
if (!winShowFlag)
|
||||
{
|
||||
pCompose->SetMAPISendMode(MAPI_SAVE);
|
||||
}
|
||||
|
||||
MSG_AttachmentData *pAttach = (MSG_AttachmentData *)
|
||||
XP_CALLOC((sendMailPtr->MSG_nFileCount + 1),
|
||||
sizeof(MSG_AttachmentData));
|
||||
if (!pAttach)
|
||||
{
|
||||
return(MAPI_E_INSUFFICIENT_MEMORY);
|
||||
}
|
||||
|
||||
memset(pAttach, 0, (sendMailPtr->MSG_nFileCount + 1) *
|
||||
sizeof(MSG_AttachmentData));
|
||||
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
|
||||
{
|
||||
CString cs;
|
||||
// Create URL from filename...
|
||||
WFE_ConvertFile2Url(cs,
|
||||
(const char *)NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
pAttach[i].url = XP_STRDUP(cs);
|
||||
|
||||
// Now also include the "display" name...
|
||||
StrAllocCopy(pAttach[i].real_name, NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
}
|
||||
|
||||
// Set the list!
|
||||
MSG_SetAttachmentList(pCompose->GetMsgPane(), pAttach);
|
||||
|
||||
// Now free everything...
|
||||
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
|
||||
{
|
||||
if (pAttach[i].url)
|
||||
XP_FREE(pAttach[i].url);
|
||||
|
||||
if (pAttach[i].real_name)
|
||||
XP_FREE(pAttach[i].real_name);
|
||||
}
|
||||
|
||||
XP_FREE(pAttach);
|
||||
}
|
||||
|
||||
//
|
||||
// Now, if we were supposed to do the blind send...do it, otherwise,
|
||||
// just popup the window...
|
||||
//
|
||||
if (winShowFlag)
|
||||
{
|
||||
// Post message to compose window to set the initial focus.
|
||||
pCompose->PostMessage(WM_COMP_SET_INITIAL_FOCUS);
|
||||
}
|
||||
else if (sendMailPtr->MSG_nFileCount <= 0) // Send NOW if no attachments!
|
||||
{
|
||||
pCompose->PostMessage(WM_COMMAND, IDM_SAVEASDRAFT);
|
||||
}
|
||||
|
||||
return(SUCCESS_SUCCESS);
|
||||
}
|
||||
89
mozilla/mailnews/mapi/old/hook/mapimail.h
Normal file
89
mozilla/mailnews/mapi/old/hook/mapimail.h
Normal file
@@ -0,0 +1,89 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#ifndef _MAPI_MAIL_H_
|
||||
#define _MAPI_MAIL_H_
|
||||
|
||||
#include "nscpmapi.h"
|
||||
#include <structs.h> // for MWContext
|
||||
|
||||
//extern "C" {
|
||||
|
||||
//
|
||||
// This function will create a composition window and either do
|
||||
// a blind send or pop up the compose window for the user to
|
||||
// complete the operation
|
||||
//
|
||||
// Return: appropriate MAPI return code...
|
||||
//
|
||||
//
|
||||
extern "C" LONG
|
||||
DoFullMAPIMailOperation(MAPISendMailType *sendMailPtr,
|
||||
const char *pInitialText,
|
||||
BOOL winShowFlag);
|
||||
|
||||
//
|
||||
// This function will create a composition window and just attach
|
||||
// the attachments of interest and pop up the window...
|
||||
//
|
||||
// Return: appropriate MAPI return code...
|
||||
//
|
||||
//
|
||||
extern "C" LONG
|
||||
DoPartialMAPIMailOperation(MAPISendDocumentsType *sendDocPtr);
|
||||
|
||||
//
|
||||
// This function will save a message into the Communicator "Drafts"
|
||||
// folder with no UI showing.
|
||||
//
|
||||
// Return: appropriate MAPI return code...
|
||||
//
|
||||
//
|
||||
extern "C" LONG
|
||||
DoMAPISaveMailOperation(MAPISendMailType *sendMailPtr,
|
||||
const char *pInitialText);
|
||||
|
||||
//
|
||||
// This will fire off a "get mail in background operation" in an
|
||||
// async. fashion.
|
||||
//
|
||||
extern "C" void
|
||||
MAPIGetNewMessagesInBackground(void);
|
||||
|
||||
|
||||
// } // extern "C"
|
||||
|
||||
#endif // _MAPI_MAIL_H_
|
||||
50
mozilla/mailnews/mapi/old/lib/Makefile.win
Normal file
50
mozilla/mailnews/mapi/old/lib/Makefile.win
Normal file
@@ -0,0 +1,50 @@
|
||||
#!nmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
|
||||
DEPTH=..\..\..
|
||||
MODULE=mapiutils
|
||||
|
||||
include <$(DEPTH)\config\config.mak>
|
||||
|
||||
################################################################################
|
||||
## exports
|
||||
|
||||
EXPORTS= mapismem.h \
|
||||
nsstrseq.h \
|
||||
$(NULL)
|
||||
|
||||
################################################################################
|
||||
## library
|
||||
|
||||
LIBRARY_NAME=mapiutils_s
|
||||
|
||||
|
||||
CPP_OBJS= .\$(OBJDIR)\mapismem.obj \
|
||||
.\$(OBJDIR)\nsstrseq.obj \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
install:: $(LIBRARY)
|
||||
$(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib
|
||||
|
||||
clobber::
|
||||
rm -f $(DIST)\lib\$(LIBRARY_NAME).lib
|
||||
173
mozilla/mailnews/mapi/old/lib/mapismem.cpp
Normal file
173
mozilla/mailnews/mapi/old/lib/mapismem.cpp
Normal file
@@ -0,0 +1,173 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// smem.cpp - This deals with all shared memory functions needed for
|
||||
// the MAPI component of Communicator
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
|
||||
#include "mapismem.h"
|
||||
|
||||
|
||||
#ifndef ZeroMemory
|
||||
#include <memory.h>
|
||||
#define ZeroMemory(PTR, SIZE) memset(PTR, 0, SIZE)
|
||||
#endif // ZeroMemory
|
||||
|
||||
//
|
||||
// *create new* shared memory chunk
|
||||
// once this is created, use the pointer
|
||||
// to the segment to to store data
|
||||
// e.g.:
|
||||
// lpString = "string for communicator";
|
||||
// lstrcpy((LPSTR)pData->m_buf[0], lpString);
|
||||
//
|
||||
CSharedMem *
|
||||
NSCreateSharedMemory(DWORD memSize, LPCTSTR memName, HANDLE *hSharedMemory)
|
||||
{
|
||||
#ifdef WIN32
|
||||
|
||||
BOOL bExistedBefore;
|
||||
CSharedMem *pData;
|
||||
|
||||
LPCTSTR szObjectName = memName;
|
||||
DWORD dwSize = sizeof(CSharedMem) + memSize;
|
||||
*hSharedMemory = CreateFileMapping(
|
||||
(HANDLE)0xFFFFFFFF,0,PAGE_READWRITE,0,dwSize,szObjectName);
|
||||
if(*hSharedMemory == 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
bExistedBefore = (GetLastError() == ERROR_ALREADY_EXISTS);
|
||||
if(bExistedBefore)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pData = (CSharedMem *)MapViewOfFile(
|
||||
*hSharedMemory, FILE_MAP_ALL_ACCESS, 0, 0, 0);
|
||||
if(pData == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZeroMemory(pData, dwSize);
|
||||
pData->m_dwSize = memSize;
|
||||
|
||||
return pData;
|
||||
#else
|
||||
CSharedMem *sMemChunk = NULL;
|
||||
DWORD dwSize = memSize = (sizeof(CSharedMem) + memSize);
|
||||
|
||||
if (sMemChunk != NULL)
|
||||
return(sMemChunk);
|
||||
|
||||
sMemChunk = (CSharedMem *) GlobalAllocPtr(GMEM_MOVEABLE, dwSize);
|
||||
ZeroMemory(sMemChunk, (size_t) dwSize);
|
||||
sMemChunk->m_dwSize = dwSize; // Missing in Communicator code!
|
||||
return(sMemChunk);
|
||||
|
||||
#endif // WIN32
|
||||
}
|
||||
|
||||
//
|
||||
// *open existing* shared memory chunk
|
||||
// once you have the pointer to the new segment
|
||||
// use this pointer to access data, e.g.:
|
||||
//
|
||||
CSharedMem *
|
||||
NSOpenExistingSharedMemory(LPCTSTR memName, HANDLE *hSharedMemory)
|
||||
{
|
||||
#ifdef WIN32
|
||||
CSharedMem *pData;
|
||||
DWORD dwSize;
|
||||
|
||||
LPCTSTR szObjectName = memName;
|
||||
*hSharedMemory = OpenFileMapping(
|
||||
FILE_MAP_WRITE,FALSE,szObjectName);
|
||||
if(*hSharedMemory == 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pData = (CSharedMem *)MapViewOfFile(
|
||||
*hSharedMemory,FILE_MAP_ALL_ACCESS,0,0,0);
|
||||
if(pData == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dwSize = pData->m_dwSize;
|
||||
return pData;
|
||||
#else
|
||||
|
||||
return(NULL); // In Win16, this is really meaningless...
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
//
|
||||
// to close shared memory segment
|
||||
//
|
||||
void
|
||||
NSCloseSharedMemory(CSharedMem *pData, HANDLE hSharedMemory)
|
||||
{
|
||||
#ifdef WIN32
|
||||
if(pData != 0)
|
||||
{
|
||||
UnmapViewOfFile(pData);
|
||||
pData = 0;
|
||||
}
|
||||
|
||||
if(hSharedMemory != 0)
|
||||
{
|
||||
CloseHandle(hSharedMemory);
|
||||
hSharedMemory = 0;
|
||||
}
|
||||
#else
|
||||
|
||||
if (pData != NULL)
|
||||
{
|
||||
GlobalFreePtr(pData);
|
||||
pData = NULL;
|
||||
}
|
||||
|
||||
#endif // WIN32
|
||||
}
|
||||
116
mozilla/mailnews/mapi/old/lib/mapismem.h
Normal file
116
mozilla/mailnews/mapi/old/lib/mapismem.h
Normal file
@@ -0,0 +1,116 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#ifndef __SMEM_HPP__
|
||||
#define __SMEM_HPP__
|
||||
|
||||
//
|
||||
// Need this for Win16 since it is an undocumented message
|
||||
//
|
||||
#ifndef WIN32
|
||||
|
||||
#define WM_COPYDATA 0x004A
|
||||
|
||||
/*
|
||||
* lParam of WM_COPYDATA message points to...
|
||||
*/
|
||||
typedef struct tagCOPYDATASTRUCT {
|
||||
DWORD dwData;
|
||||
DWORD cbData;
|
||||
LPVOID lpData;
|
||||
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
|
||||
|
||||
# ifndef LPCTSTR
|
||||
# define LPCTSTR LPCSTR
|
||||
# endif
|
||||
|
||||
|
||||
#endif // ifndef WIN32
|
||||
|
||||
// The following structure will be stored in the shared memory
|
||||
// and will be used to pass data back and forth
|
||||
|
||||
#pragma pack(4)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD m_dwSize; // size of the shared memory block
|
||||
BYTE m_buf[1]; // this is the buffer of memory to be used
|
||||
} CSharedMem;
|
||||
|
||||
#pragma pack(4)
|
||||
|
||||
// ******************************************************
|
||||
// Public routines...
|
||||
// ******************************************************
|
||||
//
|
||||
//
|
||||
// *create new* shared memory chunk
|
||||
// once this is created, use the pointer
|
||||
// to the segment to to store data
|
||||
// e.g.:
|
||||
// lpString = "string for communicator";
|
||||
// lstrcpy((LPSTR)pData->m_buf[0], lpString);
|
||||
// pData->m_dwBytesUsed = lstrlen(lpString) + 1; // count '\0'
|
||||
//
|
||||
CSharedMem *
|
||||
NSCreateSharedMemory(DWORD memSize, LPCTSTR memName, HANDLE *hSharedMemory);
|
||||
|
||||
//
|
||||
// *open existing* shared memory chunk
|
||||
// once you have the pointer to the new segment
|
||||
// use this pointer to access data, e.g.:
|
||||
//
|
||||
// This will return the pointer to the memory chunk as well as
|
||||
// fill out the hSharedMemory argument that is needed for subsequent
|
||||
// operations.
|
||||
//
|
||||
// if(pData->m_dwBytesUsed > 0)
|
||||
// {
|
||||
// // use pData->m_buf here
|
||||
// }
|
||||
//
|
||||
CSharedMem *
|
||||
NSOpenExistingSharedMemory(LPCTSTR memName, HANDLE *hSharedMemory);
|
||||
|
||||
//
|
||||
// You must pass in the pointer to the memory chunk as well as
|
||||
// the hSharedMemory HANDLE to close shared memory segment
|
||||
//
|
||||
void
|
||||
NSCloseSharedMemory(CSharedMem *pData, HANDLE hSharedMemory);
|
||||
|
||||
#endif // __SMEM_HPP__
|
||||
230
mozilla/mailnews/mapi/old/lib/nsstrseq.cpp
Normal file
230
mozilla/mailnews/mapi/old/lib/nsstrseq.cpp
Normal file
@@ -0,0 +1,230 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// This is a string sequence handling routine to take complex
|
||||
// structures and merge them into a chunk of memory.
|
||||
//
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
|
||||
#include "nsstrseq.h"
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL '\0'
|
||||
#endif
|
||||
|
||||
#define MARKER '\377'
|
||||
|
||||
//
|
||||
// Delete an existing string sequence
|
||||
//
|
||||
void NSStrSeqDelete(NSstringSeq seq)
|
||||
{
|
||||
if (seq != NULL)
|
||||
free(seq);
|
||||
|
||||
seq = NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// Allocate a new sequence, copying the given strings into it.
|
||||
//
|
||||
NSstringSeq NSStrSeqNew(LPSTR strings[])
|
||||
{
|
||||
int size;
|
||||
if (!strings)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
{
|
||||
int i;
|
||||
for (i=0,size=0; strings[i]; i++)
|
||||
{
|
||||
size+=strlen(strings[i])+1;
|
||||
switch (strings[i][0])
|
||||
{
|
||||
// Need to pad "" or anything starting with 255
|
||||
// to allow for multiple blank strings in a row
|
||||
case 0:
|
||||
case MARKER:
|
||||
size++;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
NSstringSeq s=(NSstringSeq)malloc(size+1);
|
||||
if (!s)
|
||||
{ return NULL;}
|
||||
|
||||
{
|
||||
int i,offset;
|
||||
for (i=0,offset=0; strings[i]; i++)
|
||||
{
|
||||
switch (strings[i][0])
|
||||
{
|
||||
// Need to pad "" or anything starting with 255
|
||||
case 0:
|
||||
case MARKER:
|
||||
s[offset++]=MARKER;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
strcpy(s+offset,strings[i]);
|
||||
offset+=strlen(strings[i])+1;
|
||||
}
|
||||
s[offset]=0;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Get the # of bytes required for the sequence
|
||||
//
|
||||
LONG NSStrSeqSize(NSstringSeq seq)
|
||||
{
|
||||
const char* s;
|
||||
if (!seq)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (s=seq+1; ((*s) || (*(s-1))); s++)
|
||||
;
|
||||
|
||||
// At this point, s points to the second 0
|
||||
// of the double 0 at the end
|
||||
return (s-seq)+1;
|
||||
}
|
||||
|
||||
//
|
||||
// Get the # of strings in the sequence
|
||||
//
|
||||
LONG NSStrSeqNumStrs(NSstringSeq seq)
|
||||
{
|
||||
const char* s;
|
||||
int N;
|
||||
if (!seq)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (s=seq+1,N=0; ((*s) || (*(s-1))); s++)
|
||||
{
|
||||
if (!(*s))
|
||||
N++;
|
||||
}
|
||||
|
||||
return N;
|
||||
}
|
||||
|
||||
static LPSTR correct(LPSTR s)
|
||||
{
|
||||
if (s[0]==MARKER)
|
||||
return s+1;
|
||||
else // Anup , 4/96
|
||||
return s;
|
||||
}
|
||||
|
||||
//
|
||||
// Extract the index'th string in the sequence
|
||||
//
|
||||
LPSTR NSStrSeqGet(NSstringSeq seq, LONG index)
|
||||
{
|
||||
char* s;
|
||||
int N;
|
||||
|
||||
if (!seq)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (index<0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!index)
|
||||
return correct(seq);
|
||||
|
||||
for (s=seq+1,N=0; ((*s) || (*(s-1))) && (N<index); s++)
|
||||
{
|
||||
if (!(*s))
|
||||
N++;
|
||||
}
|
||||
|
||||
if (N==index)
|
||||
return correct(s);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
LPSTR * NSStrSeqGetAll(NSstringSeq seq)
|
||||
{
|
||||
LONG N=NSStrSeqNumStrs(seq);
|
||||
if (N<0)
|
||||
return NULL;
|
||||
|
||||
{
|
||||
char** res=(char**)malloc( (size_t) ((N+1)*sizeof(char*)) );
|
||||
int i;
|
||||
|
||||
if (!res)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
for (i=0; i<N; i++)
|
||||
res[i]=NSStrSeqGet(seq,i);
|
||||
res[N]=NULL;
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -1,71 +1,68 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is the Netscape Portable Runtime (NSPR).
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998-2000
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#ifndef __SEQUENCES_OF_STRINGS_H_
|
||||
#define __SEQUENCES_OF_STRINGS_H
|
||||
|
||||
/*
|
||||
** File: ptmisc.c
|
||||
** Descritpion: Implemenation of miscellaneous methods for pthreads
|
||||
*/
|
||||
|
||||
#if defined(_PR_PTHREADS)
|
||||
typedef LPSTR NSstringSeq;
|
||||
|
||||
#include "primpl.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#ifdef SOLARIS
|
||||
#include <thread.h>
|
||||
#endif
|
||||
|
||||
#define PT_LOG(f)
|
||||
|
||||
void _PR_InitCPUs(void) {PT_LOG("_PR_InitCPUs")}
|
||||
void _PR_InitStacks(void) {PT_LOG("_PR_InitStacks")}
|
||||
|
||||
PR_IMPLEMENT(void) PR_SetConcurrency(PRUintn numCPUs)
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#ifdef SOLARIS
|
||||
thr_setconcurrency(numCPUs);
|
||||
#else
|
||||
PT_LOG("PR_SetConcurrency");
|
||||
#endif
|
||||
|
||||
void NSStrSeqDelete(NSstringSeq seq);
|
||||
NSstringSeq NSStrSeqNew(LPSTR strings[]);
|
||||
|
||||
// Get the # of bytes required for the sequence
|
||||
LONG NSStrSeqSize(NSstringSeq seq);
|
||||
|
||||
// Get the # of strings in the sequence
|
||||
LONG NSStrSeqNumStrs(NSstringSeq seq);
|
||||
|
||||
// Extract the index'th string in the sequence
|
||||
LPSTR NSStrSeqGet(NSstringSeq seq, LONG index);
|
||||
|
||||
// Build an array of all the strings in the sequence
|
||||
LPSTR *NSStrSeqGetAll(NSstringSeq seq);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
PR_IMPLEMENT(void) PR_SetThreadRecycleMode(PRUint32 flag)
|
||||
{PT_LOG("PR_SetThreadRecycleMode")}
|
||||
|
||||
#endif /* defined(_PR_PTHREADS) */
|
||||
|
||||
/* ptmisc.c */
|
||||
#endif // __sequences_of_strings_h_
|
||||
26
mozilla/mailnews/mapi/old/makefile.win
Normal file
26
mozilla/mailnews/mapi/old/makefile.win
Normal file
@@ -0,0 +1,26 @@
|
||||
#!nmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
|
||||
DEPTH=..\..
|
||||
|
||||
DIRS=public lib mapi32 tests hook
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
100
mozilla/mailnews/mapi/old/mapi32/maindll.cpp
Normal file
100
mozilla/mailnews/mapi/old/mapi32/maindll.cpp
Normal file
@@ -0,0 +1,100 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// DLLMain to get a handle on an hInstance
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
#include <windows.h>
|
||||
|
||||
//
|
||||
// global variables
|
||||
//
|
||||
HINSTANCE hInstance;
|
||||
|
||||
//
|
||||
// DLL entry
|
||||
//
|
||||
#ifdef WIN32
|
||||
/****************************************************************************
|
||||
FUNCTION: DllMain(HANDLE, DWORD, LPVOID)
|
||||
|
||||
PURPOSE: DllMain is called by Windows when
|
||||
the DLL is initialized, Thread Attached, and other times.
|
||||
Refer to SDK documentation, as to the different ways this
|
||||
may be called.
|
||||
|
||||
The DllMain function should perform additional initialization
|
||||
tasks required by the DLL. In this example, no initialization
|
||||
tasks are required. DllMain should return a value of 1 if
|
||||
the initialization is successful.
|
||||
|
||||
*******************************************************************************/
|
||||
BOOL APIENTRY DllMain(HANDLE hInstLocal, DWORD ul_reason_being_called, LPVOID lpReserved)
|
||||
{
|
||||
hInstance = (HINSTANCE)hInstLocal;
|
||||
|
||||
if (hInstance != NULL)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else // WIN16
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// LibMain( hInstance, wDataSegment, wHeapSize, lpszCmdLine ) : WORD
|
||||
//
|
||||
// hInstance library instance handle
|
||||
// wDataSegment library data segment
|
||||
// wHeapSize default heap size
|
||||
// lpszCmdLine command line arguments
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
int CALLBACK LibMain(HINSTANCE hInstLocal, WORD wDataSegment, WORD wHeapSize, LPSTR lpszCmdLine)
|
||||
{
|
||||
hInstance = hInstLocal;
|
||||
/* return result 1 = success; 0 = fail */
|
||||
if (hInstance != NULL)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif // WIN16
|
||||
|
||||
70
mozilla/mailnews/mapi/old/mapi32/makefile.win
Normal file
70
mozilla/mailnews/mapi/old/mapi32/makefile.win
Normal file
@@ -0,0 +1,70 @@
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
|
||||
DEPTH=..\..\..
|
||||
MODULE=mapi32
|
||||
|
||||
################################################################################
|
||||
## exports
|
||||
|
||||
#EXPORTS =
|
||||
|
||||
|
||||
################################################################################
|
||||
## library
|
||||
|
||||
LIBNAME = .\$(OBJDIR)\mapi32
|
||||
DEFINES= -NS_DEBUG
|
||||
DEFFILE=MAPI32.def
|
||||
|
||||
!ifdef MOZ_STATIC_COMPONENT_LIBS
|
||||
LIB = $(LIBNAME).lib
|
||||
!else
|
||||
DLL = $(LIBNAME).dll
|
||||
!endif
|
||||
|
||||
OBJS= \
|
||||
.\$(OBJDIR)\maindll.obj \
|
||||
.\$(OBJDIR)\mapi32.obj \
|
||||
.\$(OBJDIR)\mapiipc.obj \
|
||||
.\$(OBJDIR)\mapimem.obj \
|
||||
.\$(OBJDIR)\mapiutl.obj \
|
||||
.\$(OBJDIR)\smem.obj \
|
||||
.\$(OBJDIR)\trace.obj \
|
||||
.\$(OBJDIR)\xpapi.obj \
|
||||
$(NULL)
|
||||
|
||||
LLIBS= \
|
||||
$(LLIBS) \
|
||||
$(LIBNSPR) \
|
||||
$(DIST)\lib\xppref32.lib \
|
||||
$(DIST)\lib\xpcom.lib \
|
||||
$(DIST)\lib\mapiutils_s.lib \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
!ifdef MOZ_STATIC_COMPONENT_LIBS
|
||||
install:: $(LIB)
|
||||
$(MAKE_INSTALL) $(LIBNAME).$(LIB_SUFFIX) $(DIST)\bin\components
|
||||
!else
|
||||
install:: $(DLL)
|
||||
$(MAKE_INSTALL) $(LIBNAME).$(DLL_SUFFIX) $(DIST)\bin\components
|
||||
!endif
|
||||
2291
mozilla/mailnews/mapi/old/mapi32/mapi32.cpp
Normal file
2291
mozilla/mailnews/mapi/old/mapi32/mapi32.cpp
Normal file
File diff suppressed because it is too large
Load Diff
14
mozilla/mailnews/mapi/old/mapi32/mapi32.def
Normal file
14
mozilla/mailnews/mapi/old/mapi32/mapi32.def
Normal file
@@ -0,0 +1,14 @@
|
||||
EXPORTS
|
||||
MAPILogon
|
||||
MAPILogoff
|
||||
MAPISendMail
|
||||
MAPISendDocuments
|
||||
MAPIFreeBuffer
|
||||
MAPIFindNext
|
||||
MAPIReadMail
|
||||
MAPISaveMail
|
||||
MAPIDeleteMail
|
||||
MAPIAddress
|
||||
MAPIDetails
|
||||
MAPIResolveName
|
||||
MAPIGetNetscapeVersion
|
||||
146
mozilla/mailnews/mapi/old/mapi32/mapi32.rc
Normal file
146
mozilla/mailnews/mapi/old/mapi32/mapi32.rc
Normal file
@@ -0,0 +1,146 @@
|
||||
// Insert copyright and license here 1997
|
||||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
ID_DIALOG_MAPI DIALOGEX 0, 0, 186, 111
|
||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
EXSTYLE WS_EX_TOOLWINDOW
|
||||
CAPTION "Netscape MAPI Support"
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "OK",IDOK,41,95,50,14
|
||||
PUSHBUTTON "Cancel",IDCANCEL,104,95,50,14
|
||||
GROUPBOX "Diagnostic Information",IDC_STATIC,2,2,182,91
|
||||
CTEXT "This window will contain MAPI relative\ninformation for Netscape Communicator",
|
||||
IDC_STATIC,11,14,159,30
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DESIGNINFO
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO DISCARDABLE
|
||||
BEGIN
|
||||
ID_DIALOG_MAPI, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 2
|
||||
RIGHTMARGIN, 184
|
||||
TOPMARGIN, 2
|
||||
BOTTOMMARGIN, 109
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
#ifndef _MAC
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 5,0,0,1
|
||||
PRODUCTVERSION 5,0,0,1
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x40004L
|
||||
FILETYPE 0x2L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "Comments", "Simple MAPI DLL\0"
|
||||
VALUE "CompanyName", "Netscape Communications Corporation\0"
|
||||
VALUE "FileDescription", "mapi32\0"
|
||||
VALUE "FileVersion", "5, 0, 0, 1\0"
|
||||
VALUE "InternalName", "mapi32\0"
|
||||
VALUE "LegalCopyright", "Copyright © 1997\0"
|
||||
VALUE "LegalTrademarks", "Netscape and Netscape Navigator are registered trademarks of Netscape Communications Corporation.\0"
|
||||
VALUE "OriginalFilename", "mapi32.dll\0"
|
||||
VALUE "ProductName", "Netscape Communications Simple MAPI\0"
|
||||
VALUE "ProductVersion", "5, 0, 0, 1\0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
|
||||
#endif // !_MAC
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
||||
249
mozilla/mailnews/mapi/old/mapi32/mapiipc.cpp
Normal file
249
mozilla/mailnews/mapi/old/mapi32/mapiipc.cpp
Normal file
@@ -0,0 +1,249 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// MAPI IPC Routines
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
#include <nscpmapi.h> // Should live in Communicator
|
||||
|
||||
#include "resource.h"
|
||||
#include "mapiipc.h"
|
||||
#include "mapismem.h"
|
||||
#include "trace.h"
|
||||
|
||||
#ifndef WIN32
|
||||
#include <string.h>
|
||||
#endif
|
||||
|
||||
//
|
||||
// Necessary variables...
|
||||
//
|
||||
static LONG instanceCount = 0;
|
||||
HWND hWndMAPI = NULL;
|
||||
char szClassName[] = "NetscapeMAPIClient";
|
||||
char szWindowName[] = "NetscapeMAPI";
|
||||
|
||||
//
|
||||
// External declares...
|
||||
//
|
||||
extern HINSTANCE hInstance;
|
||||
|
||||
void
|
||||
ProcessCommand(HWND hWnd, int id, HWND hCtl, UINT codeNotify)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case IDOK:
|
||||
case IDCANCEL:
|
||||
{
|
||||
ShowWindow(hWnd, SW_HIDE);
|
||||
}
|
||||
|
||||
default:
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL CALLBACK LOADDS
|
||||
MyDlgProc(HWND hWndMain, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (wMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
hWndMAPI = hWndMain;
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_CLOSE:
|
||||
// DestroyWindow(hWndMain);
|
||||
break;
|
||||
|
||||
case WM_DESTROY:
|
||||
hWndMain = NULL;
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
HANDLE_WM_COMMAND(hWndMAPI, wParam, lParam, ProcessCommand);
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL
|
||||
InitInstance(HINSTANCE hInstance)
|
||||
{
|
||||
//
|
||||
// Create a main window for this application instance.
|
||||
//
|
||||
/* RICHIE - TRY SOME CHANGES!!!
|
||||
hWndMAPI = CreateDialog((HINSTANCE) hInstance,
|
||||
MAKEINTRESOURCE(ID_DIALOG_QAHOOK),
|
||||
(HWND) NULL, (DLGPROC) MyDlgProc);
|
||||
******/
|
||||
hWndMAPI = CreateWindow(
|
||||
szClassName, // pointer to registered class name
|
||||
szWindowName, // pointer to window name
|
||||
WS_CHILD, // window style
|
||||
-10, // horizontal position of window
|
||||
-10, // vertical position of window
|
||||
1, // window width
|
||||
1, // window height
|
||||
GetDesktopWindow(), // handle to parent or owner window
|
||||
NULL, // handle to menu or child-window identifier
|
||||
hInstance, // handle to application instance
|
||||
NULL // pointer to window-creation data
|
||||
);
|
||||
if (!hWndMAPI)
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL
|
||||
InitApp(void)
|
||||
{
|
||||
#ifdef WIN32
|
||||
WNDCLASS wc;
|
||||
wc.style = 0;
|
||||
wc.lpfnWndProc = DefDlgProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = DLGWINDOWEXTRA;
|
||||
wc.hInstance = hInstance;
|
||||
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ID_ICON_APP));
|
||||
wc.hCursor = LoadCursor(0, IDC_ARROW);
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = szClassName;
|
||||
|
||||
if(!RegisterClass(&wc))
|
||||
return FALSE;
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
} // end InitApp
|
||||
|
||||
BOOL
|
||||
InitDLL(void)
|
||||
{
|
||||
if (hWndMAPI != NULL)
|
||||
return TRUE;
|
||||
|
||||
if (!InitApp())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!InitInstance(hInstance))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// ShowWindow(hWndMAPI, SW_SHOW); Just for jollies
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
//*************************************************************
|
||||
//* Calls exposed for rest of DLL...
|
||||
//*************************************************************
|
||||
//
|
||||
// Purpose: Open the API
|
||||
// Return: 1 on success
|
||||
// 0 on failure
|
||||
//
|
||||
DWORD nsMAPI_OpenAPI(void)
|
||||
{
|
||||
if (instanceCount > 0)
|
||||
{
|
||||
return(1);
|
||||
}
|
||||
|
||||
++instanceCount;
|
||||
return(1);
|
||||
}
|
||||
|
||||
//
|
||||
// Purpose: Close the API
|
||||
//
|
||||
void nsMAPI_CloseAPI(void)
|
||||
{
|
||||
--instanceCount;
|
||||
if (instanceCount <= 0)
|
||||
{
|
||||
instanceCount = 0;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Send the actual request to Communicator
|
||||
//
|
||||
LRESULT
|
||||
SendMAPIRequest(HWND hWnd,
|
||||
DWORD mapiRequestID,
|
||||
MAPIIPCType *ipcInfo)
|
||||
{
|
||||
LRESULT returnVal = 0;
|
||||
COPYDATASTRUCT cds;
|
||||
|
||||
if (!InitDLL())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
cds.dwData = mapiRequestID;
|
||||
cds.cbData = sizeof(MAPIIPCType);
|
||||
cds.lpData = ipcInfo;
|
||||
|
||||
// Make the call into Communicator
|
||||
returnVal = SendMessage(hWnd, WM_COPYDATA, (WPARAM) hWndMAPI, (LPARAM) &cds);
|
||||
|
||||
// Now kill the window...
|
||||
DestroyWindow(hWndMAPI);
|
||||
hWndMAPI = NULL;
|
||||
UnregisterClass(szClassName, hInstance);
|
||||
|
||||
return returnVal;
|
||||
}
|
||||
@@ -1,57 +1,63 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is the Netscape Portable Runtime (NSPR).
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998-2000
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#ifndef __MAPIIPC_HPP__
|
||||
#define __MAPIIPC_HPP__
|
||||
|
||||
#include "plstr.h"
|
||||
#include <string.h>
|
||||
#include "port.h"
|
||||
#include <nscpmapi.h>
|
||||
|
||||
PR_IMPLEMENT(PRIntn)
|
||||
PL_strcmp(const char *a, const char *b)
|
||||
{
|
||||
if( ((const char *)0 == a) || (const char *)0 == b )
|
||||
return (PRIntn)(a-b);
|
||||
//********************************************************
|
||||
// Open and close functions for API
|
||||
//********************************************************
|
||||
// Open the API
|
||||
// Return: 1 on success, 0 on failure
|
||||
//
|
||||
DWORD nsMAPI_OpenAPI(void);
|
||||
|
||||
return (PRIntn)strcmp(a, b);
|
||||
}
|
||||
//
|
||||
// Purpose: Close the API
|
||||
//
|
||||
void nsMAPI_CloseAPI(void);
|
||||
|
||||
PR_IMPLEMENT(PRIntn)
|
||||
PL_strncmp(const char *a, const char *b, PRUint32 max)
|
||||
{
|
||||
if( ((const char *)0 == a) || (const char *)0 == b )
|
||||
return (PRIntn)(a-b);
|
||||
//
|
||||
// Send the actual request to Communicator
|
||||
//
|
||||
LRESULT SendMAPIRequest(HWND hWnd,
|
||||
DWORD mapiRequestID,
|
||||
MAPIIPCType *ipcInfo);
|
||||
|
||||
return (PRIntn)strncmp(a, b, (size_t)max);
|
||||
}
|
||||
#endif // __MAPIIPC_HPP__
|
||||
363
mozilla/mailnews/mapi/old/mapi32/mapimem.cpp
Normal file
363
mozilla/mailnews/mapi/old/mapi32/mapimem.cpp
Normal file
@@ -0,0 +1,363 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// mem.cpp
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
// This implements various memory management functions for use with
|
||||
// MAPI features of Communicator
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <memory.h>
|
||||
#include <malloc.h>
|
||||
#include "mapimem.h"
|
||||
#include <nscpmapi.h> // lives in communicator winfe
|
||||
#include "nsstrseq.h"
|
||||
#include "trace.h"
|
||||
#include "mapiutl.h"
|
||||
#include "xpapi.h"
|
||||
|
||||
LPSTR
|
||||
CheckNullString(LPSTR inStr)
|
||||
{
|
||||
static UCHAR str[1];
|
||||
|
||||
str[0] = '\0';
|
||||
if (inStr == NULL)
|
||||
return((LPSTR)str);
|
||||
else
|
||||
return(inStr);
|
||||
}
|
||||
|
||||
void
|
||||
FreeMAPIFile(lpMapiFileDesc pv)
|
||||
{
|
||||
if (!pv)
|
||||
return;
|
||||
|
||||
if (pv->lpszPathName != NULL)
|
||||
free(pv->lpszPathName);
|
||||
|
||||
if (pv->lpszFileName != NULL)
|
||||
free(pv->lpszFileName);
|
||||
}
|
||||
|
||||
void
|
||||
FreeMAPIMessage(lpMapiMessage pv)
|
||||
{
|
||||
ULONG i;
|
||||
|
||||
if (!pv)
|
||||
return;
|
||||
|
||||
if (pv->lpszSubject != NULL)
|
||||
free(pv->lpszSubject);
|
||||
|
||||
if (pv->lpszNoteText)
|
||||
free(pv->lpszNoteText);
|
||||
|
||||
if (pv->lpszMessageType)
|
||||
free(pv->lpszMessageType);
|
||||
|
||||
if (pv->lpszDateReceived)
|
||||
free(pv->lpszDateReceived);
|
||||
|
||||
if (pv->lpszConversationID)
|
||||
free(pv->lpszConversationID);
|
||||
|
||||
if (pv->lpOriginator)
|
||||
FreeMAPIRecipient(pv->lpOriginator);
|
||||
|
||||
for (i=0; i<pv->nRecipCount; i++)
|
||||
{
|
||||
if (&(pv->lpRecips[i]) != NULL)
|
||||
{
|
||||
FreeMAPIRecipient(&(pv->lpRecips[i]));
|
||||
}
|
||||
}
|
||||
|
||||
if (pv->lpRecips != NULL)
|
||||
{
|
||||
free(pv->lpRecips);
|
||||
}
|
||||
|
||||
for (i=0; i<pv->nFileCount; i++)
|
||||
{
|
||||
if (&(pv->lpFiles[i]) != NULL)
|
||||
{
|
||||
FreeMAPIFile(&(pv->lpFiles[i]));
|
||||
}
|
||||
}
|
||||
|
||||
if (pv->lpFiles != NULL)
|
||||
{
|
||||
free(pv->lpFiles);
|
||||
}
|
||||
|
||||
free(pv);
|
||||
pv = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
FreeMAPIRecipient(lpMapiRecipDesc pv)
|
||||
{
|
||||
if (!pv)
|
||||
return;
|
||||
|
||||
if (pv->lpszName != NULL)
|
||||
free(pv->lpszName);
|
||||
|
||||
if (pv->lpszAddress != NULL)
|
||||
free(pv->lpszAddress);
|
||||
|
||||
if (pv->lpEntryID != NULL)
|
||||
free(pv->lpEntryID);
|
||||
}
|
||||
|
||||
//
|
||||
// This routine will take an lpMapiMessage structure and "flatten" it into
|
||||
// one contiguous chunk of memory that can be easily passed around. After this
|
||||
// is done, "extract" routines will be written to get complicated string routines
|
||||
// out of the chunk of memory at the end.
|
||||
//
|
||||
LPVOID
|
||||
FlattenMAPIMessageStructure(lpMapiMessage msg, DWORD *totalSize)
|
||||
{
|
||||
MAPISendMailType *mailPtr;
|
||||
LPSTR *strArray;
|
||||
DWORD strCount = 0;
|
||||
DWORD currentString = 0;
|
||||
DWORD arrayBufSize = 0;
|
||||
DWORD i;
|
||||
|
||||
*totalSize = 0;
|
||||
if (!msg)
|
||||
return(NULL);
|
||||
|
||||
//
|
||||
// Allocate the initial structure to hold all of the mail info.
|
||||
//
|
||||
*totalSize = sizeof(MAPISendMailType);
|
||||
mailPtr = (MAPISendMailType *) malloc(sizeof(MAPISendMailType));
|
||||
if (!mailPtr)
|
||||
return(NULL);
|
||||
memset(mailPtr, 0, sizeof(MAPISendMailType));
|
||||
|
||||
//
|
||||
// First, assign all of the easy numeric values...
|
||||
//
|
||||
mailPtr->MSG_flFlags = msg->flFlags; // unread,return receipt
|
||||
mailPtr->MSG_nRecipCount = msg->nRecipCount; // Number of recipients
|
||||
mailPtr->MSG_nFileCount = msg->nFileCount; // # of file attachments
|
||||
if (msg->lpOriginator != NULL)
|
||||
{
|
||||
mailPtr->MSG_ORIG_ulRecipClass = msg->lpOriginator->ulRecipClass; // Recipient class - MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG
|
||||
}
|
||||
|
||||
//
|
||||
// Now, figure out how many string pointers we need...
|
||||
//
|
||||
strCount = 4; // These are the 4 KNOWN strings up front for a message
|
||||
strCount += 2; // This is for the originator name and address
|
||||
|
||||
strCount += msg->nRecipCount * 3; // Name, address & class (cc, bcc) for each recipient
|
||||
strCount += msg->nFileCount * 2; // filename and display name for each attachment
|
||||
|
||||
//
|
||||
// Now allocate a new string sequence...add one entry for NULL at the end
|
||||
//
|
||||
arrayBufSize = sizeof(LPSTR) * (strCount + 1);
|
||||
|
||||
#ifdef WIN16 // Check for max mem allocation...
|
||||
if ((sizeof(MAPISendMailType) + arrayBufSize) > 64000)
|
||||
{
|
||||
free(mailPtr);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
//
|
||||
// Allocate a buffer for the string pointers and if this fails,
|
||||
// cleanup and return.
|
||||
//
|
||||
strArray = (LPSTR *)malloc( (size_t) arrayBufSize);
|
||||
if (!strArray)
|
||||
{
|
||||
free(mailPtr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(strArray, 0, (size_t) arrayBufSize); // Set the array to NULL
|
||||
strArray[currentString++] = CheckNullString(msg->lpszSubject); // Message Subject
|
||||
strArray[currentString++] = CheckNullString(msg->lpszNoteText); // Message Text
|
||||
strArray[currentString++] = CheckNullString(msg->lpszDateReceived); // in YYYY/MM/DD HH:MM format
|
||||
strArray[currentString++] = CheckNullString(msg->lpszConversationID); // conversation thread ID
|
||||
|
||||
if (msg->lpOriginator)
|
||||
{
|
||||
strArray[currentString++] = CheckNullString(msg->lpOriginator[0].lpszName);
|
||||
strArray[currentString++] = CheckNullString(msg->lpOriginator[0].lpszAddress);
|
||||
}
|
||||
else
|
||||
{
|
||||
strArray[currentString++] = CheckNullString(NULL);
|
||||
strArray[currentString++] = CheckNullString(NULL);
|
||||
}
|
||||
|
||||
//
|
||||
// Assign pointers for the Name and address of each recipient
|
||||
//
|
||||
LPSTR toString = "1";
|
||||
LPSTR ccString = "2";
|
||||
LPSTR bccString = "3";
|
||||
|
||||
for (i=0; i<msg->nRecipCount; i++)
|
||||
{
|
||||
// rhp - need message class
|
||||
if (msg->lpRecips[i].ulRecipClass == MAPI_BCC)
|
||||
strArray[currentString++] = CheckNullString(bccString);
|
||||
else if (msg->lpRecips[i].ulRecipClass == MAPI_CC)
|
||||
strArray[currentString++] = CheckNullString(ccString);
|
||||
else
|
||||
strArray[currentString++] = CheckNullString(toString);
|
||||
|
||||
strArray[currentString++] = CheckNullString(msg->lpRecips[i].lpszName);
|
||||
strArray[currentString++] = CheckNullString(msg->lpRecips[i].lpszAddress);
|
||||
}
|
||||
|
||||
BYTE szNewFileName[_MAX_PATH];
|
||||
|
||||
for (i=0; i<msg->nFileCount; i++)
|
||||
{
|
||||
char *namePtr;
|
||||
// have to copy/create temp files here of office won't work...
|
||||
|
||||
if (
|
||||
(msg->lpFiles[i].lpszFileName != NULL) &&
|
||||
(*msg->lpFiles[i].lpszFileName != '\0')
|
||||
)
|
||||
{
|
||||
namePtr = (char *)msg->lpFiles[i].lpszFileName;
|
||||
}
|
||||
else
|
||||
{
|
||||
namePtr = (char *)msg->lpFiles[i].lpszPathName;
|
||||
}
|
||||
|
||||
if (GetTempMailNameWithExtension((char *)szNewFileName, namePtr) == 0)
|
||||
{
|
||||
free(strArray);
|
||||
free(mailPtr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!XP_CopyFile((char *)msg->lpFiles[i].lpszPathName, (char *)szNewFileName, TRUE))
|
||||
{
|
||||
free(strArray);
|
||||
free(mailPtr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
strArray[currentString++] = CheckNullString((char *)szNewFileName);
|
||||
strArray[currentString++] = CheckNullString(msg->lpFiles[i].lpszFileName);
|
||||
|
||||
AddTempFile((LPSTR) szNewFileName);
|
||||
// strArray[currentString++] = CheckNullString(msg->lpFiles[i].lpszPathName);
|
||||
// strArray[currentString++] = CheckNullString(msg->lpFiles[i].lpszFileName);
|
||||
}
|
||||
|
||||
if (currentString != strCount)
|
||||
{
|
||||
TRACE("MAPI PROBLEM!!!!!! FlattenMAPIMessageStructure() currentString != strCount\n");
|
||||
}
|
||||
|
||||
strArray[strCount] = NULL; // terminate at the end
|
||||
NSstringSeq strSeq = NSStrSeqNew(strArray);
|
||||
if (!strSeq)
|
||||
{
|
||||
free(strArray);
|
||||
free(mailPtr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// Now we need to copy the structure into a big, contiguous chunk of memory
|
||||
//
|
||||
LONG totalArraySize = NSStrSeqSize(strSeq);
|
||||
LONG totalMemSize = sizeof(MAPISendMailType) + totalArraySize;
|
||||
|
||||
#ifdef WIN16
|
||||
if (totalMemSize > 64000)
|
||||
{
|
||||
free(strArray);
|
||||
NSStrSeqDelete(strSeq);
|
||||
free(mailPtr);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
MAPISendMailType *newMailPtr = (MAPISendMailType *)malloc((size_t)totalMemSize);
|
||||
if (!newMailPtr)
|
||||
{
|
||||
free(strArray);
|
||||
NSStrSeqDelete(strSeq);
|
||||
free(mailPtr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(newMailPtr, 0, (size_t) totalMemSize);
|
||||
//
|
||||
// Finally do the copy...
|
||||
//
|
||||
memcpy(newMailPtr, mailPtr, sizeof(MAPISendMailType));
|
||||
memcpy(newMailPtr->dataBuf, strSeq, (size_t) totalArraySize);
|
||||
*totalSize = totalMemSize;
|
||||
|
||||
//
|
||||
// Cleanup and scram...
|
||||
//
|
||||
if (strArray)
|
||||
free(strArray);
|
||||
|
||||
if (strSeq)
|
||||
NSStrSeqDelete(strSeq);
|
||||
|
||||
if (mailPtr)
|
||||
free(mailPtr);
|
||||
|
||||
return(newMailPtr);
|
||||
}
|
||||
76
mozilla/mailnews/mapi/old/mapi32/mapimem.h
Normal file
76
mozilla/mailnews/mapi/old/mapi32/mapimem.h
Normal file
@@ -0,0 +1,76 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#ifndef __MY_MEM_HPP__
|
||||
#define __MY_MEM_HPP__
|
||||
|
||||
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
|
||||
#include <mapi.h>
|
||||
#endif
|
||||
|
||||
//
|
||||
// Needed for turning NULL's into ""'s for string sequence routines...
|
||||
//
|
||||
LPSTR CheckNullString(LPSTR inStr);
|
||||
|
||||
//
|
||||
// Memory allocation functions...
|
||||
//
|
||||
|
||||
//
|
||||
// This will free an lpMapiMessage structure allocated by this DLL
|
||||
//
|
||||
void FreeMAPIMessage(lpMapiMessage pv);
|
||||
|
||||
//
|
||||
// This will free an lpMapiRecipDesc structure allocated by this DLL
|
||||
//
|
||||
void FreeMAPIRecipient(lpMapiRecipDesc pv);
|
||||
|
||||
//
|
||||
// Frees a mapi file object...
|
||||
//
|
||||
void FreeMAPIFile(lpMapiFileDesc pv);
|
||||
|
||||
//
|
||||
// This routine will take an lpMapiMessage structure and "flatten" it into
|
||||
// one contiguous chunk of memory that can be easily passed around.
|
||||
//
|
||||
LPVOID FlattenMAPIMessageStructure(lpMapiMessage msg, DWORD *totalSize);
|
||||
|
||||
|
||||
|
||||
#endif // __MY_MEM_HPP__
|
||||
899
mozilla/mailnews/mapi/old/mapi32/mapiutl.cpp
Normal file
899
mozilla/mailnews/mapi/old/mapi32/mapiutl.cpp
Normal file
@@ -0,0 +1,899 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// Various utils needed for the MAPI functions
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <time.h>
|
||||
#include <sys/stat.h>
|
||||
#include <io.h>
|
||||
#include "xpapi.h"
|
||||
#include "trace.h"
|
||||
#include "mapiipc.h"
|
||||
#include "mapiutl.h"
|
||||
|
||||
//
|
||||
// Global variables
|
||||
//
|
||||
BOOL gLoggingEnabled = FALSE;
|
||||
|
||||
void
|
||||
SetLoggingEnabled(BOOL val)
|
||||
{
|
||||
gLoggingEnabled = val;
|
||||
}
|
||||
|
||||
// Log File
|
||||
void
|
||||
LogString(LPCSTR pStr1)
|
||||
{
|
||||
// Off of the declaration line...
|
||||
LPCSTR pStr2 = NULL;
|
||||
BOOL useStr1 = TRUE;
|
||||
|
||||
if (gLoggingEnabled)
|
||||
{
|
||||
char tempPath[_MAX_PATH] = "";
|
||||
if (getenv("TEMP"))
|
||||
{
|
||||
lstrcpy((LPSTR) tempPath, getenv("TEMP")); // environmental variable
|
||||
}
|
||||
|
||||
int len = lstrlen(tempPath);
|
||||
if ((len > 1) && tempPath[len - 1] != '\\')
|
||||
{
|
||||
lstrcat(tempPath, "\\");
|
||||
}
|
||||
lstrcat(tempPath, szMapiLog);
|
||||
HFILE hFile = _lopen(tempPath, OF_WRITE);
|
||||
if (hFile == HFILE_ERROR)
|
||||
{
|
||||
hFile = _lcreat(tempPath, 0);
|
||||
}
|
||||
if (hFile != HFILE_ERROR)
|
||||
{
|
||||
_llseek(hFile, 0, SEEK_END); // seek to the end of the file
|
||||
LPCSTR pTemp = useStr1 ? pStr1 : pStr2;
|
||||
_lwrite(hFile, pTemp, lstrlen(pTemp));
|
||||
_lclose(hFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Find Communicator and return an HWND, if not, start Communicator,
|
||||
// then find an HWND
|
||||
//
|
||||
HWND
|
||||
GetCommunicatorIPCWindow(void)
|
||||
{
|
||||
HWND hWnd = NULL;
|
||||
DWORD timeCount = 0;
|
||||
BOOL launchTry = FALSE;
|
||||
|
||||
//
|
||||
// This will wait for 10 seconds before giving up and failing
|
||||
//
|
||||
while ((hWnd == NULL) && (timeCount < 20))
|
||||
{
|
||||
if ((hWnd = FindWindow("AfxFrameOrView", NULL)) && !FindWindow("aHiddenFrameClass", NULL))
|
||||
return(hWnd);
|
||||
else if ((hWnd = FindWindow("aHiddenFrameClass", NULL)))
|
||||
return(hWnd);
|
||||
|
||||
if (!launchTry)
|
||||
{
|
||||
char szPath[_MAX_PATH] = "";
|
||||
DWORD nMAPIERROR;
|
||||
|
||||
if ((nMAPIERROR = XP_GetInstallLocation(szPath, _MAX_PATH)) != SUCCESS_SUCCESS)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
WORD nReturn = XP_CallProcess(szPath, " -MAPICLIENT");
|
||||
launchTry = TRUE;
|
||||
}
|
||||
|
||||
//
|
||||
// Pause for 1/2 a second and try to connect again...
|
||||
//
|
||||
#ifdef WIN32
|
||||
Sleep(500);
|
||||
#else
|
||||
Yield();
|
||||
#endif
|
||||
|
||||
timeCount++;
|
||||
}
|
||||
|
||||
return(hWnd);
|
||||
}
|
||||
|
||||
void
|
||||
BuildMemName(LPSTR name, ULONG winSeed)
|
||||
{
|
||||
static DWORD id = 0;
|
||||
|
||||
if (id == 0)
|
||||
{
|
||||
// Seed the random-number generator with current time so that
|
||||
// the numbers will be different every time we run.
|
||||
srand( (unsigned)time( NULL ) );
|
||||
id = rand();
|
||||
}
|
||||
|
||||
wsprintf(name, "MAPI_IPC_SMEM-%d", (winSeed + id++));
|
||||
TRACE("Shared Memory Name = [%s]\n", name);
|
||||
}
|
||||
|
||||
DWORD
|
||||
ValidateFile(LPCSTR szFile)
|
||||
{
|
||||
struct _stat buf;
|
||||
int result;
|
||||
|
||||
result = _stat( szFile, &buf );
|
||||
if (result != 0)
|
||||
return(1);
|
||||
|
||||
if (!(buf.st_mode & S_IREAD))
|
||||
return(2);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
//
|
||||
// return of zero is ok
|
||||
// 1 = MAPI_E_ATTACHMENT_NOT_FOUND
|
||||
// 2 = MAPI_E_ATTACHMENT_OPEN_FAILURE
|
||||
//
|
||||
DWORD
|
||||
SanityCheckAttachmentFiles(lpMapiMessage lpMessage)
|
||||
{
|
||||
ULONG i;
|
||||
DWORD rc;
|
||||
|
||||
for (i=0; i<lpMessage->nFileCount; i++)
|
||||
{
|
||||
if ((rc = ValidateFile(lpMessage->lpFiles[i].lpszPathName)) != 0)
|
||||
{
|
||||
return(rc);
|
||||
}
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
DWORD
|
||||
GetFileCount(LPSTR pFiles, LPSTR delimChar)
|
||||
{
|
||||
DWORD count = 1;
|
||||
if ((!pFiles) || (!*pFiles))
|
||||
return(0);
|
||||
|
||||
for (DWORD i=0; i<strlen(pFiles); i++)
|
||||
{
|
||||
if (pFiles[i] == delimChar[0])
|
||||
{
|
||||
++count;
|
||||
}
|
||||
}
|
||||
|
||||
return(count);
|
||||
}
|
||||
|
||||
//
|
||||
// Extract a filename from a string
|
||||
// Return TRUE if file found, else FALSE
|
||||
//
|
||||
BOOL
|
||||
ExtractFile(LPSTR pFiles, LPSTR delimChar, DWORD fIndex, LPSTR fName)
|
||||
{
|
||||
LPSTR ptr = pFiles;
|
||||
DWORD loc;
|
||||
DWORD count = 0;
|
||||
|
||||
if ((!pFiles) || (!*pFiles))
|
||||
return(0);
|
||||
|
||||
// Get to the fIndex'th entry
|
||||
for (loc=0; loc<strlen(pFiles); loc++)
|
||||
{
|
||||
if (count == fIndex)
|
||||
break;
|
||||
if (pFiles[loc] == delimChar[0])
|
||||
count++;
|
||||
}
|
||||
|
||||
if (loc >= strlen(pFiles)) // Got to the end of string!
|
||||
return(FALSE);
|
||||
|
||||
lstrcpy(fName, (LPSTR)pFiles + loc);
|
||||
//
|
||||
// Truncate at 2nd delimiter
|
||||
//
|
||||
for (DWORD i=0; i<strlen(fName); i++)
|
||||
{
|
||||
if (fName[i] == delimChar[0])
|
||||
{
|
||||
fName[i] = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
ULONG
|
||||
GetFileSize(LPSTR fName)
|
||||
{
|
||||
struct _stat buf;
|
||||
int result;
|
||||
|
||||
result = _stat( fName, &buf );
|
||||
if (result != 0)
|
||||
return(0);
|
||||
|
||||
return(buf.st_size);
|
||||
}
|
||||
|
||||
LPVOID
|
||||
LoadBlobToMemory(LPSTR fName)
|
||||
{
|
||||
UCHAR *ptr = NULL;
|
||||
ULONG bufSize = GetFileSize(fName);
|
||||
|
||||
if (bufSize == 0)
|
||||
{
|
||||
_unlink(fName);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
ptr = (UCHAR *)malloc( (size_t) bufSize);
|
||||
if (!ptr)
|
||||
{
|
||||
_unlink(fName);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
HFILE hFile = _lopen(fName, OF_READ);
|
||||
if (hFile == HFILE_ERROR)
|
||||
{
|
||||
_unlink(fName);
|
||||
free(ptr);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
UINT numRead = _lread(hFile, ptr, (size_t) bufSize);
|
||||
_lclose(hFile);
|
||||
|
||||
if (numRead != bufSize)
|
||||
{
|
||||
_unlink(fName);
|
||||
free(ptr);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
_unlink(fName);
|
||||
return(ptr);
|
||||
}
|
||||
|
||||
LONG
|
||||
WriteMemoryBufferToDisk(LPSTR fName, LONG bufSize, LPSTR buf)
|
||||
{
|
||||
if (!buf)
|
||||
{
|
||||
return(-1);
|
||||
}
|
||||
|
||||
HFILE hFile = _lcreat(fName, 0);
|
||||
if (hFile == HFILE_ERROR)
|
||||
{
|
||||
return(-1);
|
||||
}
|
||||
|
||||
LONG writeCount = _lwrite(hFile, buf, (size_t) bufSize);
|
||||
_lclose(hFile);
|
||||
|
||||
if (writeCount != bufSize)
|
||||
{
|
||||
_unlink(fName);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
LPSTR
|
||||
GetTheTempDirectoryOnTheSystem(void)
|
||||
{
|
||||
static UCHAR retPath[_MAX_PATH];
|
||||
|
||||
if (getenv("TEMP"))
|
||||
{
|
||||
lstrcpy((LPSTR) retPath, getenv("TEMP")); // environmental variable
|
||||
}
|
||||
else if (getenv("TMP"))
|
||||
{
|
||||
lstrcpy((LPSTR) retPath, getenv("TMP")); // How about this environmental variable?
|
||||
}
|
||||
else
|
||||
{
|
||||
GetWindowsDirectory((LPSTR) retPath, sizeof(retPath));
|
||||
}
|
||||
|
||||
return((LPSTR) &(retPath[0]));
|
||||
}
|
||||
|
||||
#ifdef WIN16
|
||||
int WINAPI EXPORT ISGetTempFileName(LPCSTR a_pDummyPath, LPCSTR a_pPrefix, UINT a_uUnique, LPSTR a_pResultName)
|
||||
{
|
||||
#ifdef GetTempFileName // we need the real thing comming up next...
|
||||
#undef GetTempFileName
|
||||
#endif
|
||||
return GetTempFileName(0, a_pPrefix, a_uUnique, a_pResultName);
|
||||
}
|
||||
#endif
|
||||
|
||||
LONG
|
||||
GetTempAttachmentName(LPSTR fName)
|
||||
{
|
||||
UINT res;
|
||||
static UINT uUnique = 1;
|
||||
|
||||
if (!fName)
|
||||
return(-1);
|
||||
|
||||
LPSTR szTempPath = GetTheTempDirectoryOnTheSystem();
|
||||
|
||||
TRYAGAIN:
|
||||
#ifdef WIN32
|
||||
res = GetTempFileName(szTempPath, "MAPI", uUnique++, fName);
|
||||
#else
|
||||
res = ISGetTempFileName(szTempPath, "MAPI", uUnique++, fName);
|
||||
#endif
|
||||
|
||||
if (ValidateFile(fName) != 1)
|
||||
{
|
||||
if (uUnique < 32000)
|
||||
{
|
||||
goto TRYAGAIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// RICHIE - strip all of the HTML stuff out of the message...
|
||||
int
|
||||
CheckForInlineHTML(char *noteBody, DWORD len, DWORD *curPos, char *newBody, DWORD *realLen)
|
||||
{
|
||||
LPSTR tags[] = {" ", "<", "&", NULL};
|
||||
UCHAR tagsSubst[] = {' ', '<', '&', NULL};
|
||||
int x = 0;
|
||||
|
||||
while (tags[x])
|
||||
{
|
||||
// should we check for first tag
|
||||
if ( (*curPos+strlen(tags[x])) < len)
|
||||
{
|
||||
if (strncmp(tags[x], noteBody, strlen(tags[x])) == 0)
|
||||
{
|
||||
*curPos += strlen(tags[x]) - 1;
|
||||
newBody[*realLen] = tagsSubst[x];
|
||||
*realLen += 1;
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
|
||||
++x;
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
//
|
||||
// RICHIE - This is also temporary fix for now...
|
||||
//
|
||||
LPSTR
|
||||
StripSignedMessage(LPSTR noteText, DWORD totalCR)
|
||||
{
|
||||
char *newBuf;
|
||||
LPSTR startTag = "<HTML>";
|
||||
LPSTR endTag = "/HTML>";
|
||||
DWORD i;
|
||||
DWORD realLen = 0;
|
||||
DWORD startPos = 0;
|
||||
DWORD len = strlen(noteText);;
|
||||
|
||||
// create a new buffer...
|
||||
newBuf = (char *) malloc((size_t)(len + totalCR));
|
||||
if (!newBuf)
|
||||
return(noteText);
|
||||
|
||||
newBuf[0] = '\0';
|
||||
|
||||
// First, find the start of the HTML for the message...
|
||||
for (i=0; i<len; i++)
|
||||
{
|
||||
// should we check for first tag
|
||||
if ( (i+strlen(startTag)) < len)
|
||||
{
|
||||
if (strncmp(startTag, (noteText + i), strlen(startTag)) == 0)
|
||||
{
|
||||
startPos = i + strlen(startTag);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Didn't find any HTML start tag
|
||||
if (i == len)
|
||||
return(noteText);
|
||||
|
||||
BOOL inHTML = FALSE;
|
||||
BOOL firstChar = FALSE;
|
||||
|
||||
for (i=startPos; i<len; i++)
|
||||
{
|
||||
char *ptr = (noteText + i);
|
||||
|
||||
if ( ((*ptr == 0x0D) || (*ptr == 0x20)) && (!firstChar) )
|
||||
continue;
|
||||
else
|
||||
firstChar = TRUE;
|
||||
|
||||
// First, check for the end /HTML> tag
|
||||
if ( (i+strlen(endTag)) < len)
|
||||
{
|
||||
if (strncmp(endTag, ptr, strlen(endTag)) == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// If we are in HTML, check for a ">"...
|
||||
if (inHTML)
|
||||
{
|
||||
if (*ptr == '>')
|
||||
{
|
||||
inHTML = FALSE;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check for NEW HTML...
|
||||
if (*ptr == '<')
|
||||
{
|
||||
inHTML = TRUE;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (CheckForInlineHTML(ptr, len, &i, newBuf, &realLen))
|
||||
continue;
|
||||
|
||||
newBuf[realLen++] = *ptr;
|
||||
// Tack on a line feed if we hit a CR...
|
||||
if ( *ptr == 0x0D )
|
||||
{
|
||||
newBuf[realLen++] = 0x0A;
|
||||
}
|
||||
}
|
||||
|
||||
// terminate the buffer - reallocate and move on...
|
||||
newBuf[realLen++] = '\0';
|
||||
newBuf = (LPSTR) realloc(newBuf, (size_t) realLen);
|
||||
|
||||
// check if the realloc worked and if so, free old memory and
|
||||
// return...if not, just return the original buffer
|
||||
if (!newBuf)
|
||||
{
|
||||
return(noteText);
|
||||
}
|
||||
else
|
||||
{
|
||||
free(noteText);
|
||||
return(newBuf);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// RICHIE - this is a temporary fix for now to get rid of
|
||||
// html stuff within the text of a message - if there was a
|
||||
// valid noteText buffer coming into this call, we need to
|
||||
// free it on the way out.
|
||||
//
|
||||
LPSTR
|
||||
StripHTML(LPSTR noteText)
|
||||
{
|
||||
char *newBuf;
|
||||
LPSTR signTag = "This is a cryptographically signed message in MIME format.";
|
||||
LPSTR mimeTag = "This is a multi-part message in MIME format.";
|
||||
|
||||
DWORD i;
|
||||
DWORD realLen = 0;
|
||||
DWORD totalCR = 0;
|
||||
|
||||
// do sanity checking...
|
||||
if ((!noteText) || (!(*noteText)))
|
||||
return(noteText);
|
||||
|
||||
// more sanity checking...
|
||||
DWORD len = strlen(noteText) + 1;
|
||||
if (len <= 0)
|
||||
return(noteText);
|
||||
|
||||
// Get the number of CR's in this message and add room for
|
||||
// the LF's
|
||||
for (i=0; i<len; i++)
|
||||
{
|
||||
if ( (*(noteText + i)) == 0x0D )
|
||||
++totalCR;
|
||||
}
|
||||
|
||||
// This is a check for a signed message in the start of a message
|
||||
// check for sign line...
|
||||
if ( strlen(signTag) < len)
|
||||
{
|
||||
if (
|
||||
(strncmp(signTag, noteText, strlen(signTag)) == 0) ||
|
||||
(strncmp(mimeTag, noteText, strlen(mimeTag)) == 0)
|
||||
)
|
||||
{
|
||||
return( StripSignedMessage(noteText, totalCR) );
|
||||
}
|
||||
}
|
||||
|
||||
// create a new buffer...
|
||||
newBuf = (char *) malloc((size_t)(len + totalCR));
|
||||
if (!newBuf)
|
||||
return(noteText);
|
||||
|
||||
newBuf[0] = '\0';
|
||||
|
||||
BOOL firstChar = FALSE;
|
||||
|
||||
// Now do the translation for the body of the note...
|
||||
for (i=0; i<len; i++)
|
||||
{
|
||||
char *ptr = (noteText + i);
|
||||
|
||||
if ( ((*ptr == 0x0D) || (*ptr == 0x20)) && (!firstChar) )
|
||||
continue;
|
||||
else
|
||||
firstChar = TRUE;
|
||||
|
||||
if (CheckForInlineHTML(ptr, len, &i, newBuf, &realLen))
|
||||
continue;
|
||||
|
||||
newBuf[realLen++] = *ptr;
|
||||
if ( *ptr == 0x0D )
|
||||
{
|
||||
newBuf[realLen++] = 0x0A;
|
||||
}
|
||||
}
|
||||
|
||||
// terminate the buffer - reallocate and move on...
|
||||
newBuf[realLen++] = '\0';
|
||||
newBuf = (LPSTR) realloc(newBuf, (size_t) realLen);
|
||||
|
||||
// check if the realloc worked and if so, free old memory and
|
||||
// return...if not, just return the original buffer
|
||||
if (!newBuf)
|
||||
{
|
||||
return(noteText);
|
||||
}
|
||||
else
|
||||
{
|
||||
free(noteText);
|
||||
return(newBuf);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef WIN16
|
||||
|
||||
void
|
||||
GetWin16TempName(LPSTR realFileName, LPSTR tempPath,
|
||||
LPSTR szTempFileName, UINT uUnique)
|
||||
{
|
||||
char *dotPtr = strrchr(realFileName, '.');
|
||||
if (dotPtr != NULL)
|
||||
{
|
||||
*dotPtr = '\0';
|
||||
}
|
||||
|
||||
int nameLen = lstrlen(realFileName);
|
||||
if (dotPtr != NULL)
|
||||
{
|
||||
*dotPtr = '.';
|
||||
}
|
||||
|
||||
if (nameLen <= 7)
|
||||
{
|
||||
wsprintf(szTempFileName, "%s\\%d%s", tempPath, uUnique, realFileName);
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(szTempFileName, "%s\\%d%s", tempPath, uUnique, (realFileName + 1));
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#define MAXTRY 9999 // How many times do we try..
|
||||
|
||||
UINT
|
||||
GetTempMailNameWithExtension(LPSTR szTempFileName,
|
||||
LPSTR origName)
|
||||
{
|
||||
UINT res = 1;
|
||||
UINT uUnique = 0;
|
||||
char *szTempPath = GetTheTempDirectoryOnTheSystem();
|
||||
char *tmpPtr;
|
||||
char *realFileName = NULL;
|
||||
|
||||
if ( (origName != NULL) && (*origName != '\0') )
|
||||
{
|
||||
tmpPtr = origName;
|
||||
}
|
||||
else
|
||||
{
|
||||
tmpPtr = szTempFileName;
|
||||
}
|
||||
|
||||
realFileName = strrchr(tmpPtr, '\\');
|
||||
if (!realFileName)
|
||||
realFileName = tmpPtr;
|
||||
else
|
||||
realFileName++;
|
||||
|
||||
TRYAGAIN:
|
||||
|
||||
#ifdef WIN32
|
||||
if (uUnique == 0)
|
||||
{
|
||||
wsprintf(szTempFileName, "%s\\%s", szTempPath, realFileName);
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(szTempFileName, "%s\\%d_%s",
|
||||
szTempPath, uUnique, realFileName);
|
||||
}
|
||||
#else // WIN16
|
||||
if ( (uUnique == 0) && (strlen(realFileName) <= 12) )
|
||||
{
|
||||
wsprintf(szTempFileName, "%s\\%s", szTempPath, realFileName);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (uUnique < 10)
|
||||
{
|
||||
GetWin16TempName(realFileName, szTempPath, szTempFileName, uUnique);
|
||||
}
|
||||
else
|
||||
{
|
||||
res = ISGetTempFileName(szTempPath, "ns", uUnique++, szTempFileName);
|
||||
}
|
||||
|
||||
// Now add the correct extension...
|
||||
char *origExt = strrchr(realFileName, '.');
|
||||
if (origExt != NULL)
|
||||
{
|
||||
char *tmpExt = strrchr(szTempFileName, '.');
|
||||
if (tmpExt != NULL)
|
||||
{
|
||||
origExt++;
|
||||
tmpExt++;
|
||||
|
||||
while ( ((tmpExt) && (origExt)) && (*origExt != '\0') )
|
||||
{
|
||||
*tmpExt = *origExt;
|
||||
tmpExt++;
|
||||
origExt++;
|
||||
}
|
||||
|
||||
*tmpExt = '\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if ( (ValidateFile(szTempFileName) != 1) && (uUnique < MAXTRY) )
|
||||
{
|
||||
uUnique++;
|
||||
if (uUnique >= MAXTRY)
|
||||
return(1);
|
||||
goto TRYAGAIN;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
#define kMaxTempFiles 10
|
||||
#define kMaxListLength (10 * _MAX_PATH)
|
||||
|
||||
void GetTempFiles(LPSTR pBuf, int lenBuf)
|
||||
{
|
||||
if (!GetConfigInfoStr(szMapiSection, szTempFiles, pBuf, lenBuf, HKEY_ROOT))
|
||||
{
|
||||
*pBuf = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void WriteTempFiles(LPSTR pBuf)
|
||||
{
|
||||
SetConfigInfoStr(szMapiSection, szTempFiles, pBuf, HKEY_ROOT);
|
||||
}
|
||||
|
||||
void AddTempFile(LPCSTR pFileName)
|
||||
{
|
||||
if ( (!pFileName) || (pFileName[0] == '\0') )
|
||||
return;
|
||||
|
||||
char *files = (char *)malloc(kMaxListLength);
|
||||
|
||||
if (!files)
|
||||
return;
|
||||
|
||||
GetTempFiles(files, kMaxListLength);
|
||||
if ((lstrlen(files) + lstrlen(pFileName) + 2) >= kMaxListLength)
|
||||
{
|
||||
free(files);
|
||||
return;
|
||||
}
|
||||
|
||||
if (lstrlen(files) != 0)
|
||||
{
|
||||
lstrcat(files, ";");
|
||||
}
|
||||
|
||||
lstrcat(files, pFileName);
|
||||
WriteTempFiles(files);
|
||||
free(files);
|
||||
}
|
||||
|
||||
void DeleteFirstTempFile(LPSTR pFiles)
|
||||
{
|
||||
if (!*pFiles)
|
||||
return;
|
||||
LPSTR pTemp = strchr(pFiles, ';');
|
||||
if (pTemp)
|
||||
{
|
||||
*pTemp = 0;
|
||||
}
|
||||
|
||||
//#ifndef _DEBUG
|
||||
_unlink(pFiles);
|
||||
//#endif
|
||||
|
||||
if (pTemp)
|
||||
{
|
||||
memmove(pFiles, pTemp + 1, lstrlen(pTemp + 1) + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
*pFiles = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RemoveAllTempFiles(void)
|
||||
{
|
||||
char *files = (char *)malloc(kMaxListLength);
|
||||
|
||||
if (!files)
|
||||
return;
|
||||
|
||||
GetTempFiles(files, kMaxListLength);
|
||||
|
||||
while (*files)
|
||||
{
|
||||
DeleteFirstTempFile(files);
|
||||
}
|
||||
|
||||
WriteTempFiles(files);
|
||||
free(files);
|
||||
}
|
||||
|
||||
void CheckAgeTempFiles(void)
|
||||
{
|
||||
char *files = (char *)malloc(kMaxListLength);
|
||||
|
||||
if (!files)
|
||||
return;
|
||||
|
||||
GetTempFiles(files, kMaxListLength);
|
||||
int i = 0;
|
||||
LPSTR pTemp = files;
|
||||
while (TRUE)
|
||||
{
|
||||
pTemp = strchr(pTemp, ';');
|
||||
if (!pTemp)
|
||||
break;
|
||||
++pTemp;
|
||||
++i;
|
||||
}
|
||||
|
||||
if (i >= 10)
|
||||
{
|
||||
DeleteFirstTempFile(files);
|
||||
WriteTempFiles(files);
|
||||
}
|
||||
|
||||
free(files);
|
||||
}
|
||||
|
||||
void
|
||||
CleanupMAPITempFiles(void)
|
||||
{
|
||||
if (Is_16_OR_32_BIT_CommunitorRunning() == 0)
|
||||
{
|
||||
RemoveAllTempFiles(); // if Communicator not running, clean up all the temp files
|
||||
}
|
||||
else
|
||||
{
|
||||
CheckAgeTempFiles();
|
||||
}
|
||||
}
|
||||
|
||||
void *
|
||||
CleanMalloc(size_t mallocSize)
|
||||
{
|
||||
void *ptr = malloc(mallocSize);
|
||||
if (!ptr)
|
||||
return(NULL);
|
||||
|
||||
memset(ptr, 0, mallocSize);
|
||||
return(ptr);
|
||||
}
|
||||
|
||||
void
|
||||
SafeFree(void *ptr)
|
||||
{
|
||||
if (!ptr)
|
||||
return;
|
||||
|
||||
free(ptr);
|
||||
ptr = NULL;
|
||||
}
|
||||
89
mozilla/mailnews/mapi/old/mapi32/mapiutl.h
Normal file
89
mozilla/mailnews/mapi/old/mapi32/mapiutl.h
Normal file
@@ -0,0 +1,89 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#ifndef __UTILS_
|
||||
#define __UTILS_
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
|
||||
#include <mapi.h>
|
||||
#endif
|
||||
|
||||
//
|
||||
// Utility functions...
|
||||
//
|
||||
void SetLoggingEnabled(BOOL val); // Set a logging enabled flag
|
||||
void LogString(LPCSTR pStr1); // Log a string to a file...
|
||||
void BuildMemName(LPSTR name, ULONG winSeed); // Shared memory name
|
||||
HWND GetCommunicatorIPCWindow(void); // Get the IPC window we will use...
|
||||
DWORD SanityCheckAttachmentFiles(lpMapiMessage lpMessage); // Check attachments
|
||||
DWORD ValidateFile(LPCSTR szFile); // Is this a valid file - 0=Yes 1 = NOT_FOUND 2 = OPEN_FAILURE
|
||||
|
||||
DWORD GetFileCount(LPSTR pFiles, LPSTR delimChar); // Get File count from string of file1;file2, etc..
|
||||
BOOL ExtractFile(LPSTR pFiles, LPSTR delimChar, DWORD fIndex, LPSTR fName); // Extract a filename from a string
|
||||
|
||||
LPVOID LoadBlobToMemory(LPSTR fName); // Load the blob into memory!
|
||||
LONG GetTempAttachmentName(LPSTR fName); // Get a temp file name and put it in fName
|
||||
|
||||
UINT GetTempMailNameWithExtension(LPSTR szTempFileName, LPSTR origName);
|
||||
void CleanupMAPITempFiles(void);
|
||||
void AddTempFile(LPCSTR pFileName);
|
||||
|
||||
void *CleanMalloc(size_t mallocSize);
|
||||
void SafeFree(void *ptr);
|
||||
|
||||
//
|
||||
// RICHIE - this is a temporary fix for now to get rid of
|
||||
// html stuff within the text of a message - if there was a
|
||||
// valid noteText buffer coming into this call, we need to
|
||||
// free it on the way out.
|
||||
//
|
||||
LPSTR StripHTML(LPSTR noteText);
|
||||
|
||||
//
|
||||
// Write a buffer to disk
|
||||
// Return 0 on success -1 on failure
|
||||
//
|
||||
LONG WriteMemoryBufferToDisk(LPSTR fName, LONG bufSize, LPSTR buf);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __UTILS_
|
||||
303
mozilla/mailnews/mapi/old/mapi32/port.h
Normal file
303
mozilla/mailnews/mapi/old/mapi32/port.h
Normal file
@@ -0,0 +1,303 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
|
||||
#ifndef PORT_H
|
||||
#define PORT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*****************************************************************\
|
||||
* *
|
||||
* PORT.H *
|
||||
* *
|
||||
* Win16/Win32 portability stuff *
|
||||
* *
|
||||
* A.Sokolsky *
|
||||
* 3.10.94 distilled into this header *
|
||||
* *
|
||||
\*****************************************************************/
|
||||
|
||||
/*
|
||||
* calling conventions
|
||||
*/
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
#ifndef CDECL
|
||||
#define CDECL __cdecl
|
||||
#endif // CDECL
|
||||
|
||||
#ifndef PASCAL
|
||||
#define PASCAL __pascal
|
||||
#endif // PASCAL
|
||||
|
||||
#ifdef FASTCALL
|
||||
#error FASTCALL defined
|
||||
#endif // FASTCALL
|
||||
|
||||
|
||||
#ifdef NDEBUG
|
||||
#define FASTCALL __fastcall
|
||||
#else
|
||||
#define FASTCALL PASCAL
|
||||
#endif // NDEBUG
|
||||
|
||||
|
||||
|
||||
#ifndef HWND2DWORD
|
||||
# ifdef WIN32
|
||||
# define HWND2DWORD(X_hWnd) ( (DWORD)(X_hWnd) )
|
||||
# else // WIN16
|
||||
# define HWND2DWORD(X_hWnd) ( (DWORD)MAKELONG(((WORD)(X_hWnd)), 0) )
|
||||
# endif
|
||||
#endif // HWND2DWORD
|
||||
|
||||
|
||||
/*
|
||||
* WIN16 - WIN32 compatibility stuff
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
# define DLLEXPORT __declspec( dllexport )
|
||||
# define EXPORT
|
||||
# define LOADDS
|
||||
# define HUGE
|
||||
# ifndef FAR
|
||||
# define FAR
|
||||
# endif // FAR
|
||||
# ifndef NEAR
|
||||
# define NEAR
|
||||
# endif // NEAR
|
||||
# ifdef UNICODE
|
||||
# define SIZEOF(x) (sizeof(x)/sizeof(WCHAR))
|
||||
# else
|
||||
# define SIZEOF(x) sizeof(x)
|
||||
# endif
|
||||
|
||||
#else // !WIN32 == WIN16
|
||||
|
||||
# define DLLEXPORT
|
||||
# define EXPORT __export
|
||||
# define LOADDS __loadds
|
||||
# define HUGE __huge
|
||||
# ifndef FAR
|
||||
# define FAR __far
|
||||
# define NEAR __near
|
||||
# endif // FAR
|
||||
# define CONST const
|
||||
# define SIZEOF(x) sizeof(x)
|
||||
# define CHAR char
|
||||
# define TCHAR char
|
||||
# define WCHAR char
|
||||
# ifndef LPTSTR
|
||||
# define LPTSTR LPSTR
|
||||
# endif
|
||||
# ifndef LPCTSTR
|
||||
# define LPCTSTR LPCSTR
|
||||
# endif
|
||||
# define UNREFERENCED_PARAMETER(x) x;
|
||||
# ifndef TEXT
|
||||
# define TEXT(x) x
|
||||
# endif
|
||||
# define GetWindowTextW GetWindowText
|
||||
# define lstrcpyW lstrcpy
|
||||
|
||||
# define BN_DBLCLK BN_DOUBLECLICKED // ~~MRJ needed for custom control.
|
||||
// ~~MRJ begin Win95 backward compat section
|
||||
# define LPWSTR LPSTR
|
||||
# define LPCWSTR LPCSTR
|
||||
|
||||
// button check state for WIN16
|
||||
#ifndef BST_UNCHECKED
|
||||
#define BST_UNCHECKED 0x0000
|
||||
#endif
|
||||
|
||||
#ifndef BST_CHECKED
|
||||
#define BST_CHECKED 0x0001
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef WIN95_COMPAT
|
||||
# define WIN95_COMPAT
|
||||
#endif
|
||||
|
||||
// ~~MRJ end Win95 compat section.
|
||||
|
||||
// critical section API stubs
|
||||
typedef DWORD CRITICAL_SECTION;
|
||||
typedef CRITICAL_SECTION FAR * LPCRITICAL_SECTION;
|
||||
#ifdef __cplusplus
|
||||
inline void InitializeCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
inline void DeleteCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
inline void EnterCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
inline void LeaveCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
#endif // __cplusplus
|
||||
|
||||
// Added for nssock16 ---Neeti
|
||||
#ifndef ZeroMemory
|
||||
#include <memory.h>
|
||||
#define ZeroMemory(PTR, SIZE) memset(PTR, 0, SIZE)
|
||||
#endif // ZeroMemory
|
||||
|
||||
#endif // WIN16
|
||||
|
||||
/*
|
||||
* unix - windows compatibility stuff
|
||||
*/
|
||||
typedef DWORD u_int32;
|
||||
typedef WORD u_int16;
|
||||
typedef BYTE u_int8;
|
||||
#ifdef WIN32
|
||||
typedef short int Bool16;
|
||||
#else // WIN16
|
||||
typedef BOOL Bool16;
|
||||
#endif // WIN16
|
||||
|
||||
/*
|
||||
* Cross Platform Compatibility
|
||||
*/
|
||||
#ifndef UNALIGNED
|
||||
# ifdef _M_ALPHA
|
||||
# define UNALIGNED __unaligned
|
||||
# else // !_M_ALPHA
|
||||
# define UNALIGNED
|
||||
# endif // !_M_ALPHA
|
||||
#endif // UNALIGNED
|
||||
|
||||
//
|
||||
// RICHIE - for the Alpha port
|
||||
//
|
||||
#ifdef _M_ALPHA
|
||||
# undef pascal
|
||||
# undef PASCAL
|
||||
# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
|
||||
# define pascal __stdcall
|
||||
# define PASCAL __stdcall
|
||||
# else
|
||||
# define PASCAL
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Useful Types
|
||||
*/
|
||||
typedef char HUGE *HPSTR;
|
||||
typedef const char HUGE *HPCSTR;
|
||||
typedef unsigned char HUGE *HPBYTE;
|
||||
typedef WORD HUGE *HPWORD;
|
||||
typedef UINT FAR *LPUINT;
|
||||
typedef BOOL (CALLBACK *USERABORTPROC)();
|
||||
typedef BOOL (CALLBACK *PROGRESSPROC)(UINT uPos, UINT uRange);
|
||||
typedef int INT; // ~~MRJ a function needed this defined.
|
||||
typedef MINMAXINFO FAR *LPMINMAXINFO; // ~~MRJ
|
||||
|
||||
//
|
||||
// stuff missing from windows.h
|
||||
//
|
||||
#ifndef MAKEWORD
|
||||
#define MAKEWORD(low, high) ((WORD)(((BYTE)(low)) | (((WORD)((BYTE)(high))) << 8)))
|
||||
#endif // MAKEWORD
|
||||
|
||||
#ifdef WIN32
|
||||
# ifndef hmemcpy
|
||||
# define hmemcpy memcpy
|
||||
# endif // !defined(hmemcpy)
|
||||
# define _fmemset memset
|
||||
|
||||
# include <malloc.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
inline BOOL IsGDIObject(HGDIOBJ hObj) { return (hObj != 0); }
|
||||
inline void *_halloc(long num, unsigned int size) { return malloc(num * size); }
|
||||
inline void _hfree( void *memblock ) { free(memblock); }
|
||||
/*
|
||||
inline BOOL IsInstance(HINSTANCE hInst) {
|
||||
# ifdef WIN32
|
||||
return (hInst != 0);
|
||||
# else // WIN16
|
||||
return (hInst > HINSTANCE_ERROR);
|
||||
# endif
|
||||
}
|
||||
*/
|
||||
|
||||
#endif // __cplusplus
|
||||
|
||||
WINUSERAPI HANDLE WINAPI LoadImageA(HINSTANCE, LPCSTR, UINT, int, int, UINT);
|
||||
|
||||
#endif // WIN32
|
||||
|
||||
#ifdef __cplusplus
|
||||
inline BOOL IsInstance(HINSTANCE hInst) {
|
||||
# ifdef WIN32
|
||||
return (hInst != 0);
|
||||
# else // WIN16
|
||||
return (hInst > HINSTANCE_ERROR);
|
||||
# endif
|
||||
}
|
||||
inline void SetWindowSmallIcon(HINSTANCE hInst, HWND hWnd, UINT uIconResourceId) {
|
||||
#ifdef WIN32
|
||||
# ifndef WM_SETICON
|
||||
# define WM_SETICON 0x0080
|
||||
# endif // WM_SETICON
|
||||
# ifndef IMAGE_ICON
|
||||
# define IMAGE_ICON 1
|
||||
# endif
|
||||
assert(IsWindow(hWnd));
|
||||
HICON hIcon = (HICON)LoadImageA(hInst, MAKEINTRESOURCE(uIconResourceId), IMAGE_ICON,
|
||||
16, 16, 0);
|
||||
if(NULL != hIcon) {
|
||||
SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);
|
||||
} else {
|
||||
HICON hIcon = LoadIcon(hInst, MAKEINTRESOURCE(uIconResourceId));
|
||||
assert(hIcon != 0);
|
||||
SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);
|
||||
}
|
||||
#endif // WIN32
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* PORT_H */
|
||||
@@ -1,66 +1,54 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is the Netscape Portable Runtime (NSPR).
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1999-2000
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by mapi32.rc
|
||||
//
|
||||
#define ID_DIALOG_QAHOOK 101
|
||||
#define ID_DIALOG_MAPI 101
|
||||
#define ID_ICON_APP 102
|
||||
|
||||
#include "primpl.h"
|
||||
|
||||
#include <setjmp.h>
|
||||
|
||||
/* Fake this out */
|
||||
int socketpair (int foo, int foo2, int foo3, int sv[2])
|
||||
{
|
||||
printf("error in socketpair\n");
|
||||
exit (-1);
|
||||
}
|
||||
|
||||
void _MD_EarlyInit(void)
|
||||
{
|
||||
}
|
||||
|
||||
PRWord *_MD_HomeGCRegisters(PRThread *t, int isCurrent, int *np)
|
||||
{
|
||||
#ifndef _PR_PTHREADS
|
||||
if (isCurrent) {
|
||||
(void) setjmp(CONTEXT(t));
|
||||
}
|
||||
|
||||
*np = sizeof(CONTEXT(t)) / sizeof(PRWord);
|
||||
return (PRWord *) CONTEXT(t);
|
||||
#else
|
||||
*np = 0;
|
||||
return NULL;
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 103
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1000
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
172
mozilla/mailnews/mapi/old/mapi32/smem.cpp
Normal file
172
mozilla/mailnews/mapi/old/mapi32/smem.cpp
Normal file
@@ -0,0 +1,172 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// smem.cpp - This deals with all shared memory functions needed for
|
||||
// the MAPI component of Communicator
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
|
||||
#include "mapismem.h"
|
||||
|
||||
#ifndef ZeroMemory
|
||||
#include <memory.h>
|
||||
#define ZeroMemory(PTR, SIZE) memset(PTR, 0, SIZE)
|
||||
#endif // ZeroMemory
|
||||
|
||||
//
|
||||
// *create new* shared memory chunk
|
||||
// once this is created, use the pointer
|
||||
// to the segment to to store data
|
||||
// e.g.:
|
||||
// lpString = "string for communicator";
|
||||
// lstrcpy((LPSTR)pData->m_buf[0], lpString);
|
||||
//
|
||||
CSharedMem *
|
||||
NSCreateSharedMemory(DWORD memSize, LPCTSTR memName, HANDLE *hSharedMemory)
|
||||
{
|
||||
#ifdef WIN32
|
||||
|
||||
BOOL bExistedBefore;
|
||||
CSharedMem *pData;
|
||||
|
||||
LPCTSTR szObjectName = memName;
|
||||
DWORD dwSize = sizeof(CSharedMem) + memSize;
|
||||
*hSharedMemory = CreateFileMapping(
|
||||
(HANDLE)0xFFFFFFFF,0,PAGE_READWRITE,0,dwSize,szObjectName);
|
||||
if(*hSharedMemory == 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
bExistedBefore = (GetLastError() == ERROR_ALREADY_EXISTS);
|
||||
if(bExistedBefore)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pData = (CSharedMem *)MapViewOfFile(
|
||||
*hSharedMemory, FILE_MAP_ALL_ACCESS, 0, 0, 0);
|
||||
if(pData == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZeroMemory(pData, dwSize);
|
||||
pData->m_dwSize = memSize;
|
||||
|
||||
return pData;
|
||||
#else
|
||||
CSharedMem *sMemChunk = NULL;
|
||||
DWORD dwSize = memSize = (sizeof(CSharedMem) + memSize);
|
||||
|
||||
if (sMemChunk != NULL)
|
||||
return(sMemChunk);
|
||||
|
||||
sMemChunk = (CSharedMem *) GlobalAllocPtr(GMEM_MOVEABLE, dwSize);
|
||||
ZeroMemory(sMemChunk, (size_t) dwSize);
|
||||
sMemChunk->m_dwSize = dwSize; // Missing in Communicator code!
|
||||
return(sMemChunk);
|
||||
|
||||
#endif // WIN32
|
||||
}
|
||||
|
||||
//
|
||||
// *open existing* shared memory chunk
|
||||
// once you have the pointer to the new segment
|
||||
// use this pointer to access data, e.g.:
|
||||
//
|
||||
CSharedMem *
|
||||
NSOpenExistingSharedMemory(LPCTSTR memName, HANDLE *hSharedMemory)
|
||||
{
|
||||
#ifdef WIN32
|
||||
CSharedMem *pData;
|
||||
DWORD dwSize;
|
||||
|
||||
LPCTSTR szObjectName = memName;
|
||||
*hSharedMemory = OpenFileMapping(
|
||||
PAGE_READWRITE,FALSE,szObjectName);
|
||||
if(*hSharedMemory == 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pData = (CSharedMem *)MapViewOfFile(
|
||||
*hSharedMemory,FILE_MAP_ALL_ACCESS,0,0,0);
|
||||
if(pData == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dwSize = pData->m_dwSize;
|
||||
return pData;
|
||||
#else
|
||||
|
||||
return(NULL); // In Win16, this is really meaningless...
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
//
|
||||
// to close shared memory segment
|
||||
//
|
||||
void
|
||||
NSCloseSharedMemory(CSharedMem *pData, HANDLE hSharedMemory)
|
||||
{
|
||||
#ifdef WIN32
|
||||
if(pData != 0)
|
||||
{
|
||||
UnmapViewOfFile(pData);
|
||||
pData = 0;
|
||||
}
|
||||
|
||||
if(hSharedMemory != 0)
|
||||
{
|
||||
CloseHandle(hSharedMemory);
|
||||
hSharedMemory = 0;
|
||||
}
|
||||
#else
|
||||
|
||||
if (pData != NULL)
|
||||
{
|
||||
GlobalFreePtr(pData);
|
||||
pData = NULL;
|
||||
}
|
||||
|
||||
#endif // WIN32
|
||||
}
|
||||
@@ -1,58 +1,68 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is the Netscape Portable Runtime (NSPR).
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998-2000
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
|
||||
#if defined(WIN16)
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <tchar.h>
|
||||
#include "trace.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
|
||||
#ifndef WIN16
|
||||
void CDECL AfxTrace(LPCTSTR lpszFormat, ...)
|
||||
#else
|
||||
void CDECL AfxTrace(LPCSTR lpszFormat, ...)
|
||||
#endif
|
||||
#include "prtypes.h"
|
||||
|
||||
extern PRIntn my_global;
|
||||
|
||||
PR_IMPLEMENT(PRIntn) My_GetValue()
|
||||
{
|
||||
return my_global;
|
||||
va_list args;
|
||||
va_start(args, lpszFormat);
|
||||
|
||||
int nBuf;
|
||||
TCHAR szBuffer[512];
|
||||
|
||||
nBuf = _vstprintf(szBuffer, lpszFormat, args);
|
||||
va_end(args);
|
||||
OutputDebugString(szBuffer);
|
||||
return;
|
||||
}
|
||||
|
||||
#if defined(WIN16)
|
||||
int CALLBACK LibMain( HINSTANCE hInst, WORD wDataSeg,
|
||||
WORD cbHeapSize, LPSTR lpszCmdLine )
|
||||
{
|
||||
return TRUE;
|
||||
BOOL AfxAssertFailedLine(LPCSTR lpszFileName, int nLine)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
#endif /* WIN16 */
|
||||
|
||||
#endif
|
||||
81
mozilla/mailnews/mapi/old/mapi32/trace.h
Normal file
81
mozilla/mailnews/mapi/old/mapi32/trace.h
Normal file
@@ -0,0 +1,81 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#include <windows.h>
|
||||
|
||||
#ifdef _DEBUG
|
||||
BOOL AfxAssertFailedLine(LPCSTR lpszFileName, int nLine);
|
||||
|
||||
#ifndef WIN16
|
||||
void CDECL AfxTrace(LPCTSTR lpszFormat, ...);
|
||||
#else
|
||||
void CDECL AfxTrace(LPCSTR lpszFormat, ...);
|
||||
#endif
|
||||
|
||||
#define TRACE ::AfxTrace
|
||||
#define THIS_FILE __FILE__
|
||||
#define ASSERT(f) \
|
||||
do \
|
||||
{ \
|
||||
if (!(f) && AfxAssertFailedLine(THIS_FILE, __LINE__)) \
|
||||
AfxDebugBreak(); \
|
||||
} while (0) \
|
||||
|
||||
#define VERIFY(f) ASSERT(f)
|
||||
#define TRACE_FN(name) LogFn __logFn(name)
|
||||
class LogFn
|
||||
{
|
||||
public:
|
||||
LogFn(LPCSTR pFnName) {m_pFnName = pFnName; TRACE("--%s: In--\n", pFnName);}
|
||||
~LogFn() {TRACE("--%s: Out--\n", m_pFnName);}
|
||||
private:
|
||||
LPCSTR m_pFnName;
|
||||
};
|
||||
#else
|
||||
// NDEBUG
|
||||
#define ASSERT(f) ((void)0)
|
||||
#define VERIFY(f) ((void)(f))
|
||||
#define ASSERT_VALID(pOb) ((void)0)
|
||||
#define DEBUG_ONLY(f) ((void)0)
|
||||
#ifdef WIN32
|
||||
inline void CDECL AfxTrace(LPCTSTR, ...) { }
|
||||
#else
|
||||
inline void CDECL AfxTrace(LPCSTR, ...) { }
|
||||
#endif
|
||||
#define TRACE 1 ? (void)0 : ::AfxTrace
|
||||
#define TRACE_FN(name)
|
||||
#endif // _DEBUG
|
||||
|
||||
347
mozilla/mailnews/mapi/old/mapi32/xpapi.cpp
Normal file
347
mozilla/mailnews/mapi/old/mapi32/xpapi.cpp
Normal file
@@ -0,0 +1,347 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// XPAPI.CPP
|
||||
// API implementation file for mapi16.dll and mapi32.dll
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include "xpapi.h"
|
||||
#include "mapiutl.h"
|
||||
|
||||
WORD LOAD_DS XP_CallProcess(LPCSTR pPath, LPCSTR pCmdLine)
|
||||
{
|
||||
WORD wReturn = 0;
|
||||
#ifndef WIN16
|
||||
STARTUPINFO startupInfo;
|
||||
PROCESS_INFORMATION processInfo;
|
||||
|
||||
memset(&startupInfo, 0, sizeof(startupInfo));
|
||||
startupInfo.cb = sizeof(startupInfo);
|
||||
if (wReturn = CreateProcess(pPath, (LPTSTR)pCmdLine, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_PROCESS_GROUP, NULL, NULL, &startupInfo, &processInfo))
|
||||
{
|
||||
WaitForInputIdle(processInfo.hProcess, 120000);
|
||||
}
|
||||
#else
|
||||
// char szMsg[80];
|
||||
char szExecute[512];
|
||||
lstrcpy(szExecute, pPath);
|
||||
lstrcat(szExecute, " ");
|
||||
lstrcat(szExecute, pCmdLine);
|
||||
wReturn = WinExec(szExecute,SW_SHOW);
|
||||
|
||||
if (wReturn < 32)
|
||||
{
|
||||
wReturn = 0;
|
||||
}
|
||||
#endif
|
||||
return wReturn;
|
||||
}
|
||||
|
||||
HKEY LOAD_DS RegOpenParent(LPCSTR pSection, HKEY hRootKey, REGSAM access)
|
||||
{
|
||||
HKEY hKey;
|
||||
#ifndef WIN16
|
||||
if (RegOpenKeyEx(hRootKey, pSection, 0, access, &hKey) != ERROR_SUCCESS)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
#else
|
||||
if (RegOpenKey(hRootKey, pSection, &hKey) != ERROR_SUCCESS)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
#endif
|
||||
return(hKey);
|
||||
}
|
||||
|
||||
HKEY LOAD_DS RegCreateParent(LPCSTR pSection, HKEY hMasterKey)
|
||||
{
|
||||
HKEY hKey;
|
||||
if (RegCreateKey(hMasterKey, pSection, &hKey) != ERROR_SUCCESS)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
return(hKey);
|
||||
}
|
||||
|
||||
BOOL LOAD_DS GetConfigInfoStr(LPCSTR pSection, LPCSTR pKey, LPSTR pBuf, int lenBuf, HKEY hMasterKey)
|
||||
{
|
||||
HKEY hKey;
|
||||
hKey = RegOpenParent(pSection, hMasterKey, KEY_QUERY_VALUE);
|
||||
if (!hKey)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
DWORD len = (DWORD)lenBuf;
|
||||
#ifndef WIN16
|
||||
BOOL retVal = (RegQueryValueEx(hKey, pKey, NULL, NULL, (LPBYTE)pBuf, &len) == ERROR_SUCCESS);
|
||||
#else
|
||||
BOOL retVal = (RegQueryValue(hKey, pKey, pBuf, (long far*)&len) == ERROR_SUCCESS);
|
||||
#endif
|
||||
RegCloseKey(hKey);
|
||||
return(retVal);
|
||||
}
|
||||
|
||||
BOOL LOAD_DS GetConfigInfoNum(LPCSTR pSection, LPCSTR pKey, DWORD* pVal, HKEY hMasterKey)
|
||||
{
|
||||
HKEY hKey;
|
||||
hKey = RegOpenParent(pSection, hMasterKey, KEY_QUERY_VALUE);
|
||||
if (!hKey)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
DWORD len = sizeof(DWORD);
|
||||
#ifndef WIN16
|
||||
BOOL retVal = (RegQueryValueEx(hKey, pKey, NULL, NULL, (LPBYTE)pVal, &len) == ERROR_SUCCESS);
|
||||
#else
|
||||
BOOL retVal = (RegQueryValue(hKey, pKey, (char far*)pVal, (long far*)&len) == ERROR_SUCCESS);
|
||||
#endif
|
||||
RegCloseKey(hKey);
|
||||
return(retVal);
|
||||
}
|
||||
|
||||
BOOL LOAD_DS SetConfigInfoStr(LPCSTR pSection, LPCSTR pKey, LPSTR pStr, HKEY hMasterKey)
|
||||
{
|
||||
HKEY hKey;
|
||||
hKey = RegCreateParent(pSection, hMasterKey);
|
||||
if (!hKey)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
#ifndef WIN16
|
||||
BOOL retVal = (RegSetValueEx(hKey, pKey, 0, REG_SZ, (LPBYTE)pStr, lstrlen(pStr) + 1) == ERROR_SUCCESS);
|
||||
#else
|
||||
BOOL retVal = (RegSetValue(hKey, pKey, REG_SZ, pStr, lstrlen(pStr) + 1) == ERROR_SUCCESS);
|
||||
#endif
|
||||
RegCloseKey(hKey);
|
||||
return(retVal);
|
||||
}
|
||||
|
||||
|
||||
BOOL LOAD_DS XP_GetInstallDirectory(LPCSTR pcurVersionSection, LPCSTR pInstallDirKey, LPSTR path, UINT nSize, HKEY hKey)
|
||||
{
|
||||
#ifdef WIN32
|
||||
if (!GetConfigInfoStr(pcurVersionSection, pInstallDirKey, path, nSize, hKey))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
#else
|
||||
if ( 0 < GetPrivateProfileString(pcurVersionSection, pInstallDirKey,"ERROR", path, nSize, szNetscapeINI))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
BOOL LOAD_DS XP_GetVersionInfoString(LPCSTR pNavigatorSection, LPCSTR pCurrentVersionKey, LPSTR pcurVersionStr, UINT nSize, HKEY hKey)
|
||||
{
|
||||
#ifdef WIN32
|
||||
if (!GetConfigInfoStr(pNavigatorSection, pCurrentVersionKey, pcurVersionStr, nSize, HKEY_LOCAL_MACHINE))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
#else
|
||||
if ( 0 < GetPrivateProfileString(pNavigatorSection, pCurrentVersionKey,"ERROR", pcurVersionStr, nSize, szNetscapeINI))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
DWORD LOAD_DS XP_GetInstallLocation(LPSTR pPath, UINT nSize)
|
||||
{
|
||||
char curVersionStr[256];
|
||||
char curVersionSection[256];
|
||||
|
||||
if (!pPath)
|
||||
return MAPI_E_LOGON_FAILURE;
|
||||
|
||||
#ifdef WIN32
|
||||
if (!XP_GetVersionInfoString(szNavigatorSection, szCurrentVersionKey, curVersionStr,
|
||||
sizeof(curVersionStr), HKEY_LOCAL_MACHINE))
|
||||
{
|
||||
return (MAPI_E_LOGON_FAILURE);
|
||||
}
|
||||
|
||||
wsprintf(curVersionSection, szNavigatorCurVersionSection, curVersionStr);
|
||||
|
||||
if (!XP_GetInstallDirectory(curVersionSection, szInstallDirKey, pPath,
|
||||
nSize, HKEY_LOCAL_MACHINE))
|
||||
{
|
||||
return (MAPI_E_ACCESS_DENIED);
|
||||
|
||||
}
|
||||
|
||||
lstrcat(pPath, "\\");
|
||||
lstrcat(pPath, "Program\\netscape.exe");
|
||||
|
||||
return SUCCESS_SUCCESS;
|
||||
#else
|
||||
if (32 == Is_16_OR_32_BIT_CommunitorRunning())
|
||||
{
|
||||
if (!GetConfigInfoStr("snews\\shell\\open", "command", curVersionStr, sizeof(curVersionStr), HKEY_CLASSES_ROOT))
|
||||
{
|
||||
return (MAPI_E_ACCESS_DENIED);
|
||||
}
|
||||
else
|
||||
{
|
||||
char *pFind = strstr(curVersionStr,"-h");
|
||||
|
||||
if (pFind)
|
||||
{
|
||||
*pFind=0;
|
||||
lstrcpy(pPath,curVersionStr);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (MAPI_E_ACCESS_DENIED);
|
||||
}
|
||||
}
|
||||
|
||||
return SUCCESS_SUCCESS;
|
||||
}
|
||||
else //setup up to start navstart since we are a sixteen bit DLL.
|
||||
{
|
||||
if (!XP_GetVersionInfoString(szNavigatorSection, szCurrentVersionKey, curVersionStr, sizeof(curVersionStr), HKEY_LOCAL_MACHINE))
|
||||
{
|
||||
return (MAPI_E_LOGON_FAILURE);
|
||||
}
|
||||
|
||||
wsprintf(curVersionSection, szNavigatorCurVersionSection, curVersionStr);
|
||||
|
||||
if (!XP_GetInstallDirectory(curVersionSection, szInstallDirKey, pPath,nSize, HKEY_LOCAL_MACHINE))
|
||||
{
|
||||
return (MAPI_E_ACCESS_DENIED);
|
||||
}
|
||||
|
||||
lstrcat(pPath, "\\");
|
||||
lstrcat(pPath, "NAVSTART.EXE");
|
||||
return SUCCESS_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int LOAD_DS Is_16_OR_32_BIT_CommunitorRunning()
|
||||
{
|
||||
if (FindWindow("AfxFrameOrView", NULL) && !FindWindow("aHiddenFrameClass", NULL))
|
||||
return(16);
|
||||
else if (FindWindow("aHiddenFrameClass", NULL))
|
||||
return(32);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
// size of buffer to use for copying files.
|
||||
#define COPYBUFSIZE 1024
|
||||
|
||||
#ifdef WIN16
|
||||
|
||||
BOOL Win16CopyFile(LPCSTR a_Src, LPCSTR a_Dest, BOOL a_bOverwrite)
|
||||
{
|
||||
OFSTRUCT ofSrc, ofDest;
|
||||
HFILE hSrc, hDest;
|
||||
BOOL bResult;
|
||||
|
||||
ofDest.cBytes = ofSrc.cBytes = sizeof(OFSTRUCT);
|
||||
hDest = OpenFile(a_Dest, &ofDest, OF_EXIST);
|
||||
if (hDest != HFILE_ERROR && !a_bOverwrite)
|
||||
bResult = FALSE; // file exists but caller doesn't want file overwritten
|
||||
else { // file either doesn't exist, or caller wants it overwritten.
|
||||
hSrc = OpenFile(a_Src, &ofSrc, OF_READ);
|
||||
hDest = OpenFile(a_Dest, &ofDest, OF_WRITE | OF_CREATE);
|
||||
if (hSrc != HFILE_ERROR && hDest != HFILE_ERROR) {
|
||||
unsigned char buf[COPYBUFSIZE];
|
||||
UINT bufsize = COPYBUFSIZE;
|
||||
UINT bytesread;
|
||||
|
||||
bResult = TRUE;
|
||||
while (0 != (bytesread = _lread(hSrc, (LPVOID)buf, bufsize))) {
|
||||
if ((bytesread == HFILE_ERROR) || // check for read error...
|
||||
// and write error
|
||||
(bytesread != _lwrite(hDest, (LPVOID)buf, bytesread))) {
|
||||
bResult = FALSE; // could be out of diskspace
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
bResult = FALSE;
|
||||
|
||||
if (hSrc != HFILE_ERROR)
|
||||
_lclose(hSrc);
|
||||
if (hDest != HFILE_ERROR)
|
||||
_lclose(hDest);
|
||||
}
|
||||
|
||||
return bResult;
|
||||
}
|
||||
|
||||
#endif // WIN16
|
||||
|
||||
BOOL LOAD_DS
|
||||
XP_CopyFile(LPCSTR lpExistingFile, LPCSTR lpNewFile, BOOL bFailifExist)
|
||||
{
|
||||
#ifdef WIN32
|
||||
return CopyFile(lpExistingFile, lpNewFile, bFailifExist);
|
||||
#else
|
||||
return Win16CopyFile(lpExistingFile, lpNewFile, TRUE);
|
||||
#endif
|
||||
}
|
||||
138
mozilla/mailnews/mapi/old/mapi32/xpapi.h
Normal file
138
mozilla/mailnews/mapi/old/mapi32/xpapi.h
Normal file
@@ -0,0 +1,138 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// Various routines for MAPI functions.
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#ifndef __XPAPI_H
|
||||
#define __XPAPI_H
|
||||
|
||||
#ifdef WIN16
|
||||
|
||||
#include <string.h>
|
||||
#include <direct.h>
|
||||
#include <shellapi.h>
|
||||
#include <stdlib.h>
|
||||
#else
|
||||
#include <winreg.h>
|
||||
#endif
|
||||
|
||||
#ifdef WIN16
|
||||
extern "C" {
|
||||
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
|
||||
#include <mapi.h>
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
//#include <mapi.h>
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#define MAPI_IMPLEMENT(param) param PASCAL
|
||||
#define LOAD_DS
|
||||
#else
|
||||
#define LOAD_DS __loadds
|
||||
#define MAPI_IMPLEMENT(param) extern "C" param FAR PASCAL
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef WIN16
|
||||
#define _MAX_PATH 260 /* max. length of full pathname*/
|
||||
#define MAPI_E_LOGON_FAILURE 3
|
||||
#define MAPI_E_ACCESS_DENIED 6
|
||||
#define INVALID_HANDLE_VALUE (HANDLE)-1
|
||||
#define KEY_QUERY_VALUE 0x0001
|
||||
#define HKEY_LOCAL_MACHINE ((HKEY)0x80000002)
|
||||
#define HKEY_ROOT HKEY_CLASSES_ROOT
|
||||
#else
|
||||
#define HKEY_ROOT ((HKEY)0x80000002)
|
||||
#endif
|
||||
|
||||
//
|
||||
// registry keys
|
||||
//
|
||||
#ifdef WIN32
|
||||
static char szNavigatorSection[] = "Software\\Netscape\\Netscape Navigator";
|
||||
static char szNavigatorCurVersionSection[] = "Software\\Netscape\\Netscape Navigator\\%s\\Main";
|
||||
static char szCurrentVersionKey[] = "CurrentVersion";
|
||||
static char szInstallDirKey[] = "Install Directory";
|
||||
static char szMapiSection[] = "Software\\Netscape\\Netscape Navigator\\MAPI";
|
||||
static char szTempFiles[] = "TempFiles";
|
||||
static char szMapiLog[] = "NSMAPI32.LOG";
|
||||
#else
|
||||
//32 bit key strings for trying to read the 32bit registry
|
||||
static char szNavigatorSection32[] = "Software\\Netscape\\Netscape Navigator";
|
||||
static char szNavigatorCurVersionSection32[] = "Software\\Netscape\\Netscape Navigator\\%s\\Main";
|
||||
static char szMapiSection32[] = "Software\\Netscape\\Netscape Navigator\\MAPI";
|
||||
|
||||
// ini section and key strings
|
||||
static char szNetscapeINI[] = "nscp.ini";
|
||||
static char szNavigatorSection[] = "Netscape Navigator";
|
||||
static char szNavigatorCurVersionSection[] = "Netscape Navigator-%s";
|
||||
static char szCurrentVersionKey[] = "CurrentVersion";
|
||||
static char szInstallDirKey[] = "Install Directory";
|
||||
static char szMapiSection[] = "MAPI";
|
||||
static char szTempFiles[] = "TempFiles";
|
||||
static char szExeName[] = "NAVSTART.EXE";
|
||||
static char szMapiLog[] = "NSMAPI16.LOG";
|
||||
#endif
|
||||
|
||||
//Since REGSAM is just an ACCESS_MASK which is just a DWORD and it's not
|
||||
//declared in win16 we'll make one hear for the purpose of keeping parameters
|
||||
//the same even though the access rights don't get used for win16.
|
||||
|
||||
typedef DWORD REGSAM;
|
||||
|
||||
|
||||
// XP declarations
|
||||
|
||||
int LOAD_DS Is_16_OR_32_BIT_CommunitorRunning();
|
||||
WORD LOAD_DS XP_CallProcess(LPCSTR pPath, LPCSTR pCmdLine);
|
||||
HKEY LOAD_DS RegOpenParent(LPCSTR pSection, HKEY hRootKey, REGSAM access);
|
||||
HKEY LOAD_DS RegCreateParent(LPCSTR pSection, HKEY hMasterKey);
|
||||
BOOL LOAD_DS GetConfigInfoStr(LPCSTR pSection, LPCSTR pKey, LPSTR pBuf, int lenBuf, HKEY hMasterKey);
|
||||
BOOL LOAD_DS GetConfigInfoNum(LPCSTR pSection, LPCSTR pKey, DWORD* pVal, HKEY hMasterKey);
|
||||
BOOL LOAD_DS SetConfigInfoStr(LPCSTR pSection, LPCSTR pKey, LPSTR pStr, HKEY hMasterKey);
|
||||
|
||||
BOOL LOAD_DS XP_GetInstallDirectory(LPCSTR pcurVersionSection, LPCSTR pInstallDirKey, LPSTR path, UINT nSize, HKEY hKey);
|
||||
BOOL LOAD_DS XP_GetVersionInfoString(LPCSTR pNavigatorSection, LPCSTR pCurrentVersionKey, LPSTR pcurVersionStr, UINT nSize, HKEY hKey);
|
||||
DWORD LOAD_DS XP_GetInstallLocation(LPSTR pPath, UINT nSize);
|
||||
BOOL LOAD_DS XP_CopyFile(LPCSTR lpExistingFile, LPCSTR lpNewFile, BOOL bFailifExist);
|
||||
|
||||
#endif // __XPAPI_H
|
||||
31
mozilla/mailnews/mapi/old/public/makefile.win
Normal file
31
mozilla/mailnews/mapi/old/public/makefile.win
Normal file
@@ -0,0 +1,31 @@
|
||||
#!nmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
|
||||
DEPTH=..\..\..
|
||||
MODULE=mime
|
||||
|
||||
EXPORTS = \
|
||||
nscpmapi.h \
|
||||
$(NULL)
|
||||
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
351
mozilla/mailnews/mapi/old/public/nscpmapi.h
Normal file
351
mozilla/mailnews/mapi/old/public/nscpmapi.h
Normal file
@@ -0,0 +1,351 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// This is a header file for the MAPI support within
|
||||
// Communicator.
|
||||
//
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
//
|
||||
#ifndef _NSCPMAPI
|
||||
#define _NSCPMAPI
|
||||
|
||||
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
|
||||
#include <mapi.h> // for MAPI specific types...
|
||||
#endif
|
||||
|
||||
#ifdef WIN16
|
||||
typedef unsigned char UCHAR;
|
||||
#endif
|
||||
|
||||
|
||||
#define MAX_NAME_LEN 256
|
||||
#define MAX_PW_LEN 256
|
||||
#define MAX_MSGINFO_LEN 512
|
||||
#define MAX_CON 4 // Maximum MAPI session supported
|
||||
#define MAX_POINTERS 32
|
||||
|
||||
//
|
||||
// The MAPI class that will act as the internal mechanism for
|
||||
// Communicator to control multiple MAPI sessions.
|
||||
//
|
||||
class CMAPIConnection
|
||||
{
|
||||
protected:
|
||||
LONG m_ID;
|
||||
BOOL m_defaultConnection;
|
||||
LONG m_sessionCount;
|
||||
LONG m_messageIndex;
|
||||
LPVOID m_cookie;
|
||||
UCHAR m_messageFindInfo[MAX_MSGINFO_LEN];
|
||||
UCHAR m_profileName[MAX_NAME_LEN];
|
||||
UCHAR m_password[MAX_PW_LEN];
|
||||
|
||||
// Methods
|
||||
|
||||
public:
|
||||
CMAPIConnection ( LONG, LPSTR, LPSTR );
|
||||
~CMAPIConnection ( );
|
||||
|
||||
// ID related methods
|
||||
LONG GetID( ) { return m_ID; } ;
|
||||
|
||||
// Dealing with the default session...
|
||||
BOOL IsDefault( ) { return m_defaultConnection; } ;
|
||||
void SetDefault( BOOL flag ) { m_defaultConnection = flag; } ;
|
||||
|
||||
// For handling multiple sessions on a profile name...
|
||||
LONG GetSessionCount( ) { return m_sessionCount; } ;
|
||||
void IncrementSessionCount() { ++m_sessionCount; } ;
|
||||
void DecrementSessionCount() { --m_sessionCount; } ;
|
||||
|
||||
// Information retrieval stuff...
|
||||
LPSTR GetProfileName( ) { return (LPSTR) m_profileName; };
|
||||
LPSTR GetPassword( ) { return (LPSTR) m_password; };
|
||||
|
||||
// Dealing with message information...
|
||||
void SetMessageIndex( LONG mIndex ) { m_messageIndex = mIndex; } ;
|
||||
LONG GetMessageIndex( ) { return m_messageIndex; };
|
||||
|
||||
void SetMessageFindInfo( LPSTR info ) { lstrcpy((LPSTR)m_messageFindInfo, info); } ;
|
||||
LPSTR GetMessageFindInfo( ) { return (LPSTR) m_messageFindInfo; };
|
||||
|
||||
// For enumerating Messages...
|
||||
void SetMapiListContext( LPVOID cookie) { m_cookie = cookie; } ;
|
||||
LPVOID GetMapiListContext( ) { return m_cookie; };
|
||||
};
|
||||
|
||||
//
|
||||
// Defines needed for requests being made with the WM_COPYDATA call...
|
||||
//
|
||||
typedef enum {
|
||||
NSCP_MAPIStartRequestID = 0,
|
||||
NSCP_MAPILogon,
|
||||
NSCP_MAPILogoff,
|
||||
NSCP_MAPIFree,
|
||||
NSCP_MAPISendMail,
|
||||
NSCP_MAPISendDocuments,
|
||||
NSCP_MAPIFindNext,
|
||||
NSCP_MAPIReadMail,
|
||||
NSCP_MAPISaveMail,
|
||||
NSCP_MAPIDeleteMail,
|
||||
NSCP_MAPIAddress,
|
||||
NSCP_MAPIDetails,
|
||||
NSCP_MAPIResolveName,
|
||||
NSCP_MAPIEndRequestID // Note: this is a marker for MAPI IPC requests
|
||||
} NSCP_IPC_REQUEST;
|
||||
|
||||
//
|
||||
// This is to keep track of the pointers allocated in the MAPI DLL
|
||||
// and deal with them correctly.
|
||||
//
|
||||
#define MAPI_MESSAGE_TYPE 0
|
||||
#define MAPI_RECIPIENT_TYPE 1
|
||||
|
||||
typedef struct {
|
||||
LPVOID lpMem;
|
||||
UCHAR memType;
|
||||
} memTrackerType;
|
||||
|
||||
//
|
||||
// This is the generic message that WM_COPYDATA will send to the
|
||||
// Communicator product to allow it to attach to shared memory.
|
||||
// NOTE: On Win16, this will simply reference a pointer.
|
||||
//
|
||||
typedef struct {
|
||||
UCHAR smemName[64]; // Name of shared memory
|
||||
DWORD smemSize; // Size of shared memory
|
||||
LPVOID lpsmem; // Will be really used in Win16 only
|
||||
} MAPIIPCType;
|
||||
|
||||
//
|
||||
// These are message specific structures that will be used for
|
||||
// the various MAPI operations.
|
||||
//
|
||||
typedef struct {
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
LHANDLE lhSession;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
// LPSTR strSequence, // LPSTR lpszProfileName, LPSTR lpszPassword
|
||||
// This is here to document the fact there will be a string sequence at
|
||||
// this location
|
||||
} MAPILogonType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
} MAPILogoffType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
// The following is the "FLAT" representation of the (lpMapiMessage lpMessage)
|
||||
// argument of this structure
|
||||
FLAGS MSG_flFlags; // unread,return receipt
|
||||
ULONG MSG_nRecipCount; // Number of recipients
|
||||
ULONG MSG_nFileCount; // # of file attachments
|
||||
ULONG MSG_ORIG_ulRecipClass; // Recipient class - MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG
|
||||
BYTE dataBuf[1]; // For easy referencing
|
||||
//
|
||||
// This is where it gets CONFUSING...the following buffer of memory is a
|
||||
// contiguous chunk of memory for various strings that are part of this
|
||||
// multilevel structure. For any of the following structure, any numbers
|
||||
// are represented by strings that will have to be converted back to numeric
|
||||
// values with atoi() calls.
|
||||
|
||||
// String 0: LPSTR lpszSubject; // Message Subject
|
||||
// String 1: LPSTR lpszNoteText FILE NAME; // Message Text will be
|
||||
// stored into a temp file and this will be the pointer to that file.
|
||||
// String 2: LPSTR lpszDateReceived; // in YYYY/MM/DD HH:MM format
|
||||
// String 3: LPSTR lpszConversationID; // conversation thread ID
|
||||
//
|
||||
// The following are for the originator of the message. Only ONE of these.
|
||||
//
|
||||
// String 4: LPSTR lpszName; // Originator name
|
||||
// String 5: LPSTR lpszAddress; // Originator address (optional)
|
||||
//
|
||||
// The following strings are for the recipients for this message. There are
|
||||
// MSG_nRecipCount of these in a row:
|
||||
//
|
||||
// for (i=0; i<MSG_nRecipCount; i++)
|
||||
// String x: LPSTR lpszRecipClass (ULONG) // Recipient class - MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG
|
||||
// String x: LPSTR lpszName; // Recipient N name
|
||||
// String x: LPSTR lpszAddress; // Recipient N address (optional)
|
||||
//
|
||||
// Now, finally, add the attachments for this beast. There are MSG_nFileCount
|
||||
// attachments so it would look like the following:
|
||||
//
|
||||
// for (i=0; i<MSG_nFileCount; i++)
|
||||
//
|
||||
// String x: LPSTR lpszPathName // Fully qualified path of the attached file.
|
||||
// // This path should include the disk drive letter and directory name.
|
||||
// String x: LPSTR lpszFileName // The display name for the attached file
|
||||
//
|
||||
} MAPISendMailType;
|
||||
|
||||
typedef struct {
|
||||
ULONG ulUIParam;
|
||||
ULONG nFileCount;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
BYTE dataBuf[1]; // For easy referencing
|
||||
//
|
||||
// The sequence of strings to follow are groups of PathName/FileName couples.
|
||||
// The strings will be parsed in MAPI[32].DLL and then put into this format:
|
||||
//
|
||||
// for (i=0; i<nFileCount; i++)
|
||||
//
|
||||
// String x: LPSTR lpszPathName // Fully qualified path of the attached file.
|
||||
// // This path should include the disk drive letter and directory name.
|
||||
// String x: LPSTR lpszFileName // The display name for the attached file
|
||||
} MAPISendDocumentsType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
UCHAR lpszSeedMessageID[MAX_MSGINFO_LEN];
|
||||
UCHAR lpszMessageID[MAX_MSGINFO_LEN];
|
||||
} MAPIFindNextType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
UCHAR lpszMessageID[MAX_MSGINFO_LEN];
|
||||
} MAPIDeleteMailType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
UCHAR lpszName[MAX_NAME_LEN];
|
||||
// These are returned by Communicator
|
||||
UCHAR lpszABookID[MAX_NAME_LEN];
|
||||
UCHAR lpszABookName[MAX_NAME_LEN];
|
||||
UCHAR lpszABookAddress[MAX_NAME_LEN];
|
||||
} MAPIResolveNameType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
UCHAR lpszABookID[MAX_NAME_LEN];
|
||||
} MAPIDetailsType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
UCHAR lpszMessageID[MAX_MSGINFO_LEN];
|
||||
//
|
||||
// The following is the "FLAT" representation of the (lpMapiMessage lpMessage)
|
||||
// argument of this structure
|
||||
//
|
||||
FLAGS MSG_flFlags; // unread, return or receipt
|
||||
ULONG MSG_nRecipCount; // Number of recipients
|
||||
ULONG MSG_nFileCount; // # of file attachments
|
||||
ULONG MSG_ORIG_ulRecipClass; // Recipient class - MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG
|
||||
//
|
||||
// Output parameter for blob of information that will live on disk.
|
||||
//
|
||||
UCHAR lpszBlob[MAX_MSGINFO_LEN]; // file name on disk
|
||||
//
|
||||
// The format of this blob of information will be:
|
||||
//
|
||||
// String 0: LPSTR lpszSubject; // Message Subject
|
||||
// String 1: LPSTR lpszNoteText FILE NAME; // Message Text will be
|
||||
// stored into a temp file and this will be the pointer to that file.
|
||||
// String 2: LPSTR lpszDateReceived; // in YYYY/MM/DD HH:MM format
|
||||
// String 3: LPSTR lpszConversationID; // conversation thread ID
|
||||
//
|
||||
// The following are for the originator of the message. Only ONE of these.
|
||||
//
|
||||
// String 4: LPSTR lpszName; // Originator name
|
||||
// String 5: LPSTR lpszAddress; // Originator address (optional)
|
||||
//
|
||||
// The following strings are for the recipients for this message. There are
|
||||
// MSG_nRecipCount of these in a row:
|
||||
//
|
||||
// for (i=0; i<MSG_nRecipCount; i++)
|
||||
// String x: LPSTR lpszName; // Recipient N name
|
||||
// String x: LPSTR lpszAddress; // Recipient N address (optional)
|
||||
// String x: LPSTR lpszRecipClass // recipient class - sprintf of ULONG
|
||||
//
|
||||
// Now, finally, add the attachments for this beast. There are MSG_nFileCount
|
||||
// attachments so it would look like the following:
|
||||
//
|
||||
// for (i=0; i<MSG_nFileCount; i++)
|
||||
//
|
||||
// String x: LPSTR lpszPathName // Fully qualified path of the attached file.
|
||||
// // This path should include the disk drive letter and directory name.
|
||||
// String x: LPSTR lpszFileName // The display name for the attached file
|
||||
//
|
||||
} MAPIReadMailType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
UCHAR lpszCaption[MAX_MSGINFO_LEN];
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
// The following is the "FLAT" representation of the (lpMapiRecipDesc lpRecips)
|
||||
// argument of this structure
|
||||
ULONG nRecips; // number of recips to start with...
|
||||
ULONG nNewRecips; // number of recips returned...
|
||||
UCHAR lpszBlob[MAX_MSGINFO_LEN]; // file name for blob of information
|
||||
// that will live on disk.
|
||||
BYTE dataBuf[1]; // For easy referencing
|
||||
//
|
||||
// The following contiguous chunk of memory is the buffer that holds
|
||||
// the recipients to load into the address picker...
|
||||
//
|
||||
// for (i=0; i<MSG_nRecipCount; i++)
|
||||
// String x: LPSTR lpszRecipClass (ULONG) // Recipient class - MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG
|
||||
// String x: LPSTR lpszName; // Recipient N name
|
||||
// String x: LPSTR lpszAddress; // Recipient N address (optional)
|
||||
//
|
||||
} MAPIAddressType;
|
||||
|
||||
#endif // _NSCPMAPI
|
||||
27
mozilla/mailnews/mapi/old/tests/makefile.win
Normal file
27
mozilla/mailnews/mapi/old/tests/makefile.win
Normal file
@@ -0,0 +1,27 @@
|
||||
#!nmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
|
||||
DEPTH=..\..\..
|
||||
|
||||
|
||||
DIRS=mapitest
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
239
mozilla/mailnews/mapi/old/tests/mapitest/main.cpp
Normal file
239
mozilla/mailnews/mapi/old/tests/mapitest/main.cpp
Normal file
@@ -0,0 +1,239 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
|
||||
#include <mapi.h>
|
||||
#endif
|
||||
|
||||
#include "port.h"
|
||||
#include "resource.h"
|
||||
|
||||
#ifndef WM_PAINTICON
|
||||
#define WM_PAINTICON 0x26
|
||||
#endif // WM_PAINTICON
|
||||
|
||||
/*
|
||||
* Forward Declarations...
|
||||
*/
|
||||
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
|
||||
BOOL CALLBACK LOADDS MyDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
|
||||
extern void ProcessCommand(HWND hWnd, int id, HWND hCtl, UINT codeNotify);
|
||||
BOOL OpenMAPI(void);
|
||||
void CloseMAPI(void);
|
||||
|
||||
/*
|
||||
* Global variables
|
||||
*/
|
||||
HINSTANCE hInst;
|
||||
HWND hWnd;
|
||||
|
||||
#ifdef WIN16
|
||||
HICON hIconApp;
|
||||
#endif
|
||||
|
||||
char NEAR szAppName[] = "Netscape QA Helper";
|
||||
char NEAR szShortAppName[] = "QAHelper";
|
||||
char szClassName[] = "Netscape_QAHelper_Class_Name";
|
||||
|
||||
void
|
||||
AppCleanup(void)
|
||||
{
|
||||
extern void DoMAPILogoff(HWND hWnd);
|
||||
static BOOL isDone = FALSE;
|
||||
|
||||
if (isDone)
|
||||
return;
|
||||
|
||||
extern LHANDLE mapiSession;
|
||||
|
||||
if (mapiSession != 0)
|
||||
{
|
||||
DoMAPILogoff(hWnd);
|
||||
}
|
||||
|
||||
CloseMAPI();
|
||||
isDone = TRUE;
|
||||
}
|
||||
|
||||
BOOL
|
||||
InitInstance(HINSTANCE hInstance, int nCmdShow)
|
||||
{
|
||||
/* Create a main window for this application instance. */
|
||||
hWnd = CreateDialog((HINSTANCE) hInstance,
|
||||
MAKEINTRESOURCE(ID_DIALOG),
|
||||
(HWND) NULL, (DLGPROC) MyDlgProc);
|
||||
|
||||
if (!hWnd)
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL InitApp(void)
|
||||
{
|
||||
#ifndef WIN16
|
||||
WNDCLASS wc;
|
||||
wc.style = 0;
|
||||
wc.lpfnWndProc = DefDlgProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = DLGWINDOWEXTRA;
|
||||
wc.hInstance = hInst;
|
||||
wc.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_APP));
|
||||
wc.hCursor = LoadCursor(0, IDC_ARROW);
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = szClassName;
|
||||
|
||||
if(!RegisterClass(&wc))
|
||||
return FALSE;
|
||||
|
||||
#else
|
||||
hIconApp = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_APP));
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
} // end InitApp
|
||||
|
||||
// Win Main
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
|
||||
{
|
||||
MSG msg;
|
||||
|
||||
hInst = hInstance;
|
||||
|
||||
if (!InitApp())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!InitInstance(hInstance, nCmdShow))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!OpenMAPI())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ShowWindow(hWnd, SW_SHOW);
|
||||
|
||||
// Start the application
|
||||
while ((GetMessage(&msg, (HWND) NULL, (UINT) NULL, (UINT) NULL)))
|
||||
{
|
||||
if(IsDialogMessage(hWnd, &msg))
|
||||
continue;
|
||||
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
return(msg.wParam);
|
||||
}
|
||||
|
||||
BOOL CALLBACK LOADDS
|
||||
MyDlgProc(HWND hWndMain, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (wMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
hWnd = hWndMain;
|
||||
SetDlgItemText(hWnd, ID_EDIT_ROW, "0");
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_CLOSE:
|
||||
{
|
||||
DestroyWindow(hWnd);
|
||||
break;
|
||||
}
|
||||
|
||||
case WM_DESTROY:
|
||||
{
|
||||
AppCleanup();
|
||||
|
||||
#ifndef WIN16
|
||||
UnregisterClass(szClassName, hInst);
|
||||
#else
|
||||
// Destroy the 16 bit windows icon
|
||||
if(hIconApp != 0)
|
||||
DestroyIcon(hIconApp);
|
||||
#endif
|
||||
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
}
|
||||
case WM_COMMAND:
|
||||
HANDLE_WM_COMMAND(hWnd, wParam, lParam, ProcessCommand);
|
||||
break;
|
||||
|
||||
case WM_QUERYDRAGICON:
|
||||
#ifdef WIN16
|
||||
return (BOOL)hIconApp;
|
||||
#endif
|
||||
|
||||
case WM_PAINTICON:
|
||||
#ifdef WIN16
|
||||
SetClassWord(hWnd, GCW_HICON, 0);
|
||||
|
||||
// fall trough
|
||||
case WM_PAINT:
|
||||
{
|
||||
if(!IsIconic(hWnd))
|
||||
return FALSE;
|
||||
PAINTSTRUCT ps;
|
||||
HDC hDC = BeginPaint(hWnd, &ps);
|
||||
SetMapMode(hDC, MM_TEXT);
|
||||
DrawIcon(hDC, 2, 2, hIconApp);
|
||||
EndPaint(hWnd, &ps);
|
||||
break;
|
||||
}
|
||||
#endif //WIN16
|
||||
break; // RICHIE - if this is not here NT 3.51 Pukes!!!!
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//~~av return (DefWindowProc(hWnd, wMsg, wParam, lParam));
|
||||
return TRUE;
|
||||
}
|
||||
240
mozilla/mailnews/mapi/old/tests/mapitest/makefile.win
Normal file
240
mozilla/mailnews/mapi/old/tests/mapitest/makefile.win
Normal file
@@ -0,0 +1,240 @@
|
||||
# Microsoft Developer Studio Generated NMAKE File, Based on mapitest.dsp
|
||||
!IF "$(CFG)" == ""
|
||||
CFG=mapitest - Win32 Debug
|
||||
!MESSAGE No configuration specified. Defaulting to mapitest - Win32 Debug.
|
||||
!ENDIF
|
||||
|
||||
!IF "$(CFG)" != "mapitest - Win32 Release" && "$(CFG)" != "mapitest - Win32 Debug"
|
||||
!MESSAGE Invalid configuration "$(CFG)" specified.
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "mapitest.mak" CFG="mapitest - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "mapitest - Win32 Release" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "mapitest - Win32 Debug" (based on "Win32 (x86) Application")
|
||||
!MESSAGE
|
||||
!ERROR An invalid configuration is specified.
|
||||
!ENDIF
|
||||
|
||||
!IF "$(OS)" == "Windows_NT"
|
||||
NULL=
|
||||
!ELSE
|
||||
NULL=nul
|
||||
!ENDIF
|
||||
|
||||
!IF "$(CFG)" == "mapitest - Win32 Release"
|
||||
|
||||
OUTDIR=.\Release
|
||||
INTDIR=.\Release
|
||||
# Begin Custom Macros
|
||||
OutDir=.\Release
|
||||
# End Custom Macros
|
||||
|
||||
ALL : "$(OUTDIR)\mapitest.exe"
|
||||
|
||||
export :
|
||||
libs :
|
||||
install :
|
||||
|
||||
clobber_all : clobber
|
||||
|
||||
clobber:
|
||||
-@erase "$(INTDIR)\main.obj"
|
||||
-@erase "$(INTDIR)\mapimail.obj"
|
||||
-@erase "$(INTDIR)\mapiproc.obj"
|
||||
-@erase "$(INTDIR)\mtest32.res"
|
||||
-@erase "$(INTDIR)\readmail.obj"
|
||||
-@erase "$(INTDIR)\vc60.idb"
|
||||
-@erase "$(OUTDIR)\mapitest.exe"
|
||||
-@erase "$(OUTDIR)\mapitest.pch"
|
||||
|
||||
"$(OUTDIR)" :
|
||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
||||
|
||||
CPP=cl.exe
|
||||
CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"$(INTDIR)\mapitest.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
|
||||
|
||||
.c{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.c{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
MTL=midl.exe
|
||||
MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
RSC=rc.exe
|
||||
RSC_PROJ=/l 0x409 /fo"$(INTDIR)\mtest32.res" /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\mapitest.bsc"
|
||||
BSC32_SBRS= \
|
||||
|
||||
LINK32=link.exe
|
||||
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:no /pdb:"$(OUTDIR)\mapitest.pdb" /machine:I386 /out:"$(OUTDIR)\mapitest.exe"
|
||||
LINK32_OBJS= \
|
||||
"$(INTDIR)\main.obj" \
|
||||
"$(INTDIR)\mapimail.obj" \
|
||||
"$(INTDIR)\mapiproc.obj" \
|
||||
"$(INTDIR)\readmail.obj" \
|
||||
"$(INTDIR)\mtest32.res"
|
||||
|
||||
"$(OUTDIR)\mapitest.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
|
||||
$(LINK32) @<<
|
||||
$(LINK32_FLAGS) $(LINK32_OBJS)
|
||||
<<
|
||||
|
||||
!ELSEIF "$(CFG)" == "mapitest - Win32 Debug"
|
||||
|
||||
OUTDIR=.\Debug
|
||||
INTDIR=.\Debug
|
||||
# Begin Custom Macros
|
||||
OutDir=.\Debug
|
||||
# End Custom Macros
|
||||
|
||||
ALL : "$(OUTDIR)\mapitest.exe"
|
||||
|
||||
export :
|
||||
libs :
|
||||
install :
|
||||
|
||||
clobber_all : clobber
|
||||
|
||||
clobber :
|
||||
-@erase "$(INTDIR)\main.obj"
|
||||
-@erase "$(INTDIR)\mapimail.obj"
|
||||
-@erase "$(INTDIR)\mapiproc.obj"
|
||||
-@erase "$(INTDIR)\mtest32.res"
|
||||
-@erase "$(INTDIR)\readmail.obj"
|
||||
-@erase "$(INTDIR)\vc60.idb"
|
||||
-@erase "$(INTDIR)\vc60.pdb"
|
||||
-@erase "$(OUTDIR)\mapitest.exe"
|
||||
-@erase "$(OUTDIR)\mapitest.ilk"
|
||||
-@erase "$(OUTDIR)\mapitest.pdb"
|
||||
-@erase "$(OUTDIR)\mapitest.pch"
|
||||
|
||||
"$(OUTDIR)" :
|
||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
||||
|
||||
CPP=cl.exe
|
||||
CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"$(INTDIR)\mapitest.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
|
||||
|
||||
.c{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.c{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
MTL=midl.exe
|
||||
MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
RSC=rc.exe
|
||||
RSC_PROJ=/l 0x409 /fo"$(INTDIR)\mtest32.res" /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\mapitest.bsc"
|
||||
BSC32_SBRS= \
|
||||
|
||||
LINK32=link.exe
|
||||
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\mapitest.pdb" /debug /machine:I386 /out:"$(OUTDIR)\mapitest.exe" /pdbtype:sept
|
||||
LINK32_OBJS= \
|
||||
"$(INTDIR)\main.obj" \
|
||||
"$(INTDIR)\mapimail.obj" \
|
||||
"$(INTDIR)\mapiproc.obj" \
|
||||
"$(INTDIR)\readmail.obj" \
|
||||
"$(INTDIR)\mtest32.res"
|
||||
|
||||
"$(OUTDIR)\mapitest.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
|
||||
$(LINK32) @<<
|
||||
$(LINK32_FLAGS) $(LINK32_OBJS)
|
||||
<<
|
||||
|
||||
!ENDIF
|
||||
|
||||
|
||||
!IF "$(NO_EXTERNAL_DEPS)" != "1"
|
||||
!IF EXISTS("mapitest.dep")
|
||||
!INCLUDE "mapitest.dep"
|
||||
!ELSE
|
||||
!MESSAGE Warning: cannot find "mapitest.dep"
|
||||
!ENDIF
|
||||
!ENDIF
|
||||
|
||||
|
||||
!IF "$(CFG)" == "mapitest - Win32 Release" || "$(CFG)" == "mapitest - Win32 Debug"
|
||||
SOURCE=.\main.cpp
|
||||
|
||||
"$(INTDIR)\main.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
SOURCE=.\mapimail.cpp
|
||||
|
||||
"$(INTDIR)\mapimail.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
SOURCE=.\mapiproc.cpp
|
||||
|
||||
"$(INTDIR)\mapiproc.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
SOURCE=.\mtest32.rc
|
||||
|
||||
"$(INTDIR)\mtest32.res" : $(SOURCE) "$(INTDIR)"
|
||||
$(RSC) $(RSC_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=.\readmail.cpp
|
||||
|
||||
"$(INTDIR)\readmail.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
772
mozilla/mailnews/mapi/old/tests/mapitest/mapimail.cpp
Normal file
772
mozilla/mailnews/mapi/old/tests/mapitest/mapimail.cpp
Normal file
@@ -0,0 +1,772 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
#include <string.h>
|
||||
#include <mapi.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "port.h"
|
||||
#include "resource.h"
|
||||
|
||||
//
|
||||
// Variables...
|
||||
//
|
||||
extern HINSTANCE m_hInstMapi;
|
||||
extern LHANDLE mapiSession;
|
||||
|
||||
//
|
||||
// Forward declarations...
|
||||
//
|
||||
void DoMAPIFreeBuffer(HWND hWnd, LPVOID buf, BOOL alert);
|
||||
extern void ShowMessage(HWND hWnd, LPSTR msg);
|
||||
void DoMAPISendMail(HWND hWnd);
|
||||
void DoMAPISendDocuments(HWND hWnd);
|
||||
void DoMAPISaveMail(HWND hWnd);
|
||||
void DoMAPIAddress(HWND hWnd);
|
||||
extern void SetFooter(LPSTR msg);
|
||||
extern LPSTR GetMAPIError(LONG errorCode);
|
||||
|
||||
void
|
||||
ProcessMailCommand(HWND hWnd, int id, HWND hCtl, UINT codeNotify)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case IDCANCEL:
|
||||
EndDialog(hWnd, 0);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_MAPISENDMAIL:
|
||||
DoMAPISendMail(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_MAPISENDDOCUMENTS:
|
||||
DoMAPISendDocuments(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_MAPISAVEMAIL:
|
||||
DoMAPISaveMail(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_MAPIADDRESS:
|
||||
DoMAPIAddress(hWnd);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL CALLBACK LOADDS
|
||||
MailDlgProc(HWND hWndMain, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (wMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
HANDLE_WM_COMMAND(hWndMain, wParam, lParam, ProcessMailCommand);
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static LPSTR lpszDelimChar = ";";
|
||||
|
||||
void
|
||||
TackItOn(LPSTR fileBuf, LPSTR nameBuf, LPSTR addOn)
|
||||
{
|
||||
if (addOn[0] != '\0')
|
||||
{
|
||||
lstrcat(fileBuf, addOn);
|
||||
lstrcat(fileBuf, lpszDelimChar);
|
||||
|
||||
lstrcat(nameBuf, "NAMEOF.FILE");
|
||||
lstrcat(nameBuf, lpszDelimChar);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPISendDocuments(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPISendDocuments) (ULONG ulUIParam,
|
||||
LPTSTR lpszDelimChar, LPTSTR lpszFullPaths,
|
||||
LPTSTR lpszFileNames, ULONG ulReserved);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPISendDocuments = GetProcAddress(m_hInstMapi, "MAPISENDDOCUMENTS");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPISendDocuments = GetProcAddress(m_hInstMapi, "MAPISendDocuments");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPISendDocuments)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
char msg[1024];
|
||||
char tempFileName[_MAX_PATH] = "";
|
||||
char lpszFullPaths[(_MAX_PATH + 1) * 4] = "";
|
||||
char lpszFileNames[(_MAX_PATH + 1) * 4] = "";
|
||||
|
||||
// Now get the names of the files to attach...
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH1, tempFileName, sizeof(tempFileName));
|
||||
TackItOn(lpszFullPaths, lpszFileNames, tempFileName);
|
||||
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH2, tempFileName, sizeof(tempFileName));
|
||||
TackItOn(lpszFullPaths, lpszFileNames, tempFileName);
|
||||
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH3, tempFileName, sizeof(tempFileName));
|
||||
TackItOn(lpszFullPaths, lpszFileNames, tempFileName);
|
||||
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH4, tempFileName, sizeof(tempFileName));
|
||||
TackItOn(lpszFullPaths, lpszFileNames, tempFileName);
|
||||
|
||||
LONG rc = (*lpfnMAPISendDocuments)
|
||||
( (ULONG) hWnd,
|
||||
lpszDelimChar,
|
||||
lpszFullPaths,
|
||||
lpszFileNames,
|
||||
0);
|
||||
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
ShowMessage(hWnd, "Success with MAPISendDocuments");
|
||||
SetFooter("MAPISendDocuments success");
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPISendDocuments\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("MAPISendDocuments failed");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
FreeMAPIFile(lpMapiFileDesc pv)
|
||||
{
|
||||
if (!pv)
|
||||
return;
|
||||
|
||||
if (pv->lpszPathName != NULL)
|
||||
free(pv->lpszPathName);
|
||||
|
||||
if (pv->lpszFileName != NULL)
|
||||
free(pv->lpszFileName);
|
||||
}
|
||||
|
||||
void
|
||||
FreeMAPIRecipient(lpMapiRecipDesc pv)
|
||||
{
|
||||
if (!pv)
|
||||
return;
|
||||
|
||||
if (pv->lpszName != NULL)
|
||||
free(pv->lpszName);
|
||||
|
||||
if (pv->lpszAddress != NULL)
|
||||
free(pv->lpszAddress);
|
||||
|
||||
if (pv->lpEntryID != NULL)
|
||||
free(pv->lpEntryID);
|
||||
}
|
||||
|
||||
void
|
||||
FreeMAPIMessage(lpMapiMessage pv)
|
||||
{
|
||||
ULONG i;
|
||||
|
||||
if (!pv)
|
||||
return;
|
||||
|
||||
if (pv->lpszSubject != NULL)
|
||||
free(pv->lpszSubject);
|
||||
|
||||
if (pv->lpszNoteText)
|
||||
free(pv->lpszNoteText);
|
||||
|
||||
if (pv->lpszMessageType)
|
||||
free(pv->lpszMessageType);
|
||||
|
||||
if (pv->lpszDateReceived)
|
||||
free(pv->lpszDateReceived);
|
||||
|
||||
if (pv->lpszConversationID)
|
||||
free(pv->lpszConversationID);
|
||||
|
||||
if (pv->lpOriginator)
|
||||
FreeMAPIRecipient(pv->lpOriginator);
|
||||
|
||||
for (i=0; i<pv->nRecipCount; i++)
|
||||
{
|
||||
if (&(pv->lpRecips[i]) != NULL)
|
||||
{
|
||||
FreeMAPIRecipient(&(pv->lpRecips[i]));
|
||||
}
|
||||
}
|
||||
|
||||
if (pv->lpRecips != NULL)
|
||||
{
|
||||
free(pv->lpRecips);
|
||||
}
|
||||
|
||||
for (i=0; i<pv->nFileCount; i++)
|
||||
{
|
||||
if (&(pv->lpFiles[i]) != NULL)
|
||||
{
|
||||
FreeMAPIFile(&(pv->lpFiles[i]));
|
||||
}
|
||||
}
|
||||
|
||||
if (pv->lpFiles != NULL)
|
||||
{
|
||||
free(pv->lpFiles);
|
||||
}
|
||||
|
||||
free(pv);
|
||||
pv = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPISendMail(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPISendMail) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
lpMapiMessage lpMessage, FLAGS flFlags, ULONG ulReserved);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPISendMail = GetProcAddress(m_hInstMapi, "MAPISENDMAIL");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPISendMail = GetProcAddress(m_hInstMapi, "MAPISendMail");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPISendMail)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
FLAGS flFlags = 0;
|
||||
char msg[512];
|
||||
char file1[_MAX_PATH] = "";
|
||||
char file2[_MAX_PATH] = "";
|
||||
char file3[_MAX_PATH] = "";
|
||||
char file4[_MAX_PATH] = "";
|
||||
char toAddr[128];
|
||||
char ccAddr[128];
|
||||
char bccAddr[128];
|
||||
char subject[128];
|
||||
char noteText[4096];
|
||||
char dateReceived[128] = "N/A";
|
||||
char threadID[128] = "N/A";;
|
||||
char origName[128] = "N/A";;
|
||||
char origAddress[128] = "N/A";;
|
||||
|
||||
GetDlgItemText(hWnd, ID_EDIT_TOADDRESS, toAddr, sizeof(toAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_CCADDRESS, ccAddr, sizeof(ccAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_BCCADDRESS, bccAddr, sizeof(bccAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_SUBJECT, subject, sizeof(subject));
|
||||
GetDlgItemText(hWnd, ID_EDIT_NOTETEXT, noteText, sizeof(noteText));
|
||||
|
||||
// Do the one flag we support for this call...
|
||||
if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, ID_CHECK_SHOWDIALOG)))
|
||||
{
|
||||
flFlags |= MAPI_DIALOG;
|
||||
}
|
||||
|
||||
// Build the message to send off...
|
||||
lpMapiMessage msgPtr = (MapiMessage *)malloc(sizeof(MapiMessage));
|
||||
if (msgPtr == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
memset(msgPtr, 0, sizeof(MapiMessage));
|
||||
|
||||
//
|
||||
// At this point, we need to populate the structure of information
|
||||
// we are passing in via the *lppMessage
|
||||
//
|
||||
|
||||
// Set all of the general information first!
|
||||
msgPtr->lpszSubject = strdup(subject);
|
||||
msgPtr->lpszNoteText = strdup(noteText);
|
||||
msgPtr->lpszDateReceived = strdup(dateReceived);
|
||||
msgPtr->lpszConversationID = strdup(threadID);
|
||||
msgPtr->flFlags = flFlags;
|
||||
|
||||
// Now deal with the recipients of this message
|
||||
DWORD realRecips = 0;
|
||||
if (toAddr[0] != '\0') ++realRecips;
|
||||
if (ccAddr[0] != '\0') ++realRecips;
|
||||
if (bccAddr[0] != '\0') ++realRecips;
|
||||
|
||||
msgPtr->lpRecips = (lpMapiRecipDesc) malloc((size_t) (sizeof(MapiRecipDesc) * realRecips));
|
||||
if (!msgPtr->lpRecips)
|
||||
{
|
||||
FreeMAPIMessage(msgPtr);
|
||||
return;
|
||||
}
|
||||
|
||||
msgPtr->nRecipCount = realRecips;
|
||||
memset(msgPtr->lpRecips, 0, (size_t) (sizeof(MapiRecipDesc) * msgPtr->nRecipCount));
|
||||
|
||||
DWORD rCount = 0;
|
||||
if (toAddr[0] != '\0')
|
||||
{
|
||||
msgPtr->lpRecips[rCount].lpszName = strdup(toAddr);
|
||||
msgPtr->lpRecips[rCount].lpszAddress = strdup(toAddr);
|
||||
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_TO;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
if (ccAddr[0] != '\0')
|
||||
{
|
||||
msgPtr->lpRecips[rCount].lpszName = strdup(ccAddr);
|
||||
msgPtr->lpRecips[rCount].lpszAddress = strdup(ccAddr);
|
||||
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_CC;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
if (bccAddr[0] != '\0')
|
||||
{
|
||||
msgPtr->lpRecips[rCount].lpszName = strdup(bccAddr);
|
||||
msgPtr->lpRecips[rCount].lpszAddress = strdup(bccAddr);
|
||||
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_BCC;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
// Now get the names of the files to attach...
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH1, file1, sizeof(file1));
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH2, file2, sizeof(file2));
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH3, file3, sizeof(file3));
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH4, file4, sizeof(file4));
|
||||
|
||||
DWORD realFiles = 0;
|
||||
if (file1[0] != '\0') ++realFiles;
|
||||
if (file2[0] != '\0') ++realFiles;
|
||||
if (file3[0] != '\0') ++realFiles;
|
||||
if (file4[0] != '\0') ++realFiles;
|
||||
|
||||
// Now deal with the list of attachments! Since the nFileCount should be set
|
||||
// correctly, this loop will automagically be correct
|
||||
//
|
||||
msgPtr->nFileCount = realFiles;
|
||||
if (realFiles > 0)
|
||||
{
|
||||
msgPtr->lpFiles = (lpMapiFileDesc) malloc((size_t) (sizeof(MapiFileDesc) * realFiles));
|
||||
if (!msgPtr->lpFiles)
|
||||
{
|
||||
FreeMAPIMessage(msgPtr);
|
||||
return;
|
||||
}
|
||||
|
||||
memset(msgPtr->lpFiles, 0, (size_t) (sizeof(MapiFileDesc) * msgPtr->nFileCount));
|
||||
}
|
||||
|
||||
rCount = 0;
|
||||
if (file1[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file1);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file1);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
if (file2[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file2);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file2);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
if (file3[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file3);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file3);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
if (file4[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file4);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file4);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
// Finally, make the call...
|
||||
LONG rc = (*lpfnMAPISendMail)
|
||||
(mapiSession,
|
||||
(ULONG) hWnd,
|
||||
msgPtr,
|
||||
flFlags,
|
||||
0);
|
||||
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
ShowMessage(hWnd, "Success with MAPISendMail");
|
||||
SetFooter("MAPISendMail success");
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPISendMail\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("MAPISendMail failed");
|
||||
}
|
||||
|
||||
// Now cleanup and move on...
|
||||
FreeMAPIMessage(msgPtr);
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPISaveMail(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPISaveMail) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
lpMapiMessage lpMessage, FLAGS flFlags, ULONG ulReserved,
|
||||
LPTSTR lpszMessageID);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPISaveMail = GetProcAddress(m_hInstMapi, "MAPISAVEMAIL");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPISaveMail = GetProcAddress(m_hInstMapi, "MAPISaveMail");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPISaveMail)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
FLAGS flFlags = 0;
|
||||
char msg[512];
|
||||
char file1[_MAX_PATH] = "";
|
||||
char file2[_MAX_PATH] = "";
|
||||
char file3[_MAX_PATH] = "";
|
||||
char file4[_MAX_PATH] = "";
|
||||
char toAddr[128];
|
||||
char ccAddr[128];
|
||||
char bccAddr[128];
|
||||
char subject[128];
|
||||
char noteText[4096];
|
||||
char dateReceived[128] = "N/A";
|
||||
char threadID[128] = "N/A";;
|
||||
char origName[128] = "N/A";;
|
||||
char origAddress[128] = "N/A";;
|
||||
|
||||
GetDlgItemText(hWnd, ID_EDIT_TOADDRESS, toAddr, sizeof(toAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_CCADDRESS, ccAddr, sizeof(ccAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_BCCADDRESS, bccAddr, sizeof(bccAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_SUBJECT, subject, sizeof(subject));
|
||||
GetDlgItemText(hWnd, ID_EDIT_NOTETEXT, noteText, sizeof(noteText));
|
||||
|
||||
// Build the message to send off...
|
||||
lpMapiMessage msgPtr = (MapiMessage *)malloc(sizeof(MapiMessage));
|
||||
if (msgPtr == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
memset(msgPtr, 0, sizeof(MapiMessage));
|
||||
|
||||
//
|
||||
// At this point, we need to populate the structure of information
|
||||
// we are passing in via the *lppMessage
|
||||
//
|
||||
|
||||
// Set all of the general information first!
|
||||
msgPtr->lpszSubject = strdup(subject);
|
||||
msgPtr->lpszNoteText = strdup(noteText);
|
||||
msgPtr->lpszDateReceived = strdup(dateReceived);
|
||||
msgPtr->lpszConversationID = strdup(threadID);
|
||||
msgPtr->flFlags = flFlags;
|
||||
|
||||
// Now deal with the recipients of this message
|
||||
DWORD realRecips = 0;
|
||||
if (toAddr[0] != '\0') ++realRecips;
|
||||
if (ccAddr[0] != '\0') ++realRecips;
|
||||
if (bccAddr[0] != '\0') ++realRecips;
|
||||
|
||||
msgPtr->lpRecips = (lpMapiRecipDesc) malloc((size_t) (sizeof(MapiRecipDesc) * realRecips));
|
||||
if (!msgPtr->lpRecips)
|
||||
{
|
||||
FreeMAPIMessage(msgPtr);
|
||||
return;
|
||||
}
|
||||
|
||||
msgPtr->nRecipCount = realRecips;
|
||||
memset(msgPtr->lpRecips, 0, (size_t) (sizeof(MapiRecipDesc) * msgPtr->nRecipCount));
|
||||
|
||||
DWORD rCount = 0;
|
||||
if (toAddr[0] != '\0')
|
||||
{
|
||||
msgPtr->lpRecips[rCount].lpszName = strdup(toAddr);
|
||||
msgPtr->lpRecips[rCount].lpszAddress = strdup(toAddr);
|
||||
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_TO;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
if (ccAddr[0] != '\0')
|
||||
{
|
||||
msgPtr->lpRecips[rCount].lpszName = strdup(ccAddr);
|
||||
msgPtr->lpRecips[rCount].lpszAddress = strdup(ccAddr);
|
||||
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_CC;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
if (bccAddr[0] != '\0')
|
||||
{
|
||||
msgPtr->lpRecips[rCount].lpszName = strdup(bccAddr);
|
||||
msgPtr->lpRecips[rCount].lpszAddress = strdup(bccAddr);
|
||||
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_BCC;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
// Now get the names of the files to attach...
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH1, file1, sizeof(file1));
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH2, file2, sizeof(file2));
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH3, file3, sizeof(file3));
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH4, file4, sizeof(file4));
|
||||
|
||||
DWORD realFiles = 0;
|
||||
if (file1[0] != '\0') ++realFiles;
|
||||
if (file2[0] != '\0') ++realFiles;
|
||||
if (file3[0] != '\0') ++realFiles;
|
||||
if (file4[0] != '\0') ++realFiles;
|
||||
|
||||
// Now deal with the list of attachments! Since the nFileCount should be set
|
||||
// correctly, this loop will automagically be correct
|
||||
//
|
||||
msgPtr->nFileCount = realFiles;
|
||||
if (realFiles > 0)
|
||||
{
|
||||
msgPtr->lpFiles = (lpMapiFileDesc) malloc((size_t) (sizeof(MapiFileDesc) * realFiles));
|
||||
if (!msgPtr->lpFiles)
|
||||
{
|
||||
FreeMAPIMessage(msgPtr);
|
||||
return;
|
||||
}
|
||||
|
||||
memset(msgPtr->lpFiles, 0, (size_t) (sizeof(MapiFileDesc) * msgPtr->nFileCount));
|
||||
}
|
||||
|
||||
rCount = 0;
|
||||
if (file1[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file1);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file1);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
if (file2[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file2);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file2);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
if (file3[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file3);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file3);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
if (file4[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file4);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file4);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
// Finally, make the call...
|
||||
LONG rc = (*lpfnMAPISaveMail)
|
||||
(mapiSession,
|
||||
(ULONG) hWnd,
|
||||
msgPtr,
|
||||
flFlags,
|
||||
0, NULL);
|
||||
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
ShowMessage(hWnd, "Success with MAPISaveMail");
|
||||
SetFooter("MAPISaveMail success");
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPISaveMail\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("MAPISaveMail failed");
|
||||
}
|
||||
|
||||
// Now cleanup and move on...
|
||||
FreeMAPIMessage(msgPtr);
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPIAddress(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIAddress)
|
||||
(LHANDLE lhSession,
|
||||
ULONG ulUIParam,
|
||||
LPSTR lpszCaption,
|
||||
ULONG nEditFields,
|
||||
LPSTR lpszLabels,
|
||||
ULONG nRecips,
|
||||
lpMapiRecipDesc lpRecips,
|
||||
FLAGS flFlags,
|
||||
ULONG ulReserved,
|
||||
LPULONG lpnNewRecips,
|
||||
lpMapiRecipDesc FAR *lppNewRecips);
|
||||
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIAddress = GetProcAddress(m_hInstMapi, "MAPIADDRESS");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIAddress = GetProcAddress(m_hInstMapi, "MAPIAddress");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIAddress)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
DWORD i;
|
||||
FLAGS flFlags = 0;
|
||||
DWORD addrCount = 0;
|
||||
char msg[512];
|
||||
char toAddr[128];
|
||||
char ccAddr[128];
|
||||
char bccAddr[128];
|
||||
|
||||
GetDlgItemText(hWnd, ID_EDIT_TOADDRESS, toAddr, sizeof(toAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_CCADDRESS, ccAddr, sizeof(ccAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_BCCADDRESS, bccAddr, sizeof(bccAddr));
|
||||
|
||||
if (toAddr[0]) ++addrCount;
|
||||
if (ccAddr[0]) ++addrCount;
|
||||
if (bccAddr[0]) ++addrCount;
|
||||
|
||||
lpMapiRecipDesc lpRecips = (lpMapiRecipDesc) malloc((size_t) (sizeof(MapiRecipDesc) * addrCount));
|
||||
if (!lpRecips)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
memset(lpRecips, 0, (size_t) (sizeof(MapiRecipDesc) * addrCount));
|
||||
|
||||
DWORD rCount = 0;
|
||||
if (toAddr[0] != '\0')
|
||||
{
|
||||
lpRecips[rCount].lpszName = strdup("To Address Name");
|
||||
lpRecips[rCount].lpszAddress = strdup(toAddr);
|
||||
lpRecips[rCount].ulRecipClass = MAPI_TO;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
if (ccAddr[0] != '\0')
|
||||
{
|
||||
lpRecips[rCount].lpszName = strdup("CC Address Name");
|
||||
lpRecips[rCount].lpszAddress = strdup(ccAddr);
|
||||
lpRecips[rCount].ulRecipClass = MAPI_CC;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
if (bccAddr[0] != '\0')
|
||||
{
|
||||
lpRecips[rCount].lpszName = strdup("BCC Address Name");
|
||||
lpRecips[rCount].lpszAddress = strdup(bccAddr);
|
||||
lpRecips[rCount].ulRecipClass = MAPI_BCC;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
ULONG newRecips;
|
||||
lpMapiRecipDesc lpNewRecips;
|
||||
|
||||
// Finally, make the call...
|
||||
LONG rc = (*lpfnMAPIAddress)
|
||||
(mapiSession,
|
||||
0,
|
||||
"MAPI Test Address Picker",
|
||||
0,
|
||||
NULL,
|
||||
rCount,
|
||||
lpRecips,
|
||||
0,
|
||||
0,
|
||||
&newRecips,
|
||||
&lpNewRecips);
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
for (i=0; i<newRecips; i++)
|
||||
{
|
||||
char tMsg[512];
|
||||
|
||||
wsprintf(tMsg, "User %d\nName=[%s]\nEmail=[%s]\nType=[%d]",
|
||||
i,
|
||||
lpNewRecips[i].lpszName,
|
||||
lpNewRecips[i].lpszAddress,
|
||||
lpNewRecips[i].ulRecipClass);
|
||||
ShowMessage(hWnd, tMsg);
|
||||
}
|
||||
|
||||
SetFooter("MAPIAddress success");
|
||||
|
||||
DoMAPIFreeBuffer(hWnd, lpNewRecips, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPIAddress\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("MAPIAddress failed");
|
||||
}
|
||||
|
||||
// Now cleanup and move on...
|
||||
for (i=0; i<rCount; i++)
|
||||
{
|
||||
FreeMAPIRecipient(&(lpRecips[i]));
|
||||
}
|
||||
}
|
||||
832
mozilla/mailnews/mapi/old/tests/mapitest/mapiproc.cpp
Normal file
832
mozilla/mailnews/mapi/old/tests/mapitest/mapiproc.cpp
Normal file
@@ -0,0 +1,832 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
|
||||
#include <mapi.h>
|
||||
#endif
|
||||
|
||||
#include "port.h"
|
||||
#include "resource.h"
|
||||
|
||||
//
|
||||
// Variables...
|
||||
//
|
||||
extern HINSTANCE hInst;
|
||||
HINSTANCE m_hInstMapi;
|
||||
LHANDLE mapiSession = 0;
|
||||
|
||||
//
|
||||
// Forward declarations...
|
||||
//
|
||||
void LoadNSCPVersionFunc(HWND hWnd);
|
||||
void DoMAPILogon(HWND hWnd);
|
||||
void DoMAPILogoff(HWND hWnd);
|
||||
void DoMAPIFreeBuffer(HWND hWnd, LPVOID buf, BOOL alert);
|
||||
void DoMAPISendMail(HWND hWnd);
|
||||
void DoMAPISendDocuments(HWND hWnd);
|
||||
void DoMAPIFindNext(HWND hWnd);
|
||||
void DoMAPIReadMail(HWND hWnd);
|
||||
void DoMAPIDeleteMail(HWND hWnd);
|
||||
void DoMAPIDetails(HWND hWnd);
|
||||
void DoMAPIResolveName(HWND hWnd);
|
||||
void DoMAPIResolveNameFreeBuffer(HWND hWnd);
|
||||
void SetFooter(LPSTR msg);
|
||||
void DoMAPI_NSCP_Sync(HWND hWnd);
|
||||
LPSTR GetMAPIError(LONG errorCode);
|
||||
extern void DisplayMAPIReadMail(HWND hWnd, lpMapiMessage msgPtr);
|
||||
lpMapiMessage GetMessage(HWND hWnd, LPSTR id);
|
||||
|
||||
void
|
||||
SetFooter(LPSTR msg)
|
||||
{
|
||||
extern HWND hWnd;
|
||||
|
||||
SetDlgItemText(hWnd, ID_STATIC_RESULT, msg);
|
||||
}
|
||||
|
||||
char FAR *
|
||||
GetMAPIError(LONG errorCode)
|
||||
{
|
||||
static char FAR msg[128];
|
||||
|
||||
switch (errorCode) {
|
||||
case MAPI_E_FAILURE:
|
||||
lstrcpy(msg, "General MAPI Failure");
|
||||
break;
|
||||
|
||||
case MAPI_E_INSUFFICIENT_MEMORY:
|
||||
strcpy(msg, "Insufficient Memory");
|
||||
break;
|
||||
|
||||
case MAPI_E_LOGIN_FAILURE:
|
||||
strcpy(msg, "Login Failure");
|
||||
break;
|
||||
|
||||
case MAPI_E_TOO_MANY_SESSIONS:
|
||||
strcpy(msg, "Too many MAPI sessions");
|
||||
break;
|
||||
|
||||
case MAPI_E_INVALID_SESSION:
|
||||
strcpy(msg, "Invalid Session!");
|
||||
break;
|
||||
|
||||
case MAPI_E_INVALID_MESSAGE:
|
||||
strcpy(msg, "Message identifier was bad!");
|
||||
break;
|
||||
|
||||
case MAPI_E_NO_MESSAGES:
|
||||
strcpy(msg, "No messages were found!");
|
||||
break;
|
||||
|
||||
case MAPI_E_ATTACHMENT_WRITE_FAILURE:
|
||||
strcpy(msg, "Attachment write failure!");
|
||||
break;
|
||||
|
||||
case MAPI_E_DISK_FULL:
|
||||
strcpy(msg, "Attachment write failure! DISK FULL");
|
||||
break;
|
||||
|
||||
case MAPI_E_AMBIGUOUS_RECIPIENT:
|
||||
strcpy(msg, "Recipient requested is not a unique address list entry.");
|
||||
break;
|
||||
|
||||
case MAPI_E_UNKNOWN_RECIPIENT:
|
||||
strcpy(msg, "Recipient requested does not exist.");
|
||||
break;
|
||||
|
||||
case MAPI_E_NOT_SUPPORTED:
|
||||
strcpy(msg, "Not supported by messaging system");
|
||||
break;
|
||||
|
||||
case SUCCESS_SUCCESS:
|
||||
strcpy(msg, "Success on MAPI operation");
|
||||
break;
|
||||
|
||||
case MAPI_E_INVALID_RECIPS:
|
||||
strcpy(msg, "Recipient specified in the lpRecip parameter was\nunknown. No dialog box was displayed.");
|
||||
break;
|
||||
|
||||
case MAPI_E_ATTACHMENT_OPEN_FAILURE:
|
||||
strcpy(msg, "One or more files could not be located. No message was sent.");
|
||||
break;
|
||||
|
||||
case MAPI_E_ATTACHMENT_NOT_FOUND:
|
||||
strcpy(msg, "The specified attachment was not found. No message was sent.");
|
||||
break;
|
||||
|
||||
case MAPI_E_BAD_RECIPTYPE:
|
||||
strcpy(msg, "The type of a recipient was not MAPI_TO, MAPI_CC, or MAPI_BCC. No message was sent.");
|
||||
break;
|
||||
|
||||
default:
|
||||
strcpy(msg, "Unknown MAPI Return Code");
|
||||
break;
|
||||
}
|
||||
|
||||
return((LPSTR) &(msg[0]));
|
||||
}
|
||||
|
||||
void
|
||||
ShowMessage(HWND hWnd, LPSTR msg)
|
||||
{
|
||||
MessageBox(hWnd, msg, "Info Message", MB_ICONINFORMATION);
|
||||
}
|
||||
|
||||
BOOL
|
||||
OpenMAPI(void)
|
||||
{
|
||||
#ifdef WIN16
|
||||
m_hInstMapi = LoadLibrary("Y:\\ns\\cmd\\winfe\\mapi\\MAPI.DLL");
|
||||
#else
|
||||
m_hInstMapi = LoadLibrary(".\\COMPONENTS\\MAPI32.DLL");
|
||||
#endif
|
||||
|
||||
if (!m_hInstMapi)
|
||||
{
|
||||
ShowMessage(NULL, "Error Loading the MAPI DLL...Probably not found!");
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
CloseMAPI(void)
|
||||
{
|
||||
if(m_hInstMapi)
|
||||
{
|
||||
FreeLibrary(m_hInstMapi);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ProcessCommand(HWND hWnd, int id, HWND hCtl, UINT codeNotify)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case ID_BUTTON_SYNC:
|
||||
DoMAPI_NSCP_Sync(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_NSCPVERSION:
|
||||
LoadNSCPVersionFunc(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_LOGON:
|
||||
DoMAPILogon(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_LOGOFF:
|
||||
DoMAPILogoff(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_FINDNEXT:
|
||||
case ID_MENU_MAPIFINDNEXT:
|
||||
DoMAPIFindNext(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_READMAIL:
|
||||
case ID_MENU_MAPIREADMAIL:
|
||||
DoMAPIReadMail(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_MAIL:
|
||||
{
|
||||
extern CALLBACK LOADDS
|
||||
MailDlgProc(HWND hWndMain, UINT wMsg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
DialogBox(hInst, MAKEINTRESOURCE(ID_DIALOG_MAIL), hWnd,
|
||||
(DLGPROC)MailDlgProc);
|
||||
}
|
||||
break;
|
||||
|
||||
case ID_BUTTON_DELETEMAIL:
|
||||
case ID_MENU_MAPIDELETEMAIL:
|
||||
DoMAPIDeleteMail(hWnd);
|
||||
break;
|
||||
|
||||
case ID_MENU_MYEXIT:
|
||||
DestroyWindow(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_CLEAR:
|
||||
case ID_MENU_CLEARRESULTS:
|
||||
ListBox_ResetContent(GetDlgItem(hWnd, ID_LIST_RESULT));
|
||||
break;
|
||||
|
||||
case ID_BUTTON_FREEBUFFER:
|
||||
DoMAPIResolveNameFreeBuffer(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_RESOLVENAME:
|
||||
DoMAPIResolveName(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_DETAILS:
|
||||
DoMAPIDetails(hWnd);
|
||||
break;
|
||||
|
||||
case ID_MENU_MYABOUT:
|
||||
MessageBox(hWnd,
|
||||
"Netscape MAPI Test Harness\nWritten by: Rich Pizzarro (rhp@netscape.com)",
|
||||
"About",
|
||||
MB_ICONINFORMATION);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPILogon(HWND hWnd)
|
||||
{
|
||||
char msg[1024];
|
||||
char user[128] = "";
|
||||
char pw[128] = "";
|
||||
|
||||
// Get Address of MAPI function...
|
||||
ULONG (FAR PASCAL *lpfnMAPILogon)(ULONG, LPSTR, LPSTR, FLAGS, ULONG, LPLHANDLE);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPILogon = GetProcAddress(m_hInstMapi, "MAPILOGON");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPILogon = GetProcAddress(m_hInstMapi, "MAPILogon");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPILogon)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
GetDlgItemText(hWnd, ID_EDIT_USERNAME, user, sizeof(user));
|
||||
GetDlgItemText(hWnd, ID_EDIT_PW, pw, sizeof(pw));
|
||||
|
||||
LONG rc = (*lpfnMAPILogon)((ULONG) hWnd, user, pw,
|
||||
MAPI_FORCE_DOWNLOAD | MAPI_NEW_SESSION, 0, &mapiSession);
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
wsprintf(msg, "Success with session = %d", mapiSession);
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("Logon success");
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from Logon\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("Logon failed");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPILogoff(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPILogoff) ( LHANDLE lhSession, ULONG ulUIParam,
|
||||
FLAGS flFlags, ULONG ulReserved);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPILogoff = GetProcAddress(m_hInstMapi, "MAPILOGOFF");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPILogoff = GetProcAddress(m_hInstMapi, "MAPILogoff");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPILogoff)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
char msg[1024];
|
||||
LONG rc = (*lpfnMAPILogoff)(mapiSession, (ULONG) hWnd, 0, 0);
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
wsprintf(msg, "Successful logoff");
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter(msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from Logoff\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("Logoff failed");
|
||||
}
|
||||
|
||||
mapiSession = 0;
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPIFreeBuffer(HWND hWnd, LPVOID buf, BOOL alert)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIFreeBuffer) (LPVOID lpBuffer);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIFreeBuffer = GetProcAddress(m_hInstMapi, "MAPIFREEBUFFER");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIFreeBuffer = GetProcAddress(m_hInstMapi, "MAPIFreeBuffer");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIFreeBuffer)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
char msg[1024];
|
||||
LONG rc = (*lpfnMAPIFreeBuffer)(buf);
|
||||
#ifdef WIN32
|
||||
if (rc == S_OK)
|
||||
#else
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
#endif
|
||||
{
|
||||
wsprintf(msg, "Successful Free Buffer Operation");
|
||||
if (alert)
|
||||
ShowMessage(hWnd, msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from Logoff", rc);
|
||||
ShowMessage(hWnd, msg);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPIFindNext(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIFindNext) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
LPTSTR lpszMessageType, LPTSTR lpszSeedMessageID, FLAGS flFlags,
|
||||
ULONG ulReserved, LPTSTR lpszMessageID);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIFindNext = GetProcAddress(m_hInstMapi, "MAPIFINDNEXT");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIFindNext = GetProcAddress(m_hInstMapi, "MAPIFindNext");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIFindNext)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Clear the list before we start...
|
||||
ListBox_ResetContent(GetDlgItem(hWnd, ID_LIST_RESULT));
|
||||
|
||||
char msg[1024];
|
||||
char messageID[512];
|
||||
LONG rc;
|
||||
#ifdef WIN32
|
||||
FLAGS flags = MAPI_GUARANTEE_FIFO | MAPI_LONG_MSGID | MAPI_UNREAD_ONLY;
|
||||
#else
|
||||
FLAGS flags = MAPI_GUARANTEE_FIFO | MAPI_UNREAD_ONLY;
|
||||
#endif
|
||||
|
||||
while ( (rc = (*lpfnMAPIFindNext) (mapiSession,
|
||||
(ULONG) hWnd,
|
||||
NULL,
|
||||
NULL,
|
||||
flags,
|
||||
0,
|
||||
messageID)) == SUCCESS_SUCCESS)
|
||||
{
|
||||
//
|
||||
|
||||
lpMapiMessage mapiMsg = GetMessage(hWnd, messageID);
|
||||
if (mapiMsg != NULL)
|
||||
{
|
||||
wsprintf(msg, "%s: \"%s\" Sender: %s",
|
||||
messageID,
|
||||
mapiMsg->lpszSubject,
|
||||
mapiMsg->lpOriginator->lpszName);
|
||||
DoMAPIFreeBuffer(hWnd, mapiMsg, FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
lstrcpy(msg, messageID);
|
||||
}
|
||||
|
||||
ListBox_InsertString(GetDlgItem(hWnd, ID_LIST_RESULT), 0, msg);
|
||||
}
|
||||
|
||||
wsprintf(msg, "Enumeration ended: Return code %d from MAPIFindNext\nCondition=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("Enumeration ended");
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPIReadMail(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIReadMail) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
LPTSTR lpszMessageID, FLAGS flFlags, ULONG ulReserved,
|
||||
lpMapiMessage FAR * lppMessage);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIReadMail = GetProcAddress(m_hInstMapi, "MAPIREADMAIL");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIReadMail = GetProcAddress(m_hInstMapi, "MAPIReadMail");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIReadMail)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
char msg[1024];
|
||||
char lpszMessageID[512];
|
||||
lpMapiMessage lpMessage = NULL;
|
||||
FLAGS flFlags = 0;
|
||||
|
||||
DWORD selected = ListBox_GetCurSel(GetDlgItem(hWnd, ID_LIST_RESULT));
|
||||
if (selected == LB_ERR)
|
||||
{
|
||||
ShowMessage(hWnd, "You need to select a valid message. Make sure\nyou have done a MAPIFindNext and selected\none of the resulting messages.");
|
||||
return;
|
||||
}
|
||||
|
||||
ListBox_GetText(GetDlgItem(hWnd, ID_LIST_RESULT), selected, lpszMessageID);
|
||||
|
||||
// Do the various flags for this call...
|
||||
if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK_BODYASFILE)))
|
||||
{
|
||||
flFlags |= MAPI_BODY_AS_FILE;
|
||||
}
|
||||
|
||||
if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK_ENVELOPEONLY)))
|
||||
{
|
||||
flFlags |= MAPI_ENVELOPE_ONLY;
|
||||
}
|
||||
|
||||
if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK_PEEK)))
|
||||
{
|
||||
flFlags |= MAPI_PEEK;
|
||||
}
|
||||
|
||||
if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK_SUPPRESSATTACH)))
|
||||
{
|
||||
flFlags |= MAPI_SUPPRESS_ATTACH;
|
||||
}
|
||||
|
||||
char *ptr = strchr( (const char *) lpszMessageID, ':');
|
||||
if (ptr) *ptr = '\0';
|
||||
|
||||
LONG rc = (*lpfnMAPIReadMail)
|
||||
(mapiSession,
|
||||
(ULONG) hWnd,
|
||||
lpszMessageID,
|
||||
flFlags,
|
||||
0,
|
||||
&lpMessage);
|
||||
|
||||
// Deal with error up front and return if need be...
|
||||
if (rc != SUCCESS_SUCCESS)
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPIReadMail\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("ReadMail failed");
|
||||
return;
|
||||
}
|
||||
|
||||
// Now display the message and then return...
|
||||
DisplayMAPIReadMail(hWnd, lpMessage);
|
||||
DoMAPIFreeBuffer(hWnd, lpMessage, TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPIDeleteMail(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIDeleteMail) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
LPTSTR lpszMessageID, FLAGS flFlags, ULONG ulReserved);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIDeleteMail = GetProcAddress(m_hInstMapi, "MAPIDELETEMAIL");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIDeleteMail = GetProcAddress(m_hInstMapi, "MAPIDeleteMail");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIDeleteMail)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
char msg[1024];
|
||||
char lpszMessageID[512];
|
||||
lpMapiMessage lpMessage = NULL;
|
||||
|
||||
DWORD selected = ListBox_GetCurSel(GetDlgItem(hWnd, ID_LIST_RESULT));
|
||||
if (selected == LB_ERR)
|
||||
{
|
||||
ShowMessage(hWnd, "You need to select a valid message. Make sure\nyou have done a MAPIFindNext and selected\none of the resulting messages.");
|
||||
return;
|
||||
}
|
||||
|
||||
ListBox_GetText(GetDlgItem(hWnd, ID_LIST_RESULT), selected, lpszMessageID);
|
||||
|
||||
char *ptr = strchr( (const char *) lpszMessageID, ':');
|
||||
if (ptr) *ptr = '\0';
|
||||
|
||||
LONG rc = (*lpfnMAPIDeleteMail)
|
||||
(mapiSession,
|
||||
(ULONG) hWnd,
|
||||
lpszMessageID,
|
||||
0,
|
||||
0);
|
||||
|
||||
// Deal with the return code...
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
wsprintf(msg, "Successful deletion");
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter(msg);
|
||||
|
||||
// If it worked, refresh the list...
|
||||
ShowMessage(hWnd, "The message list will now be refreshed\nsince one message was deleted.");
|
||||
DoMAPIFindNext(hWnd);
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPIDeleteMail\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("Logoff failed");
|
||||
}
|
||||
}
|
||||
|
||||
// This is for the name lookup stuff...
|
||||
lpMapiRecipDesc lpRecip = NULL;
|
||||
|
||||
void
|
||||
DoMAPIResolveName(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIResolveName) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
LPTSTR lpszName, FLAGS flFlags, ULONG ulReserved,
|
||||
lpMapiRecipDesc FAR * lppRecip);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIResolveName = GetProcAddress(m_hInstMapi, "MAPIRESOLVENAME");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIResolveName = GetProcAddress(m_hInstMapi, "MAPIResolveName");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIResolveName)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (lpRecip != NULL)
|
||||
{
|
||||
ShowMessage(hWnd, "We need to free memory from a previous call...");
|
||||
DoMAPIFreeBuffer(hWnd, lpRecip, TRUE);
|
||||
lpRecip = NULL;
|
||||
}
|
||||
|
||||
char userName[512];
|
||||
char msg[1024];
|
||||
FLAGS flFlags = 0; // We support none...
|
||||
|
||||
GetDlgItemText(hWnd, IDC_EDIT_RESOLVENAME, userName, sizeof(userName));
|
||||
LONG rc = (*lpfnMAPIResolveName)
|
||||
(mapiSession,
|
||||
(ULONG) hWnd,
|
||||
userName,
|
||||
flFlags,
|
||||
0,
|
||||
&lpRecip);
|
||||
|
||||
// Deal with error up front and return if need be...
|
||||
if (rc != SUCCESS_SUCCESS)
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from DoMAPIResolveName\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("DoMAPIResolveName failed");
|
||||
return;
|
||||
}
|
||||
|
||||
// If we get here, we should probably show the information that we
|
||||
// got back
|
||||
wsprintf(msg, "Received information for %s\nName=[%s]\nAddress=[%s]\nID=[%s]",
|
||||
userName, lpRecip->lpszName, lpRecip->lpszAddress, (LPSTR) lpRecip->lpEntryID);
|
||||
ShowMessage(hWnd, msg);
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPIResolveNameFreeBuffer(HWND hWnd)
|
||||
{
|
||||
if (lpRecip == NULL)
|
||||
{
|
||||
ShowMessage(hWnd, "There is no memory allocated from MAPIResolveName()\nto be freed. Request ignored.");
|
||||
}
|
||||
else
|
||||
{
|
||||
DoMAPIFreeBuffer(hWnd, lpRecip, TRUE);
|
||||
lpRecip = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPIDetails(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIDetails) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
lpMapiRecipDesc lpRecip, FLAGS flFlags, ULONG ulReserved);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIDetails = GetProcAddress(m_hInstMapi, "MAPIDetails");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIDetails = GetProcAddress(m_hInstMapi, "MAPIDetails");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIDetails)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
char msg[1024];
|
||||
FLAGS flFlags = 0; // We really don't support these...
|
||||
|
||||
LONG rc = (*lpfnMAPIDetails)
|
||||
(mapiSession,
|
||||
(ULONG) hWnd,
|
||||
lpRecip,
|
||||
flFlags,
|
||||
0);
|
||||
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
|
||||
wsprintf(msg, "MAPIDetails call succeeded");
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter(msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPIDetails\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
|
||||
if (lpRecip == NULL)
|
||||
{
|
||||
lstrcat(msg, "\nNOTE: There is no valid pointer from a MAPIResolveName()\ncall to show details about.");
|
||||
}
|
||||
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("MAPIDetails failed");
|
||||
}
|
||||
}
|
||||
|
||||
lpMapiMessage
|
||||
GetMessage(HWND hWnd, LPSTR id)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIReadMail) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
LPTSTR lpszMessageID, FLAGS flFlags, ULONG ulReserved,
|
||||
lpMapiMessage FAR * lppMessage);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIReadMail = GetProcAddress(m_hInstMapi, "MAPIREADMAIL");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIReadMail = GetProcAddress(m_hInstMapi, "MAPIReadMail");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIReadMail)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char msg[1024];
|
||||
lpMapiMessage lpMessage = NULL;
|
||||
FLAGS flFlags = 0;
|
||||
|
||||
flFlags |= MAPI_ENVELOPE_ONLY;
|
||||
LONG rc = (*lpfnMAPIReadMail)
|
||||
(mapiSession,
|
||||
(ULONG) hWnd,
|
||||
id,
|
||||
flFlags,
|
||||
0,
|
||||
&lpMessage);
|
||||
|
||||
// Deal with error up front and return if need be...
|
||||
if (rc != SUCCESS_SUCCESS)
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPIReadMail\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("ReadMail failed");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return(lpMessage);
|
||||
}
|
||||
|
||||
void
|
||||
LoadNSCPVersionFunc(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnLoadNSCPVersion) ( void );
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnLoadNSCPVersion = GetProcAddress(m_hInstMapi, "MAPIGETNERSCAPEVERSION");
|
||||
#else
|
||||
(FARPROC&) lpfnLoadNSCPVersion = GetProcAddress(m_hInstMapi, "MAPIGetNetscapeVersion");
|
||||
#endif
|
||||
|
||||
if (!lpfnLoadNSCPVersion)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPIGetNetscapeVersion() function.");
|
||||
}
|
||||
else
|
||||
{
|
||||
ShowMessage(hWnd, "MAPIGetNetscapeVersion() function was FOUND!");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPI_NSCP_Sync(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnNSCPSync) ( LHANDLE lhSession,
|
||||
ULONG ulReserved );
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnNSCPSync = GetProcAddress(m_hInstMapi, "MAPI_NSCP_SYNCHRONIZECLIENT");
|
||||
#else
|
||||
(FARPROC&) lpfnNSCPSync = GetProcAddress(m_hInstMapi, "MAPI_NSCP_SynchronizeClient");
|
||||
#endif
|
||||
|
||||
if (!lpfnNSCPSync)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
LONG rc = (*lpfnNSCPSync) (mapiSession, 0);
|
||||
|
||||
char msg[256];
|
||||
|
||||
// Deal with error up front and return if need be...
|
||||
if (rc != SUCCESS_SUCCESS)
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPI_NSCP_SynchronizeClient\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("MAPI_NSCP_SynchronizeClient failed");
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "Success for MAPI_NSCP_SynchronizeClient");
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("MAPI_NSCP_SynchronizeClient success");
|
||||
}
|
||||
}
|
||||
25
mozilla/mailnews/mapi/old/tests/mapitest/mapitest.dep
Normal file
25
mozilla/mailnews/mapi/old/tests/mapitest/mapitest.dep
Normal file
@@ -0,0 +1,25 @@
|
||||
# Microsoft Developer Studio Generated Dependency File, included by mapitest.mak
|
||||
|
||||
.\main.cpp : \
|
||||
".\port.h"\
|
||||
"c:\program files\msdev\vc98\include\basetsd.h"\
|
||||
|
||||
|
||||
.\mapimail.cpp : \
|
||||
".\port.h"\
|
||||
"c:\program files\msdev\vc98\include\basetsd.h"\
|
||||
|
||||
|
||||
.\mapiproc.cpp : \
|
||||
".\port.h"\
|
||||
"c:\program files\msdev\vc98\include\basetsd.h"\
|
||||
|
||||
|
||||
.\mtest32.rc : \
|
||||
".\nscicon.ico"\
|
||||
|
||||
|
||||
.\readmail.cpp : \
|
||||
".\port.h"\
|
||||
"c:\program files\msdev\vc98\include\basetsd.h"\
|
||||
|
||||
121
mozilla/mailnews/mapi/old/tests/mapitest/mapitest.dsp
Normal file
121
mozilla/mailnews/mapi/old/tests/mapitest/mapitest.dsp
Normal file
@@ -0,0 +1,121 @@
|
||||
# Microsoft Developer Studio Project File - Name="mapitest" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Application" 0x0101
|
||||
|
||||
CFG=mapitest - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "mapitest.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "mapitest.mak" CFG="mapitest - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "mapitest - Win32 Release" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "mapitest - Win32 Debug" (based on "Win32 (x86) Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "mapitest - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
|
||||
|
||||
!ELSEIF "$(CFG)" == "mapitest - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "mapitest - Win32 Release"
|
||||
# Name "mapitest - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\main.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\mapimail.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\mapiproc.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\mtest32.rc
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\readmail.cpp
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
||||
29
mozilla/mailnews/mapi/old/tests/mapitest/mapitest.dsw
Normal file
29
mozilla/mailnews/mapi/old/tests/mapitest/mapitest.dsw
Normal file
@@ -0,0 +1,29 @@
|
||||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "mapitest"=.\mapitest.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
BIN
mozilla/security/nss/tests/libpkix/pkix_pl_tests/module/key3.db → mozilla/mailnews/mapi/old/tests/mapitest/mapitest.ncb
Executable file → Normal file
BIN
mozilla/security/nss/tests/libpkix/pkix_pl_tests/module/key3.db → mozilla/mailnews/mapi/old/tests/mapitest/mapitest.ncb
Executable file → Normal file
Binary file not shown.
BIN
mozilla/mailnews/mapi/old/tests/mapitest/mapitest.opt
Normal file
BIN
mozilla/mailnews/mapi/old/tests/mapitest/mapitest.opt
Normal file
Binary file not shown.
44
mozilla/mailnews/mapi/old/tests/mapitest/mapitest.plg
Normal file
44
mozilla/mailnews/mapi/old/tests/mapitest/mapitest.plg
Normal file
@@ -0,0 +1,44 @@
|
||||
<html>
|
||||
<body>
|
||||
<pre>
|
||||
<h1>Build Log</h1>
|
||||
<h3>
|
||||
--------------------Configuration: mapitest - Win32 Debug--------------------
|
||||
</h3>
|
||||
<h3>Command Lines</h3>
|
||||
Creating command line "rc.exe /l 0x409 /fo"Debug/mtest32.res" /d "_DEBUG" "Y:\mozilla\mailnews\mapi\tests\mapitest\mtest32.rc""
|
||||
Creating temporary file "C:\TEMP\RSP38A.tmp" with contents
|
||||
[
|
||||
/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"Debug/mapitest.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c
|
||||
"Y:\mozilla\mailnews\mapi\tests\mapitest\readmail.cpp"
|
||||
"Y:\mozilla\mailnews\mapi\tests\mapitest\mapimail.cpp"
|
||||
"Y:\mozilla\mailnews\mapi\tests\mapitest\mapiproc.cpp"
|
||||
"Y:\mozilla\mailnews\mapi\tests\mapitest\main.cpp"
|
||||
]
|
||||
Creating command line "cl.exe @C:\TEMP\RSP38A.tmp"
|
||||
Creating temporary file "C:\TEMP\RSP38B.tmp" with contents
|
||||
[
|
||||
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:yes /pdb:"Debug/mapitest.pdb" /debug /machine:I386 /out:"Debug/mapitest.exe" /pdbtype:sept
|
||||
.\Debug\readmail.obj
|
||||
.\Debug\mapimail.obj
|
||||
.\Debug\mapiproc.obj
|
||||
.\Debug\mtest32.res
|
||||
.\Debug\main.obj
|
||||
]
|
||||
Creating command line "link.exe @C:\TEMP\RSP38B.tmp"
|
||||
<h3>Output Window</h3>
|
||||
Compiling resources...
|
||||
Compiling...
|
||||
readmail.cpp
|
||||
mapimail.cpp
|
||||
mapiproc.cpp
|
||||
main.cpp
|
||||
Linking...
|
||||
|
||||
|
||||
|
||||
<h3>Results</h3>
|
||||
mapitest.exe - 0 error(s), 0 warning(s)
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
245
mozilla/mailnews/mapi/old/tests/mapitest/mtest32.rc
Normal file
245
mozilla/mailnews/mapi/old/tests/mapitest/mtest32.rc
Normal file
@@ -0,0 +1,245 @@
|
||||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
ID_DIALOG DIALOG DISCARDABLE 0, 0, 344, 229
|
||||
STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Netscape MAPI Test Harness"
|
||||
MENU ID_MENU
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
GROUPBOX "Open/Close",IDC_STATIC,4,4,336,27
|
||||
LTEXT "User:",IDC_STATIC,9,17,18,11
|
||||
EDITTEXT ID_EDIT_USERNAME,28,15,41,12,ES_AUTOHSCROLL
|
||||
LTEXT "Password:",IDC_STATIC,74,17,38,11
|
||||
EDITTEXT ID_EDIT_PW,112,15,41,12,ES_PASSWORD | ES_AUTOHSCROLL
|
||||
PUSHBUTTON "MAPILogon",ID_BUTTON_LOGON,157,13,46,14
|
||||
PUSHBUTTON "MAPILogoff",ID_BUTTON_LOGOFF,209,13,46,14
|
||||
GROUPBOX "Mail Operations",IDC_STATIC,4,36,336,142
|
||||
PUSHBUTTON "MAPIFindNext",ID_BUTTON_FINDNEXT,17,50,57,14
|
||||
PUSHBUTTON "MAPIDeleteMail",ID_BUTTON_DELETEMAIL,80,50,57,14
|
||||
PUSHBUTTON "Clear Results",ID_BUTTON_CLEAR,143,50,57,14
|
||||
PUSHBUTTON "Send Mail",ID_BUTTON_MAIL,206,50,57,14
|
||||
LISTBOX ID_LIST_RESULT,9,66,325,56,LBS_SORT |
|
||||
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL |
|
||||
WS_TABSTOP
|
||||
GROUPBOX "User Information",IDC_STATIC,4,181,336,28
|
||||
PUSHBUTTON "MAPIResolveName",ID_BUTTON_RESOLVENAME,9,192,68,14
|
||||
EDITTEXT IDC_EDIT_RESOLVENAME,82,192,130,14,ES_AUTOHSCROLL
|
||||
PUSHBUTTON "MAPIDetails",ID_BUTTON_DETAILS,219,192,48,14
|
||||
LTEXT "",ID_STATIC_RESULT,4,214,336,13,SS_SUNKEN
|
||||
PUSHBUTTON "MAPIReadMail",ID_BUTTON_READMAIL,34,142,57,14
|
||||
CONTROL "MAPI_BODY_AS_FILE - Body as attachment",
|
||||
IDC_CHECK_BODYASFILE,"Button",BS_AUTOCHECKBOX |
|
||||
WS_TABSTOP,121,125,188,9
|
||||
CONTROL "MAPI_ENVELOPE_ONLY - Header information only",
|
||||
IDC_CHECK_ENVELOPEONLY,"Button",BS_AUTOCHECKBOX |
|
||||
WS_TABSTOP,121,138,188,9
|
||||
CONTROL "MAPI_PEEK - Don't mark message as read",IDC_CHECK_PEEK,
|
||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,121,151,188,9
|
||||
CONTROL "MAPI_SUPPRESS_ATTACH - Suppress attachments",
|
||||
IDC_CHECK_SUPPRESSATTACH,"Button",BS_AUTOCHECKBOX |
|
||||
WS_TABSTOP,121,164,188,9
|
||||
PUSHBUTTON "<- MAPIFreeBuffer",ID_BUTTON_FREEBUFFER,272,192,63,14
|
||||
PUSHBUTTON "MAPIGetNSCPVersion",ID_BUTTON_NSCPVERSION,261,13,76,14
|
||||
PUSHBUTTON "Synchronize",ID_BUTTON_SYNC,269,50,57,14
|
||||
END
|
||||
|
||||
ID_DIALOG_MAIL DIALOG DISCARDABLE 0, 0, 285, 246
|
||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Composition"
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
GROUPBOX "Address Information",IDC_STATIC,4,4,275,55
|
||||
LTEXT "To:",IDC_STATIC,21,19,12,8
|
||||
EDITTEXT ID_EDIT_TOADDRESS,36,16,239,13,ES_AUTOHSCROLL
|
||||
EDITTEXT ID_EDIT_CCADDRESS,36,30,239,13,ES_AUTOHSCROLL
|
||||
EDITTEXT ID_EDIT_BCCADDRESS,36,44,239,13,ES_AUTOHSCROLL
|
||||
LTEXT "Subject:",IDC_STATIC,5,65,29,9
|
||||
EDITTEXT ID_EDIT_SUBJECT,36,63,239,13,ES_AUTOHSCROLL
|
||||
EDITTEXT ID_EDIT_NOTETEXT,4,78,271,72,ES_MULTILINE |
|
||||
ES_AUTOHSCROLL
|
||||
GROUPBOX "Attachments",IDC_STATIC,4,153,275,39
|
||||
EDITTEXT ID_EDIT_ATTACH1,16,162,122,13,ES_AUTOHSCROLL
|
||||
EDITTEXT ID_EDIT_ATTACH2,16,176,122,13,ES_AUTOHSCROLL
|
||||
EDITTEXT ID_EDIT_ATTACH3,147,162,122,13,ES_AUTOHSCROLL
|
||||
EDITTEXT ID_EDIT_ATTACH4,147,175,122,13,ES_AUTOHSCROLL
|
||||
PUSHBUTTON "MAPISendMail",ID_BUTTON_MAPISENDMAIL,70,204,58,14
|
||||
PUSHBUTTON "Cancel",IDCANCEL,50,225,84,14
|
||||
PUSHBUTTON "MAPISendDocuments",ID_BUTTON_MAPISENDDOCUMENTS,132,204,
|
||||
79,14
|
||||
CONTROL "Show Dialog",ID_CHECK_SHOWDIALOG,"Button",
|
||||
BS_AUTOCHECKBOX | WS_TABSTOP,8,207,55,9
|
||||
LTEXT "cc:",IDC_STATIC,22,32,12,8
|
||||
LTEXT "bcc:",IDC_STATIC,18,47,15,8
|
||||
GROUPBOX "Send Operations",IDC_STATIC,4,196,275,26
|
||||
PUSHBUTTON "MAPISaveMail",ID_BUTTON_MAPISAVEMAIL,215,204,57,14
|
||||
PUSHBUTTON "MAPIAddress",ID_BUTTON_MAPIADDRESS,150,225,84,14
|
||||
END
|
||||
|
||||
ID_DIALOG_READMAIL DIALOG DISCARDABLE 0, 0, 269, 266
|
||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Mail Message"
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
LTEXT "Subject:",IDC_STATIC,5,71,27,9
|
||||
EDITTEXT IDC_EDIT_SUBJECT,36,69,229,12,ES_AUTOHSCROLL |
|
||||
ES_READONLY
|
||||
LISTBOX IDC_LIST_ATTACHMENTS,4,211,261,37,LBS_SORT |
|
||||
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
|
||||
EDITTEXT IDC_EDIT_BODYTEXT,4,113,261,85,ES_MULTILINE |
|
||||
ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY |
|
||||
ES_WANTRETURN
|
||||
LISTBOX IDC_LIST_RECIPIENTS,4,29,261,36,LBS_SORT |
|
||||
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
|
||||
LTEXT "Recipients:",IDC_STATIC,4,19,43,9
|
||||
LTEXT "Attachments:",IDC_STATIC,4,202,43,9
|
||||
EDITTEXT IDC_EDIT_DATETIME,36,83,229,12,ES_AUTOHSCROLL |
|
||||
ES_READONLY
|
||||
LTEXT "Date:",IDC_STATIC,13,84,19,9
|
||||
PUSHBUTTON "OK",ID_OK,114,249,42,13
|
||||
EDITTEXT IDC_EDIT_THREAD,36,97,229,12,ES_AUTOHSCROLL |
|
||||
ES_READONLY
|
||||
LTEXT "Thread:",IDC_STATIC,6,99,25,9
|
||||
LTEXT "From:",IDC_STATIC,4,6,19,9
|
||||
EDITTEXT IDC_EDIT_FROM,27,4,238,12,ES_AUTOHSCROLL | ES_READONLY
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DESIGNINFO
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO DISCARDABLE
|
||||
BEGIN
|
||||
ID_DIALOG, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 4
|
||||
RIGHTMARGIN, 340
|
||||
VERTGUIDE, 9
|
||||
VERTGUIDE, 309
|
||||
TOPMARGIN, 4
|
||||
BOTTOMMARGIN, 227
|
||||
HORZGUIDE, 206
|
||||
END
|
||||
|
||||
ID_DIALOG_MAIL, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 4
|
||||
RIGHTMARGIN, 281
|
||||
TOPMARGIN, 4
|
||||
BOTTOMMARGIN, 239
|
||||
END
|
||||
|
||||
ID_DIALOG_READMAIL, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 4
|
||||
RIGHTMARGIN, 265
|
||||
TOPMARGIN, 4
|
||||
BOTTOMMARGIN, 262
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon
|
||||
// remains consistent on all systems.
|
||||
ID_ICON_APP ICON DISCARDABLE "nscicon.ico"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Menu
|
||||
//
|
||||
|
||||
ID_MENU MENU DISCARDABLE
|
||||
BEGIN
|
||||
POPUP "&File"
|
||||
BEGIN
|
||||
MENUITEM "MAPI&FindNext", ID_MENU_MAPIFINDNEXT
|
||||
MENUITEM "MAPI&ReadMail", ID_MENU_MAPIREADMAIL
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "E&xit", ID_MENU_MYEXIT
|
||||
END
|
||||
POPUP "&Edit"
|
||||
BEGIN
|
||||
MENUITEM "MAPI&DeleteMail", ID_MENU_MAPIDELETEMAIL
|
||||
MENUITEM "&Clear Results", ID_MENU_CLEARRESULTS
|
||||
END
|
||||
POPUP "&Help"
|
||||
BEGIN
|
||||
MENUITEM "&About...", ID_MENU_MYABOUT
|
||||
END
|
||||
END
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
||||
BIN
mozilla/mailnews/mapi/old/tests/mapitest/nscicon.ico
Normal file
BIN
mozilla/mailnews/mapi/old/tests/mapitest/nscicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 766 B |
303
mozilla/mailnews/mapi/old/tests/mapitest/port.h
Normal file
303
mozilla/mailnews/mapi/old/tests/mapitest/port.h
Normal file
@@ -0,0 +1,303 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
|
||||
#ifndef PORT_H
|
||||
#define PORT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*****************************************************************\
|
||||
* *
|
||||
* PORT.H *
|
||||
* *
|
||||
* Win16/Win32 portability stuff *
|
||||
* *
|
||||
* A.Sokolsky *
|
||||
* 3.10.94 distilled into this header *
|
||||
* *
|
||||
\*****************************************************************/
|
||||
|
||||
/*
|
||||
* calling conventions
|
||||
*/
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
#ifndef CDECL
|
||||
#define CDECL __cdecl
|
||||
#endif // CDECL
|
||||
|
||||
#ifndef PASCAL
|
||||
#define PASCAL __pascal
|
||||
#endif // PASCAL
|
||||
|
||||
#ifdef FASTCALL
|
||||
#error FASTCALL defined
|
||||
#endif // FASTCALL
|
||||
|
||||
|
||||
#ifdef NDEBUG
|
||||
#define FASTCALL __fastcall
|
||||
#else
|
||||
#define FASTCALL PASCAL
|
||||
#endif // NDEBUG
|
||||
|
||||
|
||||
|
||||
#ifndef HWND2DWORD
|
||||
# ifdef WIN32
|
||||
# define HWND2DWORD(X_hWnd) ( (DWORD)(X_hWnd) )
|
||||
# else // WIN16
|
||||
# define HWND2DWORD(X_hWnd) ( (DWORD)MAKELONG(((WORD)(X_hWnd)), 0) )
|
||||
# endif
|
||||
#endif // HWND2DWORD
|
||||
|
||||
|
||||
/*
|
||||
* WIN16 - WIN32 compatibility stuff
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
# define DLLEXPORT __declspec( dllexport )
|
||||
# define EXPORT
|
||||
# define LOADDS
|
||||
# define HUGE
|
||||
# ifndef FAR
|
||||
# define FAR
|
||||
# endif // FAR
|
||||
# ifndef NEAR
|
||||
# define NEAR
|
||||
# endif // NEAR
|
||||
# ifdef UNICODE
|
||||
# define SIZEOF(x) (sizeof(x)/sizeof(WCHAR))
|
||||
# else
|
||||
# define SIZEOF(x) sizeof(x)
|
||||
# endif
|
||||
|
||||
#else // !WIN32 == WIN16
|
||||
|
||||
# define DLLEXPORT
|
||||
# define EXPORT __export
|
||||
# define LOADDS __loadds
|
||||
# define HUGE __huge
|
||||
# ifndef FAR
|
||||
# define FAR __far
|
||||
# define NEAR __near
|
||||
# endif // FAR
|
||||
# define CONST const
|
||||
# define SIZEOF(x) sizeof(x)
|
||||
# define CHAR char
|
||||
# define TCHAR char
|
||||
# define WCHAR char
|
||||
# ifndef LPTSTR
|
||||
# define LPTSTR LPSTR
|
||||
# endif
|
||||
# ifndef LPCTSTR
|
||||
# define LPCTSTR LPCSTR
|
||||
# endif
|
||||
# define UNREFERENCED_PARAMETER(x) x;
|
||||
# ifndef TEXT
|
||||
# define TEXT(x) x
|
||||
# endif
|
||||
# define GetWindowTextW GetWindowText
|
||||
# define lstrcpyW lstrcpy
|
||||
|
||||
# define BN_DBLCLK BN_DOUBLECLICKED // ~~MRJ needed for custom control.
|
||||
// ~~MRJ begin Win95 backward compat section
|
||||
# define LPWSTR LPSTR
|
||||
# define LPCWSTR LPCSTR
|
||||
|
||||
// button check state for WIN16
|
||||
#ifndef BST_UNCHECKED
|
||||
#define BST_UNCHECKED 0x0000
|
||||
#endif
|
||||
|
||||
#ifndef BST_CHECKED
|
||||
#define BST_CHECKED 0x0001
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef WIN95_COMPAT
|
||||
# define WIN95_COMPAT
|
||||
#endif
|
||||
|
||||
// ~~MRJ end Win95 compat section.
|
||||
|
||||
// critical section API stubs
|
||||
typedef DWORD CRITICAL_SECTION;
|
||||
typedef CRITICAL_SECTION FAR * LPCRITICAL_SECTION;
|
||||
#ifdef __cplusplus
|
||||
inline void InitializeCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
inline void DeleteCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
inline void EnterCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
inline void LeaveCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
#endif // __cplusplus
|
||||
|
||||
// Added for nssock16 ---Neeti
|
||||
#ifndef ZeroMemory
|
||||
#include <memory.h>
|
||||
#define ZeroMemory(PTR, SIZE) memset(PTR, 0, SIZE)
|
||||
#endif // ZeroMemory
|
||||
|
||||
#endif // WIN16
|
||||
|
||||
/*
|
||||
* unix - windows compatibility stuff
|
||||
*/
|
||||
typedef DWORD u_int32;
|
||||
typedef WORD u_int16;
|
||||
typedef BYTE u_int8;
|
||||
#ifdef WIN32
|
||||
typedef short int Bool16;
|
||||
#else // WIN16
|
||||
typedef BOOL Bool16;
|
||||
#endif // WIN16
|
||||
|
||||
/*
|
||||
* Cross Platform Compatibility
|
||||
*/
|
||||
#ifndef UNALIGNED
|
||||
# ifdef _M_ALPHA
|
||||
# define UNALIGNED __unaligned
|
||||
# else // !_M_ALPHA
|
||||
# define UNALIGNED
|
||||
# endif // !_M_ALPHA
|
||||
#endif // UNALIGNED
|
||||
|
||||
//
|
||||
// RICHIE - for the Alpha port
|
||||
//
|
||||
#ifdef _M_ALPHA
|
||||
# undef pascal
|
||||
# undef PASCAL
|
||||
# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
|
||||
# define pascal __stdcall
|
||||
# define PASCAL __stdcall
|
||||
# else
|
||||
# define PASCAL
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Useful Types
|
||||
*/
|
||||
typedef char HUGE *HPSTR;
|
||||
typedef const char HUGE *HPCSTR;
|
||||
typedef unsigned char HUGE *HPBYTE;
|
||||
typedef WORD HUGE *HPWORD;
|
||||
typedef UINT FAR *LPUINT;
|
||||
typedef BOOL (CALLBACK *USERABORTPROC)();
|
||||
typedef BOOL (CALLBACK *PROGRESSPROC)(UINT uPos, UINT uRange);
|
||||
typedef int INT; // ~~MRJ a function needed this defined.
|
||||
typedef MINMAXINFO FAR *LPMINMAXINFO; // ~~MRJ
|
||||
|
||||
//
|
||||
// stuff missing from windows.h
|
||||
//
|
||||
#ifndef MAKEWORD
|
||||
#define MAKEWORD(low, high) ((WORD)(((BYTE)(low)) | (((WORD)((BYTE)(high))) << 8)))
|
||||
#endif // MAKEWORD
|
||||
|
||||
#ifdef WIN32
|
||||
# ifndef hmemcpy
|
||||
# define hmemcpy memcpy
|
||||
# endif // !defined(hmemcpy)
|
||||
# define _fmemset memset
|
||||
|
||||
# include <malloc.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
inline BOOL IsGDIObject(HGDIOBJ hObj) { return (hObj != 0); }
|
||||
inline void *_halloc(long num, unsigned int size) { return malloc(num * size); }
|
||||
inline void _hfree( void *memblock ) { free(memblock); }
|
||||
/*
|
||||
inline BOOL IsInstance(HINSTANCE hInst) {
|
||||
# ifdef WIN32
|
||||
return (hInst != 0);
|
||||
# else // WIN16
|
||||
return (hInst > HINSTANCE_ERROR);
|
||||
# endif
|
||||
}
|
||||
*/
|
||||
|
||||
#endif // __cplusplus
|
||||
|
||||
WINUSERAPI HANDLE WINAPI LoadImageA(HINSTANCE, LPCSTR, UINT, int, int, UINT);
|
||||
|
||||
#endif // WIN32
|
||||
|
||||
#ifdef __cplusplus
|
||||
inline BOOL IsInstance(HINSTANCE hInst) {
|
||||
# ifdef WIN32
|
||||
return (hInst != 0);
|
||||
# else // WIN16
|
||||
return (hInst > HINSTANCE_ERROR);
|
||||
# endif
|
||||
}
|
||||
inline void SetWindowSmallIcon(HINSTANCE hInst, HWND hWnd, UINT uIconResourceId) {
|
||||
#ifdef WIN32
|
||||
# ifndef WM_SETICON
|
||||
# define WM_SETICON 0x0080
|
||||
# endif // WM_SETICON
|
||||
# ifndef IMAGE_ICON
|
||||
# define IMAGE_ICON 1
|
||||
# endif
|
||||
assert(IsWindow(hWnd));
|
||||
HICON hIcon = (HICON)LoadImageA(hInst, MAKEINTRESOURCE(uIconResourceId), IMAGE_ICON,
|
||||
16, 16, 0);
|
||||
if(NULL != hIcon) {
|
||||
SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);
|
||||
} else {
|
||||
HICON hIcon = LoadIcon(hInst, MAKEINTRESOURCE(uIconResourceId));
|
||||
assert(hIcon != 0);
|
||||
SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);
|
||||
}
|
||||
#endif // WIN32
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* PORT_H */
|
||||
137
mozilla/mailnews/mapi/old/tests/mapitest/readmail.cpp
Normal file
137
mozilla/mailnews/mapi/old/tests/mapitest/readmail.cpp
Normal file
@@ -0,0 +1,137 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
|
||||
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
|
||||
#include <mapi.h>
|
||||
#endif
|
||||
|
||||
#include "port.h"
|
||||
#include "resource.h"
|
||||
|
||||
//
|
||||
// Variables...
|
||||
//
|
||||
extern HINSTANCE hInst;
|
||||
extern HINSTANCE m_hInstMapi;
|
||||
extern LHANDLE mapiSession;
|
||||
|
||||
//
|
||||
// Forward declarations...
|
||||
//
|
||||
extern void ShowMessage(HWND hWnd, LPSTR msg);
|
||||
extern void SetFooter(LPSTR msg);
|
||||
extern LPSTR GetMAPIError(LONG errorCode);
|
||||
lpMapiMessage mailPtr = NULL;
|
||||
|
||||
void
|
||||
ProcessReadMailCommand(HWND hWnd, int id, HWND hCtl, UINT codeNotify)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case ID_OK:
|
||||
case IDCANCEL:
|
||||
EndDialog(hWnd, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL CALLBACK LOADDS
|
||||
ReadMailDlgProc(HWND hWndMail, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (wMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
DWORD i;
|
||||
// Do everything we need to display the message pointed to by
|
||||
// mailPtr
|
||||
if (!mailPtr)
|
||||
break;
|
||||
|
||||
// Start with the basics...
|
||||
SetDlgItemText(hWndMail, IDC_EDIT_SUBJECT, mailPtr->lpszSubject);
|
||||
SetDlgItemText(hWndMail, IDC_EDIT_DATETIME, mailPtr->lpszDateReceived);
|
||||
SetDlgItemText(hWndMail, IDC_EDIT_THREAD, mailPtr->lpszConversationID);
|
||||
SetDlgItemText(hWndMail, IDC_EDIT_BODYTEXT, mailPtr->lpszNoteText);
|
||||
|
||||
char buf[1024];
|
||||
wsprintf(buf, "%s (%s)", mailPtr->lpOriginator->lpszName,
|
||||
mailPtr->lpOriginator->lpszAddress);
|
||||
SetDlgItemText(hWndMail, IDC_EDIT_FROM, buf);
|
||||
|
||||
for (i=0; i<mailPtr->nRecipCount; i++)
|
||||
{
|
||||
wsprintf(buf, "%s (%s)", mailPtr->lpRecips[i].lpszName,
|
||||
mailPtr->lpRecips[i].lpszAddress);
|
||||
ListBox_InsertString(GetDlgItem(hWndMail, IDC_LIST_RECIPIENTS),
|
||||
ListBox_GetCount(GetDlgItem(hWndMail, IDC_LIST_RECIPIENTS)),
|
||||
buf);
|
||||
}
|
||||
|
||||
for (i=0; i<mailPtr->nFileCount; i++)
|
||||
{
|
||||
ListBox_InsertString(GetDlgItem(hWndMail, IDC_LIST_ATTACHMENTS),
|
||||
ListBox_GetCount(GetDlgItem(hWndMail, IDC_LIST_ATTACHMENTS)),
|
||||
mailPtr->lpFiles[i].lpszPathName);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
HANDLE_WM_COMMAND(hWndMail, wParam, lParam, ProcessReadMailCommand);
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
DisplayMAPIReadMail(HWND hWnd, lpMapiMessage msgPtr)
|
||||
{
|
||||
mailPtr = msgPtr;
|
||||
DialogBox(hInst, MAKEINTRESOURCE(ID_DIALOG_READMAIL), hWnd,
|
||||
(DLGPROC)ReadMailDlgProc);
|
||||
}
|
||||
108
mozilla/mailnews/mapi/old/tests/mapitest/resource.h
Normal file
108
mozilla/mailnews/mapi/old/tests/mapitest/resource.h
Normal file
@@ -0,0 +1,108 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by mtest32.rc
|
||||
//
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
#define ID_GUI_MESSAGE1 1
|
||||
#define ID_BUTTON_MAPIADDRESS 3
|
||||
#define ID_DIALOG 101
|
||||
#define ID_ICON_APP 102
|
||||
#define ID_MENU 104
|
||||
#define ID_DIALOG_MAIL 105
|
||||
#define ID_DIALOG_READMAIL 106
|
||||
#define ID_SETFROMEDIT 1000
|
||||
#define ID_SETTEXT 1001
|
||||
#define ID_GETROWS 1001
|
||||
#define ID_EDIT 1002
|
||||
#define ID_EDIT_HWND 1002
|
||||
#define ID_RESOURCETEXT 1003
|
||||
#define ID_GETTEXT 1003
|
||||
#define ID_STATIC_RESULT 1004
|
||||
#define ID_GETVISROWS 1005
|
||||
#define ID_GETWINID 1006
|
||||
#define ID_SETROWFOCUS 1007
|
||||
#define ID_GETROWFOCUS 1008
|
||||
#define ID_EDIT_ROW 1009
|
||||
#define ID_LIST_RESULT 1010
|
||||
#define ID_GETCOLCOUNT 1011
|
||||
#define ID_BUTTON_LOGON 1011
|
||||
#define ID_SETROWINVIEW 1012
|
||||
#define ID_BUTTON_LOGOFF 1012
|
||||
#define ID_GETNUMCHILDREN 1013
|
||||
#define ID_EDIT_USERNAME 1013
|
||||
#define ID_CLEARRESULTS 1014
|
||||
#define ID_EDIT_PW 1014
|
||||
#define ID_BUTTON_FINDNEXT 1015
|
||||
#define ID_BUTTON_CLEAR 1016
|
||||
#define ID_BUTTON_READMAIL 1017
|
||||
#define ID_BUTTON_DELETEMAIL 1018
|
||||
#define IDC_EDIT_RESOLVENAME 1019
|
||||
#define ID_BUTTON_MAPISENDMAIL 1020
|
||||
#define ID_BUTTON_NSCPVERSION 1020
|
||||
#define ID_BUTTON_RESOLVENAME 1021
|
||||
#define ID_BUTTON_MAPISENDDOCUMENTS 1021
|
||||
#define ID_EDIT_TOADDRESS 1022
|
||||
#define ID_EDIT_CCADDRESS 1023
|
||||
#define ID_BUTTON_DETAILS 1024
|
||||
#define ID_EDIT_BCCADDRESS 1024
|
||||
#define ID_EDIT_SUBJECT 1025
|
||||
#define ID_BUTTON_MAIL 1025
|
||||
#define ID_BUTTON_FREEBUFFER 1026
|
||||
#define ID_EDIT_NOTETEXT 1026
|
||||
#define ID_EDIT_ATTACH1 1027
|
||||
#define ID_BUTTON_SYNC 1027
|
||||
#define ID_EDIT_ATTACH2 1028
|
||||
#define IDC_CHECK_BODYASFILE 1028
|
||||
#define ID_EDIT_ATTACH3 1029
|
||||
#define IDC_CHECK_ENVELOPEONLY 1029
|
||||
#define IDC_LIST_ATTACHMENTS 1029
|
||||
#define ID_EDIT_ATTACH4 1030
|
||||
#define IDC_CHECK_PEEK 1030
|
||||
#define IDC_EDIT_BODYTEXT 1030
|
||||
#define IDC_CHECK_SUPPRESSATTACH 1031
|
||||
#define IDC_LIST_RECIPIENTS 1031
|
||||
#define ID_BUTTON_MAPISAVEMAIL 1031
|
||||
#define IDC_EDIT_SUBJECT 1032
|
||||
#define IDC_EDIT_DATETIME 1033
|
||||
#define ID_OK 1034
|
||||
#define IDC_EDIT_THREAD 1035
|
||||
#define ID_CHECK_SHOWDIALOG 1035
|
||||
#define IDC_EDIT_FROM 1036
|
||||
#define ID_MENU_MYEXIT 30001
|
||||
#define ID_MENU_CLEAR 30002
|
||||
#define ID_MENU_MYABOUT 30003
|
||||
#define ID_MENU_CLEARRESULTS 30004
|
||||
#define ID_MENU_MAPIDELETEMAIL 30005
|
||||
#define ID_MENU_MAPIFINDNEXT 30006
|
||||
#define ID_MENU_MAPIREADMAIL 30007
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 107
|
||||
#define _APS_NEXT_COMMAND_VALUE 30008
|
||||
#define _APS_NEXT_CONTROL_VALUE 1036
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
||||
117
mozilla/mailnews/mapi/resources/content/contents.rdf
Normal file
117
mozilla/mailnews/mapi/resources/content/contents.rdf
Normal file
@@ -0,0 +1,117 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<!-- If you modify this file, please also update the following files -->
|
||||
<!-- mailnews/mapi/resources/content/contents.rdf in the ns tree -->
|
||||
|
||||
<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:chrome="http://www.mozilla.org/rdf/chrome#">
|
||||
|
||||
<!-- list all the packages being supplied by this jar -->
|
||||
<RDF:Seq about="urn:mozilla:package:root">
|
||||
<RDF:li resource="urn:mozilla:package:messenger"/>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- package information -->
|
||||
<RDF:Description about="urn:mozilla:package:messenger"
|
||||
chrome:displayName="Messenger"
|
||||
chrome:author="mozilla.org"
|
||||
chrome:name="messenger"
|
||||
chrome:localeVersion="0.9.4"
|
||||
chrome:skinVersion="0.9.4">
|
||||
</RDF:Description>
|
||||
|
||||
<!-- overlay information -->
|
||||
<RDF:Seq about="urn:mozilla:overlays">
|
||||
<RDF:li resource="chrome://communicator/content/pref/preftree.xul"/>
|
||||
<RDF:li resource="chrome://communicator/content/pref/pref-appearance.xul"/>
|
||||
<RDF:li resource="chrome://communicator/content/pref/pref-advanced.xul"/>
|
||||
<RDF:li resource="chrome://communicator/content/tasksOverlay.xul"/>
|
||||
<RDF:li resource="chrome://navigator/content/navigatorOverlay.xul"/>
|
||||
<RDF:li resource="chrome://communicator/content/history/history.xul"/>
|
||||
<RDF:li resource="chrome://communicator/content/bookmarks/bookmarks.xul"/>
|
||||
<RDF:li resource="chrome://communicator/content/bookmarks/bm-find.xul"/>
|
||||
<RDF:li resource="chrome://messenger/content/messenger.xul"/>
|
||||
<RDF:li resource="chrome://messenger/content/mail3PaneWindowVertLayout.xul"/>
|
||||
<RDF:li resource="chrome://messenger/content/messengercompose/messengercompose.xul"/>
|
||||
<RDF:li resource="chrome://messenger/content/addressbook/addressbook.xul"/>
|
||||
<RDF:li resource="chrome://messenger/content/addressbook/abSelectAddressesDialog.xul"/>
|
||||
<RDF:li resource="chrome://editor/content/editor.xul"/>
|
||||
<RDF:li resource="chrome://messenger/content/pref-mailnews.xul"/>
|
||||
</RDF:Seq>
|
||||
|
||||
|
||||
<!-- messenger preferences branches -->
|
||||
<RDF:Seq about="chrome://communicator/content/pref/preftree.xul">
|
||||
<RDF:li>chrome://messenger/content/mailPrefsOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger startup pref -->
|
||||
<RDF:Seq about="chrome://communicator/content/pref/pref-appearance.xul">
|
||||
<RDF:li>chrome://messenger/content/mailPrefsOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger js toggle pref -->
|
||||
<RDF:Seq about="chrome://communicator/content/pref/pref-advanced.xul">
|
||||
<RDF:li>chrome://messenger/content/mailPrefsOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger taskbar/tasks menu items -->
|
||||
<RDF:Seq about="chrome://communicator/content/tasksOverlay.xul">
|
||||
<RDF:li>chrome://messenger/content/mailTasksOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for History -->
|
||||
<RDF:Seq about="chrome://communicator/content/history/history.xul">
|
||||
<RDF:li>chrome://messenger/content/mailNavigatorOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for Bookmarks -->
|
||||
<RDF:Seq about="chrome://communicator/content/bookmarks/bookmarks.xul">
|
||||
<RDF:li>chrome://messenger/content/mailNavigatorOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for History -->
|
||||
<RDF:Seq about="chrome://communicator/content/bookmarks/bm-find.xul">
|
||||
<RDF:li>chrome://messenger/content/mailNavigatorOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for Navigator -->
|
||||
<RDF:Seq about="chrome://navigator/content/navigatorOverlay.xul">
|
||||
<RDF:li>chrome://messenger/content/mailNavigatorOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for Messenger -->
|
||||
<RDF:Seq about="chrome://messenger/content/messenger.xul">
|
||||
<RDF:li>chrome://messenger/content/mailMessengerOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
<RDF:Seq about="chrome://messenger/content/mail3PaneWindowVertLayout.xul">
|
||||
<RDF:li>chrome://messenger/content/mailMessengerOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for Mail Compose -->
|
||||
<RDF:Seq about="chrome://messenger/content/messengercompose/messengercompose.xul">
|
||||
<RDF:li>chrome://messenger/content/mailMessengerComposeOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for Addressbook -->
|
||||
<RDF:Seq about="chrome://messenger/content/addressbook/addressbook.xul">
|
||||
<RDF:li>chrome://messenger/content/mailABOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for Select Addresses dialog -->
|
||||
<RDF:Seq about="chrome://messenger/content/addressbook/abSelectAddressesDialog.xul">
|
||||
<RDF:li>chrome://messenger/content/mailOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
|
||||
<!-- messenger items for Composer -->
|
||||
<RDF:Seq about="chrome://editor/content/editor.xul">
|
||||
<RDF:li>chrome://messenger/content/mailEditorOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- mapi items for Mail And Newsgroups preferences pane -->
|
||||
<RDF:Seq about="chrome://messenger/content/pref-mailnews.xul">
|
||||
<RDF:li>chrome://messenger/content/pref-mailnewsOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
</RDF:RDF>
|
||||
4
mozilla/mailnews/mapi/resources/content/jar.mn
Normal file
4
mozilla/mailnews/mapi/resources/content/jar.mn
Normal file
@@ -0,0 +1,4 @@
|
||||
messenger.jar:
|
||||
content/messenger/pref-mailnewsOverlay.xul
|
||||
+ content/messenger/contents.rdf
|
||||
content/messenger/pref-mailnewsOverlay.js
|
||||
26
mozilla/mailnews/mapi/resources/content/makefile.win
Normal file
26
mozilla/mailnews/mapi/resources/content/makefile.win
Normal file
@@ -0,0 +1,26 @@
|
||||
#!nmake
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 2001 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Srilatha Moturi <srilatha@netscape.com>
|
||||
#
|
||||
|
||||
DEPTH=..\..\..\..
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
14
mozilla/mailnews/mapi/resources/content/overlays.rdf
Normal file
14
mozilla/mailnews/mapi/resources/content/overlays.rdf
Normal file
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0"?>
|
||||
<RDF:RDF xmlns:chrome="http://www.mozilla.org/rdf/chrome#"
|
||||
xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||
|
||||
<!-- mapi items for mailnews preferences -->
|
||||
<RDF:Seq about="urn:mozilla:overlays">
|
||||
<RDF:li resource="chrome://messenger/content/pref-mailnews.xul"/>
|
||||
</RDF:Seq>
|
||||
|
||||
<RDF:Seq about="chrome://messenger/content/pref-mailnews.xul">
|
||||
<RDF:li>chrome://messenger/content/pref-mailnewsOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
</RDF:RDF>
|
||||
104
mozilla/mailnews/mapi/resources/content/pref-mailnewsOverlay.js
Normal file
104
mozilla/mailnews/mapi/resources/content/pref-mailnewsOverlay.js
Normal file
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 2001 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Srilatha Moturi <srilatha@netscape.com>
|
||||
*/
|
||||
|
||||
function mailnewsOverlayStartup() {
|
||||
mailnewsOverlayInit();
|
||||
parent.hPrefWindow.registerOKCallbackFunc(onOK);
|
||||
if (!("mapiPref" in parent)) {
|
||||
parent.mapiPref = new Object;
|
||||
parent.mapiPref.isDefaultMailClient =
|
||||
document.getElementById("mailnewsEnableMapi").checked;
|
||||
}
|
||||
else {
|
||||
// when we switch between different panes
|
||||
// set the checkbox based on the saved state
|
||||
var mailnewsEnableMapi = document.getElementById("mailnewsEnableMapi");
|
||||
if (parent.mapiPref.isDefaultMailClient)
|
||||
mailnewsEnableMapi.setAttribute("checked", "true");
|
||||
else
|
||||
mailnewsEnableMapi.setAttribute("checked", "false");
|
||||
}
|
||||
}
|
||||
|
||||
function mailnewsOverlayInit() {
|
||||
try {
|
||||
var mapiRegistry = Components.classes[ "@mozilla.org/mapiregistry;1" ].
|
||||
getService( Components.interfaces.nsIMapiRegistry );
|
||||
}
|
||||
catch(ex){
|
||||
mapiRegistry = null;
|
||||
}
|
||||
|
||||
const prefbase = "system.windows.lock_ui.";
|
||||
var mailnewsEnableMapi = document.getElementById("mailnewsEnableMapi");
|
||||
if (mapiRegistry) {
|
||||
// initialise preference component.
|
||||
// While the data is coming from the system registry, we use a set
|
||||
// of parallel preferences to indicate if the ui should be locked.
|
||||
try {
|
||||
var prefService = Components.classes["@mozilla.org/preferences-service;1"]
|
||||
.getService()
|
||||
.QueryInterface(Components.interfaces.nsIPrefService);
|
||||
var prefBranch = prefService.getBranch(prefbase);
|
||||
if (prefBranch && prefBranch.prefIsLocked("default_mail_client")) {
|
||||
if (prefBranch.getBoolPref("default_mail_client"))
|
||||
mapiRegistry.setDefaultMailClient();
|
||||
else
|
||||
mapiRegistry.unsetDefaultMailClient();
|
||||
mailnewsEnableMapi.setAttribute("disabled", "true");
|
||||
}
|
||||
}
|
||||
catch(ex) {}
|
||||
if (mapiRegistry.isDefaultMailClient)
|
||||
mailnewsEnableMapi.setAttribute("checked", "true");
|
||||
else
|
||||
mailnewsEnableMapi.setAttribute("checked", "false");
|
||||
}
|
||||
else
|
||||
mailnewsEnableMapi.setAttribute("disabled", "true");
|
||||
}
|
||||
|
||||
function onEnableMapi() {
|
||||
// save the state of the checkbox
|
||||
if ("mapiPref" in parent)
|
||||
parent.mapiPref.isDefaultMailClient =
|
||||
document.getElementById("mailnewsEnableMapi").checked;
|
||||
}
|
||||
|
||||
function onOK()
|
||||
{
|
||||
try {
|
||||
var mapiRegistry = Components.classes[ "@mozilla.org/mapiregistry;1" ].
|
||||
getService( Components.interfaces.nsIMapiRegistry );
|
||||
}
|
||||
catch(ex){
|
||||
mapiRegistry = null;
|
||||
}
|
||||
if (mapiRegistry &&
|
||||
("mapiPref" in parent) &&
|
||||
(mapiRegistry.isDefaultMailClient != parent.mapiPref.isDefaultMailClient)) {
|
||||
if (parent.mapiPref.isDefaultMailClient)
|
||||
mapiRegistry.setDefaultMailClient();
|
||||
else
|
||||
mapiRegistry.unsetDefaultMailClient();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0"?>
|
||||
<!--
|
||||
The contents of this file are subject to the Mozilla Public
|
||||
License Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License. You may obtain a copy of
|
||||
the License at http://www.mozilla.org/MPL/
|
||||
|
||||
oftware distributed under the License is distributed on an "AS
|
||||
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
implied. See the License for the specific language governing
|
||||
rights and limitations under the License.
|
||||
|
||||
The Original Code is mozilla.org code.
|
||||
The Initial Developer of the Original Code is Netscape
|
||||
Communications Corporation. Portions created by Netscape are
|
||||
Copyright (C) 2001 Netscape Communications Corporation. All
|
||||
Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
Srilatha Moturi <srilatha@netscape.com>
|
||||
-->
|
||||
|
||||
<!DOCTYPE window [
|
||||
<!ENTITY % brandDTD SYSTEM "chrome://global/locale/brand.dtd" >
|
||||
%brandDTD;
|
||||
<!ENTITY % prefMailnewsOverlayDTD SYSTEM "chrome://messenger/locale/pref-mailnewsOverlay.dtd" >
|
||||
%prefMailnewsOverlayDTD;
|
||||
]>
|
||||
<overlay id="prefMailnewsOverlay"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||
|
||||
<script type="application/x-javascript">
|
||||
<![CDATA[
|
||||
_elementIDs.push("mailnewsEnableMapi");
|
||||
]]>
|
||||
</script>
|
||||
<script type="application/x-javascript" src="chrome://messenger/content/pref-mailnewsOverlay.js"/>
|
||||
<hbox autostretch="never" id="mapi">
|
||||
<checkbox id="mailnewsEnableMapi" label="&enableMapi.label;"
|
||||
accesskey="&enableMapi.accesskey;"
|
||||
oncommand="onEnableMapi();"
|
||||
startFunc="mailnewsOverlayStartup();"/>
|
||||
</hbox>
|
||||
</overlay>
|
||||
3
mozilla/mailnews/mapi/resources/locale/en-US/jar.mn
Normal file
3
mozilla/mailnews/mapi/resources/locale/en-US/jar.mn
Normal file
@@ -0,0 +1,3 @@
|
||||
en-US.jar:
|
||||
locale/en-US/messenger/pref-mailnewsOverlay.dtd
|
||||
locale/en-US/messenger/mapi.properties
|
||||
26
mozilla/mailnews/mapi/resources/locale/en-US/makefile.win
Normal file
26
mozilla/mailnews/mapi/resources/locale/en-US/makefile.win
Normal file
@@ -0,0 +1,26 @@
|
||||
#!nmake
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 2001 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Srilatha Moturi <srilatha@netscape.com>
|
||||
#
|
||||
|
||||
DEPTH=..\..\..\..\..
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
18
mozilla/mailnews/mapi/resources/locale/en-US/mapi.properties
Normal file
18
mozilla/mailnews/mapi/resources/locale/en-US/mapi.properties
Normal file
@@ -0,0 +1,18 @@
|
||||
# Mail Integration Dialog
|
||||
dialogTitle=%S Mail
|
||||
dialogText=Do you want to use %S as the default mail application?
|
||||
checkboxText=Do not display this dialog again
|
||||
|
||||
# MAPI Messages
|
||||
loginText=Please enter your password for %S:
|
||||
loginTextwithName=Please enter your username and password
|
||||
loginTitle=%S Mail
|
||||
PasswordTitle=%S Mail
|
||||
|
||||
# MAPI Error Messages
|
||||
errorMessage=%S Mail could not be set as the default mail application because a registry key could not be updated. Verify with your system administrator that you have write access to your system registry, and then try again.
|
||||
errorMessageTitle=%S Mail
|
||||
|
||||
# MAPI Security Messages
|
||||
mapiBlindSendWarning=Another application is attempting to send mail using your user profile. Are you sure you want to send mail?
|
||||
mapiBlindSendDontShowAgain=Warn me whenever other applications try to send mail from me
|
||||
@@ -0,0 +1,3 @@
|
||||
<!ENTITY enableMapiTitle.label "When sending mail from other applications">
|
||||
<!ENTITY enableMapi.label "Use &vendorShortName; Mail as the default mail application.">
|
||||
<!ENTITY enableMapi.accesskey "u">
|
||||
28
mozilla/mailnews/mapi/resources/locale/makefile.win
Normal file
28
mozilla/mailnews/mapi/resources/locale/makefile.win
Normal file
@@ -0,0 +1,28 @@
|
||||
#!nmake
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 2001 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Srilatha Moturi <srilatha@netscape.com>
|
||||
#
|
||||
|
||||
DEPTH=..\..\..\..
|
||||
|
||||
DIRS=en-US
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
27
mozilla/mailnews/mapi/resources/makefile.win
Normal file
27
mozilla/mailnews/mapi/resources/makefile.win
Normal file
@@ -0,0 +1,27 @@
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 2001 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Srilatha Moturi <srilatha@netscape.com>
|
||||
#
|
||||
|
||||
DEPTH=..\..\..
|
||||
|
||||
DIRS=content locale
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
@@ -1,152 +0,0 @@
|
||||
#! gmake
|
||||
|
||||
#
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is the Netscape Portable Runtime (NSPR).
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Netscape Communications Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 1998-2000
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
|
||||
MOD_DEPTH = .
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(MOD_DEPTH)/config/autoconf.mk
|
||||
|
||||
MAKE := $(patsubst -j%,,$(MAKE)) -j1
|
||||
|
||||
DIRS = config pr lib
|
||||
|
||||
ifdef MOZILLA_CLIENT
|
||||
# Make nsinstall use absolute symlinks by default for Mozilla OSX builds
|
||||
# http://bugzilla.mozilla.org/show_bug.cgi?id=193164
|
||||
ifeq ($(OS_ARCH),Darwin)
|
||||
ifndef NSDISTMODE
|
||||
NSDISTMODE=absolute_symlink
|
||||
export NSDISTMODE
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
DIST_GARBAGE = config.cache config.log config.status
|
||||
|
||||
all:: config.status export
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
config.status:: configure
|
||||
ifeq ($(OS_ARCH),WINNT)
|
||||
sh $(srcdir)/configure --no-create --no-recursion
|
||||
else
|
||||
./config.status --recheck && ./config.status
|
||||
endif
|
||||
|
||||
#
|
||||
# The -ll option of zip converts CR LF to LF.
|
||||
#
|
||||
ifeq ($(OS_ARCH),WINNT)
|
||||
ZIP_ASCII_OPT = -ll
|
||||
endif
|
||||
|
||||
# Delete config/autoconf.mk last because it is included by every makefile.
|
||||
distclean::
|
||||
@echo "cd pr/tests; $(MAKE) $@"
|
||||
@$(MAKE) -C pr/tests $@
|
||||
rm -f config/autoconf.mk
|
||||
rm -f `cat unallmakefiles` unallmakefiles
|
||||
|
||||
release::
|
||||
echo $(BUILD_NUMBER) > $(RELEASE_DIR)/$(BUILD_NUMBER)/version.df
|
||||
@if test -f imports.df; then \
|
||||
echo "cp -f imports.df $(RELEASE_DIR)/$(BUILD_NUMBER)/imports.df"; \
|
||||
cp -f imports.df $(RELEASE_DIR)/$(BUILD_NUMBER)/imports.df; \
|
||||
else \
|
||||
echo "echo > $(RELEASE_DIR)/$(BUILD_NUMBER)/imports.df"; \
|
||||
echo > $(RELEASE_DIR)/$(BUILD_NUMBER)/imports.df; \
|
||||
fi
|
||||
cd $(RELEASE_DIR)/$(BUILD_NUMBER)/$(OBJDIR_NAME); \
|
||||
rm -rf META-INF; mkdir META-INF; cd META-INF; \
|
||||
echo "Manifest-Version: 1.0" > MANIFEST.MF; \
|
||||
echo "" >> MANIFEST.MF; \
|
||||
cd ..; rm -f mdbinary.jar; zip -r mdbinary.jar META-INF bin lib; \
|
||||
rm -rf META-INF; \
|
||||
cd include; \
|
||||
rm -rf META-INF; mkdir META-INF; cd META-INF; \
|
||||
echo "Manifest-Version: 1.0" > MANIFEST.MF; \
|
||||
echo "" >> MANIFEST.MF; \
|
||||
cd ..; rm -f mdheader.jar; zip $(ZIP_ASCII_OPT) -r mdheader.jar *; \
|
||||
rm -rf META-INF
|
||||
ifeq ($(OS_ARCH),WINNT)
|
||||
@if test ! -d $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER); then \
|
||||
rm -rf $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER); \
|
||||
echo "making directory $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)"; \
|
||||
$(topsrcdir)/config/prmkdir.bat $(MDIST_DOS)\\$(MOD_NAME)\\$(BUILD_NUMBER); \
|
||||
fi
|
||||
@if test ! -d $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); then \
|
||||
rm -rf $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); \
|
||||
echo "making directory $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME)"; \
|
||||
$(topsrcdir)/config/prmkdir.bat $(MDIST_DOS)\\$(MOD_NAME)\\$(BUILD_NUMBER)\\$(RELEASE_OBJDIR_NAME); \
|
||||
fi
|
||||
else
|
||||
@if test ! -d $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER); then \
|
||||
rm -rf $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER); \
|
||||
echo "making directory $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)"; \
|
||||
$(NSINSTALL) -D $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER); \
|
||||
chmod 775 $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER); \
|
||||
fi
|
||||
@if test ! -d $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); then \
|
||||
rm -rf $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); \
|
||||
echo "making directory $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME)"; \
|
||||
$(NSINSTALL) -D $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); \
|
||||
chmod 775 $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); \
|
||||
fi
|
||||
endif
|
||||
cd $(RELEASE_DIR)/$(BUILD_NUMBER); \
|
||||
cp -f version.df imports.df $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER); \
|
||||
chmod 664 $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/version.df; \
|
||||
chmod 664 $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/imports.df; \
|
||||
cd $(OBJDIR_NAME); \
|
||||
cp -f mdbinary.jar $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); \
|
||||
chmod 664 $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME)/mdbinary.jar; \
|
||||
cd include; \
|
||||
cp -f mdheader.jar $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME); \
|
||||
chmod 664 $(MDIST)/$(MOD_NAME)/$(BUILD_NUMBER)/$(RELEASE_OBJDIR_NAME)/mdheader.jar
|
||||
|
||||
package:
|
||||
@echo "cd pkg; $(MAKE) publish"
|
||||
$(MAKE) -C pkg publish
|
||||
|
||||
depend:
|
||||
@echo "NSPR20 has no dependencies. Skipped."
|
||||
@@ -1,75 +0,0 @@
|
||||
#!/bin/perl
|
||||
#
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is the Netscape Portable Runtime (NSPR).
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Netscape Communications Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 1998-2001
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
# -----------------------------------------------------------------
|
||||
#
|
||||
# explode.pl -- Unpack .jar files into bin, lib, include directories
|
||||
#
|
||||
# syntax: perl explode.pl
|
||||
#
|
||||
# Description:
|
||||
# explode.pl unpacks the .jar files created by the NSPR build
|
||||
# procedure.
|
||||
#
|
||||
# Suggested use: After copying the platform directories to
|
||||
# /s/b/c/nspr20/<release>. CD to /s/b/c/nspr20/<release> and
|
||||
# run explode.pl. This will unpack the jar files into bin, lib,
|
||||
# include directories.
|
||||
#
|
||||
# -----------------------------------------------------------------
|
||||
|
||||
@dirs = `ls -d *.OBJ*`;
|
||||
|
||||
foreach $dir (@dirs) {
|
||||
chop($dir);
|
||||
if (-l $dir) {
|
||||
print "Skipping symbolic link $dir\n";
|
||||
next;
|
||||
}
|
||||
print "Unzipping $dir/mdbinary.jar\n";
|
||||
system ("unzip", "-o", "$dir/mdbinary.jar",
|
||||
"-d", "$dir");
|
||||
system ("rm", "-rf", "$dir/META-INF");
|
||||
mkdir "$dir/include", 0755;
|
||||
print "Unzipping $dir/mdheader.jar\n";
|
||||
system ("unzip", "-o", "-aa",
|
||||
"$dir/mdheader.jar",
|
||||
"-d", "$dir/include");
|
||||
system ("rm", "-rf", "$dir/include/META-INF");
|
||||
}
|
||||
# --- end explode.pl ----------------------------------------------
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user