Compare commits
40 Commits
MAPI_TRUNK
...
STRING_081
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2e1777f9b5 | ||
|
|
99efac3124 | ||
|
|
57ed42992f | ||
|
|
6f32510025 | ||
|
|
078567ca71 | ||
|
|
7791c7b9e8 | ||
|
|
b146859b40 | ||
|
|
a8da425a6f | ||
|
|
57e25da11d | ||
|
|
5200a8a8b9 | ||
|
|
9a0cd79226 | ||
|
|
73e8d36238 | ||
|
|
108dd9fe2a | ||
|
|
8c67e6b4b2 | ||
|
|
b8d0928720 | ||
|
|
7f66a9d19f | ||
|
|
9e0dc2526a | ||
|
|
ae85ae37da | ||
|
|
8b103cd7ba | ||
|
|
9ef69db463 | ||
|
|
aadc6198b4 | ||
|
|
011984fc48 | ||
|
|
051d24e674 | ||
|
|
a8a0fd0815 | ||
|
|
23166d3117 | ||
|
|
16352119a4 | ||
|
|
6433e6c15a | ||
|
|
2e8da224d5 | ||
|
|
ad33c0e9e3 | ||
|
|
413c10a73e | ||
|
|
b50526e4f9 | ||
|
|
ddcfe0fade | ||
|
|
d3f529a51a | ||
|
|
3088f582fe | ||
|
|
85cba8b3fa | ||
|
|
d9e607a0ab | ||
|
|
3ea67f16a2 | ||
|
|
c07e9e4c4d | ||
|
|
f4db0afc09 | ||
|
|
602920c9a5 |
15
mozilla/build/mac/build_scripts/MozillaCheckoutList.txt
Normal file
15
mozilla/build/mac/build_scripts/MozillaCheckoutList.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
# List of modules to check out. Format is
|
||||
# module, (tag), (date)
|
||||
# where tag and date are optional (non-trailing commas are required)
|
||||
#
|
||||
# Examples:
|
||||
# mozilla/nsprpub, NSPRPUB_CLIENT_BRANCH
|
||||
# mozilla/gc, , 10/25/2000 12:00:00
|
||||
#
|
||||
|
||||
mozilla/nsprpub, NSPRPUB_CLIENT_BRANCH
|
||||
mozilla/security/nss, NSS_CLIENT_TAG
|
||||
mozilla/security/psm,
|
||||
DirectorySDKSourceC, LDAPCSDK_40_BRANCH
|
||||
mozilla/lib/mac/Instrumentation
|
||||
SeaMonkeyAll STRING_081_BRANCH
|
||||
1673
mozilla/content/base/src/nsDocumentEncoder.cpp
Normal file
1673
mozilla/content/base/src/nsDocumentEncoder.cpp
Normal file
File diff suppressed because it is too large
Load Diff
792
mozilla/content/base/src/nsHTMLContentSerializer.cpp
Normal file
792
mozilla/content/base/src/nsHTMLContentSerializer.cpp
Normal file
@@ -0,0 +1,792 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
#include "nsHTMLContentSerializer.h"
|
||||
|
||||
#include "nsIDOMElement.h"
|
||||
#include "nsIContent.h"
|
||||
#include "nsIDocument.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsString.h"
|
||||
#include "nsXPIDLString.h"
|
||||
#include "nsParserCIID.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIDocumentEncoder.h"
|
||||
#include "nsLayoutAtoms.h"
|
||||
#include "nsHTMLAtoms.h"
|
||||
#include "nsIURI.h"
|
||||
#include "nsNetUtil.h"
|
||||
#include "nsEscape.h"
|
||||
|
||||
static NS_DEFINE_CID(kParserServiceCID, NS_PARSERSERVICE_CID);
|
||||
|
||||
#define kIndentStr NS_LITERAL_STRING(" ")
|
||||
#define kMozStr "_moz"
|
||||
#define kLessThan NS_LITERAL_STRING("<")
|
||||
#define kGreaterThan NS_LITERAL_STRING(">")
|
||||
#define kEndTag NS_LITERAL_STRING("</")
|
||||
|
||||
static const PRInt32 kLongLineLen = 128;
|
||||
|
||||
nsresult NS_NewHTMLContentSerializer(nsIContentSerializer** aSerializer)
|
||||
{
|
||||
nsHTMLContentSerializer* it = new nsHTMLContentSerializer();
|
||||
if (!it) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
return it->QueryInterface(NS_GET_IID(nsIContentSerializer), (void**)aSerializer);
|
||||
}
|
||||
|
||||
nsHTMLContentSerializer::nsHTMLContentSerializer()
|
||||
{
|
||||
mColPos = 0;
|
||||
mIndent = 0;
|
||||
mInBody = PR_FALSE;
|
||||
mInCDATA = PR_FALSE;
|
||||
}
|
||||
|
||||
nsHTMLContentSerializer::~nsHTMLContentSerializer()
|
||||
{
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsHTMLContentSerializer::GetParserService(nsIParserService** aParserService)
|
||||
{
|
||||
if (!mParserService) {
|
||||
nsresult rv;
|
||||
mParserService = do_GetService(kParserServiceCID, &rv);
|
||||
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
CallQueryInterface(mParserService.get(), aParserService);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsHTMLContentSerializer::Init(PRUint32 aFlags, PRUint32 aWrapColumn,
|
||||
nsIAtom* aCharSet)
|
||||
{
|
||||
mFlags = aFlags;
|
||||
if (!aWrapColumn) {
|
||||
mMaxColumn = 72;
|
||||
}
|
||||
else {
|
||||
mMaxColumn = aWrapColumn;
|
||||
}
|
||||
|
||||
mDoFormat = (mFlags & nsIDocumentEncoder::OutputFormatted) ? PR_TRUE
|
||||
: PR_FALSE;
|
||||
mBodyOnly = (mFlags & nsIDocumentEncoder::OutputBodyOnly) ? PR_TRUE
|
||||
: PR_FALSE;
|
||||
// Set the line break character:
|
||||
if ((mFlags & nsIDocumentEncoder::OutputCRLineBreak)
|
||||
&& (mFlags & nsIDocumentEncoder::OutputLFLineBreak)) { // Windows/mail
|
||||
mLineBreak.AssignWithConversion("\r\n");
|
||||
}
|
||||
else if (mFlags & nsIDocumentEncoder::OutputCRLineBreak) { // Mac
|
||||
mLineBreak.AssignWithConversion("\r");
|
||||
}
|
||||
else if (mFlags & nsIDocumentEncoder::OutputLFLineBreak) { // Unix/DOM
|
||||
mLineBreak.AssignWithConversion("\n");
|
||||
}
|
||||
else {
|
||||
mLineBreak.AssignWithConversion(NS_LINEBREAK); // Platform/default
|
||||
}
|
||||
|
||||
mPreLevel = 0;
|
||||
|
||||
mIsLatin1 = PR_FALSE;
|
||||
if (aCharSet) {
|
||||
const PRUnichar *charset;
|
||||
aCharSet->GetUnicode(&charset);
|
||||
|
||||
if (NS_LITERAL_STRING("ISO-8859-1").Equals(charset)) {
|
||||
mIsLatin1 = PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsHTMLContentSerializer::AppendText(nsIDOMText* aText,
|
||||
PRInt32 aStartOffset,
|
||||
PRInt32 aEndOffset,
|
||||
nsAWritableString& aStr)
|
||||
{
|
||||
NS_ENSURE_ARG(aText);
|
||||
|
||||
nsAutoString data;
|
||||
|
||||
nsresult rv;
|
||||
rv = AppendTextData((nsIDOMNode*)aText, aStartOffset,
|
||||
aEndOffset, data, PR_TRUE, PR_FALSE);
|
||||
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
|
||||
|
||||
PRInt32 lastNewlineOffset = kNotFound;
|
||||
PRBool hasLongLines = HasLongLines(data, lastNewlineOffset);
|
||||
|
||||
if (mPreLevel || (!mDoFormat && !hasLongLines) ||
|
||||
(mFlags & nsIDocumentEncoder::OutputRaw)) {
|
||||
AppendToString(data, aStr);
|
||||
|
||||
if (lastNewlineOffset != kNotFound) {
|
||||
mColPos = data.Length() - lastNewlineOffset;
|
||||
}
|
||||
}
|
||||
else {
|
||||
AppendToStringWrapped(data, aStr, PR_FALSE);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
nsHTMLContentSerializer::SerializeAttributes(nsIContent* aContent,
|
||||
nsIAtom* aTagName,
|
||||
nsAWritableString& aStr)
|
||||
{
|
||||
nsresult rv;
|
||||
PRInt32 index, count;
|
||||
nsAutoString nameStr, valueStr;
|
||||
PRInt32 namespaceID;
|
||||
nsCOMPtr<nsIAtom> attrName, attrPrefix;
|
||||
|
||||
aContent->GetAttributeCount(count);
|
||||
|
||||
for (index = 0; index < count; index++) {
|
||||
aContent->GetAttributeNameAt(index,
|
||||
namespaceID,
|
||||
*getter_AddRefs(attrName),
|
||||
*getter_AddRefs(attrPrefix));
|
||||
|
||||
// Filter out any attribute starting with _moz
|
||||
nsXPIDLString sharedName;
|
||||
attrName->GetUnicode(getter_Shares(sharedName));
|
||||
if (nsCRT::strncmp(sharedName,
|
||||
NS_ConvertASCIItoUCS2(kMozStr),
|
||||
sizeof(kMozStr)-1) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
aContent->GetAttribute(namespaceID, attrName, valueStr);
|
||||
|
||||
//
|
||||
// Filter out special case of <br type="_moz"> or <br _moz*>,
|
||||
// used by the editor. Bug 16988. Yuck.
|
||||
//
|
||||
if ((aTagName == nsHTMLAtoms::br) &&
|
||||
(attrName.get() == nsHTMLAtoms::type) &&
|
||||
(valueStr.EqualsWithConversion(kMozStr, PR_FALSE, sizeof(kMozStr)-1))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Make all links absolute when converting only the selection:
|
||||
if ((mFlags & nsIDocumentEncoder::OutputAbsoluteLinks) &&
|
||||
((attrName.get() == nsHTMLAtoms::href) ||
|
||||
(attrName.get() == nsHTMLAtoms::src))) {
|
||||
// Would be nice to handle OBJECT and APPLET tags,
|
||||
// but that gets more complicated since we have to
|
||||
// search the tag list for CODEBASE as well.
|
||||
// For now, just leave them relative.
|
||||
nsCOMPtr<nsIDocument> document;
|
||||
aContent->GetDocument(*getter_AddRefs(document));
|
||||
if (document) {
|
||||
nsCOMPtr<nsIURI> uri = dont_AddRef(document->GetDocumentURL());
|
||||
if (uri) {
|
||||
nsAutoString absURI;
|
||||
rv = NS_MakeAbsoluteURI(absURI, valueStr, uri);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
valueStr = absURI;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
attrName->ToString(nameStr);
|
||||
|
||||
SerializeAttr(nsAutoString(), nameStr, valueStr, aStr);
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsHTMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
|
||||
nsAWritableString& aStr)
|
||||
{
|
||||
NS_ENSURE_ARG(aElement);
|
||||
|
||||
nsCOMPtr<nsIContent> content = do_QueryInterface(aElement);
|
||||
if (!content) return NS_ERROR_FAILURE;
|
||||
|
||||
// The _moz_dirty attribute is emitted by the editor to
|
||||
// indicate that this element should be pretty printed
|
||||
// even if we're not in pretty printing mode
|
||||
PRBool hasDirtyAttr = HasDirtyAttr(content);
|
||||
|
||||
nsCOMPtr<nsIAtom> name;
|
||||
content->GetTag(*getter_AddRefs(name));
|
||||
|
||||
if (name.get() == nsHTMLAtoms::body) {
|
||||
mInBody = PR_TRUE;
|
||||
}
|
||||
|
||||
if (LineBreakBeforeOpen(name, hasDirtyAttr)) {
|
||||
AppendToString(mLineBreak, aStr);
|
||||
mColPos = 0;
|
||||
}
|
||||
|
||||
StartIndentation(name, hasDirtyAttr, aStr);
|
||||
|
||||
if ((name.get() == nsHTMLAtoms::pre) ||
|
||||
(name.get() == nsHTMLAtoms::script) ||
|
||||
(name.get() == nsHTMLAtoms::style)) {
|
||||
mPreLevel++;
|
||||
}
|
||||
|
||||
AppendToString(kLessThan, aStr);
|
||||
|
||||
nsXPIDLString sharedName;
|
||||
name->GetUnicode(getter_Shares(sharedName));
|
||||
AppendToString(sharedName, -1, aStr);
|
||||
|
||||
SerializeAttributes(content, name, aStr);
|
||||
|
||||
AppendToString(kGreaterThan, aStr);
|
||||
|
||||
if (LineBreakAfterOpen(name, hasDirtyAttr)) {
|
||||
AppendToString(mLineBreak, aStr);
|
||||
mColPos = 0;
|
||||
}
|
||||
|
||||
if ((name.get() == nsHTMLAtoms::script) ||
|
||||
(name.get() == nsHTMLAtoms::style) ||
|
||||
(name.get() == nsHTMLAtoms::noscript)) {
|
||||
mInCDATA = PR_TRUE;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsHTMLContentSerializer::AppendElementEnd(nsIDOMElement *aElement,
|
||||
nsAWritableString& aStr)
|
||||
{
|
||||
NS_ENSURE_ARG(aElement);
|
||||
|
||||
nsCOMPtr<nsIContent> content = do_QueryInterface(aElement);
|
||||
if (!content) return NS_ERROR_FAILURE;
|
||||
|
||||
PRBool hasDirtyAttr = HasDirtyAttr(content);
|
||||
|
||||
nsCOMPtr<nsIAtom> name;
|
||||
content->GetTag(*getter_AddRefs(name));
|
||||
|
||||
if ((name.get() == nsHTMLAtoms::pre) ||
|
||||
(name.get() == nsHTMLAtoms::script) ||
|
||||
(name.get() == nsHTMLAtoms::style)) {
|
||||
mPreLevel--;
|
||||
}
|
||||
|
||||
nsXPIDLString sharedName;
|
||||
name->GetUnicode(getter_Shares(sharedName));
|
||||
|
||||
nsCOMPtr<nsIParserService> parserService;
|
||||
GetParserService(getter_AddRefs(parserService));
|
||||
|
||||
if (parserService && (name.get() != nsHTMLAtoms::style)) {
|
||||
nsAutoString nameStr(sharedName);
|
||||
PRBool isContainer;
|
||||
PRInt32 id;
|
||||
|
||||
parserService->HTMLStringTagToId(nameStr, &id);
|
||||
parserService->IsContainer(id, isContainer);
|
||||
if (!isContainer) return NS_OK;
|
||||
}
|
||||
|
||||
if (LineBreakBeforeClose(name, hasDirtyAttr)) {
|
||||
AppendToString(mLineBreak, aStr);
|
||||
mColPos = 0;
|
||||
}
|
||||
|
||||
EndIndentation(name, hasDirtyAttr, aStr);
|
||||
|
||||
AppendToString(kEndTag, aStr);
|
||||
AppendToString(sharedName, -1, aStr);
|
||||
AppendToString(kGreaterThan, aStr);
|
||||
|
||||
if (LineBreakAfterClose(name, hasDirtyAttr)) {
|
||||
AppendToString(mLineBreak, aStr);
|
||||
mColPos = 0;
|
||||
}
|
||||
|
||||
mInCDATA = PR_FALSE;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
nsHTMLContentSerializer::AppendToString(const PRUnichar* aStr,
|
||||
PRInt32 aLength,
|
||||
nsAWritableString& aOutputStr)
|
||||
{
|
||||
if (mBodyOnly && !mInBody) {
|
||||
return;
|
||||
}
|
||||
|
||||
PRInt32 length = (aLength == -1) ? nsCRT::strlen(aStr) : aLength;
|
||||
|
||||
mColPos += length;
|
||||
|
||||
aOutputStr.Append(aStr, length);
|
||||
}
|
||||
|
||||
void
|
||||
nsHTMLContentSerializer::AppendToString(const PRUnichar aChar,
|
||||
nsAWritableString& aOutputStr)
|
||||
{
|
||||
if (mBodyOnly && !mInBody) {
|
||||
return;
|
||||
}
|
||||
|
||||
mColPos += 1;
|
||||
|
||||
aOutputStr.Append(aChar);
|
||||
}
|
||||
|
||||
void
|
||||
nsHTMLContentSerializer::AppendToStringWrapped(const nsAReadableString& aStr,
|
||||
nsAWritableString& aOutputStr,
|
||||
PRBool aTranslateEntities)
|
||||
{
|
||||
PRInt32 length = aStr.Length();
|
||||
|
||||
nsAutoString line;
|
||||
PRBool done = PR_FALSE;
|
||||
PRInt32 indx = 0;
|
||||
PRInt32 strOffset = 0;
|
||||
PRInt32 lineLength, oldLineEnd;
|
||||
|
||||
// Make sure we haven't gone too far already
|
||||
if (mColPos > mMaxColumn) {
|
||||
AppendToString(mLineBreak, aOutputStr);
|
||||
mColPos = 0;
|
||||
}
|
||||
|
||||
// Find the end of the first old line
|
||||
oldLineEnd = aStr.FindChar(PRUnichar('\n'), 0);
|
||||
|
||||
while ((!done) && (strOffset < length)) {
|
||||
// This is how much is needed to fill up the new line
|
||||
PRInt32 leftInLine = mMaxColumn - mColPos;
|
||||
|
||||
// This is the last position in the current old line
|
||||
PRInt32 oldLineLimit;
|
||||
if (oldLineEnd == kNotFound) {
|
||||
oldLineLimit = length;
|
||||
}
|
||||
else {
|
||||
oldLineLimit = oldLineEnd;
|
||||
}
|
||||
|
||||
PRBool addLineBreak = PR_FALSE;
|
||||
|
||||
// if we can fill up the new line with less than what's
|
||||
// in the current old line...
|
||||
if ((strOffset + leftInLine) < oldLineLimit) {
|
||||
addLineBreak = PR_TRUE;
|
||||
|
||||
// Look for the next word end to break
|
||||
indx = aStr.FindChar(PRUnichar(' '), strOffset + leftInLine);
|
||||
|
||||
// If it's after the end of the current line, then break at
|
||||
// the current line
|
||||
if ((indx == kNotFound) ||
|
||||
((oldLineEnd != kNotFound) && (oldLineEnd < indx))) {
|
||||
indx = oldLineEnd;
|
||||
}
|
||||
}
|
||||
else {
|
||||
indx = oldLineEnd;
|
||||
}
|
||||
|
||||
// if there was no place to break, then just add the entire string
|
||||
if (indx == kNotFound) {
|
||||
if (strOffset == 0) {
|
||||
AppendToString(aStr, aOutputStr, aTranslateEntities);
|
||||
}
|
||||
else {
|
||||
lineLength = length - strOffset;
|
||||
aStr.Right(line, lineLength);
|
||||
AppendToString(line, aOutputStr, aTranslateEntities);
|
||||
}
|
||||
done = PR_TRUE;
|
||||
}
|
||||
else {
|
||||
// Add the part of the current old line that's part of the
|
||||
// new line
|
||||
lineLength = indx - strOffset;
|
||||
aStr.Mid(line, strOffset, lineLength);
|
||||
AppendToString(line, aOutputStr, aTranslateEntities);
|
||||
|
||||
// if we've reached the end of an old line, don't add the
|
||||
// old line break and find the end of the next old line.
|
||||
if (indx == oldLineEnd) {
|
||||
oldLineEnd = aStr.FindChar(PRUnichar('\n'), indx+1);
|
||||
AppendToString(NS_LITERAL_STRING(" "), aOutputStr);
|
||||
}
|
||||
|
||||
if (addLineBreak) {
|
||||
AppendToString(mLineBreak, aOutputStr);
|
||||
mColPos = 0;
|
||||
}
|
||||
strOffset = indx+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static PRUint16 kGTVal = 62;
|
||||
static const char* kEntities[] = {
|
||||
"", "", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "amp", "",
|
||||
"", "", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "", "",
|
||||
"lt", "", "gt"
|
||||
};
|
||||
|
||||
static const char* kAttrEntities[] = {
|
||||
"", "", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "quot", "", "", "", "amp", "apos",
|
||||
"", "", "", "", "", "", "", "", "", "",
|
||||
"", "", "", "", "", "", "", "", "", "",
|
||||
"lt", "", "gt"
|
||||
};
|
||||
|
||||
void
|
||||
nsHTMLContentSerializer::AppendToString(const nsAReadableString& aStr,
|
||||
nsAWritableString& aOutputStr,
|
||||
PRBool aTranslateEntities,
|
||||
PRBool aIncrColumn)
|
||||
{
|
||||
if (mBodyOnly && !mInBody) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (aIncrColumn) {
|
||||
mColPos += aStr.Length();
|
||||
}
|
||||
|
||||
if (aTranslateEntities && !mInCDATA) {
|
||||
if (mFlags & nsIDocumentEncoder::OutputEncodeEntities) {
|
||||
nsCOMPtr<nsIParserService> parserService;
|
||||
GetParserService(getter_AddRefs(parserService));
|
||||
|
||||
if (!parserService) {
|
||||
NS_ERROR("Can't get parser service");
|
||||
return;
|
||||
}
|
||||
|
||||
nsReadingIterator<PRUnichar> done_reading;
|
||||
aStr.EndReading(done_reading);
|
||||
|
||||
// for each chunk of |aString|...
|
||||
PRUint32 advanceLength = 0;
|
||||
nsReadingIterator<PRUnichar> iter;
|
||||
|
||||
const char **entityTable = mInAttribute ? kAttrEntities : kEntities;
|
||||
|
||||
for (aStr.BeginReading(iter);
|
||||
iter != done_reading;
|
||||
iter.advance(PRInt32(advanceLength))) {
|
||||
PRUint32 fragmentLength = iter.size_forward();
|
||||
const PRUnichar* c = iter.get();
|
||||
const PRUnichar* fragmentStart = c;
|
||||
const PRUnichar* fragmentEnd = c + fragmentLength;
|
||||
const char* entityText = nsnull;
|
||||
nsCAutoString entityReplacement;
|
||||
|
||||
advanceLength = 0;
|
||||
// for each character in this chunk, check if it
|
||||
// needs to be replaced
|
||||
for (; c < fragmentEnd; c++, advanceLength++) {
|
||||
PRUnichar val = *c;
|
||||
if ((val <= kGTVal) && (entityTable[val][0] != 0)) {
|
||||
entityText = entityTable[val];
|
||||
break;
|
||||
} else if (mIsLatin1 && val > 127 && val < 256) {
|
||||
parserService->HTMLConvertUnicodeToEntity(val, entityReplacement);
|
||||
|
||||
if (entityReplacement.Length() > 0) {
|
||||
entityText = entityReplacement.get();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
aOutputStr.Append(fragmentStart, advanceLength);
|
||||
if (entityText) {
|
||||
aOutputStr.Append(PRUnichar('&'));
|
||||
aOutputStr.Append(NS_ConvertASCIItoUCS2(entityText));
|
||||
aOutputStr.Append(PRUnichar(';'));
|
||||
advanceLength++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
nsXMLContentSerializer::AppendToString(aStr, aOutputStr, aTranslateEntities, aIncrColumn);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
aOutputStr.Append(aStr);
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsHTMLContentSerializer::HasDirtyAttr(nsIContent* aContent)
|
||||
{
|
||||
nsAutoString val;
|
||||
|
||||
if (NS_CONTENT_ATTR_NOT_THERE != aContent->GetAttribute(kNameSpaceID_None,
|
||||
nsLayoutAtoms::mozdirty,
|
||||
val)) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
else {
|
||||
return PR_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsHTMLContentSerializer::LineBreakBeforeOpen(nsIAtom* aName,
|
||||
PRBool aHasDirtyAttr)
|
||||
{
|
||||
if ((!mDoFormat && !aHasDirtyAttr) || mPreLevel || !mColPos ||
|
||||
(mFlags & nsIDocumentEncoder::OutputRaw)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
if (aName == nsHTMLAtoms::title ||
|
||||
aName == nsHTMLAtoms::meta ||
|
||||
aName == nsHTMLAtoms::link ||
|
||||
aName == nsHTMLAtoms::style ||
|
||||
aName == nsHTMLAtoms::script ||
|
||||
aName == nsHTMLAtoms::html) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
else {
|
||||
nsCOMPtr<nsIParserService> parserService;
|
||||
GetParserService(getter_AddRefs(parserService));
|
||||
|
||||
if (parserService) {
|
||||
nsAutoString str;
|
||||
aName->ToString(str);
|
||||
PRBool res;
|
||||
PRInt32 id;
|
||||
|
||||
parserService->HTMLStringTagToId(str, &id);
|
||||
parserService->IsBlock(id, res);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsHTMLContentSerializer::LineBreakAfterOpen(nsIAtom* aName,
|
||||
PRBool aHasDirtyAttr)
|
||||
{
|
||||
if ((!mDoFormat && !aHasDirtyAttr) || mPreLevel ||
|
||||
(mFlags & nsIDocumentEncoder::OutputRaw)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
if ((aName == nsHTMLAtoms::html) ||
|
||||
(aName == nsHTMLAtoms::head) ||
|
||||
(aName == nsHTMLAtoms::body) ||
|
||||
(aName == nsHTMLAtoms::ul) ||
|
||||
(aName == nsHTMLAtoms::ol) ||
|
||||
(aName == nsHTMLAtoms::dl) ||
|
||||
(aName == nsHTMLAtoms::table) ||
|
||||
(aName == nsHTMLAtoms::tbody) ||
|
||||
(aName == nsHTMLAtoms::tr) ||
|
||||
(aName == nsHTMLAtoms::br) ||
|
||||
(aName == nsHTMLAtoms::meta) ||
|
||||
(aName == nsHTMLAtoms::link) ||
|
||||
(aName == nsHTMLAtoms::script) ||
|
||||
(aName == nsHTMLAtoms::style)) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsHTMLContentSerializer::LineBreakBeforeClose(nsIAtom* aName,
|
||||
PRBool aHasDirtyAttr)
|
||||
{
|
||||
if ((!mDoFormat && !aHasDirtyAttr) || mPreLevel || !mColPos ||
|
||||
(mFlags & nsIDocumentEncoder::OutputRaw)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
if ((aName == nsHTMLAtoms::html) ||
|
||||
(aName == nsHTMLAtoms::head) ||
|
||||
(aName == nsHTMLAtoms::body) ||
|
||||
(aName == nsHTMLAtoms::ul) ||
|
||||
(aName == nsHTMLAtoms::ol) ||
|
||||
(aName == nsHTMLAtoms::dl) ||
|
||||
(aName == nsHTMLAtoms::table) ||
|
||||
(aName == nsHTMLAtoms::tbody)) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsHTMLContentSerializer::LineBreakAfterClose(nsIAtom* aName,
|
||||
PRBool aHasDirtyAttr)
|
||||
{
|
||||
if ((!mDoFormat && !aHasDirtyAttr) || mPreLevel ||
|
||||
(mFlags & nsIDocumentEncoder::OutputRaw)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
if ((aName == nsHTMLAtoms::html) ||
|
||||
(aName == nsHTMLAtoms::head) ||
|
||||
(aName == nsHTMLAtoms::body) ||
|
||||
(aName == nsHTMLAtoms::tr) ||
|
||||
(aName == nsHTMLAtoms::th) ||
|
||||
(aName == nsHTMLAtoms::td) ||
|
||||
(aName == nsHTMLAtoms::pre) ||
|
||||
(aName == nsHTMLAtoms::title) ||
|
||||
(aName == nsHTMLAtoms::li) ||
|
||||
(aName == nsHTMLAtoms::dt) ||
|
||||
(aName == nsHTMLAtoms::dd) ||
|
||||
(aName == nsHTMLAtoms::blockquote) ||
|
||||
(aName == nsHTMLAtoms::p) ||
|
||||
(aName == nsHTMLAtoms::div)) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
else {
|
||||
nsCOMPtr<nsIParserService> parserService;
|
||||
GetParserService(getter_AddRefs(parserService));
|
||||
|
||||
if (parserService) {
|
||||
nsAutoString str;
|
||||
aName->ToString(str);
|
||||
PRBool res;
|
||||
PRInt32 id;
|
||||
|
||||
parserService->HTMLStringTagToId(str, &id);
|
||||
parserService->IsBlock(id, res);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
nsHTMLContentSerializer::StartIndentation(nsIAtom* aName,
|
||||
PRBool aHasDirtyAttr,
|
||||
nsAWritableString& aStr)
|
||||
{
|
||||
if ((mDoFormat || aHasDirtyAttr) && !mPreLevel && !mColPos) {
|
||||
for (PRInt32 i = mIndent; --i >= 0; ) {
|
||||
AppendToString(kIndentStr.get(), -1,
|
||||
aStr);
|
||||
}
|
||||
}
|
||||
|
||||
if ((aName == nsHTMLAtoms::head) ||
|
||||
(aName == nsHTMLAtoms::table) ||
|
||||
(aName == nsHTMLAtoms::tr) ||
|
||||
(aName == nsHTMLAtoms::ul) ||
|
||||
(aName == nsHTMLAtoms::ol) ||
|
||||
(aName == nsHTMLAtoms::tbody) ||
|
||||
(aName == nsHTMLAtoms::form) ||
|
||||
(aName == nsHTMLAtoms::frameset) ||
|
||||
(aName == nsHTMLAtoms::blockquote) ||
|
||||
(aName == nsHTMLAtoms::li) ||
|
||||
(aName == nsHTMLAtoms::dt) ||
|
||||
(aName == nsHTMLAtoms::dd)) {
|
||||
mIndent++;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
nsHTMLContentSerializer::EndIndentation(nsIAtom* aName,
|
||||
PRBool aHasDirtyAttr,
|
||||
nsAWritableString& aStr)
|
||||
{
|
||||
if ((aName == nsHTMLAtoms::head) ||
|
||||
(aName == nsHTMLAtoms::table) ||
|
||||
(aName == nsHTMLAtoms::tr) ||
|
||||
(aName == nsHTMLAtoms::ul) ||
|
||||
(aName == nsHTMLAtoms::ol) ||
|
||||
(aName == nsHTMLAtoms::li) ||
|
||||
(aName == nsHTMLAtoms::tbody) ||
|
||||
(aName == nsHTMLAtoms::form) ||
|
||||
(aName == nsHTMLAtoms::frameset)) {
|
||||
mIndent--;
|
||||
}
|
||||
|
||||
if ((mDoFormat || aHasDirtyAttr) && !mPreLevel && !mColPos) {
|
||||
for (PRInt32 i = mIndent; --i >= 0; ) {
|
||||
AppendToString(kIndentStr.get(), -1,
|
||||
aStr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// See if the string has any lines longer than longLineLen:
|
||||
// if so, we presume formatting is wonky (e.g. the node has been edited)
|
||||
// and we'd better rewrap the whole text node.
|
||||
PRBool
|
||||
nsHTMLContentSerializer::HasLongLines(const nsString& text, PRInt32& aLastNewlineOffset)
|
||||
{
|
||||
PRUint32 start=0;
|
||||
PRUint32 theLen=text.Length();
|
||||
PRBool rv = PR_FALSE;
|
||||
aLastNewlineOffset = kNotFound;
|
||||
for (start = 0; start < theLen; )
|
||||
{
|
||||
PRInt32 eol = text.FindChar('\n', PR_FALSE, start);
|
||||
if (eol < 0) {
|
||||
eol = text.Length();
|
||||
}
|
||||
else {
|
||||
aLastNewlineOffset = eol;
|
||||
}
|
||||
if (PRInt32(eol - start) > kLongLineLen)
|
||||
rv = PR_TRUE;
|
||||
start = eol+1;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
1778
mozilla/content/base/src/nsPlainTextSerializer.cpp
Normal file
1778
mozilla/content/base/src/nsPlainTextSerializer.cpp
Normal file
File diff suppressed because it is too large
Load Diff
1453
mozilla/content/xbl/src/nsBindingManager.cpp
Normal file
1453
mozilla/content/xbl/src/nsBindingManager.cpp
Normal file
File diff suppressed because it is too large
Load Diff
332
mozilla/content/xbl/src/nsXBLWindowHandler.cpp
Normal file
332
mozilla/content/xbl/src/nsXBLWindowHandler.cpp
Normal file
@@ -0,0 +1,332 @@
|
||||
/* -*- Mode: C++; tab-width: 2; 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 Communicator client 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):
|
||||
* - David W. Hyatt (hyatt@netscape.com)
|
||||
* - Mike Pinkerton (pinkerton@netscape.com)
|
||||
* - Akkana Peck (akkana@netscape.com)
|
||||
*/
|
||||
|
||||
|
||||
#include "nsXBLWindowHandler.h"
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsPIWindowRoot.h"
|
||||
#include "nsIDOMWindowInternal.h"
|
||||
#include "nsIFocusController.h"
|
||||
#include "nsIScriptGlobalObject.h"
|
||||
#include "nsIDocShell.h"
|
||||
#include "nsIPresShell.h"
|
||||
#include "nsIDOMElement.h"
|
||||
#include "nsIDOMEventReceiver.h"
|
||||
#include "nsIXBLPrototypeHandler.h"
|
||||
#include "nsIXBLPrototypeBinding.h"
|
||||
#include "nsIPrivateDOMEvent.h"
|
||||
#include "nsIDOMEvent.h"
|
||||
#include "nsIContent.h"
|
||||
#include "nsHTMLAtoms.h"
|
||||
#include "nsINameSpaceManager.h"
|
||||
#include "nsIXBLDocumentInfo.h"
|
||||
#include "nsIDocument.h"
|
||||
#include "nsIXBLService.h"
|
||||
#include "nsIServiceManager.h"
|
||||
|
||||
class nsXBLSpecialDocInfo
|
||||
{
|
||||
public:
|
||||
nsCOMPtr<nsIXBLDocumentInfo> mHTMLBindings;
|
||||
nsCOMPtr<nsIXBLDocumentInfo> mPlatformHTMLBindings;
|
||||
nsCOMPtr<nsIXBLDocumentInfo> mUserHTMLBindings;
|
||||
|
||||
nsCString mHTMLBindingStr;
|
||||
nsCString mPlatformHTMLBindingStr;
|
||||
nsCString mUserHTMLBindingStr;
|
||||
|
||||
static char* sHTMLBindingStr;
|
||||
static char* sPlatformHTMLBindingStr;
|
||||
static char* sUserHTMLBindingStr;
|
||||
|
||||
PRBool mInitialized;
|
||||
|
||||
public:
|
||||
void LoadDocInfo();
|
||||
void GetAllHandlers(const char* aType,
|
||||
nsIXBLPrototypeHandler** handler,
|
||||
nsIXBLPrototypeHandler** platformHandler,
|
||||
nsIXBLPrototypeHandler** userHandler);
|
||||
void GetHandlers(nsIXBLDocumentInfo* aInfo,
|
||||
const nsAReadableCString& aRef,
|
||||
nsIXBLPrototypeHandler** aResult);
|
||||
|
||||
nsXBLSpecialDocInfo() : mInitialized(PR_FALSE) {};
|
||||
};
|
||||
|
||||
char* nsXBLSpecialDocInfo::sHTMLBindingStr = "resource:///res/builtin/htmlBindings.xml";
|
||||
char* nsXBLSpecialDocInfo::sPlatformHTMLBindingStr = "resource:///res/builtin/platformHTMLBindings.xml";
|
||||
// Allow for a userHTMLBindings.xml.
|
||||
// XXX Should be in the user profile directory, when we have a urlspec for that
|
||||
char* nsXBLSpecialDocInfo::sUserHTMLBindingStr = "resource:///res/builtin/userHTMLBindings.xml";
|
||||
|
||||
void nsXBLSpecialDocInfo::LoadDocInfo()
|
||||
{
|
||||
if (mInitialized)
|
||||
return;
|
||||
mInitialized = PR_TRUE;
|
||||
|
||||
mHTMLBindingStr = sHTMLBindingStr;
|
||||
mPlatformHTMLBindingStr = sPlatformHTMLBindingStr;
|
||||
mUserHTMLBindingStr = sUserHTMLBindingStr;
|
||||
|
||||
if (mHTMLBindings && mPlatformHTMLBindings && mUserHTMLBindings)
|
||||
return;
|
||||
|
||||
nsresult rv;
|
||||
NS_WITH_SERVICE(nsIXBLService, xblService, "@mozilla.org/xbl;1", &rv);
|
||||
if (NS_FAILED(rv) || !xblService)
|
||||
return;
|
||||
|
||||
// Obtain the XP and platform doc infos
|
||||
xblService->LoadBindingDocumentInfo(nsnull, nsnull,
|
||||
mHTMLBindingStr,
|
||||
nsCAutoString(""), PR_TRUE,
|
||||
getter_AddRefs(mHTMLBindings));
|
||||
xblService->LoadBindingDocumentInfo(nsnull, nsnull,
|
||||
mPlatformHTMLBindingStr,
|
||||
nsCAutoString(""), PR_TRUE,
|
||||
getter_AddRefs(mPlatformHTMLBindings));
|
||||
xblService->LoadBindingDocumentInfo(nsnull, nsnull,
|
||||
mUserHTMLBindingStr,
|
||||
nsCAutoString(""), PR_TRUE,
|
||||
getter_AddRefs(mUserHTMLBindings));
|
||||
}
|
||||
|
||||
//
|
||||
// GetHandlers
|
||||
//
|
||||
//
|
||||
void
|
||||
nsXBLSpecialDocInfo::GetHandlers(nsIXBLDocumentInfo* aInfo,
|
||||
const nsAReadableCString& aRef,
|
||||
nsIXBLPrototypeHandler** aResult)
|
||||
{
|
||||
nsCOMPtr<nsIXBLPrototypeBinding> binding;
|
||||
aInfo->GetPrototypeBinding(aRef, getter_AddRefs(binding));
|
||||
if (!binding) {
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
aInfo->GetDocument(getter_AddRefs(doc));
|
||||
nsCOMPtr<nsIContent> root = getter_AddRefs(doc->GetRootContent());
|
||||
if (root) { // no root, no handlers. don't crash please.
|
||||
PRInt32 childCount;
|
||||
root->ChildCount(childCount);
|
||||
for (PRInt32 i = 0; i < childCount; i++) {
|
||||
nsCOMPtr<nsIContent> child;
|
||||
root->ChildAt(i, *getter_AddRefs(child));
|
||||
nsAutoString id;
|
||||
child->GetAttribute(kNameSpaceID_None, nsHTMLAtoms::id, id);
|
||||
if (id.EqualsWithConversion(nsPromiseFlatCString(aRef).get())) {
|
||||
NS_NewXBLPrototypeBinding(aRef, child, aInfo, getter_AddRefs(binding));
|
||||
aInfo->SetPrototypeBinding(aRef, binding);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (binding) {
|
||||
nsCOMPtr<nsIXBLPrototypeHandler> dummy;
|
||||
binding->GetPrototypeHandlers(aResult, getter_AddRefs(dummy)); // Addref happens here.
|
||||
}
|
||||
} // GetHandlers
|
||||
|
||||
void
|
||||
nsXBLSpecialDocInfo::GetAllHandlers(const char* aType,
|
||||
nsIXBLPrototypeHandler** aHandler,
|
||||
nsIXBLPrototypeHandler** aPlatformHandler,
|
||||
nsIXBLPrototypeHandler** aUserHandler)
|
||||
{
|
||||
if (mUserHTMLBindings) {
|
||||
nsCAutoString type(aType);
|
||||
type.Append("User");
|
||||
GetHandlers(mUserHTMLBindings, type, aUserHandler);
|
||||
}
|
||||
if (mPlatformHTMLBindings) {
|
||||
nsCAutoString type(aType);
|
||||
GetHandlers(mPlatformHTMLBindings, type, aPlatformHandler);
|
||||
}
|
||||
if (mHTMLBindings) {
|
||||
nsCAutoString type(aType);
|
||||
type.Append("Base");
|
||||
GetHandlers(mHTMLBindings, type, aHandler);
|
||||
}
|
||||
}
|
||||
|
||||
// Init statics
|
||||
nsXBLSpecialDocInfo* nsXBLWindowHandler::sXBLSpecialDocInfo = nsnull;
|
||||
PRUint32 nsXBLWindowHandler::sRefCnt = 0;
|
||||
|
||||
|
||||
//
|
||||
// nsXBLWindowHandler ctor
|
||||
//
|
||||
// Increment the refcount
|
||||
//
|
||||
nsXBLWindowHandler :: nsXBLWindowHandler (nsIDOMElement* aElement, nsIDOMEventReceiver* aReceiver)
|
||||
: mElement(aElement), mReceiver(aReceiver)
|
||||
{
|
||||
++sRefCnt;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// nsXBLWindowHandler dtor
|
||||
//
|
||||
// Decrement the refcount. If we get to zero, get rid of the static XBL doc
|
||||
// info.
|
||||
//
|
||||
nsXBLWindowHandler :: ~nsXBLWindowHandler ( )
|
||||
{
|
||||
--sRefCnt;
|
||||
if ( !sRefCnt ) {
|
||||
delete sXBLSpecialDocInfo;
|
||||
sXBLSpecialDocInfo = nsnull;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// IsEditor
|
||||
//
|
||||
// Determine if the document we're working with is Editor or Browser
|
||||
//
|
||||
PRBool
|
||||
nsXBLWindowHandler :: IsEditor()
|
||||
{
|
||||
nsCOMPtr<nsPIWindowRoot> windowRoot(do_QueryInterface(mReceiver));
|
||||
nsCOMPtr<nsIFocusController> focusController;
|
||||
windowRoot->GetFocusController(getter_AddRefs(focusController));
|
||||
if (!focusController) {
|
||||
NS_WARNING("********* Something went wrong! No focus controller on the root!!!\n");
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIDOMWindowInternal> focusedWindow;
|
||||
focusController->GetFocusedWindow(getter_AddRefs(focusedWindow));
|
||||
if (!focusedWindow)
|
||||
return PR_FALSE;
|
||||
|
||||
nsCOMPtr<nsIScriptGlobalObject> obj(do_QueryInterface(focusedWindow));
|
||||
nsCOMPtr<nsIDocShell> docShell;
|
||||
obj->GetDocShell(getter_AddRefs(docShell));
|
||||
nsCOMPtr<nsIPresShell> presShell;
|
||||
if (docShell)
|
||||
docShell->GetPresShell(getter_AddRefs(presShell));
|
||||
|
||||
if (presShell) {
|
||||
PRBool isEditor;
|
||||
presShell->GetDisplayNonTextSelection(&isEditor);
|
||||
return isEditor;
|
||||
}
|
||||
|
||||
return PR_FALSE;
|
||||
} // IsEditor
|
||||
|
||||
|
||||
//
|
||||
// WalkHandlersInternal
|
||||
//
|
||||
// Given a particular DOM event and a pointer to the first handler in the list,
|
||||
// scan through the list to find something to handle the event and then make it
|
||||
// so.
|
||||
//
|
||||
nsresult
|
||||
nsXBLWindowHandler::WalkHandlersInternal(nsIDOMEvent* aEvent, nsIAtom* aEventType,
|
||||
nsIXBLPrototypeHandler* aHandler)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIXBLPrototypeHandler> currHandler = aHandler;
|
||||
while (currHandler) {
|
||||
|
||||
PRBool stopped;
|
||||
nsCOMPtr<nsIPrivateDOMEvent> privateEvent(do_QueryInterface(aEvent));
|
||||
privateEvent->IsDispatchStopped(&stopped);
|
||||
if (stopped)
|
||||
return NS_OK;
|
||||
|
||||
// if the handler says it wants the event, execute it
|
||||
if ( EventMatched(currHandler, aEventType, aEvent) ) {
|
||||
// ...but don't exectute if it is disabled.
|
||||
nsAutoString disabled;
|
||||
|
||||
nsCOMPtr<nsIContent> elt;
|
||||
currHandler->GetHandlerElement(getter_AddRefs(elt));
|
||||
|
||||
elt->GetAttribute(kNameSpaceID_None, nsHTMLAtoms::disabled, disabled);
|
||||
if (!disabled.Equals(NS_LITERAL_STRING("true"))) {
|
||||
nsCOMPtr<nsIDOMEventReceiver> rec = mReceiver;
|
||||
if (mElement)
|
||||
rec = do_QueryInterface(elt);
|
||||
rv = currHandler->ExecuteHandler(rec, aEvent);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
// the current handler didn't want it, try the next one.
|
||||
nsCOMPtr<nsIXBLPrototypeHandler> nextHandler;
|
||||
currHandler->GetNextHandler(getter_AddRefs(nextHandler));
|
||||
currHandler = nextHandler;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
} // WalkHandlersInternal
|
||||
|
||||
|
||||
|
||||
//
|
||||
// EnsureHandlers
|
||||
//
|
||||
// Lazily load the XP and platform-specific bindings
|
||||
//
|
||||
nsresult
|
||||
nsXBLWindowHandler::EnsureHandlers()
|
||||
{
|
||||
if (!sXBLSpecialDocInfo)
|
||||
sXBLSpecialDocInfo = new nsXBLSpecialDocInfo();
|
||||
if (!sXBLSpecialDocInfo)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
sXBLSpecialDocInfo->LoadDocInfo();
|
||||
|
||||
// Now determine which handlers we should be using.
|
||||
if (IsEditor()) {
|
||||
sXBLSpecialDocInfo->GetAllHandlers("editor",
|
||||
getter_AddRefs(mHandler),
|
||||
getter_AddRefs(mPlatformHandler),
|
||||
getter_AddRefs(mUserHandler));
|
||||
}
|
||||
else {
|
||||
sXBLSpecialDocInfo->GetAllHandlers("browser",
|
||||
getter_AddRefs(mHandler),
|
||||
getter_AddRefs(mPlatformHandler),
|
||||
getter_AddRefs(mUserHandler));
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
||||
} // EnsureHandlers
|
||||
|
||||
1461
mozilla/docshell/base/nsWebShell.cpp
Normal file
1461
mozilla/docshell/base/nsWebShell.cpp
Normal file
File diff suppressed because it is too large
Load Diff
4594
mozilla/dom/src/base/nsGlobalWindow.cpp
Normal file
4594
mozilla/dom/src/base/nsGlobalWindow.cpp
Normal file
File diff suppressed because it is too large
Load Diff
259
mozilla/editor/base/TextEditorTest.cpp
Normal file
259
mozilla/editor/base/TextEditorTest.cpp
Normal file
@@ -0,0 +1,259 @@
|
||||
/* -*- Mode: C++ tab-width: 2 indent-tabs-mode: nil c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "nsIEditor.h"
|
||||
#include "nsIHTMLEditor.h"
|
||||
#include "TextEditorTest.h"
|
||||
#include "nsISelection.h"
|
||||
#include "nsIDOMCharacterData.h"
|
||||
#include "nsIDOMDocument.h"
|
||||
#include "nsIDOMNode.h"
|
||||
#include "nsIDOMNodeList.h"
|
||||
#include "nsIEditProperty.h"
|
||||
#include "nsString.h"
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
|
||||
#define TEST_RESULT(r) { if (NS_FAILED(r)) {printf("FAILURE result=%X\n", r); return r; } }
|
||||
#define TEST_POINTER(p) { if (!p) {printf("FAILURE null pointer\n"); return NS_ERROR_NULL_POINTER; } }
|
||||
|
||||
TextEditorTest::TextEditorTest()
|
||||
{
|
||||
printf("constructed a TextEditorTest\n");
|
||||
}
|
||||
|
||||
TextEditorTest::~TextEditorTest()
|
||||
{
|
||||
printf("destroyed a TextEditorTest\n");
|
||||
}
|
||||
|
||||
void TextEditorTest::Run(nsIEditor *aEditor, PRInt32 *outNumTests, PRInt32 *outNumTestsFailed)
|
||||
{
|
||||
if (!aEditor) return;
|
||||
mTextEditor = do_QueryInterface(aEditor);
|
||||
mEditor = do_QueryInterface(aEditor);
|
||||
RunUnitTest(outNumTests, outNumTestsFailed);
|
||||
}
|
||||
|
||||
nsresult TextEditorTest::RunUnitTest(PRInt32 *outNumTests, PRInt32 *outNumTestsFailed)
|
||||
{
|
||||
nsresult result;
|
||||
|
||||
if (!outNumTests || !outNumTestsFailed)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*outNumTests = 0;
|
||||
*outNumTestsFailed = 0;
|
||||
|
||||
result = InitDoc();
|
||||
TEST_RESULT(result);
|
||||
// shouldn't we just bail on error here?
|
||||
|
||||
// insert some simple text
|
||||
result = mTextEditor->InsertText(NS_LITERAL_STRING("1234567890abcdefghij1234567890").get());
|
||||
TEST_RESULT(result);
|
||||
(*outNumTests)++;
|
||||
(*outNumTestsFailed) += (NS_FAILED(result) != NS_OK);
|
||||
|
||||
// insert some more text
|
||||
result = mTextEditor->InsertText(NS_LITERAL_STRING("Moreover, I am cognizant of the interrelatedness of all communities and states. I cannot sit idly by in Atlanta and not be concerned about what happens in Birmingham. Injustice anywhere is a threat to justice everywhere").get());
|
||||
TEST_RESULT(result);
|
||||
(*outNumTests)++;
|
||||
(*outNumTestsFailed) += (NS_FAILED(result) != NS_OK);
|
||||
|
||||
result = TestInsertBreak();
|
||||
TEST_RESULT(result);
|
||||
(*outNumTests)++;
|
||||
(*outNumTestsFailed) += (NS_FAILED(result) != NS_OK);
|
||||
|
||||
result = TestTextProperties();
|
||||
TEST_RESULT(result);
|
||||
(*outNumTests)++;
|
||||
(*outNumTestsFailed) += (NS_FAILED(result) != NS_OK);
|
||||
|
||||
// get us back to the original document
|
||||
result = mEditor->Undo(12);
|
||||
TEST_RESULT(result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult TextEditorTest::InitDoc()
|
||||
{
|
||||
nsresult result = mEditor->SelectAll();
|
||||
TEST_RESULT(result);
|
||||
result = mEditor->DeleteSelection(nsIEditor::eNext);
|
||||
TEST_RESULT(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult TextEditorTest::TestInsertBreak()
|
||||
{
|
||||
nsCOMPtr<nsISelection>selection;
|
||||
nsresult result = mEditor->GetSelection(getter_AddRefs(selection));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(selection.get());
|
||||
nsCOMPtr<nsIDOMNode>anchor;
|
||||
result = selection->GetAnchorNode(getter_AddRefs(anchor));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(anchor.get());
|
||||
selection->Collapse(anchor, 0);
|
||||
// insert one break
|
||||
printf("inserting a break\n");
|
||||
result = mTextEditor->InsertLineBreak();
|
||||
TEST_RESULT(result);
|
||||
mEditor->DebugDumpContent();
|
||||
|
||||
// insert a second break adjacent to the first
|
||||
printf("inserting a second break\n");
|
||||
result = mTextEditor->InsertLineBreak();
|
||||
TEST_RESULT(result);
|
||||
mEditor->DebugDumpContent();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult TextEditorTest::TestTextProperties()
|
||||
{
|
||||
nsCOMPtr<nsIDOMDocument>doc;
|
||||
nsresult result = mEditor->GetDocument(getter_AddRefs(doc));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(doc.get());
|
||||
nsCOMPtr<nsIDOMNodeList>nodeList;
|
||||
nsAutoString textTag; textTag.AssignWithConversion("__moz_text");
|
||||
result = doc->GetElementsByTagName(textTag, getter_AddRefs(nodeList));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(nodeList.get());
|
||||
PRUint32 count;
|
||||
nodeList->GetLength(&count);
|
||||
NS_ASSERTION(0!=count, "there are no text nodes in the document!");
|
||||
nsCOMPtr<nsIDOMNode>textNode;
|
||||
result = nodeList->Item(count-1, getter_AddRefs(textNode));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(textNode.get());
|
||||
|
||||
// set the whole text node to bold
|
||||
printf("set the whole first text node to bold\n");
|
||||
nsCOMPtr<nsISelection>selection;
|
||||
result = mEditor->GetSelection(getter_AddRefs(selection));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(selection.get());
|
||||
nsCOMPtr<nsIDOMCharacterData>textData;
|
||||
textData = do_QueryInterface(textNode);
|
||||
PRUint32 length;
|
||||
textData->GetLength(&length);
|
||||
selection->Collapse(textNode, 0);
|
||||
selection->Extend(textNode, length);
|
||||
|
||||
nsCOMPtr<nsIHTMLEditor> htmlEditor (do_QueryInterface(mTextEditor));
|
||||
if (!htmlEditor)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
PRBool any = PR_FALSE;
|
||||
PRBool all = PR_FALSE;
|
||||
PRBool first=PR_FALSE;
|
||||
|
||||
result = htmlEditor->GetInlineProperty(nsIEditProperty::b, nsnull, nsnull, first, any, all);
|
||||
TEST_RESULT(result);
|
||||
NS_ASSERTION(PR_FALSE==first, "first should be false");
|
||||
NS_ASSERTION(PR_FALSE==any, "any should be false");
|
||||
NS_ASSERTION(PR_FALSE==all, "all should be false");
|
||||
result = htmlEditor->SetInlineProperty(nsIEditProperty::b, nsnull, nsnull);
|
||||
TEST_RESULT(result);
|
||||
result = htmlEditor->GetInlineProperty(nsIEditProperty::b, nsnull, nsnull, first, any, all);
|
||||
TEST_RESULT(result);
|
||||
NS_ASSERTION(PR_TRUE==first, "first should be true");
|
||||
NS_ASSERTION(PR_TRUE==any, "any should be true");
|
||||
NS_ASSERTION(PR_TRUE==all, "all should be true");
|
||||
mEditor->DebugDumpContent();
|
||||
|
||||
// remove the bold we just set
|
||||
printf("set the whole first text node to not bold\n");
|
||||
result = htmlEditor->RemoveInlineProperty(nsIEditProperty::b, nsnull);
|
||||
TEST_RESULT(result);
|
||||
result = htmlEditor->GetInlineProperty(nsIEditProperty::b, nsnull, nsnull, first, any, all);
|
||||
TEST_RESULT(result);
|
||||
NS_ASSERTION(PR_FALSE==first, "first should be false");
|
||||
NS_ASSERTION(PR_FALSE==any, "any should be false");
|
||||
NS_ASSERTION(PR_FALSE==all, "all should be false");
|
||||
mEditor->DebugDumpContent();
|
||||
|
||||
// set all but the first and last character to bold
|
||||
printf("set the first text node (1, length-1) to bold and italic, and (2, length-1) to underline.\n");
|
||||
selection->Collapse(textNode, 1);
|
||||
selection->Extend(textNode, length-1);
|
||||
result = htmlEditor->SetInlineProperty(nsIEditProperty::b, nsnull, nsnull);
|
||||
TEST_RESULT(result);
|
||||
result = htmlEditor->GetInlineProperty(nsIEditProperty::b, nsnull, nsnull, first, any, all);
|
||||
TEST_RESULT(result);
|
||||
NS_ASSERTION(PR_TRUE==first, "first should be true");
|
||||
NS_ASSERTION(PR_TRUE==any, "any should be true");
|
||||
NS_ASSERTION(PR_TRUE==all, "all should be true");
|
||||
mEditor->DebugDumpContent();
|
||||
// make all that same text italic
|
||||
result = htmlEditor->SetInlineProperty(nsIEditProperty::i, nsnull, nsnull);
|
||||
TEST_RESULT(result);
|
||||
result = htmlEditor->GetInlineProperty(nsIEditProperty::i, nsnull, nsnull, first, any, all);
|
||||
TEST_RESULT(result);
|
||||
NS_ASSERTION(PR_TRUE==first, "first should be true");
|
||||
NS_ASSERTION(PR_TRUE==any, "any should be true");
|
||||
NS_ASSERTION(PR_TRUE==all, "all should be true");
|
||||
result = htmlEditor->GetInlineProperty(nsIEditProperty::b, nsnull, nsnull, first, any, all);
|
||||
TEST_RESULT(result);
|
||||
NS_ASSERTION(PR_TRUE==first, "first should be true");
|
||||
NS_ASSERTION(PR_TRUE==any, "any should be true");
|
||||
NS_ASSERTION(PR_TRUE==all, "all should be true");
|
||||
mEditor->DebugDumpContent();
|
||||
|
||||
// make all the text underlined, except for the first 2 and last 2 characters
|
||||
result = doc->GetElementsByTagName(textTag, getter_AddRefs(nodeList));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(nodeList.get());
|
||||
nodeList->GetLength(&count);
|
||||
NS_ASSERTION(0!=count, "there are no text nodes in the document!");
|
||||
result = nodeList->Item(count-2, getter_AddRefs(textNode));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(textNode.get());
|
||||
textData = do_QueryInterface(textNode);
|
||||
textData->GetLength(&length);
|
||||
NS_ASSERTION(length==915, "wrong text node");
|
||||
selection->Collapse(textNode, 1);
|
||||
selection->Extend(textNode, length-2);
|
||||
result = htmlEditor->SetInlineProperty(nsIEditProperty::u, nsnull, nsnull);
|
||||
TEST_RESULT(result);
|
||||
result = htmlEditor->GetInlineProperty(nsIEditProperty::u, nsnull, nsnull, first, any, all);
|
||||
TEST_RESULT(result);
|
||||
NS_ASSERTION(PR_TRUE==first, "first should be true");
|
||||
NS_ASSERTION(PR_TRUE==any, "any should be true");
|
||||
NS_ASSERTION(PR_TRUE==all, "all should be true");
|
||||
mEditor->DebugDumpContent();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
5508
mozilla/editor/base/nsEditor.cpp
Normal file
5508
mozilla/editor/base/nsEditor.cpp
Normal file
File diff suppressed because it is too large
Load Diff
5427
mozilla/editor/base/nsEditorShell.cpp
Normal file
5427
mozilla/editor/base/nsEditorShell.cpp
Normal file
File diff suppressed because it is too large
Load Diff
3895
mozilla/editor/base/nsHTMLEditor.cpp
Normal file
3895
mozilla/editor/base/nsHTMLEditor.cpp
Normal file
File diff suppressed because it is too large
Load Diff
5427
mozilla/editor/composer/src/nsEditorShell.cpp
Normal file
5427
mozilla/editor/composer/src/nsEditorShell.cpp
Normal file
File diff suppressed because it is too large
Load Diff
5508
mozilla/editor/libeditor/base/nsEditor.cpp
Normal file
5508
mozilla/editor/libeditor/base/nsEditor.cpp
Normal file
File diff suppressed because it is too large
Load Diff
259
mozilla/editor/libeditor/html/TextEditorTest.cpp
Normal file
259
mozilla/editor/libeditor/html/TextEditorTest.cpp
Normal file
@@ -0,0 +1,259 @@
|
||||
/* -*- Mode: C++ tab-width: 2 indent-tabs-mode: nil c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "nsIEditor.h"
|
||||
#include "nsIHTMLEditor.h"
|
||||
#include "TextEditorTest.h"
|
||||
#include "nsISelection.h"
|
||||
#include "nsIDOMCharacterData.h"
|
||||
#include "nsIDOMDocument.h"
|
||||
#include "nsIDOMNode.h"
|
||||
#include "nsIDOMNodeList.h"
|
||||
#include "nsIEditProperty.h"
|
||||
#include "nsString.h"
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
|
||||
#define TEST_RESULT(r) { if (NS_FAILED(r)) {printf("FAILURE result=%X\n", r); return r; } }
|
||||
#define TEST_POINTER(p) { if (!p) {printf("FAILURE null pointer\n"); return NS_ERROR_NULL_POINTER; } }
|
||||
|
||||
TextEditorTest::TextEditorTest()
|
||||
{
|
||||
printf("constructed a TextEditorTest\n");
|
||||
}
|
||||
|
||||
TextEditorTest::~TextEditorTest()
|
||||
{
|
||||
printf("destroyed a TextEditorTest\n");
|
||||
}
|
||||
|
||||
void TextEditorTest::Run(nsIEditor *aEditor, PRInt32 *outNumTests, PRInt32 *outNumTestsFailed)
|
||||
{
|
||||
if (!aEditor) return;
|
||||
mTextEditor = do_QueryInterface(aEditor);
|
||||
mEditor = do_QueryInterface(aEditor);
|
||||
RunUnitTest(outNumTests, outNumTestsFailed);
|
||||
}
|
||||
|
||||
nsresult TextEditorTest::RunUnitTest(PRInt32 *outNumTests, PRInt32 *outNumTestsFailed)
|
||||
{
|
||||
nsresult result;
|
||||
|
||||
if (!outNumTests || !outNumTestsFailed)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*outNumTests = 0;
|
||||
*outNumTestsFailed = 0;
|
||||
|
||||
result = InitDoc();
|
||||
TEST_RESULT(result);
|
||||
// shouldn't we just bail on error here?
|
||||
|
||||
// insert some simple text
|
||||
result = mTextEditor->InsertText(NS_LITERAL_STRING("1234567890abcdefghij1234567890").get());
|
||||
TEST_RESULT(result);
|
||||
(*outNumTests)++;
|
||||
(*outNumTestsFailed) += (NS_FAILED(result) != NS_OK);
|
||||
|
||||
// insert some more text
|
||||
result = mTextEditor->InsertText(NS_LITERAL_STRING("Moreover, I am cognizant of the interrelatedness of all communities and states. I cannot sit idly by in Atlanta and not be concerned about what happens in Birmingham. Injustice anywhere is a threat to justice everywhere").get());
|
||||
TEST_RESULT(result);
|
||||
(*outNumTests)++;
|
||||
(*outNumTestsFailed) += (NS_FAILED(result) != NS_OK);
|
||||
|
||||
result = TestInsertBreak();
|
||||
TEST_RESULT(result);
|
||||
(*outNumTests)++;
|
||||
(*outNumTestsFailed) += (NS_FAILED(result) != NS_OK);
|
||||
|
||||
result = TestTextProperties();
|
||||
TEST_RESULT(result);
|
||||
(*outNumTests)++;
|
||||
(*outNumTestsFailed) += (NS_FAILED(result) != NS_OK);
|
||||
|
||||
// get us back to the original document
|
||||
result = mEditor->Undo(12);
|
||||
TEST_RESULT(result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult TextEditorTest::InitDoc()
|
||||
{
|
||||
nsresult result = mEditor->SelectAll();
|
||||
TEST_RESULT(result);
|
||||
result = mEditor->DeleteSelection(nsIEditor::eNext);
|
||||
TEST_RESULT(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult TextEditorTest::TestInsertBreak()
|
||||
{
|
||||
nsCOMPtr<nsISelection>selection;
|
||||
nsresult result = mEditor->GetSelection(getter_AddRefs(selection));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(selection.get());
|
||||
nsCOMPtr<nsIDOMNode>anchor;
|
||||
result = selection->GetAnchorNode(getter_AddRefs(anchor));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(anchor.get());
|
||||
selection->Collapse(anchor, 0);
|
||||
// insert one break
|
||||
printf("inserting a break\n");
|
||||
result = mTextEditor->InsertLineBreak();
|
||||
TEST_RESULT(result);
|
||||
mEditor->DebugDumpContent();
|
||||
|
||||
// insert a second break adjacent to the first
|
||||
printf("inserting a second break\n");
|
||||
result = mTextEditor->InsertLineBreak();
|
||||
TEST_RESULT(result);
|
||||
mEditor->DebugDumpContent();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult TextEditorTest::TestTextProperties()
|
||||
{
|
||||
nsCOMPtr<nsIDOMDocument>doc;
|
||||
nsresult result = mEditor->GetDocument(getter_AddRefs(doc));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(doc.get());
|
||||
nsCOMPtr<nsIDOMNodeList>nodeList;
|
||||
nsAutoString textTag; textTag.AssignWithConversion("__moz_text");
|
||||
result = doc->GetElementsByTagName(textTag, getter_AddRefs(nodeList));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(nodeList.get());
|
||||
PRUint32 count;
|
||||
nodeList->GetLength(&count);
|
||||
NS_ASSERTION(0!=count, "there are no text nodes in the document!");
|
||||
nsCOMPtr<nsIDOMNode>textNode;
|
||||
result = nodeList->Item(count-1, getter_AddRefs(textNode));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(textNode.get());
|
||||
|
||||
// set the whole text node to bold
|
||||
printf("set the whole first text node to bold\n");
|
||||
nsCOMPtr<nsISelection>selection;
|
||||
result = mEditor->GetSelection(getter_AddRefs(selection));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(selection.get());
|
||||
nsCOMPtr<nsIDOMCharacterData>textData;
|
||||
textData = do_QueryInterface(textNode);
|
||||
PRUint32 length;
|
||||
textData->GetLength(&length);
|
||||
selection->Collapse(textNode, 0);
|
||||
selection->Extend(textNode, length);
|
||||
|
||||
nsCOMPtr<nsIHTMLEditor> htmlEditor (do_QueryInterface(mTextEditor));
|
||||
if (!htmlEditor)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
PRBool any = PR_FALSE;
|
||||
PRBool all = PR_FALSE;
|
||||
PRBool first=PR_FALSE;
|
||||
|
||||
result = htmlEditor->GetInlineProperty(nsIEditProperty::b, nsnull, nsnull, first, any, all);
|
||||
TEST_RESULT(result);
|
||||
NS_ASSERTION(PR_FALSE==first, "first should be false");
|
||||
NS_ASSERTION(PR_FALSE==any, "any should be false");
|
||||
NS_ASSERTION(PR_FALSE==all, "all should be false");
|
||||
result = htmlEditor->SetInlineProperty(nsIEditProperty::b, nsnull, nsnull);
|
||||
TEST_RESULT(result);
|
||||
result = htmlEditor->GetInlineProperty(nsIEditProperty::b, nsnull, nsnull, first, any, all);
|
||||
TEST_RESULT(result);
|
||||
NS_ASSERTION(PR_TRUE==first, "first should be true");
|
||||
NS_ASSERTION(PR_TRUE==any, "any should be true");
|
||||
NS_ASSERTION(PR_TRUE==all, "all should be true");
|
||||
mEditor->DebugDumpContent();
|
||||
|
||||
// remove the bold we just set
|
||||
printf("set the whole first text node to not bold\n");
|
||||
result = htmlEditor->RemoveInlineProperty(nsIEditProperty::b, nsnull);
|
||||
TEST_RESULT(result);
|
||||
result = htmlEditor->GetInlineProperty(nsIEditProperty::b, nsnull, nsnull, first, any, all);
|
||||
TEST_RESULT(result);
|
||||
NS_ASSERTION(PR_FALSE==first, "first should be false");
|
||||
NS_ASSERTION(PR_FALSE==any, "any should be false");
|
||||
NS_ASSERTION(PR_FALSE==all, "all should be false");
|
||||
mEditor->DebugDumpContent();
|
||||
|
||||
// set all but the first and last character to bold
|
||||
printf("set the first text node (1, length-1) to bold and italic, and (2, length-1) to underline.\n");
|
||||
selection->Collapse(textNode, 1);
|
||||
selection->Extend(textNode, length-1);
|
||||
result = htmlEditor->SetInlineProperty(nsIEditProperty::b, nsnull, nsnull);
|
||||
TEST_RESULT(result);
|
||||
result = htmlEditor->GetInlineProperty(nsIEditProperty::b, nsnull, nsnull, first, any, all);
|
||||
TEST_RESULT(result);
|
||||
NS_ASSERTION(PR_TRUE==first, "first should be true");
|
||||
NS_ASSERTION(PR_TRUE==any, "any should be true");
|
||||
NS_ASSERTION(PR_TRUE==all, "all should be true");
|
||||
mEditor->DebugDumpContent();
|
||||
// make all that same text italic
|
||||
result = htmlEditor->SetInlineProperty(nsIEditProperty::i, nsnull, nsnull);
|
||||
TEST_RESULT(result);
|
||||
result = htmlEditor->GetInlineProperty(nsIEditProperty::i, nsnull, nsnull, first, any, all);
|
||||
TEST_RESULT(result);
|
||||
NS_ASSERTION(PR_TRUE==first, "first should be true");
|
||||
NS_ASSERTION(PR_TRUE==any, "any should be true");
|
||||
NS_ASSERTION(PR_TRUE==all, "all should be true");
|
||||
result = htmlEditor->GetInlineProperty(nsIEditProperty::b, nsnull, nsnull, first, any, all);
|
||||
TEST_RESULT(result);
|
||||
NS_ASSERTION(PR_TRUE==first, "first should be true");
|
||||
NS_ASSERTION(PR_TRUE==any, "any should be true");
|
||||
NS_ASSERTION(PR_TRUE==all, "all should be true");
|
||||
mEditor->DebugDumpContent();
|
||||
|
||||
// make all the text underlined, except for the first 2 and last 2 characters
|
||||
result = doc->GetElementsByTagName(textTag, getter_AddRefs(nodeList));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(nodeList.get());
|
||||
nodeList->GetLength(&count);
|
||||
NS_ASSERTION(0!=count, "there are no text nodes in the document!");
|
||||
result = nodeList->Item(count-2, getter_AddRefs(textNode));
|
||||
TEST_RESULT(result);
|
||||
TEST_POINTER(textNode.get());
|
||||
textData = do_QueryInterface(textNode);
|
||||
textData->GetLength(&length);
|
||||
NS_ASSERTION(length==915, "wrong text node");
|
||||
selection->Collapse(textNode, 1);
|
||||
selection->Extend(textNode, length-2);
|
||||
result = htmlEditor->SetInlineProperty(nsIEditProperty::u, nsnull, nsnull);
|
||||
TEST_RESULT(result);
|
||||
result = htmlEditor->GetInlineProperty(nsIEditProperty::u, nsnull, nsnull, first, any, all);
|
||||
TEST_RESULT(result);
|
||||
NS_ASSERTION(PR_TRUE==first, "first should be true");
|
||||
NS_ASSERTION(PR_TRUE==any, "any should be true");
|
||||
NS_ASSERTION(PR_TRUE==all, "all should be true");
|
||||
mEditor->DebugDumpContent();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
3895
mozilla/editor/libeditor/html/nsHTMLEditor.cpp
Normal file
3895
mozilla/editor/libeditor/html/nsHTMLEditor.cpp
Normal file
File diff suppressed because it is too large
Load Diff
423
mozilla/embedding/browser/powerplant/source/CProfileManager.cpp
Executable file
423
mozilla/embedding/browser/powerplant/source/CProfileManager.cpp
Executable file
@@ -0,0 +1,423 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* 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 Mozilla browser.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications, Inc. Portions created by Netscape are
|
||||
* Copyright (C) 1999, Mozilla. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Conrad Carlen <ccarlen@netscape.com>
|
||||
*/
|
||||
|
||||
// PPBrowser
|
||||
#include "CProfileManager.h"
|
||||
#include "ApplIDs.h"
|
||||
#include "UMacUnicode.h"
|
||||
|
||||
// PowerPlant
|
||||
#include <LEditText.h>
|
||||
#include <LTextTableView.h>
|
||||
#include <LPushButton.h>
|
||||
#include <LTableMonoGeometry.h>
|
||||
#include <LTableArrayStorage.h>
|
||||
#include <LTableSingleSelector.h>
|
||||
#include <LCheckBox.h>
|
||||
|
||||
|
||||
// Mozilla
|
||||
#include "nsIProfile.h"
|
||||
#include "nsIDirectoryService.h"
|
||||
#include "nsDirectoryServiceDefs.h"
|
||||
#include "nsAppDirectoryServiceDefs.h"
|
||||
#include "nsIObserverService.h"
|
||||
#include "nsXPIDLString.h"
|
||||
#include "nsIRegistry.h"
|
||||
|
||||
// Constants
|
||||
|
||||
const MessageT msg_OnNewProfile = 2000;
|
||||
const MessageT msg_OnDeleteProfile = 2001;
|
||||
const MessageT msg_OnRenameProfile = 2002;
|
||||
|
||||
#define kRegistryGlobalPrefsSubtreeString (NS_LITERAL_STRING("global-prefs"))
|
||||
#define kRegistryShowProfilesAtStartup "start-show-dialog"
|
||||
|
||||
//*****************************************************************************
|
||||
//*** CProfileManager
|
||||
//*****************************************************************************
|
||||
|
||||
CProfileManager::CProfileManager() :
|
||||
LAttachment(msg_AnyMessage,true)
|
||||
{
|
||||
}
|
||||
|
||||
CProfileManager::~CProfileManager()
|
||||
{
|
||||
}
|
||||
|
||||
void CProfileManager::StartUp()
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
NS_WITH_SERVICE(nsIProfile, profileService, NS_PROFILE_CONTRACTID, &rv);
|
||||
ThrowIfNil_(profileService);
|
||||
|
||||
PRInt32 profileCount;
|
||||
rv = profileService->GetProfileCount(&profileCount);
|
||||
ThrowIfError_(rv);
|
||||
if (profileCount == 0)
|
||||
{
|
||||
// Make a new default profile
|
||||
NS_NAMED_LITERAL_STRING(newProfileName, "default");
|
||||
|
||||
rv = profileService->CreateNewProfile(newProfileName.get(), nsnull, nsnull, PR_FALSE);
|
||||
ThrowIfError_(rv);
|
||||
rv = profileService->SetCurrentProfile(newProfileName.get());
|
||||
ThrowIfError_(rv);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Use our flag here to check for whether to show profile mgr UI. If the flag
|
||||
// says don't show it, just start with the last used profile.
|
||||
|
||||
PRBool showIt;
|
||||
rv = GetShowDialogOnStart(&showIt);
|
||||
|
||||
if (NS_FAILED(rv) || (profileCount > 1 && showIt))
|
||||
{
|
||||
DoManageProfilesDialog();
|
||||
}
|
||||
else
|
||||
{
|
||||
// GetCurrentProfile returns the profile which was last used but is not nescesarily
|
||||
// active. Call SetCurrentProfile to make it installed and active.
|
||||
|
||||
nsXPIDLString currProfileName;
|
||||
rv = profileService->GetCurrentProfile(getter_Copies(currProfileName));
|
||||
ThrowIfError_(rv);
|
||||
rv = profileService->SetCurrentProfile(currProfileName);
|
||||
ThrowIfError_(rv);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Boolean CProfileManager::DoNewProfileDialog(char *outName, UInt32 bufSize)
|
||||
{
|
||||
Boolean confirmed;
|
||||
StDialogHandler theHandler(dlog_NewProfile, LCommander::GetTopCommander());
|
||||
LWindow *theDialog = theHandler.GetDialog();
|
||||
|
||||
ThrowIfNil_(theDialog);
|
||||
LEditText *responseText = dynamic_cast<LEditText*>(theDialog->FindPaneByID('Name'));
|
||||
ThrowIfNil_(responseText);
|
||||
theDialog->SetLatentSub(responseText);
|
||||
|
||||
theDialog->Show();
|
||||
theDialog->Select();
|
||||
|
||||
while (true) // This is our modal dialog event loop
|
||||
{
|
||||
MessageT hitMessage = theHandler.DoDialog();
|
||||
|
||||
if (hitMessage == msg_OK)
|
||||
{
|
||||
Str255 pStr;
|
||||
UInt32 outLen;
|
||||
|
||||
responseText->GetDescriptor(pStr);
|
||||
outLen = pStr[0] >= bufSize ? bufSize - 1 : pStr[0];
|
||||
memcpy(outName, &pStr[1], outLen);
|
||||
outName[outLen] = '\0';
|
||||
confirmed = PR_TRUE;
|
||||
break;
|
||||
}
|
||||
else if (hitMessage == msg_Cancel)
|
||||
{
|
||||
confirmed = PR_FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return confirmed;
|
||||
}
|
||||
|
||||
|
||||
void CProfileManager::DoManageProfilesDialog()
|
||||
{
|
||||
nsresult rv;
|
||||
StDialogHandler theHandler(dlog_ManageProfiles, LCommander::GetTopCommander());
|
||||
LWindow *theDialog = theHandler.GetDialog();
|
||||
|
||||
NS_WITH_SERVICE(nsIProfile, profileService, NS_PROFILE_CONTRACTID, &rv);
|
||||
ThrowIfNil_(profileService);
|
||||
|
||||
// Set up the dialog by filling the list of current profiles
|
||||
LTextTableView *table = (LTextTableView*) theDialog->FindPaneByID('List');
|
||||
ThrowIfNil_(table);
|
||||
LPushButton *deleteButton = (LPushButton *) theDialog->FindPaneByID('Dele');
|
||||
ThrowIfNil_(deleteButton);
|
||||
|
||||
//Str255 pascalStr;
|
||||
nsAutoString unicodeStr;
|
||||
nsCAutoString cStr;
|
||||
char dataBuf[256];
|
||||
UInt32 dataSize;
|
||||
|
||||
// PowerPlant stuff to set up the list view
|
||||
STableCell selectedCell(1, 1);
|
||||
SDimension16 tableSize;
|
||||
TableIndexT rows, cols;
|
||||
|
||||
table->GetFrameSize(tableSize);
|
||||
table->SetTableGeometry(new LTableMonoGeometry(table, tableSize.width, 16));
|
||||
table->SetTableStorage(new LTableArrayStorage(table, 0UL));
|
||||
table->SetTableSelector(new LTableSingleSelector(table));
|
||||
table->InsertCols(1, 0);
|
||||
|
||||
// Get the name of the current profile so we can select it
|
||||
nsXPIDLString currProfileName;
|
||||
profileService->GetCurrentProfile(getter_Copies(currProfileName));
|
||||
|
||||
// Get the list of profile names and add them to the list
|
||||
PRUint32 listLen;
|
||||
PRUnichar **profileList;
|
||||
rv = profileService->GetProfileList(&listLen, &profileList);
|
||||
ThrowIfError_(rv);
|
||||
|
||||
for (PRUint32 index = 0; index < listLen; index++)
|
||||
{
|
||||
CPlatformUCSConversion::GetInstance()->UCSToPlatform(nsLiteralString(profileList[index]), cStr);
|
||||
table->InsertRows(1, LONG_MAX, cStr.get(), cStr.Length(), true);
|
||||
|
||||
if (nsCRT::strcmp(profileList[index], currProfileName.get()) == 0)
|
||||
selectedCell.row = index + 1;
|
||||
}
|
||||
|
||||
PRInt32 numProfiles;
|
||||
rv = profileService->GetProfileCount(&numProfiles);
|
||||
ThrowIfError_(rv);
|
||||
(numProfiles > 1) ? deleteButton->Enable() : deleteButton->Disable();
|
||||
table->SelectCell(selectedCell);
|
||||
|
||||
|
||||
// Handle the "Ask At StartUp" checkbox
|
||||
LCheckBox *showAtStartCheck = (LCheckBox*) theDialog->FindPaneByID('Show');
|
||||
ThrowIfNil_(showAtStartCheck);
|
||||
PRBool showIt;
|
||||
rv = GetShowDialogOnStart(&showIt);
|
||||
if (NS_FAILED(rv))
|
||||
showIt = PR_TRUE;
|
||||
showAtStartCheck->SetValue(showIt);
|
||||
|
||||
|
||||
theDialog->Show();
|
||||
theDialog->Select();
|
||||
|
||||
while (true) // This is our modal dialog event loop
|
||||
{
|
||||
MessageT hitMessage = theHandler.DoDialog();
|
||||
|
||||
if (hitMessage == msg_OK)
|
||||
{
|
||||
theDialog->Hide();
|
||||
SetShowDialogOnStart(showAtStartCheck->GetValue());
|
||||
selectedCell = table->GetFirstSelectedCell();
|
||||
if (selectedCell.row > 0)
|
||||
{
|
||||
dataSize = sizeof(dataBuf) - 1;
|
||||
table->GetCellData(selectedCell, dataBuf, dataSize);
|
||||
dataBuf[dataSize] = '\0';
|
||||
CPlatformUCSConversion::GetInstance()->PlatformToUCS(nsLiteralCString(dataBuf), unicodeStr);
|
||||
rv = profileService->SetCurrentProfile(unicodeStr.GetUnicode());
|
||||
}
|
||||
break;
|
||||
}
|
||||
else if (hitMessage == msg_Cancel)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if (hitMessage == msg_OnNewProfile)
|
||||
{
|
||||
if (DoNewProfileDialog(dataBuf, sizeof(dataBuf)))
|
||||
{
|
||||
CPlatformUCSConversion::GetInstance()->PlatformToUCS(nsLiteralCString(dataBuf), unicodeStr);
|
||||
rv = profileService->CreateNewProfile(unicodeStr.GetUnicode(), nsnull, nsnull, PR_FALSE);
|
||||
if (NS_FAILED(rv))
|
||||
break;
|
||||
|
||||
table->InsertRows(1, LONG_MAX, dataBuf, strlen(dataBuf), true);
|
||||
table->GetTableSize(rows, cols);
|
||||
table->SelectCell(STableCell(rows, cols));
|
||||
|
||||
rv = profileService->GetProfileCount(&numProfiles);
|
||||
(NS_SUCCEEDED(rv) && numProfiles > 1) ? deleteButton->Enable() : deleteButton->Disable();
|
||||
}
|
||||
}
|
||||
else if (hitMessage == msg_OnDeleteProfile)
|
||||
{
|
||||
selectedCell = table->GetFirstSelectedCell();
|
||||
if (selectedCell.row > 0)
|
||||
{
|
||||
dataSize = sizeof(dataBuf) - 1;
|
||||
table->GetCellData(selectedCell, dataBuf, dataSize);
|
||||
dataBuf[dataSize] = '\0';
|
||||
CPlatformUCSConversion::GetInstance()->PlatformToUCS(nsLiteralCString(dataBuf), unicodeStr);
|
||||
|
||||
rv = profileService->DeleteProfile(unicodeStr.GetUnicode(), PR_TRUE);
|
||||
if (NS_FAILED(rv))
|
||||
break;
|
||||
|
||||
table->RemoveRows(1, selectedCell.row, true);
|
||||
table->GetTableSize(rows, cols);
|
||||
if (selectedCell.row >= rows)
|
||||
selectedCell.row = rows - 1;
|
||||
table->SelectCell(selectedCell);
|
||||
|
||||
rv = profileService->GetProfileCount(&numProfiles);
|
||||
(NS_SUCCEEDED(rv) && numProfiles > 1) ? deleteButton->Enable() : deleteButton->Disable();
|
||||
}
|
||||
}
|
||||
else if (hitMessage == msg_OnRenameProfile)
|
||||
{
|
||||
nsAutoString oldName;
|
||||
|
||||
selectedCell = table->GetFirstSelectedCell();
|
||||
dataSize = sizeof(dataBuf) - 1;
|
||||
table->GetCellData(selectedCell, dataBuf, dataSize);
|
||||
dataBuf[dataSize] = '\0';
|
||||
CPlatformUCSConversion::GetInstance()->PlatformToUCS(nsLiteralCString(dataBuf), oldName);
|
||||
|
||||
if (DoNewProfileDialog(dataBuf, sizeof(dataBuf)))
|
||||
{
|
||||
CPlatformUCSConversion::GetInstance()->PlatformToUCS(nsLiteralCString(dataBuf), unicodeStr);
|
||||
profileService->RenameProfile(oldName.GetUnicode(), unicodeStr.GetUnicode());
|
||||
table->SetCellData(selectedCell, dataBuf, strlen(dataBuf));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
The following three methods have nothing to do with profile management per se.
|
||||
They use the registry to store a flag which allows the user to choose whether
|
||||
to show the profile manager dialog at startup. After all, since we can switch
|
||||
it at any time - why must we deal with the dialog every time we start the app?
|
||||
*/
|
||||
|
||||
nsresult CProfileManager::GetShowDialogOnStart(PRBool* showIt)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
*showIt = PR_TRUE;
|
||||
|
||||
nsCOMPtr<nsIRegistry> registry;
|
||||
rv = OpenAppRegistry(getter_AddRefs(registry));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
nsRegistryKey profilesTreeKey;
|
||||
|
||||
rv = registry->GetKey(nsIRegistry::Common,
|
||||
kRegistryGlobalPrefsSubtreeString.get(),
|
||||
&profilesTreeKey);
|
||||
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
PRInt32 flagValue;
|
||||
rv = registry->GetInt(profilesTreeKey,
|
||||
kRegistryShowProfilesAtStartup,
|
||||
&flagValue);
|
||||
|
||||
if (NS_SUCCEEDED(rv))
|
||||
*showIt = (flagValue != 0);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult CProfileManager::SetShowDialogOnStart(PRBool showIt)
|
||||
{
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
nsCOMPtr<nsIRegistry> registry;
|
||||
rv = OpenAppRegistry(getter_AddRefs(registry));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
nsRegistryKey profilesTreeKey;
|
||||
|
||||
rv = registry->GetKey(nsIRegistry::Common,
|
||||
kRegistryGlobalPrefsSubtreeString.get(),
|
||||
&profilesTreeKey);
|
||||
|
||||
if (NS_FAILED(rv))
|
||||
{
|
||||
rv = registry->AddKey(nsIRegistry::Common,
|
||||
kRegistryGlobalPrefsSubtreeString.get(),
|
||||
&profilesTreeKey);
|
||||
}
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
|
||||
rv = registry->SetInt(profilesTreeKey,
|
||||
kRegistryShowProfilesAtStartup,
|
||||
showIt);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
nsresult CProfileManager::OpenAppRegistry(nsIRegistry **aRegistry)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aRegistry);
|
||||
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIFile> regFile;
|
||||
nsXPIDLCString regFilePath;
|
||||
|
||||
rv = NS_GetSpecialDirectory(NS_APP_APPLICATION_REGISTRY_FILE, getter_AddRefs(regFile));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
rv = regFile->GetPath(getter_Copies(regFilePath));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
nsCOMPtr<nsIRegistry> registry(do_CreateInstance(NS_REGISTRY_CONTRACTID, &rv));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
rv = registry->Open(regFilePath);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
*aRegistry = registry;
|
||||
NS_IF_ADDREF(*aRegistry);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
//*****************************************************************************
|
||||
//*** CProfileManager::LAttachment
|
||||
//*****************************************************************************
|
||||
|
||||
void CProfileManager::ExecuteSelf(MessageT inMessage, void *ioParam)
|
||||
{
|
||||
mExecuteHost = true;
|
||||
// update status
|
||||
if (inMessage == msg_CommandStatus) {
|
||||
SCommandStatus *status = (SCommandStatus *)ioParam;
|
||||
if (status->command == cmd_ManageProfiles) {
|
||||
*status->enabled = true;
|
||||
*status->usesMark = false;
|
||||
mExecuteHost = false; // we handled it
|
||||
}
|
||||
}
|
||||
else if (inMessage == cmd_ManageProfiles) {
|
||||
DoManageProfilesDialog();
|
||||
mExecuteHost = false; // we handled it
|
||||
}
|
||||
}
|
||||
1508
mozilla/embedding/components/windowwatcher/src/nsWindowWatcher.cpp
Normal file
1508
mozilla/embedding/components/windowwatcher/src/nsWindowWatcher.cpp
Normal file
File diff suppressed because it is too large
Load Diff
4017
mozilla/extensions/wallet/src/wallet.cpp
Normal file
4017
mozilla/extensions/wallet/src/wallet.cpp
Normal file
File diff suppressed because it is too large
Load Diff
1330
mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp
Normal file
1330
mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp
Normal file
File diff suppressed because it is too large
Load Diff
1034
mozilla/htmlparser/src/nsHTMLTokenizer.cpp
Normal file
1034
mozilla/htmlparser/src/nsHTMLTokenizer.cpp
Normal file
File diff suppressed because it is too large
Load Diff
789
mozilla/htmlparser/src/nsLoggingSink.cpp
Normal file
789
mozilla/htmlparser/src/nsLoggingSink.cpp
Normal file
@@ -0,0 +1,789 @@
|
||||
/* -*- Mode: C++; tab-width: 2; 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 Communicator client 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.
|
||||
*
|
||||
* Notes:
|
||||
* The logging sink is now both a sink and a proxy.
|
||||
* If you want to dump the calls from the parser to the sink,
|
||||
* create a content sink as usual and hand it to the parser.
|
||||
*
|
||||
* If you want to use a normal sink AND simultaneously have a
|
||||
* parse-log generated, you can set an environment variable
|
||||
* and a logging sink will be created. It will act as a proxy
|
||||
* to the REAL sink you are using after it logs the call. This
|
||||
* form of the loggingsink is constructed using the version
|
||||
* that accepts an nsIHTMLContentSink*.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
#include "nsLoggingSink.h"
|
||||
#include "nsHTMLTags.h"
|
||||
#include "nsString.h"
|
||||
#include "prprf.h"
|
||||
|
||||
static NS_DEFINE_IID(kIContentSinkIID, NS_ICONTENT_SINK_IID);
|
||||
static NS_DEFINE_IID(kIHTMLContentSinkIID, NS_IHTML_CONTENT_SINK_IID);
|
||||
static NS_DEFINE_IID(kILoggingSinkIID, NS_ILOGGING_SINK_IID);
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
|
||||
// list of tags that have skipped content
|
||||
static char gSkippedContentTags[] = {
|
||||
eHTMLTag_style,
|
||||
eHTMLTag_script,
|
||||
eHTMLTag_server,
|
||||
eHTMLTag_textarea,
|
||||
eHTMLTag_title,
|
||||
0
|
||||
};
|
||||
|
||||
|
||||
nsresult
|
||||
NS_NewHTMLLoggingSink(nsIContentSink** aInstancePtrResult)
|
||||
{
|
||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
||||
if (nsnull == aInstancePtrResult) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
nsLoggingSink* it = new nsLoggingSink();
|
||||
if (nsnull == it) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return it->QueryInterface(kIContentSinkIID, (void**) aInstancePtrResult);
|
||||
}
|
||||
|
||||
nsLoggingSink::nsLoggingSink() {
|
||||
NS_INIT_REFCNT();
|
||||
mOutput = 0;
|
||||
mLevel=-1;
|
||||
mSink=0;
|
||||
}
|
||||
|
||||
nsLoggingSink::~nsLoggingSink() {
|
||||
mSink=0;
|
||||
if(mOutput && mAutoDeleteOutput) {
|
||||
delete mOutput;
|
||||
}
|
||||
mOutput=0;
|
||||
}
|
||||
|
||||
NS_IMPL_ADDREF(nsLoggingSink)
|
||||
NS_IMPL_RELEASE(nsLoggingSink)
|
||||
|
||||
nsresult
|
||||
nsLoggingSink::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
||||
{
|
||||
NS_PRECONDITION(nsnull != aInstancePtr, "null ptr");
|
||||
if (nsnull == aInstancePtr) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
nsISupports* tmp = this;
|
||||
*aInstancePtr = (void*) tmp;
|
||||
}
|
||||
else if (aIID.Equals(kIContentSinkIID)) {
|
||||
nsIContentSink* tmp = this;
|
||||
*aInstancePtr = (void*) tmp;
|
||||
}
|
||||
else if (aIID.Equals(kIHTMLContentSinkIID)) {
|
||||
nsIHTMLContentSink* tmp = this;
|
||||
*aInstancePtr = (void*) tmp;
|
||||
}
|
||||
else if (aIID.Equals(kILoggingSinkIID)) {
|
||||
nsILoggingSink* tmp = this;
|
||||
*aInstancePtr = (void*) tmp;
|
||||
}
|
||||
else {
|
||||
*aInstancePtr = nsnull;
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
NS_ADDREF(this);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::SetOutputStream(PRFileDesc *aStream,PRBool autoDeleteOutput) {
|
||||
mOutput = aStream;
|
||||
mAutoDeleteOutput=autoDeleteOutput;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
static
|
||||
void WriteTabs(PRFileDesc * out,int aTabCount) {
|
||||
int tabs;
|
||||
for(tabs=0;tabs<aTabCount;tabs++)
|
||||
PR_fprintf(out, " ");
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::WillBuildModel() {
|
||||
|
||||
WriteTabs(mOutput,++mLevel);
|
||||
PR_fprintf(mOutput, "<begin>\n");
|
||||
|
||||
//proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
mSink->WillBuildModel();
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::DidBuildModel(PRInt32 aQualityLevel) {
|
||||
|
||||
WriteTabs(mOutput,--mLevel);
|
||||
PR_fprintf(mOutput, "</begin>\n");
|
||||
|
||||
//proxy the call to the real sink if you have one.
|
||||
nsresult theResult=NS_OK;
|
||||
if(mSink) {
|
||||
theResult=mSink->DidBuildModel(aQualityLevel);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::WillInterrupt() {
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->WillInterrupt();
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::WillResume() {
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->WillResume();
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::SetParser(nsIParser* aParser) {
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->SetParser(aParser);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::OpenContainer(const nsIParserNode& aNode) {
|
||||
|
||||
OpenNode("container", aNode); //do the real logging work...
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->OpenContainer(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::CloseContainer(const nsIParserNode& aNode) {
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
nsHTMLTag nodeType = nsHTMLTag(aNode.GetNodeType());
|
||||
if ((nodeType >= eHTMLTag_unknown) &&
|
||||
(nodeType <= nsHTMLTag(NS_HTML_TAG_MAX))) {
|
||||
const char* tag = nsHTMLTags::GetStringValue(nodeType);
|
||||
theResult=CloseNode(tag);
|
||||
}
|
||||
else theResult= CloseNode("???");
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->CloseContainer(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::AddLeaf(const nsIParserNode& aNode) {
|
||||
LeafNode(aNode);
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->AddLeaf(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::NotifyError(const nsParserError* aError) {
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->NotifyError(aError);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This gets called by the parser when you want to add
|
||||
* a PI node to the current container in the content
|
||||
* model.
|
||||
*
|
||||
* @updated gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::AddProcessingInstruction(const nsIParserNode& aNode){
|
||||
|
||||
#ifdef VERBOSE_DEBUG
|
||||
DebugDump("<",aNode.GetText(),(mNodeStackPos)*2);
|
||||
#endif
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->AddProcessingInstruction(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
/**
|
||||
* This gets called by the parser when it encounters
|
||||
* a DOCTYPE declaration in the HTML document.
|
||||
*/
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::AddDocTypeDecl(const nsIParserNode& aNode, PRInt32 aMode) {
|
||||
|
||||
#ifdef VERBOSE_DEBUG
|
||||
DebugDump("<",aNode.GetText(),(mNodeStackPos)*2);
|
||||
#endif
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->AddDocTypeDecl(aNode,aMode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This gets called by the parser when you want to add
|
||||
* a comment node to the current container in the content
|
||||
* model.
|
||||
*
|
||||
* @updated gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::AddComment(const nsIParserNode& aNode){
|
||||
|
||||
#ifdef VERBOSE_DEBUG
|
||||
DebugDump("<",aNode.GetText(),(mNodeStackPos)*2);
|
||||
#endif
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->AddComment(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::SetTitle(const nsString& aValue) {
|
||||
|
||||
char* tmp;
|
||||
GetNewCString(aValue, &tmp);
|
||||
WriteTabs(mOutput,++mLevel);
|
||||
if(tmp) {
|
||||
PR_fprintf(mOutput, "<title value=\"%s\"/>\n", tmp);
|
||||
nsMemory::Free(tmp);
|
||||
}
|
||||
--mLevel;
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->SetTitle(aValue);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::OpenHTML(const nsIParserNode& aNode) {
|
||||
OpenNode("html", aNode);
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->OpenHTML(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::CloseHTML(const nsIParserNode& aNode) {
|
||||
CloseNode("html");
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->CloseHTML(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::OpenHead(const nsIParserNode& aNode) {
|
||||
OpenNode("head", aNode);
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->OpenHead(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::CloseHead(const nsIParserNode& aNode) {
|
||||
CloseNode("head");
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->CloseHead(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::OpenBody(const nsIParserNode& aNode) {
|
||||
OpenNode("body", aNode);
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->OpenBody(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::CloseBody(const nsIParserNode& aNode) {
|
||||
CloseNode("body");
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->CloseBody(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::OpenForm(const nsIParserNode& aNode) {
|
||||
OpenNode("form", aNode);
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->OpenForm(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::CloseForm(const nsIParserNode& aNode) {
|
||||
CloseNode("form");
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->CloseForm(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::OpenMap(const nsIParserNode& aNode) {
|
||||
OpenNode("map", aNode);
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->OpenMap(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::CloseMap(const nsIParserNode& aNode) {
|
||||
CloseNode("map");
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->CloseMap(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::OpenFrameset(const nsIParserNode& aNode) {
|
||||
OpenNode("frameset", aNode);
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->OpenFrameset(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::CloseFrameset(const nsIParserNode& aNode) {
|
||||
CloseNode("frameset");
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->CloseFrameset(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
|
||||
nsresult
|
||||
nsLoggingSink::OpenNode(const char* aKind, const nsIParserNode& aNode) {
|
||||
WriteTabs(mOutput,++mLevel);
|
||||
|
||||
PR_fprintf(mOutput,"<open container=");
|
||||
|
||||
nsHTMLTag nodeType = nsHTMLTag(aNode.GetNodeType());
|
||||
if ((nodeType >= eHTMLTag_unknown) &&
|
||||
(nodeType <= nsHTMLTag(NS_HTML_TAG_MAX))) {
|
||||
const char* tag = nsHTMLTags::GetStringValue(nodeType);
|
||||
PR_fprintf(mOutput, "\"%s\"", tag);
|
||||
}
|
||||
else {
|
||||
char* text;
|
||||
GetNewCString(aNode.GetText(), &text);
|
||||
if(text) {
|
||||
PR_fprintf(mOutput, "\"%s\"", text);
|
||||
nsMemory::Free(text);
|
||||
}
|
||||
}
|
||||
|
||||
if (WillWriteAttributes(aNode)) {
|
||||
PR_fprintf(mOutput, ">\n");
|
||||
WriteAttributes(aNode);
|
||||
PR_fprintf(mOutput, "</open>\n");
|
||||
}
|
||||
else {
|
||||
PR_fprintf(mOutput, ">\n");
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsLoggingSink::CloseNode(const char* aKind) {
|
||||
WriteTabs(mOutput,mLevel--);
|
||||
PR_fprintf(mOutput, "<close container=\"%s\">\n", aKind);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
nsresult
|
||||
nsLoggingSink::WriteAttributes(const nsIParserNode& aNode) {
|
||||
|
||||
WriteTabs(mOutput,1+mLevel);
|
||||
nsAutoString tmp;
|
||||
PRInt32 ac = aNode.GetAttributeCount();
|
||||
for (PRInt32 i = 0; i < ac; i++) {
|
||||
char* key=nsnull;
|
||||
char* value=nsnull;
|
||||
const nsAReadableString& k = aNode.GetKeyAt(i);
|
||||
const nsString& v = aNode.GetValueAt(i);
|
||||
|
||||
GetNewCString(k, &key);
|
||||
if(key) {
|
||||
PR_fprintf(mOutput, " <attr key=\"%s\" value=\"", key);
|
||||
nsMemory::Free(key);
|
||||
}
|
||||
|
||||
tmp.Truncate();
|
||||
tmp.Append(v);
|
||||
if(tmp.Length() > 0) {
|
||||
PRUnichar first = tmp.First();
|
||||
if ((first == '"') || (first == '\'')) {
|
||||
if (tmp.Last() == first) {
|
||||
tmp.Cut(0, 1);
|
||||
PRInt32 pos = tmp.Length() - 1;
|
||||
if (pos >= 0) {
|
||||
tmp.Cut(pos, 1);
|
||||
}
|
||||
} else {
|
||||
// Mismatched quotes - leave them in
|
||||
}
|
||||
}
|
||||
GetNewCString(tmp, &value);
|
||||
|
||||
if(value) {
|
||||
PR_fprintf(mOutput, "%s\"/>\n", value);
|
||||
WriteTabs(mOutput,1+mLevel);
|
||||
nsMemory::Free(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (0 != strchr(gSkippedContentTags, aNode.GetNodeType())) {
|
||||
char* content;
|
||||
GetNewCString(aNode.GetSkippedContent(), &content);
|
||||
if(content) {
|
||||
PR_fprintf(mOutput, " <content value=\"");
|
||||
PR_fprintf(mOutput, "%s\"/>\n", content) ;
|
||||
nsMemory::Free(content);
|
||||
}
|
||||
}
|
||||
WriteTabs(mOutput,1+mLevel);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsLoggingSink::WillWriteAttributes(const nsIParserNode& aNode)
|
||||
{
|
||||
PRInt32 ac = aNode.GetAttributeCount();
|
||||
if (0 != ac) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
if (0 != strchr(gSkippedContentTags, aNode.GetNodeType())) {
|
||||
const nsString& content = aNode.GetSkippedContent();
|
||||
if (content.Length() > 0) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsLoggingSink::LeafNode(const nsIParserNode& aNode)
|
||||
{
|
||||
WriteTabs(mOutput,1+mLevel);
|
||||
nsHTMLTag nodeType = nsHTMLTag(aNode.GetNodeType());
|
||||
|
||||
if ((nodeType >= eHTMLTag_unknown) &&
|
||||
(nodeType <= nsHTMLTag(NS_HTML_TAG_MAX))) {
|
||||
const char* tag = nsHTMLTags::GetStringValue(nodeType);
|
||||
|
||||
if(tag)
|
||||
PR_fprintf(mOutput, "<leaf tag=\"%s\"", tag);
|
||||
else PR_fprintf(mOutput, "<leaf tag=\"???\"");
|
||||
|
||||
if (WillWriteAttributes(aNode)) {
|
||||
PR_fprintf(mOutput, ">\n");
|
||||
WriteAttributes(aNode);
|
||||
PR_fprintf(mOutput, "</leaf>\n");
|
||||
}
|
||||
else {
|
||||
PR_fprintf(mOutput, "/>\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
PRInt32 pos;
|
||||
nsAutoString tmp;
|
||||
char* str;
|
||||
switch (nodeType) {
|
||||
case eHTMLTag_whitespace:
|
||||
case eHTMLTag_text:
|
||||
GetNewCString(aNode.GetText(), &str);
|
||||
if(str) {
|
||||
PR_fprintf(mOutput, "<text value=\"%s\"/>\n", str);
|
||||
nsMemory::Free(str);
|
||||
}
|
||||
break;
|
||||
|
||||
case eHTMLTag_newline:
|
||||
PR_fprintf(mOutput, "<newline/>\n");
|
||||
break;
|
||||
|
||||
case eHTMLTag_entity:
|
||||
tmp.Append(aNode.GetText());
|
||||
tmp.Cut(0, 1);
|
||||
pos = tmp.Length() - 1;
|
||||
if (pos >= 0) {
|
||||
tmp.Cut(pos, 1);
|
||||
}
|
||||
PR_fprintf(mOutput, "<entity value=\"%s\"/>\n", tmp.GetBuffer());
|
||||
break;
|
||||
|
||||
default:
|
||||
NS_NOTREACHED("unsupported leaf node type");
|
||||
}//switch
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsLoggingSink::QuoteText(const nsAReadableString& aValue, nsString& aResult) {
|
||||
aResult.Truncate();
|
||||
/*
|
||||
if you're stepping through the string anyway, why not use iterators instead of forcing the string to copy?
|
||||
*/
|
||||
nsPromiseFlatString flat(aValue);
|
||||
const PRUnichar* cp = flat.get();
|
||||
const PRUnichar* end = cp + aValue.Length();
|
||||
while (cp < end) {
|
||||
PRUnichar ch = *cp++;
|
||||
if (ch == '"') {
|
||||
aResult.AppendWithConversion(""");
|
||||
}
|
||||
else if (ch == '&') {
|
||||
aResult.AppendWithConversion("&");
|
||||
}
|
||||
else if ((ch < 32) || (ch >= 127)) {
|
||||
aResult.AppendWithConversion("&#");
|
||||
aResult.AppendInt(PRInt32(ch), 10);
|
||||
aResult.AppendWithConversion(';');
|
||||
}
|
||||
else {
|
||||
aResult.Append(ch);
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use this method to convert nsString to char*.
|
||||
* REMEMBER: Match this call with nsMemory::Free(aResult);
|
||||
*
|
||||
* @update 04/04/99 harishd
|
||||
* @param aValue - The string value
|
||||
* @param aResult - String coverted to char*.
|
||||
*/
|
||||
nsresult
|
||||
nsLoggingSink::GetNewCString(const nsAReadableString& aValue, char** aResult)
|
||||
{
|
||||
nsresult result=NS_OK;
|
||||
nsAutoString temp;
|
||||
result=QuoteText(aValue,temp);
|
||||
if(NS_SUCCEEDED(result)) {
|
||||
if(temp.Length()>0) {
|
||||
*aResult=temp.ToNewCString();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::DoFragment(PRBool aFlag)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* This gets called when handling illegal contents, especially
|
||||
* in dealing with tables. This method creates a new context.
|
||||
*
|
||||
* @update 04/04/99 harishd
|
||||
* @param aPosition - The position from where the new context begins.
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::BeginContext(PRInt32 aPosition)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method terminates any new context that got created by
|
||||
* BeginContext and switches back to the main context.
|
||||
*
|
||||
* @update 04/04/99 harishd
|
||||
* @param aPosition - Validates the end of a context.
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::EndContext(PRInt32 aPosition)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
1146
mozilla/layout/html/document/src/nsFrameFrame.cpp
Normal file
1146
mozilla/layout/html/document/src/nsFrameFrame.cpp
Normal file
File diff suppressed because it is too large
Load Diff
3237
mozilla/layout/html/forms/src/nsGfxTextControlFrame2.cpp
Normal file
3237
mozilla/layout/html/forms/src/nsGfxTextControlFrame2.cpp
Normal file
File diff suppressed because it is too large
Load Diff
411
mozilla/layout/xul/base/src/nsBoxObject.cpp
Normal file
411
mozilla/layout/xul/base/src/nsBoxObject.cpp
Normal file
@@ -0,0 +1,411 @@
|
||||
/* -*- Mode: C++; tab-width: 2; 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 Communicator client 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.
|
||||
*
|
||||
* Original Author: David W. Hyatt (hyatt@netscape.com)
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
#include "nsBoxObject.h"
|
||||
#include "nsIBoxLayoutManager.h"
|
||||
#include "nsIBoxPaintManager.h"
|
||||
#include "nsIDocument.h"
|
||||
#include "nsIPresShell.h"
|
||||
#include "nsIPresContext.h"
|
||||
#include "nsIDocument.h"
|
||||
#include "nsIContent.h"
|
||||
#include "nsIStyleContext.h"
|
||||
#include "nsIFrame.h"
|
||||
#include "nsXPIDLString.h"
|
||||
#include "nsILookAndFeel.h"
|
||||
#include "nsWidgetsCID.h"
|
||||
#include "nsIServiceManager.h"
|
||||
|
||||
|
||||
// Static IIDs/CIDs. Try to minimize these.
|
||||
static NS_DEFINE_CID(kLookAndFeelCID, NS_LOOKANDFEEL_CID);
|
||||
|
||||
// Implementation /////////////////////////////////////////////////////////////////
|
||||
|
||||
// Static member variable initialization
|
||||
|
||||
// Implement our nsISupports methods
|
||||
NS_IMPL_ISUPPORTS3(nsBoxObject, nsIBoxObject, nsPIBoxObject, nsISecurityCheckedComponent)
|
||||
|
||||
// Constructors/Destructors
|
||||
nsBoxObject::nsBoxObject(void)
|
||||
:mContent(nsnull), mPresShell(nsnull)
|
||||
{
|
||||
NS_INIT_ISUPPORTS();
|
||||
}
|
||||
|
||||
nsBoxObject::~nsBoxObject(void)
|
||||
{
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::GetLayoutManager(nsIBoxLayoutManager** aResult)
|
||||
{
|
||||
*aResult = mLayoutManager;
|
||||
NS_IF_ADDREF(*aResult);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::SetLayoutManager(nsIBoxLayoutManager* aLayoutManager)
|
||||
{
|
||||
mLayoutManager = aLayoutManager;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::GetPaintManager(nsIBoxPaintManager** aResult)
|
||||
{
|
||||
*aResult = mPaintManager;
|
||||
NS_IF_ADDREF(*aResult);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::SetPaintManager(nsIBoxPaintManager* aPaintManager)
|
||||
{
|
||||
mPaintManager = aPaintManager;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// nsPIBoxObject //////////////////////////////////////////////////////////////////////////
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::Init(nsIContent* aContent, nsIPresShell* aShell)
|
||||
{
|
||||
mContent = aContent;
|
||||
mPresShell = aShell;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::SetDocument(nsIDocument* aDocument)
|
||||
{
|
||||
mPresState = nsnull;
|
||||
if (aDocument) {
|
||||
nsCOMPtr<nsIPresShell> shell = getter_AddRefs(aDocument->GetShellAt(0));
|
||||
mPresShell = shell;
|
||||
}
|
||||
else {
|
||||
mPresShell = nsnull;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsIFrame*
|
||||
nsBoxObject::GetFrame()
|
||||
{
|
||||
nsIFrame* frame = nsnull;
|
||||
if (mPresShell)
|
||||
mPresShell->GetPrimaryFrameFor(mContent, &frame);
|
||||
return frame;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsBoxObject::GetOffsetRect(nsRect& aRect)
|
||||
{
|
||||
nsresult res = NS_OK;
|
||||
|
||||
aRect.x = aRect.y = 0;
|
||||
aRect.Empty();
|
||||
|
||||
nsCOMPtr<nsIDocument> doc;
|
||||
mContent->GetDocument(*getter_AddRefs(doc));
|
||||
|
||||
if (doc) {
|
||||
// Get Presentation shell 0
|
||||
nsCOMPtr<nsIPresShell> presShell = getter_AddRefs(doc->GetShellAt(0));
|
||||
|
||||
if(presShell) {
|
||||
// Flush all pending notifications so that our frames are uptodate
|
||||
presShell->FlushPendingNotifications();
|
||||
|
||||
// Get the Frame for our content
|
||||
nsIFrame* frame = nsnull;
|
||||
presShell->GetPrimaryFrameFor(mContent, &frame);
|
||||
if(frame != nsnull) {
|
||||
// Get its origin
|
||||
nsPoint origin;
|
||||
frame->GetOrigin(origin);
|
||||
|
||||
// Get the union of all rectangles in this and continuation frames
|
||||
nsRect rcFrame;
|
||||
nsIFrame* next = frame;
|
||||
do {
|
||||
nsRect rect;
|
||||
next->GetRect(rect);
|
||||
rcFrame.UnionRect(rcFrame, rect);
|
||||
next->GetNextInFlow(&next);
|
||||
} while (nsnull != next);
|
||||
|
||||
|
||||
// Find the frame parent whose content's tagName either matches
|
||||
// the tagName passed in or is the document element.
|
||||
nsCOMPtr<nsIContent> docElement = getter_AddRefs(doc->GetRootContent());
|
||||
nsIFrame* parent = frame;
|
||||
nsCOMPtr<nsIContent> parentContent;
|
||||
frame->GetParent(&parent);
|
||||
while (parent) {
|
||||
parent->GetContent(getter_AddRefs(parentContent));
|
||||
if (parentContent) {
|
||||
// If we've hit the document element, break here
|
||||
if (parentContent.get() == docElement.get()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Add the parent's origin to our own to get to the
|
||||
// right coordinate system
|
||||
nsPoint parentOrigin;
|
||||
parent->GetOrigin(parentOrigin);
|
||||
origin += parentOrigin;
|
||||
|
||||
parent->GetParent(&parent);
|
||||
}
|
||||
|
||||
// For the origin, add in the border for the frame
|
||||
const nsStyleBorder* border;
|
||||
nsStyleCoord coord;
|
||||
frame->GetStyleData(eStyleStruct_Border, (const nsStyleStruct*&)border);
|
||||
if (border) {
|
||||
if (eStyleUnit_Coord == border->mBorder.GetLeftUnit()) {
|
||||
origin.x += border->mBorder.GetLeft(coord).GetCoordValue();
|
||||
}
|
||||
if (eStyleUnit_Coord == border->mBorder.GetTopUnit()) {
|
||||
origin.y += border->mBorder.GetTop(coord).GetCoordValue();
|
||||
}
|
||||
}
|
||||
|
||||
// And subtract out the border for the parent
|
||||
if (parent) {
|
||||
const nsStyleBorder* parentBorder;
|
||||
parent->GetStyleData(eStyleStruct_Border, (const nsStyleStruct*&)parentBorder);
|
||||
if (parentBorder) {
|
||||
if (eStyleUnit_Coord == parentBorder->mBorder.GetLeftUnit()) {
|
||||
origin.x -= parentBorder->mBorder.GetLeft(coord).GetCoordValue();
|
||||
}
|
||||
if (eStyleUnit_Coord == parentBorder->mBorder.GetTopUnit()) {
|
||||
origin.y -= parentBorder->mBorder.GetTop(coord).GetCoordValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get the Presentation Context from the Shell
|
||||
nsCOMPtr<nsIPresContext> context;
|
||||
presShell->GetPresContext(getter_AddRefs(context));
|
||||
|
||||
if(context) {
|
||||
// Get the scale from that Presentation Context
|
||||
float scale;
|
||||
context->GetTwipsToPixels(&scale);
|
||||
|
||||
// Convert to pixels using that scale
|
||||
aRect.x = NSTwipsToIntPixels(origin.x, scale);
|
||||
aRect.y = NSTwipsToIntPixels(origin.y, scale);
|
||||
aRect.width = NSTwipsToIntPixels(rcFrame.width, scale);
|
||||
aRect.height = NSTwipsToIntPixels(rcFrame.height, scale);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::GetX(PRInt32* aResult)
|
||||
{
|
||||
nsRect rect;
|
||||
GetOffsetRect(rect);
|
||||
*aResult = rect.x;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::GetY(PRInt32* aResult)
|
||||
{
|
||||
nsRect rect;
|
||||
GetOffsetRect(rect);
|
||||
*aResult = rect.y;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::GetWidth(PRInt32* aResult)
|
||||
{
|
||||
nsRect rect;
|
||||
GetOffsetRect(rect);
|
||||
*aResult = rect.width;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::GetHeight(PRInt32* aResult)
|
||||
{
|
||||
nsRect rect;
|
||||
GetOffsetRect(rect);
|
||||
*aResult = rect.height;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::GetLookAndFeelMetric(const PRUnichar* aPropertyName,
|
||||
PRUnichar** aResult)
|
||||
{
|
||||
nsCOMPtr<nsILookAndFeel> lookAndFeel(do_GetService(kLookAndFeelCID));
|
||||
if (!lookAndFeel)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
nsAutoString property(aPropertyName);
|
||||
if (property.EqualsIgnoreCase("scrollbarStyle")) {
|
||||
PRInt32 metricResult;
|
||||
lookAndFeel->GetMetric(nsILookAndFeel::eMetric_ScrollArrowStyle, metricResult);
|
||||
switch (metricResult) {
|
||||
case nsILookAndFeel::eMetric_ScrollArrowStyleBothAtBottom:
|
||||
*aResult = nsXPIDLString::Copy(NS_LITERAL_STRING("doublebottom").get());
|
||||
break;
|
||||
case nsILookAndFeel::eMetric_ScrollArrowStyleBothAtEachEnd:
|
||||
*aResult = nsXPIDLString::Copy(NS_LITERAL_STRING("double").get());
|
||||
break;
|
||||
case nsILookAndFeel::eMetric_ScrollArrowStyleBothAtTop:
|
||||
*aResult = nsXPIDLString::Copy(NS_LITERAL_STRING("doubletop").get());
|
||||
break;
|
||||
default:
|
||||
*aResult = nsXPIDLString::Copy(NS_LITERAL_STRING("single").get());
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (property.EqualsIgnoreCase("thumbStyle")) {
|
||||
PRInt32 metricResult;
|
||||
lookAndFeel->GetMetric(nsILookAndFeel::eMetric_ScrollSliderStyle, metricResult);
|
||||
if ( metricResult == nsILookAndFeel::eMetric_ScrollThumbStyleNormal )
|
||||
*aResult = nsXPIDLString::Copy(NS_LITERAL_STRING("fixed").get());
|
||||
else
|
||||
*aResult = nsXPIDLString::Copy(NS_LITERAL_STRING("proportional").get());
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::GetPropertyAsSupports(const PRUnichar* aPropertyName, nsISupports** aResult)
|
||||
{
|
||||
if (!mPresState) {
|
||||
*aResult = nsnull;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsAutoString propertyName(aPropertyName);
|
||||
return mPresState->GetStatePropertyAsSupports(propertyName, aResult); // Addref here.
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::SetPropertyAsSupports(const PRUnichar* aPropertyName, nsISupports* aValue)
|
||||
{
|
||||
if (!mPresState)
|
||||
NS_NewPresState(getter_AddRefs(mPresState));
|
||||
|
||||
nsAutoString propertyName(aPropertyName);
|
||||
return mPresState->SetStatePropertyAsSupports(propertyName, aValue);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::GetProperty(const PRUnichar* aPropertyName, PRUnichar** aResult)
|
||||
{
|
||||
if (!mPresState) {
|
||||
*aResult = nsnull;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsAutoString propertyName(aPropertyName);
|
||||
nsAutoString result;
|
||||
nsresult rv = mPresState->GetStateProperty(propertyName, result);
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
*aResult = nsXPIDLString::Copy(result.GetUnicode());
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::SetProperty(const PRUnichar* aPropertyName, const PRUnichar* aPropertyValue)
|
||||
{
|
||||
if (!mPresState)
|
||||
NS_NewPresState(getter_AddRefs(mPresState));
|
||||
|
||||
nsAutoString propertyName(aPropertyName);
|
||||
nsAutoString propertyValue(aPropertyValue);
|
||||
return mPresState->SetStateProperty(propertyName, propertyValue);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsBoxObject::RemoveProperty(const PRUnichar* aPropertyName)
|
||||
{
|
||||
if (!mPresState)
|
||||
return NS_OK;
|
||||
|
||||
nsAutoString propertyName(aPropertyName);
|
||||
return mPresState->RemoveStateProperty(propertyName);
|
||||
}
|
||||
|
||||
/* string canCreateWrapper (in nsIIDPtr iid); */
|
||||
NS_IMETHODIMP nsBoxObject::CanCreateWrapper(const nsIID * iid, char **_retval)
|
||||
{
|
||||
nsCAutoString str("AllAccess");
|
||||
*_retval = str.ToNewCString();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* string canCallMethod (in nsIIDPtr iid, in wstring methodName); */
|
||||
NS_IMETHODIMP nsBoxObject::CanCallMethod(const nsIID * iid, const PRUnichar *methodName, char **_retval)
|
||||
{
|
||||
nsCAutoString str("AllAccess");
|
||||
*_retval = str.ToNewCString();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* string canGetProperty (in nsIIDPtr iid, in wstring propertyName); */
|
||||
NS_IMETHODIMP nsBoxObject::CanGetProperty(const nsIID * iid, const PRUnichar *propertyName, char **_retval)
|
||||
{
|
||||
nsCAutoString str("AllAccess");
|
||||
*_retval = str.ToNewCString();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/* string canSetProperty (in nsIIDPtr iid, in wstring propertyName); */
|
||||
NS_IMETHODIMP nsBoxObject::CanSetProperty(const nsIID * iid, const PRUnichar *propertyName, char **_retval)
|
||||
{
|
||||
nsCAutoString str("AllAccess");
|
||||
*_retval = str.ToNewCString();
|
||||
return NS_OK;
|
||||
}
|
||||
// Creation Routine ///////////////////////////////////////////////////////////////////////
|
||||
|
||||
nsresult
|
||||
NS_NewBoxObject(nsIBoxObject** aResult)
|
||||
{
|
||||
*aResult = new nsBoxObject;
|
||||
if (!*aResult)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
NS_ADDREF(*aResult);
|
||||
return NS_OK;
|
||||
}
|
||||
1227
mozilla/mailnews/base/util/nsMsgIncomingServer.cpp
Normal file
1227
mozilla/mailnews/base/util/nsMsgIncomingServer.cpp
Normal file
File diff suppressed because it is too large
Load Diff
585
mozilla/mailnews/import/src/nsImportFieldMap.cpp
Normal file
585
mozilla/mailnews/import/src/nsImportFieldMap.cpp
Normal file
@@ -0,0 +1,585 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.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):
|
||||
* Pierre Phaneuf <pp@ludusdesign.com>
|
||||
*/
|
||||
|
||||
|
||||
#include "nscore.h"
|
||||
#include "nsIStringBundle.h"
|
||||
#include "nsImportFieldMap.h"
|
||||
#include "nsImportStringBundle.h"
|
||||
|
||||
#include "ImportDebug.h"
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
NS_METHOD nsImportFieldMap::Create( nsISupports *aOuter, REFNSIID aIID, void **aResult)
|
||||
{
|
||||
if (aOuter)
|
||||
return NS_ERROR_NO_AGGREGATION;
|
||||
|
||||
nsImportFieldMap *it = new nsImportFieldMap();
|
||||
if (it == nsnull)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
NS_ADDREF( it);
|
||||
nsresult rv = it->QueryInterface( aIID, aResult);
|
||||
NS_RELEASE( it);
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMPL_THREADSAFE_ISUPPORTS1(nsImportFieldMap, nsIImportFieldMap)
|
||||
|
||||
nsImportFieldMap::nsImportFieldMap()
|
||||
{
|
||||
NS_INIT_ISUPPORTS();
|
||||
m_numFields = 0;
|
||||
m_pFields = nsnull;
|
||||
m_pActive = nsnull;
|
||||
m_allocated = 0;
|
||||
// need to init the description array
|
||||
m_mozFieldCount = 0;
|
||||
nsIStringBundle *pBundle = nsImportStringBundle::GetStringBundleProxy();
|
||||
|
||||
nsString *pStr;
|
||||
for (PRInt32 i = IMPORT_FIELD_DESC_START; i <= IMPORT_FIELD_DESC_END; i++, m_mozFieldCount++) {
|
||||
pStr = new nsString();
|
||||
if (pBundle) {
|
||||
nsImportStringBundle::GetStringByID( i, *pStr, pBundle);
|
||||
}
|
||||
else
|
||||
pStr->AppendInt( i);
|
||||
m_descriptions.AppendElement( (void *)pStr);
|
||||
}
|
||||
|
||||
NS_IF_RELEASE( pBundle);
|
||||
}
|
||||
|
||||
nsImportFieldMap::~nsImportFieldMap()
|
||||
{
|
||||
if (m_pFields)
|
||||
delete [] m_pFields;
|
||||
if (m_pActive)
|
||||
delete [] m_pActive;
|
||||
|
||||
nsString * pStr;
|
||||
for (PRInt32 i = 0; i < m_mozFieldCount; i++) {
|
||||
pStr = (nsString *) m_descriptions.ElementAt( i);
|
||||
delete pStr;
|
||||
}
|
||||
m_descriptions.Clear();
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP nsImportFieldMap::GetNumMozFields(PRInt32 *aNumFields)
|
||||
{
|
||||
NS_PRECONDITION(aNumFields != nsnull, "null ptr");
|
||||
if (!aNumFields)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*aNumFields = m_mozFieldCount;
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsImportFieldMap::GetMapSize(PRInt32 *aNumFields)
|
||||
{
|
||||
NS_PRECONDITION(aNumFields != nsnull, "null ptr");
|
||||
if (!aNumFields)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*aNumFields = m_numFields;
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsImportFieldMap::GetFieldDescription(PRInt32 index, PRUnichar **_retval)
|
||||
{
|
||||
NS_PRECONDITION(_retval != nsnull, "null ptr");
|
||||
if (!_retval)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*_retval = nsnull;
|
||||
if ((index < 0) || (index >= m_descriptions.Count()))
|
||||
return( NS_ERROR_FAILURE);
|
||||
|
||||
*_retval = ((nsString *)m_descriptions.ElementAt( index))->ToNewUnicode();
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsImportFieldMap::SetFieldMapSize(PRInt32 size)
|
||||
{
|
||||
nsresult rv = Allocate( size);
|
||||
if (NS_FAILED( rv))
|
||||
return( rv);
|
||||
|
||||
m_numFields = size;
|
||||
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP nsImportFieldMap::DefaultFieldMap(PRInt32 size)
|
||||
{
|
||||
nsresult rv = SetFieldMapSize( size);
|
||||
if (NS_FAILED( rv))
|
||||
return( rv);
|
||||
for (PRInt32 i = 0; i < size; i++) {
|
||||
m_pFields[i] = i;
|
||||
m_pActive[i] = PR_TRUE;
|
||||
}
|
||||
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsImportFieldMap::GetFieldMap(PRInt32 index, PRInt32 *_retval)
|
||||
{
|
||||
NS_PRECONDITION(_retval != nsnull, "null ptr");
|
||||
if (!_retval)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
|
||||
if ((index < 0) || (index >= m_numFields))
|
||||
return( NS_ERROR_FAILURE);
|
||||
|
||||
*_retval = m_pFields[index];
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsImportFieldMap::SetFieldMap(PRInt32 index, PRInt32 fieldNum)
|
||||
{
|
||||
if (index == -1) {
|
||||
nsresult rv = Allocate( m_numFields + 1);
|
||||
if (NS_FAILED( rv))
|
||||
return( rv);
|
||||
index = m_numFields;
|
||||
m_numFields++;
|
||||
}
|
||||
else {
|
||||
if ((index < 0) || (index >= m_numFields))
|
||||
return( NS_ERROR_FAILURE);
|
||||
}
|
||||
|
||||
if ((fieldNum != -1) && ((fieldNum < 0) || (fieldNum >= m_mozFieldCount)))
|
||||
return( NS_ERROR_FAILURE);
|
||||
|
||||
m_pFields[index] = fieldNum;
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsImportFieldMap::SetFieldMapByDescription(PRInt32 index, const PRUnichar *fieldDesc)
|
||||
{
|
||||
NS_PRECONDITION(fieldDesc != nsnull, "null ptr");
|
||||
if (!fieldDesc)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
PRInt32 i = FindFieldNum( fieldDesc);
|
||||
if (i == -1)
|
||||
return( NS_ERROR_FAILURE);
|
||||
|
||||
return( SetFieldMap( index, i));
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP nsImportFieldMap::GetFieldActive(PRInt32 index, PRBool *active)
|
||||
{
|
||||
NS_PRECONDITION(active != nsnull, "null ptr");
|
||||
if (!active)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
if ((index < 0) || (index >= m_numFields))
|
||||
return( NS_ERROR_FAILURE);
|
||||
|
||||
*active = m_pActive[index];
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsImportFieldMap::SetFieldActive(PRInt32 index, PRBool active)
|
||||
{
|
||||
if ((index < 0) || (index >= m_numFields))
|
||||
return( NS_ERROR_FAILURE);
|
||||
|
||||
m_pActive[index] = active;
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP nsImportFieldMap::SetFieldValue(nsIAddrDatabase *database, nsIMdbRow *row, PRInt32 fieldNum, const PRUnichar *value)
|
||||
{
|
||||
NS_PRECONDITION(database != nsnull, "null ptr");
|
||||
NS_PRECONDITION(row != nsnull, "null ptr");
|
||||
NS_PRECONDITION(value != nsnull, "null ptr");
|
||||
if (!database || !row || !value)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
// Allow the special value for a null field
|
||||
if (fieldNum == -1)
|
||||
return( NS_OK);
|
||||
|
||||
if ((fieldNum < 0) || (fieldNum >= m_mozFieldCount))
|
||||
return( NS_ERROR_FAILURE);
|
||||
|
||||
// UGGG!!!!! lot's of typing here!
|
||||
nsresult rv;
|
||||
|
||||
nsString str(value);
|
||||
char *pVal = str.ToNewUTF8String();
|
||||
|
||||
switch( fieldNum) {
|
||||
case 0:
|
||||
rv = database->AddFirstName( row, pVal);
|
||||
break;
|
||||
case 1:
|
||||
rv = database->AddLastName( row, pVal);
|
||||
break;
|
||||
case 2:
|
||||
rv = database->AddDisplayName( row, pVal);
|
||||
break;
|
||||
case 3:
|
||||
rv = database->AddNickName( row, pVal);
|
||||
break;
|
||||
case 4:
|
||||
rv = database->AddPrimaryEmail( row, pVal);
|
||||
break;
|
||||
case 5:
|
||||
rv = database->Add2ndEmail( row, pVal);
|
||||
break;
|
||||
case 6:
|
||||
rv = database->AddWorkPhone( row, pVal);
|
||||
break;
|
||||
case 7:
|
||||
rv = database->AddHomePhone( row, pVal);
|
||||
break;
|
||||
case 8:
|
||||
rv = database->AddFaxNumber( row, pVal);
|
||||
break;
|
||||
case 9:
|
||||
rv = database->AddPagerNumber( row, pVal);
|
||||
break;
|
||||
case 10:
|
||||
rv = database->AddCellularNumber( row, pVal);
|
||||
break;
|
||||
case 11:
|
||||
rv = database->AddHomeAddress( row, pVal);
|
||||
break;
|
||||
case 12:
|
||||
rv = database->AddHomeAddress2( row, pVal);
|
||||
break;
|
||||
case 13:
|
||||
rv = database->AddHomeCity( row, pVal);
|
||||
break;
|
||||
case 14:
|
||||
rv = database->AddHomeState( row, pVal);
|
||||
break;
|
||||
case 15:
|
||||
rv = database->AddHomeZipCode( row, pVal);
|
||||
break;
|
||||
case 16:
|
||||
rv = database->AddHomeCountry( row, pVal);
|
||||
break;
|
||||
case 17:
|
||||
rv = database->AddWorkAddress( row, pVal);
|
||||
break;
|
||||
case 18:
|
||||
rv = database->AddWorkAddress2( row, pVal);
|
||||
break;
|
||||
case 19:
|
||||
rv = database->AddWorkCity( row, pVal);
|
||||
break;
|
||||
case 20:
|
||||
rv = database->AddWorkState( row, pVal);
|
||||
break;
|
||||
case 21:
|
||||
rv = database->AddWorkZipCode( row, pVal);
|
||||
break;
|
||||
case 22:
|
||||
rv = database->AddWorkCountry( row, pVal);
|
||||
break;
|
||||
case 23:
|
||||
rv = database->AddJobTitle(row, pVal);
|
||||
break;
|
||||
case 24:
|
||||
rv = database->AddDepartment(row, pVal);
|
||||
break;
|
||||
case 25:
|
||||
rv = database->AddCompany(row, pVal);
|
||||
break;
|
||||
case 26:
|
||||
rv = database->AddWebPage1(row, pVal);
|
||||
break;
|
||||
case 27:
|
||||
rv = database->AddWebPage2(row, pVal);
|
||||
break;
|
||||
case 28:
|
||||
rv = database->AddBirthYear(row, pVal);
|
||||
break;
|
||||
case 29:
|
||||
rv = database->AddBirthMonth(row, pVal);
|
||||
break;
|
||||
case 30:
|
||||
rv = database->AddBirthDay(row, pVal);
|
||||
break;
|
||||
case 31:
|
||||
rv = database->AddCustom1(row, pVal);
|
||||
break;
|
||||
case 32:
|
||||
rv = database->AddCustom2(row, pVal);
|
||||
break;
|
||||
case 33:
|
||||
rv = database->AddCustom3(row, pVal);
|
||||
break;
|
||||
case 34:
|
||||
rv = database->AddCustom4(row, pVal);
|
||||
break;
|
||||
case 35:
|
||||
rv = database->AddNotes(row, pVal);
|
||||
break;
|
||||
default:
|
||||
/* Get the field description, and add it as an anonymous attr? */
|
||||
/* OR WHAT???? */
|
||||
{
|
||||
rv = NS_ERROR_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
nsCRT::free( pVal);
|
||||
|
||||
return( rv);
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP nsImportFieldMap::SetFieldValueByDescription(nsIAddrDatabase *database, nsIMdbRow *row, const PRUnichar *fieldDesc, const PRUnichar *value)
|
||||
{
|
||||
NS_PRECONDITION(fieldDesc != nsnull, "null ptr");
|
||||
if (!fieldDesc)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
PRInt32 i = FindFieldNum( fieldDesc);
|
||||
if (i == -1)
|
||||
return( NS_ERROR_FAILURE);
|
||||
return( SetFieldValue( database, row, i, value));
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP nsImportFieldMap::GetFieldValue(nsIAbCard *card, PRInt32 fieldNum, PRUnichar **_retval)
|
||||
{
|
||||
NS_PRECONDITION(_retval != nsnull, "null ptr");
|
||||
NS_PRECONDITION(card != nsnull, "null ptr");
|
||||
if (!_retval || !card)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
if (fieldNum == -1) {
|
||||
PRUnichar c = 0;
|
||||
*_retval = nsCRT::strdup( &c);
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
if ((fieldNum < 0) || (fieldNum >= m_mozFieldCount))
|
||||
return( NS_ERROR_FAILURE);
|
||||
|
||||
// ARRGGG!!! Lots of typing again
|
||||
// get the field from the card
|
||||
nsresult rv;
|
||||
PRUnichar * pVal = nsnull;
|
||||
|
||||
switch (fieldNum) {
|
||||
case 0:
|
||||
rv = card->GetFirstName( &pVal);
|
||||
break;
|
||||
case 1:
|
||||
rv = card->GetLastName( &pVal);
|
||||
break;
|
||||
case 2:
|
||||
rv = card->GetDisplayName( &pVal);
|
||||
break;
|
||||
case 3:
|
||||
rv = card->GetNickName( &pVal);
|
||||
break;
|
||||
case 4:
|
||||
rv = card->GetPrimaryEmail( &pVal);
|
||||
break;
|
||||
case 5:
|
||||
rv = card->GetSecondEmail( &pVal);
|
||||
break;
|
||||
case 6:
|
||||
rv = card->GetWorkPhone( &pVal);
|
||||
break;
|
||||
case 7:
|
||||
rv = card->GetHomePhone( &pVal);
|
||||
break;
|
||||
case 8:
|
||||
rv = card->GetFaxNumber( &pVal);
|
||||
break;
|
||||
case 9:
|
||||
rv = card->GetPagerNumber( &pVal);
|
||||
break;
|
||||
case 10:
|
||||
rv = card->GetCellularNumber( &pVal);
|
||||
break;
|
||||
case 11:
|
||||
rv = card->GetHomeAddress( &pVal);
|
||||
break;
|
||||
case 12:
|
||||
rv = card->GetHomeAddress2( &pVal);
|
||||
break;
|
||||
case 13:
|
||||
rv = card->GetHomeCity( &pVal);
|
||||
break;
|
||||
case 14:
|
||||
rv = card->GetHomeState( &pVal);
|
||||
break;
|
||||
case 15:
|
||||
rv = card->GetHomeZipCode( &pVal);
|
||||
break;
|
||||
case 16:
|
||||
rv = card->GetHomeCountry( &pVal);
|
||||
break;
|
||||
case 17:
|
||||
rv = card->GetWorkAddress( &pVal);
|
||||
break;
|
||||
case 18:
|
||||
rv = card->GetWorkAddress2( &pVal);
|
||||
break;
|
||||
case 19:
|
||||
rv = card->GetWorkCity( &pVal);
|
||||
break;
|
||||
case 20:
|
||||
rv = card->GetWorkState( &pVal);
|
||||
break;
|
||||
case 21:
|
||||
rv = card->GetWorkZipCode( &pVal);
|
||||
break;
|
||||
case 22:
|
||||
rv = card->GetWorkCountry( &pVal);
|
||||
break;
|
||||
case 23:
|
||||
rv = card->GetJobTitle( &pVal);
|
||||
break;
|
||||
case 24:
|
||||
rv = card->GetDepartment( &pVal);
|
||||
break;
|
||||
case 25:
|
||||
rv = card->GetCompany( &pVal);
|
||||
break;
|
||||
case 26:
|
||||
rv = card->GetWebPage1( &pVal);
|
||||
break;
|
||||
case 27:
|
||||
rv = card->GetWebPage2( &pVal);
|
||||
break;
|
||||
case 28:
|
||||
rv = card->GetBirthYear( &pVal);
|
||||
break;
|
||||
case 29:
|
||||
rv = card->GetBirthMonth( &pVal);
|
||||
break;
|
||||
case 30:
|
||||
rv = card->GetBirthDay( &pVal);
|
||||
break;
|
||||
case 31:
|
||||
rv = card->GetCustom1( &pVal);
|
||||
break;
|
||||
case 32:
|
||||
rv = card->GetCustom2( &pVal);
|
||||
break;
|
||||
case 33:
|
||||
rv = card->GetCustom3( &pVal);
|
||||
break;
|
||||
case 34:
|
||||
rv = card->GetCustom4( &pVal);
|
||||
break;
|
||||
case 35:
|
||||
rv = card->GetNotes( &pVal);
|
||||
break;
|
||||
default:
|
||||
/* Get the field description, and add it as an anonymous attr? */
|
||||
/* OR WHAT???? */
|
||||
{
|
||||
rv = NS_ERROR_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
*_retval = pVal;
|
||||
|
||||
return( rv);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsImportFieldMap::GetFieldValueByDescription(nsIAbCard *card, const PRUnichar *fieldDesc, PRUnichar **_retval)
|
||||
{
|
||||
NS_PRECONDITION(fieldDesc != nsnull, "null ptr");
|
||||
if (!fieldDesc)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
PRInt32 i = FindFieldNum( fieldDesc);
|
||||
if (i == -1)
|
||||
return( NS_ERROR_FAILURE);
|
||||
return( GetFieldValue( card, i, _retval));
|
||||
}
|
||||
|
||||
|
||||
nsresult nsImportFieldMap::Allocate( PRInt32 newSize)
|
||||
{
|
||||
if (newSize <= m_allocated)
|
||||
return( NS_OK);
|
||||
|
||||
PRInt32 sz = m_allocated;
|
||||
while (sz < newSize)
|
||||
sz += 30;
|
||||
|
||||
PRInt32 *pData = new PRInt32[ sz];
|
||||
if (!pData)
|
||||
return( NS_ERROR_FAILURE);
|
||||
PRBool *pActive = new PRBool[sz];
|
||||
if (!pActive)
|
||||
return( NS_ERROR_FAILURE);
|
||||
|
||||
|
||||
PRInt32 i;
|
||||
for (i = 0; i < sz; i++) {
|
||||
pData[i] = -1;
|
||||
pActive[i] = PR_TRUE;
|
||||
}
|
||||
if (m_numFields) {
|
||||
for (i = 0; i < m_numFields; i++) {
|
||||
pData[i] = m_pFields[i];
|
||||
pActive[i] = m_pActive[i];
|
||||
}
|
||||
delete [] m_pFields;
|
||||
delete [] m_pActive;
|
||||
}
|
||||
m_allocated = sz;
|
||||
m_pFields = pData;
|
||||
m_pActive = pActive;
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
PRInt32 nsImportFieldMap::FindFieldNum( const PRUnichar *pDesc)
|
||||
{
|
||||
nsString * pStr;
|
||||
for (PRInt32 i = 0; i < m_mozFieldCount; i++) {
|
||||
pStr = (nsString *)m_descriptions.ElementAt( i);
|
||||
if (!Compare(*pStr, nsAutoString(pDesc)))
|
||||
return( i);
|
||||
}
|
||||
|
||||
return( -1);
|
||||
}
|
||||
|
||||
|
||||
795
mozilla/mailnews/import/text/src/nsTextImport.cpp
Normal file
795
mozilla/mailnews/import/text/src/nsTextImport.cpp
Normal file
@@ -0,0 +1,795 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Pierre Phaneuf <pp@ludusdesign.com>
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Text import addressbook interfaces
|
||||
|
||||
*/
|
||||
#include "nscore.h"
|
||||
#include "nsCRT.h"
|
||||
#include "nsString.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIImportService.h"
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsTextImport.h"
|
||||
#include "nsIMemory.h"
|
||||
#include "nsIImportGeneric.h"
|
||||
#include "nsIImportAddressBooks.h"
|
||||
#include "nsIImportABDescriptor.h"
|
||||
#include "nsIImportFieldMap.h"
|
||||
#include "nsIOutputStream.h"
|
||||
#include "nsIAddrDatabase.h"
|
||||
#include "nsTextFormatter.h"
|
||||
#include "nsTextStringBundle.h"
|
||||
#include "nsIStringBundle.h"
|
||||
#include "nsTextAddress.h"
|
||||
#include "nsIPref.h"
|
||||
#include "nsXPIDLString.h"
|
||||
#include "nsProxiedService.h"
|
||||
#include "TextDebugLog.h"
|
||||
|
||||
|
||||
static NS_DEFINE_CID(kImportServiceCID, NS_IMPORTSERVICE_CID);
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_CID(kPrefServiceCID, NS_PREF_CID);
|
||||
|
||||
|
||||
class ImportAddressImpl : public nsIImportAddressBooks
|
||||
{
|
||||
public:
|
||||
ImportAddressImpl();
|
||||
virtual ~ImportAddressImpl();
|
||||
|
||||
static nsresult Create(nsIImportAddressBooks** aImport);
|
||||
|
||||
// nsISupports interface
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
// nsIImportAddressBooks interface
|
||||
|
||||
/* PRBool GetSupportsMultiple (); */
|
||||
NS_IMETHOD GetSupportsMultiple(PRBool *_retval) { *_retval = PR_FALSE; return( NS_OK);}
|
||||
|
||||
/* PRBool GetAutoFind (out wstring description); */
|
||||
NS_IMETHOD GetAutoFind(PRUnichar **description, PRBool *_retval);
|
||||
|
||||
/* PRBool GetNeedsFieldMap (nsIFileSpec *location); */
|
||||
NS_IMETHOD GetNeedsFieldMap(nsIFileSpec *location, PRBool *_retval);
|
||||
|
||||
/* void GetDefaultLocation (out nsIFileSpec location, out boolean found, out boolean userVerify); */
|
||||
NS_IMETHOD GetDefaultLocation(nsIFileSpec **location, PRBool *found, PRBool *userVerify);
|
||||
|
||||
/* nsISupportsArray FindAddressBooks (in nsIFileSpec location); */
|
||||
NS_IMETHOD FindAddressBooks(nsIFileSpec *location, nsISupportsArray **_retval);
|
||||
|
||||
/* nsISupports InitFieldMap(nsIFileSpec location, nsIImportFieldMap fieldMap); */
|
||||
NS_IMETHOD InitFieldMap(nsIFileSpec *location, nsIImportFieldMap *fieldMap);
|
||||
|
||||
/* void ImportAddressBook (in nsIImportABDescriptor source, in nsISupports destination, in nsISupports fieldMap, out boolean fatalError); */
|
||||
NS_IMETHOD ImportAddressBook( nsIImportABDescriptor *source,
|
||||
nsIAddrDatabase * destination,
|
||||
nsIImportFieldMap * fieldMap,
|
||||
PRUnichar ** errorLog,
|
||||
PRUnichar ** successLog,
|
||||
PRBool * fatalError);
|
||||
|
||||
/* unsigned long GetImportProgress (); */
|
||||
NS_IMETHOD GetImportProgress(PRUint32 *_retval);
|
||||
|
||||
NS_IMETHOD GetSampleData( PRInt32 index, PRBool *pFound, PRUnichar **pStr);
|
||||
|
||||
NS_IMETHOD SetSampleLocation( nsIFileSpec *);
|
||||
|
||||
private:
|
||||
void ClearSampleFile( void);
|
||||
void SaveFieldMap( nsIImportFieldMap *pMap);
|
||||
|
||||
static void ReportSuccess( nsString& name, nsString *pStream);
|
||||
static void SetLogs( nsString& success, nsString& error, PRUnichar **pError, PRUnichar **pSuccess);
|
||||
static void ReportError( PRInt32 errorNum, nsString& name, nsString *pStream);
|
||||
static void SanitizeSampleData( nsCString& val);
|
||||
|
||||
private:
|
||||
nsTextAddress m_text;
|
||||
PRBool m_haveDelim;
|
||||
nsIFileSpec * m_fileLoc;
|
||||
char m_delim;
|
||||
PRUint32 m_bytesImported;
|
||||
};
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
nsTextImport::nsTextImport()
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
|
||||
IMPORT_LOG0( "nsTextImport Module Created\n");
|
||||
|
||||
nsTextStringBundle::GetStringBundle();
|
||||
}
|
||||
|
||||
|
||||
nsTextImport::~nsTextImport()
|
||||
{
|
||||
|
||||
IMPORT_LOG0( "nsTextImport Module Deleted\n");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMPL_ISUPPORTS1(nsTextImport, nsIImportModule)
|
||||
|
||||
|
||||
NS_IMETHODIMP nsTextImport::GetName( PRUnichar **name)
|
||||
{
|
||||
NS_PRECONDITION(name != nsnull, "null ptr");
|
||||
if (! name)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*name = nsTextStringBundle::GetStringByID( TEXTIMPORT_NAME);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsTextImport::GetDescription( PRUnichar **name)
|
||||
{
|
||||
NS_PRECONDITION(name != nsnull, "null ptr");
|
||||
if (! name)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*name = nsTextStringBundle::GetStringByID( TEXTIMPORT_DESCRIPTION);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsTextImport::GetSupports( char **supports)
|
||||
{
|
||||
NS_PRECONDITION(supports != nsnull, "null ptr");
|
||||
if (! supports)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*supports = nsCRT::strdup( kTextSupportsString);
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsTextImport::GetSupportsUpgrade( PRBool *pUpgrade)
|
||||
{
|
||||
NS_PRECONDITION(pUpgrade != nsnull, "null ptr");
|
||||
if (! pUpgrade)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*pUpgrade = PR_FALSE;
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP nsTextImport::GetImportInterface( const char *pImportType, nsISupports **ppInterface)
|
||||
{
|
||||
NS_PRECONDITION(pImportType != nsnull, "null ptr");
|
||||
if (! pImportType)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
NS_PRECONDITION(ppInterface != nsnull, "null ptr");
|
||||
if (! ppInterface)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*ppInterface = nsnull;
|
||||
nsresult rv;
|
||||
|
||||
if (!nsCRT::strcmp( pImportType, "addressbook")) {
|
||||
// create the nsIImportMail interface and return it!
|
||||
nsIImportAddressBooks * pAddress = nsnull;
|
||||
nsIImportGeneric * pGeneric = nsnull;
|
||||
rv = ImportAddressImpl::Create( &pAddress);
|
||||
if (NS_SUCCEEDED( rv)) {
|
||||
NS_WITH_SERVICE( nsIImportService, impSvc, kImportServiceCID, &rv);
|
||||
if (NS_SUCCEEDED( rv)) {
|
||||
rv = impSvc->CreateNewGenericAddressBooks( &pGeneric);
|
||||
if (NS_SUCCEEDED( rv)) {
|
||||
pGeneric->SetData( "addressInterface", pAddress);
|
||||
rv = pGeneric->QueryInterface( kISupportsIID, (void **)ppInterface);
|
||||
}
|
||||
}
|
||||
}
|
||||
NS_IF_RELEASE( pAddress);
|
||||
NS_IF_RELEASE( pGeneric);
|
||||
return( rv);
|
||||
}
|
||||
|
||||
return( NS_ERROR_NOT_AVAILABLE);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
nsresult ImportAddressImpl::Create(nsIImportAddressBooks** aImport)
|
||||
{
|
||||
NS_PRECONDITION(aImport != nsnull, "null ptr");
|
||||
if (! aImport)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*aImport = new ImportAddressImpl();
|
||||
if (! *aImport)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
NS_ADDREF(*aImport);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
ImportAddressImpl::ImportAddressImpl()
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
|
||||
m_fileLoc = nsnull;
|
||||
m_haveDelim = PR_FALSE;
|
||||
}
|
||||
|
||||
|
||||
ImportAddressImpl::~ImportAddressImpl()
|
||||
{
|
||||
if (m_fileLoc) {
|
||||
PRBool open = PR_FALSE;
|
||||
m_fileLoc->IsStreamOpen( &open);
|
||||
if (open)
|
||||
m_fileLoc->CloseStream();
|
||||
NS_RELEASE( m_fileLoc);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMPL_THREADSAFE_ISUPPORTS1(ImportAddressImpl, nsIImportAddressBooks)
|
||||
|
||||
|
||||
NS_IMETHODIMP ImportAddressImpl::GetAutoFind(PRUnichar **addrDescription, PRBool *_retval)
|
||||
{
|
||||
NS_PRECONDITION(addrDescription != nsnull, "null ptr");
|
||||
NS_PRECONDITION(_retval != nsnull, "null ptr");
|
||||
if (! addrDescription || !_retval)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
nsString str;
|
||||
*_retval = PR_FALSE;
|
||||
nsTextStringBundle::GetStringByID( TEXTIMPORT_ADDRESS_NAME, str);
|
||||
*addrDescription = str.ToNewUnicode();
|
||||
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP ImportAddressImpl::GetDefaultLocation(nsIFileSpec **ppLoc, PRBool *found, PRBool *userVerify)
|
||||
{
|
||||
NS_PRECONDITION(found != nsnull, "null ptr");
|
||||
NS_PRECONDITION(ppLoc != nsnull, "null ptr");
|
||||
NS_PRECONDITION(userVerify != nsnull, "null ptr");
|
||||
if (! found || !userVerify || !ppLoc)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*ppLoc = nsnull;
|
||||
*found = PR_FALSE;
|
||||
*userVerify = PR_TRUE;
|
||||
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP ImportAddressImpl::FindAddressBooks(nsIFileSpec *pLoc, nsISupportsArray **ppArray)
|
||||
{
|
||||
NS_PRECONDITION(pLoc != nsnull, "null ptr");
|
||||
NS_PRECONDITION(ppArray != nsnull, "null ptr");
|
||||
if (!pLoc || !ppArray)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
ClearSampleFile();
|
||||
|
||||
*ppArray = nsnull;
|
||||
PRBool exists = PR_FALSE;
|
||||
nsresult rv = pLoc->Exists( &exists);
|
||||
if (NS_FAILED( rv) || !exists)
|
||||
return( NS_ERROR_FAILURE);
|
||||
|
||||
PRBool isFile = PR_FALSE;
|
||||
rv = pLoc->IsFile( &isFile);
|
||||
if (NS_FAILED( rv) || !isFile)
|
||||
return( NS_ERROR_FAILURE);
|
||||
|
||||
rv = m_text.DetermineDelim( pLoc);
|
||||
|
||||
if (NS_FAILED( rv)) {
|
||||
IMPORT_LOG0( "*** Error determining delimitter\n");
|
||||
return( rv);
|
||||
}
|
||||
m_haveDelim = PR_TRUE;
|
||||
m_delim = m_text.GetDelim();
|
||||
|
||||
m_fileLoc = pLoc;
|
||||
NS_ADDREF( m_fileLoc);
|
||||
|
||||
/* Build an address book descriptor based on the file passed in! */
|
||||
nsCOMPtr<nsISupportsArray> array;
|
||||
rv = NS_NewISupportsArray( getter_AddRefs( array));
|
||||
if (NS_FAILED( rv)) {
|
||||
IMPORT_LOG0( "FAILED to allocate the nsISupportsArray\n");
|
||||
return( rv);
|
||||
}
|
||||
|
||||
NS_WITH_SERVICE( nsIImportService, impSvc, kImportServiceCID, &rv);
|
||||
if (NS_FAILED( rv)) {
|
||||
IMPORT_LOG0( "*** Failed to obtain the import service\n");
|
||||
return( rv);
|
||||
}
|
||||
|
||||
nsXPIDLCString pName;
|
||||
rv = pLoc->GetLeafName(getter_Copies(pName));
|
||||
if (NS_FAILED( rv)) {
|
||||
IMPORT_LOG0( "*** Failed getting leaf name of file\n");
|
||||
return( rv);
|
||||
}
|
||||
|
||||
// for get unicode leafname. If it uses nsILocalFile interface,
|
||||
// these codes do not need due to nsILocalFile->GetUnicodeLeafName()
|
||||
nsString name;
|
||||
rv = impSvc->SystemStringToUnicode((const char*) pName, name);
|
||||
if (NS_FAILED(rv))
|
||||
name.AssignWithConversion((const char*) pName);
|
||||
|
||||
PRInt32 idx = name.RFindChar( '.');
|
||||
if ((idx != -1) && (idx > 0) && ((name.Length() - idx - 1) < 5)) {
|
||||
nsString t;
|
||||
name.Left( t, idx);
|
||||
name = t;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIImportABDescriptor> desc;
|
||||
nsISupports * pInterface;
|
||||
|
||||
rv = impSvc->CreateNewABDescriptor( getter_AddRefs( desc));
|
||||
if (NS_SUCCEEDED( rv)) {
|
||||
PRUint32 sz = 0;
|
||||
pLoc->GetFileSize( &sz);
|
||||
desc->SetPreferredName( name.GetUnicode());
|
||||
desc->SetSize( sz);
|
||||
nsIFileSpec *pSpec = nsnull;
|
||||
desc->GetFileSpec( &pSpec);
|
||||
if (pSpec) {
|
||||
pSpec->FromFileSpec( pLoc);
|
||||
NS_RELEASE( pSpec);
|
||||
}
|
||||
rv = desc->QueryInterface( kISupportsIID, (void **) &pInterface);
|
||||
array->AppendElement( pInterface);
|
||||
pInterface->Release();
|
||||
}
|
||||
if (NS_FAILED( rv)) {
|
||||
IMPORT_LOG0( "*** Error creating address book descriptor for text import\n");
|
||||
}
|
||||
else {
|
||||
rv = array->QueryInterface( NS_GET_IID(nsISupportsArray), (void **) ppArray);
|
||||
}
|
||||
|
||||
return( rv);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ImportAddressImpl::ReportSuccess( nsString& name, nsString *pStream)
|
||||
{
|
||||
if (!pStream)
|
||||
return;
|
||||
// load the success string
|
||||
nsIStringBundle *pBundle = nsTextStringBundle::GetStringBundleProxy();
|
||||
PRUnichar *pFmt = nsTextStringBundle::GetStringByID( TEXTIMPORT_ADDRESS_SUCCESS, pBundle);
|
||||
PRUnichar *pText = nsTextFormatter::smprintf( pFmt, name.GetUnicode());
|
||||
pStream->Append( pText);
|
||||
nsTextFormatter::smprintf_free( pText);
|
||||
nsTextStringBundle::FreeString( pFmt);
|
||||
pStream->AppendWithConversion( LF);
|
||||
NS_IF_RELEASE( pBundle);
|
||||
}
|
||||
|
||||
void ImportAddressImpl::ReportError( PRInt32 errorNum, nsString& name, nsString *pStream)
|
||||
{
|
||||
if (!pStream)
|
||||
return;
|
||||
// load the error string
|
||||
nsIStringBundle *pBundle = nsTextStringBundle::GetStringBundleProxy();
|
||||
PRUnichar *pFmt = nsTextStringBundle::GetStringByID( errorNum, pBundle);
|
||||
PRUnichar *pText = nsTextFormatter::smprintf( pFmt, name.GetUnicode());
|
||||
pStream->Append( pText);
|
||||
nsTextFormatter::smprintf_free( pText);
|
||||
nsTextStringBundle::FreeString( pFmt);
|
||||
pStream->AppendWithConversion( LF);
|
||||
NS_IF_RELEASE( pBundle);
|
||||
}
|
||||
|
||||
void ImportAddressImpl::SetLogs( nsString& success, nsString& error, PRUnichar **pError, PRUnichar **pSuccess)
|
||||
{
|
||||
if (pError)
|
||||
*pError = error.ToNewUnicode();
|
||||
if (pSuccess)
|
||||
*pSuccess = success.ToNewUnicode();
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP ImportAddressImpl::ImportAddressBook( nsIImportABDescriptor *pSource,
|
||||
nsIAddrDatabase * pDestination,
|
||||
nsIImportFieldMap * fieldMap,
|
||||
PRUnichar ** pErrorLog,
|
||||
PRUnichar ** pSuccessLog,
|
||||
PRBool * fatalError)
|
||||
{
|
||||
NS_PRECONDITION(pSource != nsnull, "null ptr");
|
||||
NS_PRECONDITION(pDestination != nsnull, "null ptr");
|
||||
NS_PRECONDITION(fatalError != nsnull, "null ptr");
|
||||
|
||||
nsCOMPtr<nsIStringBundle> bundle( dont_AddRef( nsTextStringBundle::GetStringBundleProxy()));
|
||||
m_bytesImported = 0;
|
||||
|
||||
nsString success;
|
||||
nsString error;
|
||||
if (!pSource || !pDestination || !fatalError) {
|
||||
IMPORT_LOG0( "*** Bad param passed to text address import\n");
|
||||
nsTextStringBundle::GetStringByID( TEXTIMPORT_ADDRESS_BADPARAM, error, bundle);
|
||||
if (fatalError)
|
||||
*fatalError = PR_TRUE;
|
||||
SetLogs( success, error, pErrorLog, pSuccessLog);
|
||||
return( NS_ERROR_NULL_POINTER);
|
||||
}
|
||||
|
||||
ClearSampleFile();
|
||||
|
||||
PRBool addrAbort = PR_FALSE;
|
||||
nsString name;
|
||||
PRUnichar * pName;
|
||||
if (NS_SUCCEEDED( pSource->GetPreferredName( &pName))) {
|
||||
name = pName;
|
||||
nsCRT::free( pName);
|
||||
}
|
||||
|
||||
PRUint32 addressSize = 0;
|
||||
pSource->GetSize( &addressSize);
|
||||
if (addressSize == 0) {
|
||||
IMPORT_LOG0( "Address book size is 0, skipping import.\n");
|
||||
ReportSuccess( name, &success);
|
||||
SetLogs( success, error, pErrorLog, pSuccessLog);
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
|
||||
nsIFileSpec * inFile;
|
||||
if (NS_FAILED( pSource->GetFileSpec( &inFile))) {
|
||||
ReportError( TEXTIMPORT_ADDRESS_BADSOURCEFILE, name, &error);
|
||||
SetLogs( success, error, pErrorLog, pSuccessLog);
|
||||
return( NS_ERROR_FAILURE);
|
||||
}
|
||||
|
||||
#ifdef IMPORT_DEBUG
|
||||
char *pPath;
|
||||
inFile->GetNativePath( &pPath);
|
||||
IMPORT_LOG1( "Import address book: %s\n", pPath);
|
||||
nsCRT::free( pPath);
|
||||
#endif
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
PRBool isLDIF = PR_FALSE;
|
||||
rv = nsTextAddress::IsLDIFFile( inFile, &isLDIF);
|
||||
if (NS_FAILED( rv)) {
|
||||
inFile->Release();
|
||||
ReportError( TEXTIMPORT_ADDRESS_CONVERTERROR, name, &error);
|
||||
SetLogs( success, error, pErrorLog, pSuccessLog);
|
||||
return( rv);
|
||||
}
|
||||
|
||||
if (isLDIF) {
|
||||
// This get's tricky, the database really requires the thing
|
||||
// to have an .ldi extension so if it doesn't we may need to
|
||||
// copy the file to a temp file with the correct name, then
|
||||
// import it!
|
||||
rv = m_text.ImportLDIF( &addrAbort, name.GetUnicode(), inFile, pDestination, error);
|
||||
}
|
||||
else {
|
||||
rv = m_text.ImportAddresses( &addrAbort, name.GetUnicode(), inFile, pDestination, fieldMap, error, &m_bytesImported);
|
||||
SaveFieldMap( fieldMap);
|
||||
}
|
||||
|
||||
inFile->Release();
|
||||
|
||||
|
||||
if (NS_SUCCEEDED( rv) && error.IsEmpty()) {
|
||||
ReportSuccess( name, &success);
|
||||
}
|
||||
else {
|
||||
ReportError( TEXTIMPORT_ADDRESS_CONVERTERROR, name, &error);
|
||||
}
|
||||
|
||||
SetLogs( success, error, pErrorLog, pSuccessLog);
|
||||
|
||||
IMPORT_LOG0( "*** Text address import done\n");
|
||||
|
||||
return( rv);
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP ImportAddressImpl::GetImportProgress(PRUint32 *_retval)
|
||||
{
|
||||
NS_PRECONDITION(_retval != nsnull, "null ptr");
|
||||
if (!_retval)
|
||||
return( NS_ERROR_NULL_POINTER);
|
||||
|
||||
*_retval = m_bytesImported;
|
||||
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP ImportAddressImpl::GetNeedsFieldMap(nsIFileSpec *location, PRBool *_retval)
|
||||
{
|
||||
NS_PRECONDITION(_retval != nsnull, "null ptr");
|
||||
NS_PRECONDITION(location != nsnull, "null ptr");
|
||||
if (!location || !_retval)
|
||||
return( NS_ERROR_NULL_POINTER);
|
||||
|
||||
*_retval = PR_TRUE;
|
||||
PRBool exists = PR_FALSE;
|
||||
PRBool isFile = PR_FALSE;
|
||||
|
||||
nsresult rv = location->Exists( &exists);
|
||||
rv = location->IsFile( &isFile);
|
||||
|
||||
if (!exists || !isFile)
|
||||
return( NS_ERROR_FAILURE);
|
||||
|
||||
PRBool isLDIF = PR_FALSE;
|
||||
rv = nsTextAddress::IsLDIFFile( location, &isLDIF);
|
||||
if (NS_FAILED( rv)) {
|
||||
IMPORT_LOG0( "*** Error determining if file is of type LDIF\n");
|
||||
return( rv);
|
||||
}
|
||||
|
||||
if (isLDIF)
|
||||
*_retval = PR_FALSE;
|
||||
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
void ImportAddressImpl::SanitizeSampleData( nsCString& val)
|
||||
{
|
||||
// remove any line-feeds...
|
||||
val.ReplaceSubstring( "\x0D\x0A", ", ");
|
||||
val.ReplaceChar( 13, ',');
|
||||
val.ReplaceChar( 10, ',');
|
||||
}
|
||||
|
||||
NS_IMETHODIMP ImportAddressImpl::GetSampleData( PRInt32 index, PRBool *pFound, PRUnichar **pStr)
|
||||
{
|
||||
NS_PRECONDITION(pFound != nsnull, "null ptr");
|
||||
NS_PRECONDITION(pStr != nsnull, "null ptr");
|
||||
if (!pFound || !pStr)
|
||||
return( NS_ERROR_NULL_POINTER);
|
||||
|
||||
if (!m_fileLoc) {
|
||||
IMPORT_LOG0( "*** Error, called GetSampleData before SetSampleLocation\n");
|
||||
return( NS_ERROR_FAILURE);
|
||||
}
|
||||
|
||||
nsresult rv;
|
||||
*pStr = nsnull;
|
||||
PRBool open = PR_FALSE;
|
||||
PRUnichar term = 0;
|
||||
|
||||
if (!m_haveDelim) {
|
||||
rv = m_fileLoc->IsStreamOpen( &open);
|
||||
if (open) {
|
||||
m_fileLoc->CloseStream();
|
||||
open = PR_FALSE;
|
||||
}
|
||||
rv = m_text.DetermineDelim( m_fileLoc);
|
||||
if (NS_FAILED( rv))
|
||||
return( rv);
|
||||
m_haveDelim = PR_TRUE;
|
||||
m_delim = m_text.GetDelim();
|
||||
}
|
||||
else {
|
||||
rv = m_fileLoc->IsStreamOpen( &open);
|
||||
}
|
||||
|
||||
if (!open) {
|
||||
rv = m_fileLoc->OpenStreamForReading();
|
||||
if (NS_FAILED( rv)) {
|
||||
*pFound = PR_FALSE;
|
||||
*pStr = nsCRT::strdup( &term);
|
||||
return( NS_OK);
|
||||
}
|
||||
}
|
||||
|
||||
PRInt32 lineLen;
|
||||
PRInt32 bufSz = 10240;
|
||||
char *pLine = new char[bufSz];
|
||||
|
||||
NS_WITH_SERVICE( nsIImportService, impSvc, kImportServiceCID, &rv);
|
||||
|
||||
rv = nsTextAddress::ReadRecordNumber( m_fileLoc, pLine, bufSz, m_delim, &lineLen, index);
|
||||
if (NS_SUCCEEDED( rv)) {
|
||||
nsString str;
|
||||
nsCString field;
|
||||
nsString uField;
|
||||
PRInt32 fNum = 0;
|
||||
while (nsTextAddress::GetField( pLine, lineLen, fNum, field, m_delim)) {
|
||||
if (fNum)
|
||||
str.AppendWithConversion( "\n");
|
||||
SanitizeSampleData( field);
|
||||
if (impSvc)
|
||||
impSvc->SystemStringToUnicode( field, uField);
|
||||
else
|
||||
uField.AssignWithConversion( field);
|
||||
|
||||
str.Append( uField);
|
||||
fNum++;
|
||||
field.Truncate();
|
||||
}
|
||||
|
||||
*pStr = nsCRT::strdup( str.GetUnicode());
|
||||
*pFound = PR_TRUE;
|
||||
|
||||
/* IMPORT_LOG1( "Sample data: %S\n", str.GetUnicode()); */
|
||||
}
|
||||
else {
|
||||
*pFound = PR_FALSE;
|
||||
*pStr = nsCRT::strdup( &term);
|
||||
}
|
||||
|
||||
delete [] pLine;
|
||||
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP ImportAddressImpl::SetSampleLocation( nsIFileSpec *pLocation)
|
||||
{
|
||||
NS_IF_RELEASE( m_fileLoc);
|
||||
m_haveDelim = PR_FALSE;
|
||||
m_fileLoc = pLocation;
|
||||
NS_IF_ADDREF( m_fileLoc);
|
||||
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
|
||||
void ImportAddressImpl::ClearSampleFile( void)
|
||||
{
|
||||
if (m_fileLoc) {
|
||||
PRBool open = PR_FALSE;
|
||||
m_fileLoc->IsStreamOpen( &open);
|
||||
if (open)
|
||||
m_fileLoc->CloseStream();
|
||||
NS_RELEASE( m_fileLoc);
|
||||
m_fileLoc = nsnull;
|
||||
m_haveDelim = PR_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP ImportAddressImpl::InitFieldMap(nsIFileSpec *location, nsIImportFieldMap *fieldMap)
|
||||
{
|
||||
// Let's remember the last one the user used!
|
||||
// This should be normal for someone importing multiple times, it's usually
|
||||
// from the same file format.
|
||||
|
||||
nsresult rv;
|
||||
NS_WITH_SERVICE( nsIPref, prefs, kPrefServiceCID, &rv);
|
||||
if (NS_SUCCEEDED( rv)) {
|
||||
nsXPIDLCString prefStr;
|
||||
rv = prefs->CopyCharPref( "mailnews.import.text.fieldmap", getter_Copies(prefStr));
|
||||
if (NS_SUCCEEDED( rv)) {
|
||||
const char *pStr = (const char *)prefStr;
|
||||
if (pStr) {
|
||||
fieldMap->SetFieldMapSize( 0);
|
||||
long fNum;
|
||||
PRBool active;
|
||||
long fIndex = 0;
|
||||
while (*pStr) {
|
||||
while (*pStr && (*pStr != '+') && (*pStr != '-'))
|
||||
pStr++;
|
||||
if (*pStr == '+')
|
||||
active = PR_TRUE;
|
||||
else if (*pStr == '-')
|
||||
active = PR_FALSE;
|
||||
else
|
||||
break;
|
||||
fNum = 0;
|
||||
while (*pStr && ((*pStr < '0') || (*pStr > '9')))
|
||||
pStr++;
|
||||
if (!(*pStr))
|
||||
break;
|
||||
while (*pStr && (*pStr >= '0') && (*pStr <= '9')) {
|
||||
fNum *= 10;
|
||||
fNum += (*pStr - '0');
|
||||
pStr++;
|
||||
}
|
||||
while (*pStr && (*pStr != ','))
|
||||
pStr++;
|
||||
if (*pStr == ',')
|
||||
pStr++;
|
||||
fieldMap->SetFieldMap( -1, fNum);
|
||||
fieldMap->SetFieldActive( fIndex, active);
|
||||
fIndex++;
|
||||
}
|
||||
if (!fIndex) {
|
||||
int num;
|
||||
fieldMap->GetNumMozFields( &num);
|
||||
fieldMap->DefaultFieldMap( num);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return( NS_OK);
|
||||
}
|
||||
|
||||
|
||||
void ImportAddressImpl::SaveFieldMap( nsIImportFieldMap *pMap)
|
||||
{
|
||||
if (!pMap)
|
||||
return;
|
||||
|
||||
int size;
|
||||
int index;
|
||||
PRBool active;
|
||||
nsCString str;
|
||||
|
||||
pMap->GetMapSize( &size);
|
||||
for (long i = 0; i < size; i++) {
|
||||
index = i;
|
||||
active = PR_FALSE;
|
||||
pMap->GetFieldMap( i, &index);
|
||||
pMap->GetFieldActive( i, &active);
|
||||
if (active)
|
||||
str.Append( '+');
|
||||
else
|
||||
str.Append( '-');
|
||||
|
||||
str.AppendInt( index);
|
||||
str.Append( ',');
|
||||
}
|
||||
|
||||
PRBool done = PR_FALSE;
|
||||
nsresult rv;
|
||||
// NS_WITH_PROXIED_SERVICE( nsIPref, prefs, kPrefServiceCID, NS_UI_THREAD_EVENTQ, &rv);
|
||||
NS_WITH_SERVICE( nsIPref, prefs, kPrefServiceCID, &rv);
|
||||
|
||||
if (NS_SUCCEEDED( rv)) {
|
||||
nsXPIDLCString prefStr;
|
||||
rv = prefs->CopyCharPref( "mailnews.import.text.fieldmap", getter_Copies(prefStr));
|
||||
if (NS_SUCCEEDED( rv)) {
|
||||
if (!Compare(str, nsCAutoString((const char *)prefStr)))
|
||||
done = PR_TRUE;
|
||||
}
|
||||
if (!done) {
|
||||
rv = prefs->SetCharPref( "mailnews.import.text.fieldmap", str);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,54 +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.
|
||||
;
|
||||
; 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 *****
|
||||
|
||||
LIBRARY mozMapi32.dll
|
||||
DESCRIPTION 'Mozilla Simple MAPI Support'
|
||||
|
||||
EXPORTS
|
||||
MAPILogon
|
||||
MAPILogoff
|
||||
MAPISendMail
|
||||
MAPISendDocuments
|
||||
MAPIFindNext
|
||||
MAPIReadMail
|
||||
MAPISaveMail
|
||||
MAPIDeleteMail
|
||||
MAPIAddress
|
||||
MAPIDetails
|
||||
MAPIResolveName
|
||||
MAPIFreeBuffer
|
||||
GetMapiDllVersion
|
||||
|
||||
@@ -1,335 +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
|
||||
*
|
||||
* 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,61 +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.
|
||||
#
|
||||
# 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 *****
|
||||
|
||||
DEPTH=..\..\..
|
||||
|
||||
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>
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
#!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>
|
||||
@@ -1,64 +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) 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 "nsISupports.idl"
|
||||
|
||||
/**
|
||||
* This interface provides support for registering Mozilla as a COM component
|
||||
* for extending the use of Mail/News through Simple MAPI.
|
||||
*
|
||||
*/
|
||||
|
||||
[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"
|
||||
%}
|
||||
|
||||
@@ -1,174 +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
|
||||
*
|
||||
* 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);
|
||||
|
||||
@@ -1,67 +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
|
||||
*
|
||||
* 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 ***** */
|
||||
|
||||
#ifndef NS_MAPI_SUPPORT_H_
|
||||
#define NS_MAPI_SUPPORT_H_
|
||||
|
||||
#include <nsIObserver.h>
|
||||
#include <nsIMapiSupport.h>
|
||||
#include "msgMapiFactory.h"
|
||||
|
||||
|
||||
#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_
|
||||
@@ -1,64 +0,0 @@
|
||||
# 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
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,48 +0,0 @@
|
||||
/* -*- 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_HOOK_H_
|
||||
#define _MAPI_HOOK_H_
|
||||
|
||||
#include <structs.h> // for MWContext
|
||||
|
||||
//
|
||||
// This is the entry point to the MAPI session manager that lives
|
||||
// inside of Communicator.
|
||||
//
|
||||
LONG ProcessNetscapeMAPIHook(WPARAM wParam, LPARAM lParam);
|
||||
|
||||
#endif // _MAPI_HOOK_H_
|
||||
@@ -1,853 +0,0 @@
|
||||
/* -*- 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);
|
||||
}
|
||||
@@ -1,89 +0,0 @@
|
||||
/* -*- 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_
|
||||
@@ -1,50 +0,0 @@
|
||||
#!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
|
||||
@@ -1,173 +0,0 @@
|
||||
/* -*- 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
|
||||
}
|
||||
@@ -1,116 +0,0 @@
|
||||
/* -*- 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__
|
||||
@@ -1,230 +0,0 @@
|
||||
/* -*- 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,68 +0,0 @@
|
||||
/* -*- 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 __SEQUENCES_OF_STRINGS_H_
|
||||
#define __SEQUENCES_OF_STRINGS_H
|
||||
|
||||
|
||||
typedef LPSTR NSstringSeq;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#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
|
||||
|
||||
|
||||
#endif // __sequences_of_strings_h_
|
||||
@@ -1,26 +0,0 @@
|
||||
#!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>
|
||||
@@ -1,100 +0,0 @@
|
||||
/* -*- 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
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
# 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
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,14 +0,0 @@
|
||||
EXPORTS
|
||||
MAPILogon
|
||||
MAPILogoff
|
||||
MAPISendMail
|
||||
MAPISendDocuments
|
||||
MAPIFreeBuffer
|
||||
MAPIFindNext
|
||||
MAPIReadMail
|
||||
MAPISaveMail
|
||||
MAPIDeleteMail
|
||||
MAPIAddress
|
||||
MAPIDetails
|
||||
MAPIResolveName
|
||||
MAPIGetNetscapeVersion
|
||||
@@ -1,146 +0,0 @@
|
||||
// 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
|
||||
|
||||
@@ -1,249 +0,0 @@
|
||||
/* -*- 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,63 +0,0 @@
|
||||
/* -*- 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 __MAPIIPC_HPP__
|
||||
#define __MAPIIPC_HPP__
|
||||
|
||||
#include "port.h"
|
||||
#include <nscpmapi.h>
|
||||
|
||||
//********************************************************
|
||||
// Open and close functions for API
|
||||
//********************************************************
|
||||
// Open the API
|
||||
// Return: 1 on success, 0 on failure
|
||||
//
|
||||
DWORD nsMAPI_OpenAPI(void);
|
||||
|
||||
//
|
||||
// Purpose: Close the API
|
||||
//
|
||||
void nsMAPI_CloseAPI(void);
|
||||
|
||||
//
|
||||
// Send the actual request to Communicator
|
||||
//
|
||||
LRESULT SendMAPIRequest(HWND hWnd,
|
||||
DWORD mapiRequestID,
|
||||
MAPIIPCType *ipcInfo);
|
||||
|
||||
#endif // __MAPIIPC_HPP__
|
||||
@@ -1,363 +0,0 @@
|
||||
/* -*- 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);
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
/* -*- 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__
|
||||
@@ -1,899 +0,0 @@
|
||||
/* -*- 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;
|
||||
}
|
||||
@@ -1,89 +0,0 @@
|
||||
/* -*- 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_
|
||||
@@ -1,303 +0,0 @@
|
||||
/* -*- 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,54 +0,0 @@
|
||||
/* -*- 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 ***** */
|
||||
//{{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
|
||||
|
||||
// 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
|
||||
@@ -1,172 +0,0 @@
|
||||
/* -*- 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,68 +0,0 @@
|
||||
/* -*- 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 <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
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, lpszFormat);
|
||||
|
||||
int nBuf;
|
||||
TCHAR szBuffer[512];
|
||||
|
||||
nBuf = _vstprintf(szBuffer, lpszFormat, args);
|
||||
va_end(args);
|
||||
OutputDebugString(szBuffer);
|
||||
return;
|
||||
}
|
||||
|
||||
BOOL AfxAssertFailedLine(LPCSTR lpszFileName, int nLine)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,81 +0,0 @@
|
||||
/* -*- 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
|
||||
|
||||
@@ -1,347 +0,0 @@
|
||||
/* -*- 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
|
||||
}
|
||||
@@ -1,138 +0,0 @@
|
||||
/* -*- 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
|
||||
@@ -1,31 +0,0 @@
|
||||
#!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>
|
||||
|
||||
@@ -1,351 +0,0 @@
|
||||
/* -*- 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
|
||||
@@ -1,27 +0,0 @@
|
||||
#!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>
|
||||
@@ -1,239 +0,0 @@
|
||||
/* -*- 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;
|
||||
}
|
||||
@@ -1,240 +0,0 @@
|
||||
# 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
|
||||
|
||||
@@ -1,772 +0,0 @@
|
||||
/* -*- 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]));
|
||||
}
|
||||
}
|
||||
@@ -1,832 +0,0 @@
|
||||
/* -*- 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");
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
# 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"\
|
||||
|
||||
@@ -1,121 +0,0 @@
|
||||
# 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
|
||||
@@ -1,29 +0,0 @@
|
||||
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>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,44 +0,0 @@
|
||||
<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>
|
||||
@@ -1,245 +0,0 @@
|
||||
//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
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 766 B |
@@ -1,303 +0,0 @@
|
||||
/* -*- 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,137 +0,0 @@
|
||||
/* -*- 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);
|
||||
}
|
||||
@@ -1,108 +0,0 @@
|
||||
//{{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
|
||||
@@ -1,117 +0,0 @@
|
||||
<?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>
|
||||
@@ -1,4 +0,0 @@
|
||||
messenger.jar:
|
||||
content/messenger/pref-mailnewsOverlay.xul
|
||||
+ content/messenger/contents.rdf
|
||||
content/messenger/pref-mailnewsOverlay.js
|
||||
@@ -1,14 +0,0 @@
|
||||
<?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>
|
||||
@@ -1,104 +0,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/
|
||||
*
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
<?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>
|
||||
@@ -1,3 +0,0 @@
|
||||
en-US.jar:
|
||||
locale/en-US/messenger/pref-mailnewsOverlay.dtd
|
||||
locale/en-US/messenger/mapi.properties
|
||||
@@ -1,18 +0,0 @@
|
||||
# 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
|
||||
@@ -1,3 +0,0 @@
|
||||
<!ENTITY enableMapiTitle.label "When sending mail from other applications">
|
||||
<!ENTITY enableMapi.label "Use &vendorShortName; Mail as the default mail application.">
|
||||
<!ENTITY enableMapi.accesskey "u">
|
||||
1081
mozilla/mailnews/news/src/nsNNTPNewsgroupList.cpp
Normal file
1081
mozilla/mailnews/news/src/nsNNTPNewsgroupList.cpp
Normal file
File diff suppressed because it is too large
Load Diff
5552
mozilla/mailnews/news/src/nsNNTPProtocol.cpp
Normal file
5552
mozilla/mailnews/news/src/nsNNTPProtocol.cpp
Normal file
File diff suppressed because it is too large
Load Diff
1966
mozilla/modules/libpref/src/nsPref.cpp
Normal file
1966
mozilla/modules/libpref/src/nsPref.cpp
Normal file
File diff suppressed because it is too large
Load Diff
4252
mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp
Normal file
4252
mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp
Normal file
File diff suppressed because it is too large
Load Diff
4252
mozilla/modules/plugin/nglsrc/nsPluginHostImpl.cpp
Normal file
4252
mozilla/modules/plugin/nglsrc/nsPluginHostImpl.cpp
Normal file
File diff suppressed because it is too large
Load Diff
501
mozilla/netwerk/base/src/nsIOService.cpp
Normal file
501
mozilla/netwerk/base/src/nsIOService.cpp
Normal file
@@ -0,0 +1,501 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
#include "nsIOService.h"
|
||||
#include "nsIProtocolHandler.h"
|
||||
#include "nscore.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIEventQueueService.h"
|
||||
#include "nsIFileTransportService.h"
|
||||
#include "nsIURI.h"
|
||||
#include "nsIStreamListener.h"
|
||||
#include "prprf.h"
|
||||
#include "nsLoadGroup.h"
|
||||
#include "nsInputStreamChannel.h"
|
||||
#include "nsXPIDLString.h"
|
||||
#include "nsIErrorService.h"
|
||||
#include "netCore.h"
|
||||
#include "nsIObserverService.h"
|
||||
|
||||
static NS_DEFINE_CID(kFileTransportService, NS_FILETRANSPORTSERVICE_CID);
|
||||
static NS_DEFINE_CID(kEventQueueService, NS_EVENTQUEUESERVICE_CID);
|
||||
static NS_DEFINE_CID(kSocketTransportServiceCID, NS_SOCKETTRANSPORTSERVICE_CID);
|
||||
static NS_DEFINE_CID(kDNSServiceCID, NS_DNSSERVICE_CID);
|
||||
static NS_DEFINE_CID(kErrorServiceCID, NS_ERRORSERVICE_CID);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
nsIOService::nsIOService()
|
||||
: mOffline(PR_FALSE)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsIOService::Init()
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
// Hold onto the eventQueue service. We do not want any eventqueues to go away
|
||||
// when we shutdown until we process all remaining transports
|
||||
|
||||
if (NS_SUCCEEDED(rv))
|
||||
mEventQueueService = do_GetService(NS_EVENTQUEUESERVICE_CONTRACTID, &rv);
|
||||
|
||||
|
||||
// We need to get references to these services so that we can shut them
|
||||
// down later. If we wait until the nsIOService is being shut down,
|
||||
// GetService will fail at that point.
|
||||
rv = nsServiceManager::GetService(kSocketTransportServiceCID,
|
||||
NS_GET_IID(nsISocketTransportService),
|
||||
getter_AddRefs(mSocketTransportService));
|
||||
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = nsServiceManager::GetService(kFileTransportService,
|
||||
NS_GET_IID(nsIFileTransportService),
|
||||
getter_AddRefs(mFileTransportService));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
rv = nsServiceManager::GetService(kDNSServiceCID,
|
||||
NS_GET_IID(nsIDNSService),
|
||||
getter_AddRefs(mDNSService));
|
||||
|
||||
// XXX hack until xpidl supports error info directly (http://bugzilla.mozilla.org/show_bug.cgi?id=13423)
|
||||
nsCOMPtr<nsIErrorService> errorService = do_GetService(kErrorServiceCID, &rv);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
rv = errorService->RegisterErrorStringBundle(NS_ERROR_MODULE_NETWORK, NECKO_MSGS_URL);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
rv = errorService->RegisterErrorStringBundleKey(NS_NET_STATUS_READ_FROM, "ReadFrom");
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
rv = errorService->RegisterErrorStringBundleKey(NS_NET_STATUS_WROTE_TO, "WroteTo");
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
rv = errorService->RegisterErrorStringBundleKey(NS_NET_STATUS_RESOLVING_HOST, "ResolvingHost");
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
rv = errorService->RegisterErrorStringBundleKey(NS_NET_STATUS_CONNECTED_TO, "ConnectedTo");
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
rv = errorService->RegisterErrorStringBundleKey(NS_NET_STATUS_SENDING_TO, "SendingTo");
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
rv = errorService->RegisterErrorStringBundleKey(NS_NET_STATUS_RECEIVING_FROM, "ReceivingFrom");
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
rv = errorService->RegisterErrorStringBundleKey(NS_NET_STATUS_CONNECTING_TO, "ConnectingTo");
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
nsIOService::~nsIOService()
|
||||
{
|
||||
(void)SetOffline(PR_TRUE);
|
||||
if (mFileTransportService)
|
||||
(void)mFileTransportService->Shutdown();
|
||||
}
|
||||
|
||||
NS_METHOD
|
||||
nsIOService::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult)
|
||||
{
|
||||
static nsISupports *_rValue = nsnull;
|
||||
|
||||
nsresult rv;
|
||||
NS_ENSURE_NO_AGGREGATION(aOuter);
|
||||
|
||||
if (_rValue)
|
||||
{
|
||||
NS_ADDREF (_rValue);
|
||||
*aResult = _rValue;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsIOService* _ios = new nsIOService();
|
||||
if (_ios == nsnull)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
NS_ADDREF(_ios);
|
||||
rv = _ios->Init();
|
||||
if (NS_FAILED(rv))
|
||||
{
|
||||
delete _ios;
|
||||
return rv;
|
||||
}
|
||||
|
||||
rv = _ios->QueryInterface(aIID, aResult);
|
||||
|
||||
if (NS_FAILED(rv))
|
||||
{
|
||||
delete _ios;
|
||||
return rv;
|
||||
}
|
||||
|
||||
_rValue = NS_STATIC_CAST (nsISupports*, *aResult);
|
||||
NS_RELEASE (_rValue);
|
||||
_rValue = nsnull;
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMPL_THREADSAFE_ISUPPORTS1(nsIOService, nsIIOService);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define MAX_SCHEME_LENGTH 64 // XXX big enough?
|
||||
|
||||
#define MAX_NET_CONTRACTID_LENGTH (MAX_SCHEME_LENGTH + NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX_LENGTH + 1)
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsIOService::CacheProtocolHandler(const char *scheme, nsIProtocolHandler *handler)
|
||||
{
|
||||
for (unsigned int i=0; i<NS_N(gScheme); i++)
|
||||
{
|
||||
if (!nsCRT::strcasecmp(scheme, gScheme[i]))
|
||||
{
|
||||
nsresult rv;
|
||||
NS_ASSERTION(!mWeakHandler[i], "Protocol handler already cached");
|
||||
// Make sure the handler supports weak references.
|
||||
nsCOMPtr<nsISupportsWeakReference> factoryPtr = do_QueryInterface(handler, &rv);
|
||||
if (!factoryPtr)
|
||||
{
|
||||
// Dont cache handlers that dont support weak reference as
|
||||
// there is real danger of a circular reference.
|
||||
#ifdef DEBUG_dp
|
||||
printf("DEBUG: %s protcol handler doesn't support weak ref. Not cached.\n", scheme);
|
||||
#endif /* DEBUG_dp */
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
mWeakHandler[i] = getter_AddRefs(NS_GetWeakReference(handler));
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsIOService::GetCachedProtocolHandler(const char *scheme, nsIProtocolHandler **result)
|
||||
{
|
||||
for (unsigned int i=0; i<NS_N(gScheme); i++)
|
||||
{
|
||||
if (!nsCRT::strcasecmp(scheme, gScheme[i]))
|
||||
if (mWeakHandler[i])
|
||||
{
|
||||
nsCOMPtr<nsIProtocolHandler> temp = do_QueryReferent(mWeakHandler[i]);
|
||||
if (temp)
|
||||
{
|
||||
*result = temp.get();
|
||||
NS_ADDREF(*result);
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsIOService::GetProtocolHandler(const char* scheme, nsIProtocolHandler* *result)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
NS_ASSERTION(NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX_LENGTH
|
||||
== nsCRT::strlen(NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX),
|
||||
"need to fix NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX_LENGTH");
|
||||
|
||||
NS_ENSURE_ARG_POINTER(scheme);
|
||||
// XXX we may want to speed this up by introducing our own protocol
|
||||
// scheme -> protocol handler mapping, avoiding the string manipulation
|
||||
// and service manager stuff
|
||||
|
||||
rv = GetCachedProtocolHandler(scheme, result);
|
||||
if (NS_SUCCEEDED(rv)) return NS_OK;
|
||||
|
||||
char buf[MAX_NET_CONTRACTID_LENGTH];
|
||||
nsCAutoString contractID(NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX);
|
||||
contractID += scheme;
|
||||
contractID.ToLowerCase();
|
||||
contractID.ToCString(buf, MAX_NET_CONTRACTID_LENGTH);
|
||||
|
||||
rv = nsServiceManager::GetService(buf, NS_GET_IID(nsIProtocolHandler), (nsISupports **)result);
|
||||
if (NS_FAILED(rv))
|
||||
{
|
||||
// okay we don't have a protocol handler to handle this url type, so use the default protocol handler.
|
||||
// this will cause urls to get dispatched out to the OS ('cause we can't do anything with them) when
|
||||
// we try to read from a channel created by the default protocol handler.
|
||||
|
||||
rv = nsServiceManager::GetService(NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX"default", NS_GET_IID(nsIProtocolHandler), (nsISupports **)result);
|
||||
if (NS_FAILED(rv)) return NS_ERROR_UNKNOWN_PROTOCOL;
|
||||
}
|
||||
|
||||
CacheProtocolHandler(scheme, *result);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsIOService::ExtractScheme(const char* inURI, PRUint32 *startPos,
|
||||
PRUint32 *endPos, char* *scheme)
|
||||
{
|
||||
return ExtractURLScheme(inURI, startPos, endPos, scheme);
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsIOService::NewURI(const char* aSpec, nsIURI* aBaseURI,
|
||||
nsIURI* *result, nsIProtocolHandler* *hdlrResult)
|
||||
{
|
||||
nsresult rv;
|
||||
nsIURI* base;
|
||||
NS_ENSURE_ARG_POINTER(aSpec);
|
||||
char* scheme;
|
||||
rv = ExtractScheme(aSpec, nsnull, nsnull, &scheme);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
// then aSpec is absolute
|
||||
// ignore aBaseURI in this case
|
||||
base = nsnull;
|
||||
}
|
||||
else {
|
||||
// then aSpec is relative
|
||||
if (aBaseURI == nsnull)
|
||||
return NS_ERROR_MALFORMED_URI;
|
||||
rv = aBaseURI->GetScheme(&scheme);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
base = aBaseURI;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIProtocolHandler> handler;
|
||||
rv = GetProtocolHandler(scheme, getter_AddRefs(handler));
|
||||
nsCRT::free(scheme);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
if (hdlrResult) {
|
||||
*hdlrResult = handler;
|
||||
NS_ADDREF(*hdlrResult);
|
||||
}
|
||||
return handler->NewURI(aSpec, base, result);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsIOService::NewURI(const char* aSpec, nsIURI* aBaseURI,
|
||||
nsIURI* *result)
|
||||
{
|
||||
return NewURI(aSpec, aBaseURI, result, nsnull);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsIOService::NewChannelFromURI(nsIURI *aURI, nsIChannel **result)
|
||||
{
|
||||
nsresult rv;
|
||||
NS_ENSURE_ARG_POINTER(aURI);
|
||||
|
||||
nsXPIDLCString scheme;
|
||||
rv = aURI->GetScheme(getter_Copies(scheme));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
nsCOMPtr<nsIProtocolHandler> handler;
|
||||
rv = GetProtocolHandler((const char*)scheme, getter_AddRefs(handler));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = handler->NewChannel(aURI, result);
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsIOService::NewChannel(const char *aSpec, nsIURI *aBaseURI, nsIChannel **result)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIURI> uri;
|
||||
nsCOMPtr<nsIProtocolHandler> handler;
|
||||
rv = NewURI(aSpec, aBaseURI, getter_AddRefs(uri), getter_AddRefs(handler));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = handler->NewChannel(uri, result);
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsIOService::GetOffline(PRBool *offline)
|
||||
{
|
||||
*offline = mOffline;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsIOService::SetOffline(PRBool offline)
|
||||
{
|
||||
nsCOMPtr<nsIObserverService>
|
||||
observerService(do_GetService(NS_OBSERVERSERVICE_CONTRACTID));
|
||||
|
||||
nsresult rv1 = NS_OK;
|
||||
nsresult rv2 = NS_OK;
|
||||
if (offline) {
|
||||
mOffline = PR_TRUE; // indicate we're trying to shutdown
|
||||
// be sure to try and shutdown both (even if the first fails)
|
||||
if (mDNSService)
|
||||
rv1 = mDNSService->Shutdown(); // shutdown dns service first, because it has callbacks for socket transport
|
||||
if (mSocketTransportService)
|
||||
rv2 = mSocketTransportService->Shutdown();
|
||||
if (NS_FAILED(rv1)) return rv1;
|
||||
if (NS_FAILED(rv2)) return rv2;
|
||||
|
||||
// don't care if notification fails
|
||||
if (observerService)
|
||||
(void)observerService->Notify(this,
|
||||
NS_LITERAL_STRING("network:offline-status-changed").get(),
|
||||
NS_LITERAL_STRING("offline").get());
|
||||
}
|
||||
else if (!offline && mOffline) {
|
||||
// go online
|
||||
if (mDNSService)
|
||||
rv1 = mDNSService->Init();
|
||||
if (NS_FAILED(rv2)) return rv1;
|
||||
|
||||
if (mSocketTransportService)
|
||||
rv2 = mSocketTransportService->Init(); //XXX should we shutdown the dns service?
|
||||
if (NS_FAILED(rv2)) return rv1;
|
||||
mOffline = PR_FALSE; // indicate success only AFTER we've
|
||||
// brought up the services
|
||||
// don't care if notification fails
|
||||
if (observerService)
|
||||
(void)observerService->Notify(this,
|
||||
NS_LITERAL_STRING("network:offline-status-changed").get(),
|
||||
NS_LITERAL_STRING("online").get());
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// URL parsing utilities
|
||||
|
||||
/* encode characters into % escaped hexcodes */
|
||||
|
||||
/* use the following masks to specify which
|
||||
part of an URL you want to escape:
|
||||
|
||||
url_Scheme = 1
|
||||
url_Username = 2
|
||||
url_Password = 4
|
||||
url_Host = 8
|
||||
url_Directory = 16
|
||||
url_FileBaseName = 32
|
||||
url_FileExtension = 64
|
||||
url_Param = 128
|
||||
url_Query = 256
|
||||
url_Ref = 512
|
||||
*/
|
||||
|
||||
/* by default this function will not escape parts of a string
|
||||
that already look escaped, which means it already includes
|
||||
a valid hexcode. This is done to avoid multiple escapes of
|
||||
a string. Use the following mask to force escaping of a
|
||||
string:
|
||||
|
||||
url_Forced = 1024
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
nsIOService::Escape(const char *str, PRInt16 mask, char** result)
|
||||
{
|
||||
nsCAutoString esc_str;
|
||||
nsresult rv = nsURLEscape((char*)str,mask,esc_str);
|
||||
CRTFREEIF(*result);
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
*result = esc_str.ToNewCString();
|
||||
if (!*result)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsIOService::Unescape(const char *str, char **result)
|
||||
{
|
||||
return nsURLUnescape((char*)str,result);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsIOService::ExtractPort(const char *str, PRInt32 *result)
|
||||
{
|
||||
PRInt32 returnValue = -1;
|
||||
*result = (0 < PR_sscanf(str, "%d", &returnValue)) ? returnValue : -1;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsIOService::ResolveRelativePath(const char *relativePath, const char* basePath,
|
||||
char **result)
|
||||
{
|
||||
nsCAutoString name;
|
||||
nsCAutoString path(basePath);
|
||||
PRBool needsDelim = PR_FALSE;
|
||||
|
||||
if ( !path.IsEmpty() ) {
|
||||
PRUnichar last = path.Last();
|
||||
needsDelim = !(last == '/' || last == '\\' );
|
||||
}
|
||||
|
||||
PRBool end = PR_FALSE;
|
||||
char c;
|
||||
while (!end) {
|
||||
c = *relativePath++;
|
||||
switch (c) {
|
||||
case '\0':
|
||||
case '#':
|
||||
case ';':
|
||||
case '?':
|
||||
end = PR_TRUE;
|
||||
// fall through...
|
||||
case '/':
|
||||
case '\\':
|
||||
// delimiter found
|
||||
if (name.Equals("..")) {
|
||||
// pop path
|
||||
PRInt32 pos = path.RFind("/");
|
||||
if (pos > 0) {
|
||||
path.Truncate(pos + 1);
|
||||
path += name;
|
||||
}
|
||||
else {
|
||||
return NS_ERROR_MALFORMED_URI;
|
||||
}
|
||||
}
|
||||
else if (name.Equals(".") || name.Equals("")) {
|
||||
// do nothing
|
||||
}
|
||||
else {
|
||||
// append name to path
|
||||
if (needsDelim)
|
||||
path += "/";
|
||||
path += name;
|
||||
needsDelim = PR_TRUE;
|
||||
}
|
||||
name = "";
|
||||
break;
|
||||
|
||||
default:
|
||||
// append char to name
|
||||
name += c;
|
||||
}
|
||||
}
|
||||
// append anything left on relativePath (e.g. #..., ;..., ?...)
|
||||
if (c != '\0')
|
||||
path += --relativePath;
|
||||
|
||||
*result = path.ToNewCString();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
1330
mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp
Normal file
1330
mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp
Normal file
File diff suppressed because it is too large
Load Diff
1034
mozilla/parser/htmlparser/src/nsHTMLTokenizer.cpp
Normal file
1034
mozilla/parser/htmlparser/src/nsHTMLTokenizer.cpp
Normal file
File diff suppressed because it is too large
Load Diff
789
mozilla/parser/htmlparser/src/nsLoggingSink.cpp
Normal file
789
mozilla/parser/htmlparser/src/nsLoggingSink.cpp
Normal file
@@ -0,0 +1,789 @@
|
||||
/* -*- Mode: C++; tab-width: 2; 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 Communicator client 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.
|
||||
*
|
||||
* Notes:
|
||||
* The logging sink is now both a sink and a proxy.
|
||||
* If you want to dump the calls from the parser to the sink,
|
||||
* create a content sink as usual and hand it to the parser.
|
||||
*
|
||||
* If you want to use a normal sink AND simultaneously have a
|
||||
* parse-log generated, you can set an environment variable
|
||||
* and a logging sink will be created. It will act as a proxy
|
||||
* to the REAL sink you are using after it logs the call. This
|
||||
* form of the loggingsink is constructed using the version
|
||||
* that accepts an nsIHTMLContentSink*.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
#include "nsLoggingSink.h"
|
||||
#include "nsHTMLTags.h"
|
||||
#include "nsString.h"
|
||||
#include "prprf.h"
|
||||
|
||||
static NS_DEFINE_IID(kIContentSinkIID, NS_ICONTENT_SINK_IID);
|
||||
static NS_DEFINE_IID(kIHTMLContentSinkIID, NS_IHTML_CONTENT_SINK_IID);
|
||||
static NS_DEFINE_IID(kILoggingSinkIID, NS_ILOGGING_SINK_IID);
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
|
||||
// list of tags that have skipped content
|
||||
static char gSkippedContentTags[] = {
|
||||
eHTMLTag_style,
|
||||
eHTMLTag_script,
|
||||
eHTMLTag_server,
|
||||
eHTMLTag_textarea,
|
||||
eHTMLTag_title,
|
||||
0
|
||||
};
|
||||
|
||||
|
||||
nsresult
|
||||
NS_NewHTMLLoggingSink(nsIContentSink** aInstancePtrResult)
|
||||
{
|
||||
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
|
||||
if (nsnull == aInstancePtrResult) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
nsLoggingSink* it = new nsLoggingSink();
|
||||
if (nsnull == it) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return it->QueryInterface(kIContentSinkIID, (void**) aInstancePtrResult);
|
||||
}
|
||||
|
||||
nsLoggingSink::nsLoggingSink() {
|
||||
NS_INIT_REFCNT();
|
||||
mOutput = 0;
|
||||
mLevel=-1;
|
||||
mSink=0;
|
||||
}
|
||||
|
||||
nsLoggingSink::~nsLoggingSink() {
|
||||
mSink=0;
|
||||
if(mOutput && mAutoDeleteOutput) {
|
||||
delete mOutput;
|
||||
}
|
||||
mOutput=0;
|
||||
}
|
||||
|
||||
NS_IMPL_ADDREF(nsLoggingSink)
|
||||
NS_IMPL_RELEASE(nsLoggingSink)
|
||||
|
||||
nsresult
|
||||
nsLoggingSink::QueryInterface(const nsIID& aIID, void** aInstancePtr)
|
||||
{
|
||||
NS_PRECONDITION(nsnull != aInstancePtr, "null ptr");
|
||||
if (nsnull == aInstancePtr) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
nsISupports* tmp = this;
|
||||
*aInstancePtr = (void*) tmp;
|
||||
}
|
||||
else if (aIID.Equals(kIContentSinkIID)) {
|
||||
nsIContentSink* tmp = this;
|
||||
*aInstancePtr = (void*) tmp;
|
||||
}
|
||||
else if (aIID.Equals(kIHTMLContentSinkIID)) {
|
||||
nsIHTMLContentSink* tmp = this;
|
||||
*aInstancePtr = (void*) tmp;
|
||||
}
|
||||
else if (aIID.Equals(kILoggingSinkIID)) {
|
||||
nsILoggingSink* tmp = this;
|
||||
*aInstancePtr = (void*) tmp;
|
||||
}
|
||||
else {
|
||||
*aInstancePtr = nsnull;
|
||||
return NS_NOINTERFACE;
|
||||
}
|
||||
NS_ADDREF(this);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::SetOutputStream(PRFileDesc *aStream,PRBool autoDeleteOutput) {
|
||||
mOutput = aStream;
|
||||
mAutoDeleteOutput=autoDeleteOutput;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
static
|
||||
void WriteTabs(PRFileDesc * out,int aTabCount) {
|
||||
int tabs;
|
||||
for(tabs=0;tabs<aTabCount;tabs++)
|
||||
PR_fprintf(out, " ");
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::WillBuildModel() {
|
||||
|
||||
WriteTabs(mOutput,++mLevel);
|
||||
PR_fprintf(mOutput, "<begin>\n");
|
||||
|
||||
//proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
mSink->WillBuildModel();
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::DidBuildModel(PRInt32 aQualityLevel) {
|
||||
|
||||
WriteTabs(mOutput,--mLevel);
|
||||
PR_fprintf(mOutput, "</begin>\n");
|
||||
|
||||
//proxy the call to the real sink if you have one.
|
||||
nsresult theResult=NS_OK;
|
||||
if(mSink) {
|
||||
theResult=mSink->DidBuildModel(aQualityLevel);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::WillInterrupt() {
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->WillInterrupt();
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::WillResume() {
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->WillResume();
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::SetParser(nsIParser* aParser) {
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->SetParser(aParser);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::OpenContainer(const nsIParserNode& aNode) {
|
||||
|
||||
OpenNode("container", aNode); //do the real logging work...
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->OpenContainer(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::CloseContainer(const nsIParserNode& aNode) {
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
nsHTMLTag nodeType = nsHTMLTag(aNode.GetNodeType());
|
||||
if ((nodeType >= eHTMLTag_unknown) &&
|
||||
(nodeType <= nsHTMLTag(NS_HTML_TAG_MAX))) {
|
||||
const char* tag = nsHTMLTags::GetStringValue(nodeType);
|
||||
theResult=CloseNode(tag);
|
||||
}
|
||||
else theResult= CloseNode("???");
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->CloseContainer(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::AddLeaf(const nsIParserNode& aNode) {
|
||||
LeafNode(aNode);
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->AddLeaf(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::NotifyError(const nsParserError* aError) {
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->NotifyError(aError);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This gets called by the parser when you want to add
|
||||
* a PI node to the current container in the content
|
||||
* model.
|
||||
*
|
||||
* @updated gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::AddProcessingInstruction(const nsIParserNode& aNode){
|
||||
|
||||
#ifdef VERBOSE_DEBUG
|
||||
DebugDump("<",aNode.GetText(),(mNodeStackPos)*2);
|
||||
#endif
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->AddProcessingInstruction(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
/**
|
||||
* This gets called by the parser when it encounters
|
||||
* a DOCTYPE declaration in the HTML document.
|
||||
*/
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::AddDocTypeDecl(const nsIParserNode& aNode, PRInt32 aMode) {
|
||||
|
||||
#ifdef VERBOSE_DEBUG
|
||||
DebugDump("<",aNode.GetText(),(mNodeStackPos)*2);
|
||||
#endif
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->AddDocTypeDecl(aNode,aMode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* This gets called by the parser when you want to add
|
||||
* a comment node to the current container in the content
|
||||
* model.
|
||||
*
|
||||
* @updated gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::AddComment(const nsIParserNode& aNode){
|
||||
|
||||
#ifdef VERBOSE_DEBUG
|
||||
DebugDump("<",aNode.GetText(),(mNodeStackPos)*2);
|
||||
#endif
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->AddComment(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::SetTitle(const nsString& aValue) {
|
||||
|
||||
char* tmp;
|
||||
GetNewCString(aValue, &tmp);
|
||||
WriteTabs(mOutput,++mLevel);
|
||||
if(tmp) {
|
||||
PR_fprintf(mOutput, "<title value=\"%s\"/>\n", tmp);
|
||||
nsMemory::Free(tmp);
|
||||
}
|
||||
--mLevel;
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->SetTitle(aValue);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::OpenHTML(const nsIParserNode& aNode) {
|
||||
OpenNode("html", aNode);
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->OpenHTML(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::CloseHTML(const nsIParserNode& aNode) {
|
||||
CloseNode("html");
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->CloseHTML(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::OpenHead(const nsIParserNode& aNode) {
|
||||
OpenNode("head", aNode);
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->OpenHead(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::CloseHead(const nsIParserNode& aNode) {
|
||||
CloseNode("head");
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->CloseHead(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::OpenBody(const nsIParserNode& aNode) {
|
||||
OpenNode("body", aNode);
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->OpenBody(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::CloseBody(const nsIParserNode& aNode) {
|
||||
CloseNode("body");
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->CloseBody(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::OpenForm(const nsIParserNode& aNode) {
|
||||
OpenNode("form", aNode);
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->OpenForm(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::CloseForm(const nsIParserNode& aNode) {
|
||||
CloseNode("form");
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->CloseForm(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::OpenMap(const nsIParserNode& aNode) {
|
||||
OpenNode("map", aNode);
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->OpenMap(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::CloseMap(const nsIParserNode& aNode) {
|
||||
CloseNode("map");
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->CloseMap(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::OpenFrameset(const nsIParserNode& aNode) {
|
||||
OpenNode("frameset", aNode);
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->OpenFrameset(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::CloseFrameset(const nsIParserNode& aNode) {
|
||||
CloseNode("frameset");
|
||||
|
||||
nsresult theResult=NS_OK;
|
||||
|
||||
//then proxy the call to the real sink if you have one.
|
||||
if(mSink) {
|
||||
theResult=mSink->CloseFrameset(aNode);
|
||||
}
|
||||
|
||||
return theResult;
|
||||
}
|
||||
|
||||
|
||||
nsresult
|
||||
nsLoggingSink::OpenNode(const char* aKind, const nsIParserNode& aNode) {
|
||||
WriteTabs(mOutput,++mLevel);
|
||||
|
||||
PR_fprintf(mOutput,"<open container=");
|
||||
|
||||
nsHTMLTag nodeType = nsHTMLTag(aNode.GetNodeType());
|
||||
if ((nodeType >= eHTMLTag_unknown) &&
|
||||
(nodeType <= nsHTMLTag(NS_HTML_TAG_MAX))) {
|
||||
const char* tag = nsHTMLTags::GetStringValue(nodeType);
|
||||
PR_fprintf(mOutput, "\"%s\"", tag);
|
||||
}
|
||||
else {
|
||||
char* text;
|
||||
GetNewCString(aNode.GetText(), &text);
|
||||
if(text) {
|
||||
PR_fprintf(mOutput, "\"%s\"", text);
|
||||
nsMemory::Free(text);
|
||||
}
|
||||
}
|
||||
|
||||
if (WillWriteAttributes(aNode)) {
|
||||
PR_fprintf(mOutput, ">\n");
|
||||
WriteAttributes(aNode);
|
||||
PR_fprintf(mOutput, "</open>\n");
|
||||
}
|
||||
else {
|
||||
PR_fprintf(mOutput, ">\n");
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsLoggingSink::CloseNode(const char* aKind) {
|
||||
WriteTabs(mOutput,mLevel--);
|
||||
PR_fprintf(mOutput, "<close container=\"%s\">\n", aKind);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
nsresult
|
||||
nsLoggingSink::WriteAttributes(const nsIParserNode& aNode) {
|
||||
|
||||
WriteTabs(mOutput,1+mLevel);
|
||||
nsAutoString tmp;
|
||||
PRInt32 ac = aNode.GetAttributeCount();
|
||||
for (PRInt32 i = 0; i < ac; i++) {
|
||||
char* key=nsnull;
|
||||
char* value=nsnull;
|
||||
const nsAReadableString& k = aNode.GetKeyAt(i);
|
||||
const nsString& v = aNode.GetValueAt(i);
|
||||
|
||||
GetNewCString(k, &key);
|
||||
if(key) {
|
||||
PR_fprintf(mOutput, " <attr key=\"%s\" value=\"", key);
|
||||
nsMemory::Free(key);
|
||||
}
|
||||
|
||||
tmp.Truncate();
|
||||
tmp.Append(v);
|
||||
if(tmp.Length() > 0) {
|
||||
PRUnichar first = tmp.First();
|
||||
if ((first == '"') || (first == '\'')) {
|
||||
if (tmp.Last() == first) {
|
||||
tmp.Cut(0, 1);
|
||||
PRInt32 pos = tmp.Length() - 1;
|
||||
if (pos >= 0) {
|
||||
tmp.Cut(pos, 1);
|
||||
}
|
||||
} else {
|
||||
// Mismatched quotes - leave them in
|
||||
}
|
||||
}
|
||||
GetNewCString(tmp, &value);
|
||||
|
||||
if(value) {
|
||||
PR_fprintf(mOutput, "%s\"/>\n", value);
|
||||
WriteTabs(mOutput,1+mLevel);
|
||||
nsMemory::Free(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (0 != strchr(gSkippedContentTags, aNode.GetNodeType())) {
|
||||
char* content;
|
||||
GetNewCString(aNode.GetSkippedContent(), &content);
|
||||
if(content) {
|
||||
PR_fprintf(mOutput, " <content value=\"");
|
||||
PR_fprintf(mOutput, "%s\"/>\n", content) ;
|
||||
nsMemory::Free(content);
|
||||
}
|
||||
}
|
||||
WriteTabs(mOutput,1+mLevel);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsLoggingSink::WillWriteAttributes(const nsIParserNode& aNode)
|
||||
{
|
||||
PRInt32 ac = aNode.GetAttributeCount();
|
||||
if (0 != ac) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
if (0 != strchr(gSkippedContentTags, aNode.GetNodeType())) {
|
||||
const nsString& content = aNode.GetSkippedContent();
|
||||
if (content.Length() > 0) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
}
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsLoggingSink::LeafNode(const nsIParserNode& aNode)
|
||||
{
|
||||
WriteTabs(mOutput,1+mLevel);
|
||||
nsHTMLTag nodeType = nsHTMLTag(aNode.GetNodeType());
|
||||
|
||||
if ((nodeType >= eHTMLTag_unknown) &&
|
||||
(nodeType <= nsHTMLTag(NS_HTML_TAG_MAX))) {
|
||||
const char* tag = nsHTMLTags::GetStringValue(nodeType);
|
||||
|
||||
if(tag)
|
||||
PR_fprintf(mOutput, "<leaf tag=\"%s\"", tag);
|
||||
else PR_fprintf(mOutput, "<leaf tag=\"???\"");
|
||||
|
||||
if (WillWriteAttributes(aNode)) {
|
||||
PR_fprintf(mOutput, ">\n");
|
||||
WriteAttributes(aNode);
|
||||
PR_fprintf(mOutput, "</leaf>\n");
|
||||
}
|
||||
else {
|
||||
PR_fprintf(mOutput, "/>\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
PRInt32 pos;
|
||||
nsAutoString tmp;
|
||||
char* str;
|
||||
switch (nodeType) {
|
||||
case eHTMLTag_whitespace:
|
||||
case eHTMLTag_text:
|
||||
GetNewCString(aNode.GetText(), &str);
|
||||
if(str) {
|
||||
PR_fprintf(mOutput, "<text value=\"%s\"/>\n", str);
|
||||
nsMemory::Free(str);
|
||||
}
|
||||
break;
|
||||
|
||||
case eHTMLTag_newline:
|
||||
PR_fprintf(mOutput, "<newline/>\n");
|
||||
break;
|
||||
|
||||
case eHTMLTag_entity:
|
||||
tmp.Append(aNode.GetText());
|
||||
tmp.Cut(0, 1);
|
||||
pos = tmp.Length() - 1;
|
||||
if (pos >= 0) {
|
||||
tmp.Cut(pos, 1);
|
||||
}
|
||||
PR_fprintf(mOutput, "<entity value=\"%s\"/>\n", tmp.GetBuffer());
|
||||
break;
|
||||
|
||||
default:
|
||||
NS_NOTREACHED("unsupported leaf node type");
|
||||
}//switch
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsLoggingSink::QuoteText(const nsAReadableString& aValue, nsString& aResult) {
|
||||
aResult.Truncate();
|
||||
/*
|
||||
if you're stepping through the string anyway, why not use iterators instead of forcing the string to copy?
|
||||
*/
|
||||
nsPromiseFlatString flat(aValue);
|
||||
const PRUnichar* cp = flat.get();
|
||||
const PRUnichar* end = cp + aValue.Length();
|
||||
while (cp < end) {
|
||||
PRUnichar ch = *cp++;
|
||||
if (ch == '"') {
|
||||
aResult.AppendWithConversion(""");
|
||||
}
|
||||
else if (ch == '&') {
|
||||
aResult.AppendWithConversion("&");
|
||||
}
|
||||
else if ((ch < 32) || (ch >= 127)) {
|
||||
aResult.AppendWithConversion("&#");
|
||||
aResult.AppendInt(PRInt32(ch), 10);
|
||||
aResult.AppendWithConversion(';');
|
||||
}
|
||||
else {
|
||||
aResult.Append(ch);
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use this method to convert nsString to char*.
|
||||
* REMEMBER: Match this call with nsMemory::Free(aResult);
|
||||
*
|
||||
* @update 04/04/99 harishd
|
||||
* @param aValue - The string value
|
||||
* @param aResult - String coverted to char*.
|
||||
*/
|
||||
nsresult
|
||||
nsLoggingSink::GetNewCString(const nsAReadableString& aValue, char** aResult)
|
||||
{
|
||||
nsresult result=NS_OK;
|
||||
nsAutoString temp;
|
||||
result=QuoteText(aValue,temp);
|
||||
if(NS_SUCCEEDED(result)) {
|
||||
if(temp.Length()>0) {
|
||||
*aResult=temp.ToNewCString();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::DoFragment(PRBool aFlag)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* This gets called when handling illegal contents, especially
|
||||
* in dealing with tables. This method creates a new context.
|
||||
*
|
||||
* @update 04/04/99 harishd
|
||||
* @param aPosition - The position from where the new context begins.
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::BeginContext(PRInt32 aPosition)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method terminates any new context that got created by
|
||||
* BeginContext and switches back to the main context.
|
||||
*
|
||||
* @update 04/04/99 harishd
|
||||
* @param aPosition - Validates the end of a context.
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
nsLoggingSink::EndContext(PRInt32 aPosition)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
2339
mozilla/profile/src/nsProfile.cpp
Normal file
2339
mozilla/profile/src/nsProfile.cpp
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user