Compare commits

..

7 Commits

Author SHA1 Message Date
ruslan%netscape.com
b6a9a31b18 Minor cleanup
git-svn-id: svn://10.0.0.236/branches/linkclickfix_tmp_branch@65590 18797224-902f-48f8-a5cc-f745e15eee43
2000-04-11 03:03:28 +00:00
ruslan%netscape.com
528acf4c90 Now this fixes everything
git-svn-id: svn://10.0.0.236/branches/linkclickfix_tmp_branch@65586 18797224-902f-48f8-a5cc-f745e15eee43
2000-04-11 02:21:59 +00:00
ruslan%netscape.com
4dcb15068c Merge in GetSecurityInfo fix from the main branch
git-svn-id: svn://10.0.0.236/branches/linkclickfix_tmp_branch@65572 18797224-902f-48f8-a5cc-f745e15eee43
2000-04-10 22:24:54 +00:00
ruslan%netscape.com
04353776b2 A better fix for link-click problem
git-svn-id: svn://10.0.0.236/branches/linkclickfix_tmp_branch@65557 18797224-902f-48f8-a5cc-f745e15eee43
2000-04-10 19:36:56 +00:00
ruslan%netscape.com
3d8808b91f Add more logging
git-svn-id: svn://10.0.0.236/branches/linkclickfix_tmp_branch@65532 18797224-902f-48f8-a5cc-f745e15eee43
2000-04-08 04:03:20 +00:00
ruslan%netscape.com
0e08e3e2ee Fix for link-click problem
git-svn-id: svn://10.0.0.236/branches/linkclickfix_tmp_branch@65508 18797224-902f-48f8-a5cc-f745e15eee43
2000-04-07 21:54:37 +00:00
(no author)
953c538a6a This commit was manufactured by cvs2svn to create branch
'linkclickfix_tmp_branch'.

git-svn-id: svn://10.0.0.236/branches/linkclickfix_tmp_branch@65467 18797224-902f-48f8-a5cc-f745e15eee43
2000-04-07 00:31:05 +00:00
557 changed files with 75773 additions and 13422 deletions

View File

@@ -0,0 +1,42 @@
#
# 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 = ../../../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = necko
LIBRARY_NAME = necko_datetime
SHORT_LIBNAME = neckodtm
IS_COMPONENT = 1
CPPSRCS = \
nsDateTimeHandler.cpp \
nsDateTimeChannel.cpp \
nsDateTimeModule.cpp \
$(NULL)
EXTRA_DSO_LDOPTS += $(MOZ_COMPONENT_LIBS)
include $(topsrcdir)/config/rules.mk

View File

@@ -0,0 +1,431 @@
/* -*- 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):
*/
// datetime implementation
#include "nsDateTimeChannel.h"
#include "nsIServiceManager.h"
#include "nsILoadGroup.h"
#include "nsIInterfaceRequestor.h"
#include "nsXPIDLString.h"
#include "nsISocketTransportService.h"
static NS_DEFINE_CID(kSocketTransportServiceCID, NS_SOCKETTRANSPORTSERVICE_CID);
// nsDateTimeChannel methods
nsDateTimeChannel::nsDateTimeChannel() {
NS_INIT_REFCNT();
mContentLength = -1;
mPort = -1;
}
nsDateTimeChannel::~nsDateTimeChannel() {
}
NS_IMPL_ISUPPORTS4(nsDateTimeChannel, nsIChannel, nsIRequest, nsIStreamListener, nsIStreamObserver)
nsresult
nsDateTimeChannel::Init(nsIURI* uri)
{
nsresult rv;
NS_ASSERTION(uri, "no uri");
mUrl = uri;
rv = mUrl->GetPort(&mPort);
if (NS_FAILED(rv) || mPort < 1)
mPort = DATETIME_PORT;
rv = mUrl->GetPath(getter_Copies(mHost));
if (NS_FAILED(rv)) return rv;
if (!*(const char *)mHost) return NS_ERROR_NOT_INITIALIZED;
return NS_OK;
}
NS_METHOD
nsDateTimeChannel::Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult)
{
nsDateTimeChannel* dc = new nsDateTimeChannel();
if (dc == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(dc);
nsresult rv = dc->QueryInterface(aIID, aResult);
NS_RELEASE(dc);
return rv;
}
////////////////////////////////////////////////////////////////////////////////
// nsIRequest methods:
NS_IMETHODIMP
nsDateTimeChannel::IsPending(PRBool *result)
{
NS_NOTREACHED("nsDateTimeChannel::IsPending");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::GetStatus(nsresult *status)
{
*status = NS_OK;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::Cancel(nsresult status)
{
NS_NOTREACHED("nsDateTimeChannel::Cancel");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::Suspend(void)
{
NS_NOTREACHED("nsDateTimeChannel::Suspend");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::Resume(void)
{
NS_NOTREACHED("nsDateTimeChannel::Resume");
return NS_ERROR_NOT_IMPLEMENTED;
}
////////////////////////////////////////////////////////////////////////////////
// nsIChannel methods:
NS_IMETHODIMP
nsDateTimeChannel::GetOriginalURI(nsIURI* *aURI)
{
*aURI = mOriginalURI ? mOriginalURI : mUrl;
NS_ADDREF(*aURI);
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetOriginalURI(nsIURI* aURI)
{
mOriginalURI = aURI;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::GetURI(nsIURI* *aURI)
{
*aURI = mUrl;
NS_IF_ADDREF(*aURI);
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetURI(nsIURI* aURI)
{
mUrl = aURI;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::OpenInputStream(nsIInputStream **_retval)
{
nsresult rv = NS_OK;
NS_WITH_SERVICE(nsISocketTransportService, socketService, kSocketTransportServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIChannel> channel;
rv = socketService->CreateTransport(mHost, mPort, mHost, 32, 32, getter_AddRefs(channel));
if (NS_FAILED(rv)) return rv;
rv = channel->SetNotificationCallbacks(mCallbacks);
if (NS_FAILED(rv)) return rv;
return channel->OpenInputStream(_retval);
}
NS_IMETHODIMP
nsDateTimeChannel::OpenOutputStream(nsIOutputStream **_retval)
{
NS_NOTREACHED("nsDateTimeChannel::OpenOutputStream");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::AsyncOpen(nsIStreamObserver *observer, nsISupports* ctxt)
{
nsresult rv = NS_OK;
NS_WITH_SERVICE(nsISocketTransportService, socketService, kSocketTransportServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIChannel> channel;
rv = socketService->CreateTransport(mHost, mPort, mHost, 32, 32, getter_AddRefs(channel));
if (NS_FAILED(rv)) return rv;
rv = channel->SetNotificationCallbacks(mCallbacks);
if (NS_FAILED(rv)) return rv;
return channel->AsyncOpen(observer, ctxt);
}
NS_IMETHODIMP
nsDateTimeChannel::AsyncRead(nsIStreamListener *aListener,
nsISupports *ctxt)
{
nsresult rv = NS_OK;
NS_WITH_SERVICE(nsISocketTransportService, socketService, kSocketTransportServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIChannel> channel;
rv = socketService->CreateTransport(mHost, mPort, mHost, 32, 32, getter_AddRefs(channel));
if (NS_FAILED(rv)) return rv;
rv = channel->SetNotificationCallbacks(mCallbacks);
if (NS_FAILED(rv)) return rv;
mListener = aListener;
return channel->AsyncRead(this, ctxt);
}
NS_IMETHODIMP
nsDateTimeChannel::AsyncWrite(nsIInputStream *fromStream,
nsIStreamObserver *observer,
nsISupports *ctxt)
{
NS_NOTREACHED("nsDateTimeChannel::AsyncWrite");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::GetLoadAttributes(PRUint32 *aLoadAttributes)
{
*aLoadAttributes = mLoadAttributes;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetLoadAttributes(PRUint32 aLoadAttributes)
{
mLoadAttributes = aLoadAttributes;
return NS_OK;
}
#define DATETIME_TYPE "text/plain"
NS_IMETHODIMP
nsDateTimeChannel::GetContentType(char* *aContentType) {
if (!aContentType) return NS_ERROR_NULL_POINTER;
*aContentType = nsCRT::strdup(DATETIME_TYPE);
if (!*aContentType) return NS_ERROR_OUT_OF_MEMORY;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetContentType(const char *aContentType)
{
//It doesn't make sense to set the content-type on this type
// of channel...
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsDateTimeChannel::GetContentLength(PRInt32 *aContentLength)
{
*aContentLength = mContentLength;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetContentLength(PRInt32 aContentLength)
{
NS_NOTREACHED("nsDateTimeChannel::SetContentLength");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::GetTransferOffset(PRUint32 *aTransferOffset)
{
NS_NOTREACHED("nsDateTimeChannel::GetTransferOffset");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::SetTransferOffset(PRUint32 aTransferOffset)
{
NS_NOTREACHED("nsDateTimeChannel::SetTransferOffset");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::GetTransferCount(PRInt32 *aTransferCount)
{
NS_NOTREACHED("nsDateTimeChannel::GetTransferCount");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::SetTransferCount(PRInt32 aTransferCount)
{
NS_NOTREACHED("nsDateTimeChannel::SetTransferCount");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::GetBufferSegmentSize(PRUint32 *aBufferSegmentSize)
{
NS_NOTREACHED("nsDateTimeChannel::GetBufferSegmentSize");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::SetBufferSegmentSize(PRUint32 aBufferSegmentSize)
{
NS_NOTREACHED("nsDateTimeChannel::SetBufferSegmentSize");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::GetBufferMaxSize(PRUint32 *aBufferMaxSize)
{
NS_NOTREACHED("nsDateTimeChannel::GetBufferMaxSize");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::SetBufferMaxSize(PRUint32 aBufferMaxSize)
{
NS_NOTREACHED("nsDateTimeChannel::SetBufferMaxSize");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::GetShouldCache(PRBool *aShouldCache)
{
*aShouldCache = PR_FALSE;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::GetPipeliningAllowed(PRBool *aPipeliningAllowed)
{
*aPipeliningAllowed = PR_FALSE;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetPipeliningAllowed(PRBool aPipeliningAllowed)
{
NS_NOTREACHED("SetPipeliningAllowed");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsDateTimeChannel::GetLoadGroup(nsILoadGroup* *aLoadGroup)
{
*aLoadGroup = mLoadGroup;
NS_IF_ADDREF(*aLoadGroup);
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetLoadGroup(nsILoadGroup* aLoadGroup)
{
if (mLoadGroup) // if we already had a load group remove ourselves...
(void)mLoadGroup->RemoveChannel(this, nsnull, nsnull, nsnull);
mLoadGroup = aLoadGroup;
if (mLoadGroup) {
return mLoadGroup->AddChannel(this, nsnull);
}
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::GetOwner(nsISupports* *aOwner)
{
*aOwner = mOwner.get();
NS_IF_ADDREF(*aOwner);
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetOwner(nsISupports* aOwner)
{
mOwner = aOwner;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::GetNotificationCallbacks(nsIInterfaceRequestor* *aNotificationCallbacks)
{
*aNotificationCallbacks = mCallbacks.get();
NS_IF_ADDREF(*aNotificationCallbacks);
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::SetNotificationCallbacks(nsIInterfaceRequestor* aNotificationCallbacks)
{
mCallbacks = aNotificationCallbacks;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeChannel::GetSecurityInfo(nsISupports * *aSecurityInfo)
{
*aSecurityInfo = nsnull;
return NS_OK;
}
// nsIStreamObserver methods
NS_IMETHODIMP
nsDateTimeChannel::OnStartRequest(nsIChannel *aChannel, nsISupports *aContext) {
return mListener->OnStartRequest(this, aContext);
}
NS_IMETHODIMP
nsDateTimeChannel::OnStopRequest(nsIChannel* aChannel, nsISupports* aContext,
nsresult aStatus, const PRUnichar* aMsg) {
if (mLoadGroup) {
nsresult rv = mLoadGroup->RemoveChannel(this, nsnull, aStatus, aMsg);
if (NS_FAILED(rv)) return rv;
}
return mListener->OnStopRequest(this, aContext, aStatus, aMsg);
}
// nsIStreamListener method
NS_IMETHODIMP
nsDateTimeChannel::OnDataAvailable(nsIChannel* aChannel, nsISupports* aContext,
nsIInputStream *aInputStream, PRUint32 aSourceOffset,
PRUint32 aLength) {
mContentLength = aLength;
return mListener->OnDataAvailable(this, aContext, aInputStream, aSourceOffset, aLength);
}

View File

@@ -0,0 +1,77 @@
/* -*- 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):
*/
// A datetime channel retrieves date time information from
// RFC 867 compliant datetime servers. The date/time returned
// to the caller is of MIME type "text/plain".
#ifndef nsDateTimeChannel_h___
#define nsDateTimeChannel_h___
#include "nsString.h"
#include "nsILoadGroup.h"
#include "nsIInputStream.h"
#include "nsIInterfaceRequestor.h"
#include "nsCOMPtr.h"
#include "nsXPIDLString.h"
#include "nsIChannel.h"
#include "nsIURI.h"
#include "nsDateTimeHandler.h"
#include "nsIStreamListener.h"
class nsDateTimeChannel : public nsIChannel, public nsIStreamListener {
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIREQUEST
NS_DECL_NSICHANNEL
NS_DECL_NSISTREAMLISTENER
NS_DECL_NSISTREAMOBSERVER
// nsDateTimeChannel methods:
nsDateTimeChannel();
virtual ~nsDateTimeChannel();
// Define a Create method to be used with a factory:
static NS_METHOD
Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult);
nsresult Init(nsIURI* uri);
protected:
nsCOMPtr<nsIInterfaceRequestor> mCallbacks;
nsCOMPtr<nsIURI> mOriginalURI;
nsCOMPtr<nsIURI> mUrl;
nsCOMPtr<nsIStreamListener> mListener;
PRUint32 mLoadAttributes;
nsCOMPtr<nsILoadGroup> mLoadGroup;
nsCString mContentType;
PRInt32 mContentLength;
nsCOMPtr<nsISupports> mOwner;
PRUint32 mBufferSegmentSize;
PRUint32 mBufferMaxSize;
PRInt32 mPort;
nsXPIDLCString mHost;
};
#endif /* nsDateTimeChannel_h___ */

View File

@@ -0,0 +1,116 @@
/* -*- 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):
*/
#include "nspr.h"
#include "nsDateTimeChannel.h"
#include "nsDateTimeHandler.h"
#include "nsIURL.h"
#include "nsCRT.h"
#include "nsIComponentManager.h"
#include "nsIServiceManager.h"
#include "nsIInterfaceRequestor.h"
#include "nsIProgressEventSink.h"
static NS_DEFINE_CID(kSimpleURICID, NS_SIMPLEURI_CID);
////////////////////////////////////////////////////////////////////////////////
nsDateTimeHandler::nsDateTimeHandler() {
NS_INIT_REFCNT();
}
nsDateTimeHandler::~nsDateTimeHandler() {
}
NS_IMPL_ISUPPORTS(nsDateTimeHandler, NS_GET_IID(nsIProtocolHandler));
NS_METHOD
nsDateTimeHandler::Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult) {
nsDateTimeHandler* ph = new nsDateTimeHandler();
if (ph == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(ph);
nsresult rv = ph->QueryInterface(aIID, aResult);
NS_RELEASE(ph);
return rv;
}
////////////////////////////////////////////////////////////////////////////////
// nsIProtocolHandler methods:
NS_IMETHODIMP
nsDateTimeHandler::GetScheme(char* *result) {
*result = nsCRT::strdup("datetime");
if (!*result) return NS_ERROR_OUT_OF_MEMORY;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeHandler::GetDefaultPort(PRInt32 *result) {
*result = DATETIME_PORT;
return NS_OK;
}
NS_IMETHODIMP
nsDateTimeHandler::NewURI(const char *aSpec, nsIURI *aBaseURI,
nsIURI **result) {
nsresult rv;
// no concept of a relative datetime url
NS_ASSERTION(!aBaseURI, "base url passed into datetime protocol handler");
nsIURI* url;
rv = nsComponentManager::CreateInstance(kSimpleURICID, nsnull,
NS_GET_IID(nsIURI),
(void**)&url);
if (NS_FAILED(rv)) return rv;
rv = url->SetSpec((char*)aSpec);
if (NS_FAILED(rv)) {
NS_RELEASE(url);
return rv;
}
*result = url;
return rv;
}
NS_IMETHODIMP
nsDateTimeHandler::NewChannel(nsIURI* url, nsIChannel* *result)
{
nsresult rv;
nsDateTimeChannel* channel;
rv = nsDateTimeChannel::Create(nsnull, NS_GET_IID(nsIChannel), (void**)&channel);
if (NS_FAILED(rv)) return rv;
rv = channel->Init(url);
if (NS_FAILED(rv)) {
NS_RELEASE(channel);
return rv;
}
*result = channel;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,51 @@
/* -*- 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):
*/
// The datetime protocol handler creates "datetime" URIs of the form
// "datetime:RFC867Server".
#ifndef nsDateTimeHandler_h___
#define nsDateTimeHandler_h___
#include "nsIProtocolHandler.h"
#define DATETIME_PORT 13
// {AA27D2A0-B71B-11d3-A1A0-0050041CAF44}
#define NS_DATETIMEHANDLER_CID \
{ 0xaa27d2a0, 0xb71b, 0x11d3, { 0xa1, 0xa0, 0x0, 0x50, 0x4, 0x1c, 0xaf, 0x44 } }
class nsDateTimeHandler : public nsIProtocolHandler
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIPROTOCOLHANDLER
// nsDateTimeHandler methods:
nsDateTimeHandler();
virtual ~nsDateTimeHandler();
// Define a Create method to be used with a factory:
static NS_METHOD Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult);
};
#endif /* nsDateTimeHandler_h___ */

View File

@@ -0,0 +1,34 @@
/* -*- 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):
*/
#include "nsIGenericFactory.h"
#include "nsDateTimeHandler.h"
static nsModuleComponentInfo gResComponents[] = {
{ "The DateTime Protocol Handler",
NS_DATETIMEHANDLER_CID,
NS_NETWORK_PROTOCOL_PROGID_PREFIX "datetime",
nsDateTimeHandler::Create
}
};
NS_IMPL_NSGETMODULE("datetime", gResComponents)

View File

@@ -0,0 +1,41 @@
#
# 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 = ../../../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = necko
LIBRARY_NAME = necko_finger
IS_COMPONENT = 1
CPPSRCS = \
nsFingerHandler.cpp \
nsFingerChannel.cpp \
nsFingerModule.cpp \
$(NULL)
EXTRA_DSO_LDOPTS += $(MOZ_COMPONENT_LIBS)
include $(topsrcdir)/config/rules.mk

View File

@@ -0,0 +1,517 @@
/* -*- 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):
*/
// finger implementation
#include "nsFingerChannel.h"
#include "nsIServiceManager.h"
#include "nsILoadGroup.h"
#include "nsIInterfaceRequestor.h"
#include "nsXPIDLString.h"
#include "nsISocketTransportService.h"
#include "nsIStringStream.h"
#include "nsMimeTypes.h"
static NS_DEFINE_CID(kSocketTransportServiceCID, NS_SOCKETTRANSPORTSERVICE_CID);
#define BUFFER_SEG_SIZE (4*1024)
#define BUFFER_MAX_SIZE (64*1024)
// nsFingerChannel methods
nsFingerChannel::nsFingerChannel()
: mContentLength(-1),
mActAsObserver(PR_TRUE),
mPort(-1),
mStatus(NS_OK)
{
NS_INIT_REFCNT();
}
nsFingerChannel::~nsFingerChannel() {
}
NS_IMPL_THREADSAFE_ISUPPORTS4(nsFingerChannel, nsIChannel, nsIRequest,
nsIStreamListener, nsIStreamObserver)
nsresult
nsFingerChannel::Init(nsIURI* uri)
{
nsresult rv;
nsXPIDLCString autoBuffer;
NS_ASSERTION(uri, "no uri");
mUrl = uri;
// For security reasons, we do not allow the user to specify a
// non-default port for finger: URL's.
mPort = FINGER_PORT;
rv = mUrl->GetPath(getter_Copies(autoBuffer)); // autoBuffer = user@host
if (NS_FAILED(rv)) return rv;
nsCString cString(autoBuffer);
nsCString tempBuf;
PRUint32 i;
// Now parse out the user and host
for (i=0; cString[i] != '\0'; i++) {
if (cString[i] == '@') {
cString.Left(tempBuf, i);
mUser = tempBuf;
cString.Right(tempBuf, cString.Length() - i - 1);
mHost = tempBuf;
break;
}
}
// Catch the case of just the host being given
if (cString[i] == '\0') {
mHost = cString;
}
#ifdef DEBUG_bryner
printf("Status:mUser = %s, mHost = %s\n", (const char*)mUser,
(const char*)mHost);
#endif
if (!*(const char *)mHost) return NS_ERROR_NOT_INITIALIZED;
return NS_OK;
}
NS_METHOD
nsFingerChannel::Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult)
{
nsFingerChannel* fc = new nsFingerChannel();
if (fc == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(fc);
nsresult rv = fc->QueryInterface(aIID, aResult);
NS_RELEASE(fc);
return rv;
}
////////////////////////////////////////////////////////////////////////////////
// nsIRequest methods:
NS_IMETHODIMP
nsFingerChannel::IsPending(PRBool *result)
{
NS_NOTREACHED("nsFingerChannel::IsPending");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::GetStatus(nsresult *status)
{
*status = mStatus;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::Cancel(nsresult status)
{
nsresult rv = NS_ERROR_FAILURE;
mStatus = status;
if (mTransport) {
rv = mTransport->Cancel(status);
}
return rv;
}
NS_IMETHODIMP
nsFingerChannel::Suspend(void)
{
NS_NOTREACHED("nsFingerChannel::Suspend");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::Resume(void)
{
NS_NOTREACHED("nsFingerChannel::Resume");
return NS_ERROR_NOT_IMPLEMENTED;
}
////////////////////////////////////////////////////////////////////////////////
// nsIChannel methods:
NS_IMETHODIMP
nsFingerChannel::GetOriginalURI(nsIURI* *aURI)
{
*aURI = mOriginalURI ? mOriginalURI : mUrl;
NS_ADDREF(*aURI);
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetOriginalURI(nsIURI* aURI)
{
mOriginalURI = aURI;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::GetURI(nsIURI* *aURI)
{
*aURI = mUrl;
NS_IF_ADDREF(*aURI);
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetURI(nsIURI* aURI)
{
mUrl = aURI;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::OpenInputStream(nsIInputStream **_retval)
{
nsresult rv = NS_OK;
NS_WITH_SERVICE(nsISocketTransportService, socketService, kSocketTransportServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIChannel> channel;
rv = socketService->CreateTransport(mHost, mPort, mHost, BUFFER_SEG_SIZE,
BUFFER_MAX_SIZE, getter_AddRefs(channel));
if (NS_FAILED(rv)) return rv;
rv = channel->SetNotificationCallbacks(mCallbacks);
if (NS_FAILED(rv)) return rv;
return channel->OpenInputStream(_retval);
}
NS_IMETHODIMP
nsFingerChannel::OpenOutputStream(nsIOutputStream **_retval)
{
NS_NOTREACHED("nsFingerChannel::OpenOutputStream");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::AsyncOpen(nsIStreamObserver *observer, nsISupports* ctxt)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::AsyncRead(nsIStreamListener *aListener, nsISupports *ctxt)
{
nsresult rv = NS_OK;
NS_WITH_SERVICE(nsISocketTransportService, socketService, kSocketTransportServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIChannel> channel;
rv = socketService->CreateTransport(mHost, mPort, mHost, BUFFER_SEG_SIZE,
BUFFER_MAX_SIZE, getter_AddRefs(channel));
if (NS_FAILED(rv)) return rv;
rv = channel->SetNotificationCallbacks(mCallbacks);
if (NS_FAILED(rv)) return rv;
mListener = aListener;
mResponseContext = ctxt;
mTransport = channel;
return SendRequest(channel);
}
NS_IMETHODIMP
nsFingerChannel::AsyncWrite(nsIInputStream *fromStream,
nsIStreamObserver *observer,
nsISupports *ctxt)
{
NS_NOTREACHED("nsFingerChannel::AsyncWrite");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::GetLoadAttributes(PRUint32 *aLoadAttributes)
{
*aLoadAttributes = mLoadAttributes;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetLoadAttributes(PRUint32 aLoadAttributes)
{
mLoadAttributes = aLoadAttributes;
return NS_OK;
}
#define FINGER_TYPE TEXT_PLAIN
NS_IMETHODIMP
nsFingerChannel::GetContentType(char* *aContentType) {
if (!aContentType) return NS_ERROR_NULL_POINTER;
*aContentType = nsCRT::strdup(FINGER_TYPE);
if (!*aContentType) return NS_ERROR_OUT_OF_MEMORY;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetContentType(const char *aContentType)
{
//It doesn't make sense to set the content-type on this type
// of channel...
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsFingerChannel::GetContentLength(PRInt32 *aContentLength)
{
*aContentLength = mContentLength;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetContentLength(PRInt32 aContentLength)
{
NS_NOTREACHED("nsFingerChannel::SetContentLength");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::GetTransferOffset(PRUint32 *aTransferOffset)
{
NS_NOTREACHED("nsFingerChannel::GetTransferOffset");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::SetTransferOffset(PRUint32 aTransferOffset)
{
NS_NOTREACHED("nsFingerChannel::SetTransferOffset");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::GetTransferCount(PRInt32 *aTransferCount)
{
NS_NOTREACHED("nsFingerChannel::GetTransferCount");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::SetTransferCount(PRInt32 aTransferCount)
{
NS_NOTREACHED("nsFingerChannel::SetTransferCount");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::GetBufferSegmentSize(PRUint32 *aBufferSegmentSize)
{
NS_NOTREACHED("nsFingerChannel::GetBufferSegmentSize");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::SetBufferSegmentSize(PRUint32 aBufferSegmentSize)
{
NS_NOTREACHED("nsFingerChannel::SetBufferSegmentSize");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::GetBufferMaxSize(PRUint32 *aBufferMaxSize)
{
NS_NOTREACHED("nsFingerChannel::GetBufferMaxSize");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::SetBufferMaxSize(PRUint32 aBufferMaxSize)
{
NS_NOTREACHED("nsFingerChannel::SetBufferMaxSize");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::GetShouldCache(PRBool *aShouldCache)
{
*aShouldCache = PR_FALSE;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::GetPipeliningAllowed(PRBool *aPipeliningAllowed)
{
*aPipeliningAllowed = PR_FALSE;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetPipeliningAllowed(PRBool aPipeliningAllowed)
{
NS_NOTREACHED("SetPipeliningAllowed");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsFingerChannel::GetLoadGroup(nsILoadGroup* *aLoadGroup)
{
*aLoadGroup = mLoadGroup;
NS_IF_ADDREF(*aLoadGroup);
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetLoadGroup(nsILoadGroup* aLoadGroup)
{
mLoadGroup = aLoadGroup;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::GetOwner(nsISupports* *aOwner)
{
*aOwner = mOwner.get();
NS_IF_ADDREF(*aOwner);
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetOwner(nsISupports* aOwner)
{
mOwner = aOwner;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::GetNotificationCallbacks(nsIInterfaceRequestor* *aNotificationCallbacks)
{
*aNotificationCallbacks = mCallbacks.get();
NS_IF_ADDREF(*aNotificationCallbacks);
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::SetNotificationCallbacks(nsIInterfaceRequestor* aNotificationCallbacks)
{
mCallbacks = aNotificationCallbacks;
return NS_OK;
}
NS_IMETHODIMP
nsFingerChannel::GetSecurityInfo(nsISupports * *aSecurityInfo)
{
*aSecurityInfo = nsnull;
return NS_OK;
}
// nsIStreamObserver methods
NS_IMETHODIMP
nsFingerChannel::OnStartRequest(nsIChannel *aChannel, nsISupports *aContext) {
if (!mActAsObserver) {
// acting as a listener
return mListener->OnStartRequest(this, aContext);
} else {
// we don't want to pass our AsyncWrite's OnStart through
// we just ignore this
return NS_OK;
}
}
NS_IMETHODIMP
nsFingerChannel::OnStopRequest(nsIChannel* aChannel, nsISupports* aContext,
nsresult aStatus, const PRUnichar* aMsg) {
#ifdef DEBUG_bryner
printf("nsFingerChannel::OnStopRequest, mActAsObserver=%d\n",
mActAsObserver);
printf(" aChannel = %p\n", aChannel);
#endif
nsresult rv = NS_OK;
if (NS_FAILED(aStatus) || !mActAsObserver) {
if (mLoadGroup) {
rv = mLoadGroup->RemoveChannel(this, nsnull, aStatus, aMsg);
if (NS_FAILED(rv)) return rv;
}
rv = mListener->OnStopRequest(this, aContext, aStatus, aMsg);
mTransport = 0;
return rv;
} else {
// at this point we know the request has been sent.
// we're no longer acting as an observer.
mActAsObserver = PR_FALSE;
return aChannel->AsyncRead(this, mResponseContext);
}
}
// nsIStreamListener method
NS_IMETHODIMP
nsFingerChannel::OnDataAvailable(nsIChannel* aChannel, nsISupports* aContext,
nsIInputStream *aInputStream, PRUint32 aSourceOffset,
PRUint32 aLength) {
mContentLength = aLength;
return mListener->OnDataAvailable(this, aContext, aInputStream, aSourceOffset, aLength);
}
nsresult
nsFingerChannel::SendRequest(nsIChannel* aChannel) {
// The text to send should already be in mUser
nsresult rv = NS_OK;
nsCOMPtr<nsISupports> result;
nsCOMPtr<nsIInputStream> charstream;
nsCString requestBuffer(mUser);
if (mLoadGroup) {
mLoadGroup->AddChannel(this, nsnull);
}
requestBuffer.Append(CRLF);
mRequest = requestBuffer.ToNewCString();
rv = NS_NewCharInputStream(getter_AddRefs(result), mRequest);
if (NS_FAILED(rv)) return rv;
charstream = do_QueryInterface(result, &rv);
if (NS_FAILED(rv)) return rv;
#ifdef DEBUG_bryner
printf("Sending: %s\n", requestBuffer.GetBuffer());
#endif
rv = aChannel->SetTransferCount(requestBuffer.Length());
if (NS_FAILED(rv)) return rv;
rv = aChannel->AsyncWrite(charstream, this, 0);
return rv;
}

View File

@@ -0,0 +1,84 @@
/* -*- 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):
*/
#ifndef nsFingerChannel_h___
#define nsFingerChannel_h___
#include "nsString.h"
#include "nsILoadGroup.h"
#include "nsIInputStream.h"
#include "nsIInterfaceRequestor.h"
#include "nsCOMPtr.h"
#include "nsXPIDLString.h"
#include "nsIChannel.h"
#include "nsIURI.h"
#include "nsFingerHandler.h"
#include "nsIStreamListener.h"
class nsFingerChannel : public nsIChannel, public nsIStreamListener {
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIREQUEST
NS_DECL_NSICHANNEL
NS_DECL_NSISTREAMLISTENER
NS_DECL_NSISTREAMOBSERVER
// nsFingerChannel methods:
nsFingerChannel();
virtual ~nsFingerChannel();
// Define a Create method to be used with a factory:
static NS_METHOD
Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult);
nsresult Init(nsIURI* uri);
protected:
nsCOMPtr<nsIInterfaceRequestor> mCallbacks;
nsCOMPtr<nsIURI> mOriginalURI;
nsCOMPtr<nsIURI> mUrl;
nsCOMPtr<nsIStreamListener> mListener;
PRUint32 mLoadAttributes;
nsCOMPtr<nsILoadGroup> mLoadGroup;
nsCString mContentType;
PRInt32 mContentLength;
nsCOMPtr<nsISupports> mOwner;
PRUint32 mBufferSegmentSize;
PRUint32 mBufferMaxSize;
PRBool mActAsObserver;
PRInt32 mPort;
nsXPIDLCString mHost;
nsXPIDLCString mUser;
nsXPIDLCString mRequest;
nsCOMPtr<nsISupports> mResponseContext;
nsCOMPtr<nsIChannel> mTransport;
nsresult mStatus;
protected:
nsresult SendRequest(nsIChannel* aChannel);
};
#endif /* nsFingerChannel_h___ */

View File

@@ -0,0 +1,116 @@
/* -*- 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):
*/
#include "nspr.h"
#include "nsFingerChannel.h"
#include "nsFingerHandler.h"
#include "nsIURL.h"
#include "nsCRT.h"
#include "nsIComponentManager.h"
#include "nsIServiceManager.h"
#include "nsIInterfaceRequestor.h"
#include "nsIProgressEventSink.h"
static NS_DEFINE_CID(kSimpleURICID, NS_SIMPLEURI_CID);
////////////////////////////////////////////////////////////////////////////////
nsFingerHandler::nsFingerHandler() {
NS_INIT_REFCNT();
}
nsFingerHandler::~nsFingerHandler() {
}
NS_IMPL_ISUPPORTS(nsFingerHandler, NS_GET_IID(nsIProtocolHandler));
NS_METHOD
nsFingerHandler::Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult) {
nsFingerHandler* ph = new nsFingerHandler();
if (ph == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(ph);
nsresult rv = ph->QueryInterface(aIID, aResult);
NS_RELEASE(ph);
return rv;
}
////////////////////////////////////////////////////////////////////////////////
// nsIProtocolHandler methods:
NS_IMETHODIMP
nsFingerHandler::GetScheme(char* *result) {
*result = nsCRT::strdup("finger");
if (!*result) return NS_ERROR_OUT_OF_MEMORY;
return NS_OK;
}
NS_IMETHODIMP
nsFingerHandler::GetDefaultPort(PRInt32 *result) {
*result = FINGER_PORT;
return NS_OK;
}
NS_IMETHODIMP
nsFingerHandler::NewURI(const char *aSpec, nsIURI *aBaseURI,
nsIURI **result) {
nsresult rv;
// no concept of a relative finger url
NS_ASSERTION(!aBaseURI, "base url passed into finger protocol handler");
nsIURI* url;
rv = nsComponentManager::CreateInstance(kSimpleURICID, nsnull,
NS_GET_IID(nsIURI),
(void**)&url);
if (NS_FAILED(rv)) return rv;
rv = url->SetSpec((char*)aSpec);
if (NS_FAILED(rv)) {
NS_RELEASE(url);
return rv;
}
*result = url;
return rv;
}
NS_IMETHODIMP
nsFingerHandler::NewChannel(nsIURI* url, nsIChannel* *result)
{
nsresult rv;
nsFingerChannel* channel;
rv = nsFingerChannel::Create(nsnull, NS_GET_IID(nsIChannel), (void**)&channel);
if (NS_FAILED(rv)) return rv;
rv = channel->Init(url);
if (NS_FAILED(rv)) {
NS_RELEASE(channel);
return rv;
}
*result = channel;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,52 @@
/* -*- 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):
*/
// The finger protocol handler creates "finger" URIs of the form
// "finger:user@host" or "finger:host".
#ifndef nsFingerHandler_h___
#define nsFingerHandler_h___
#include "nsIProtocolHandler.h"
#define FINGER_PORT 79
// {0x76d6d5d8-1dd2-11b2-b361-850ddf15ef07}
#define NS_FINGERHANDLER_CID \
{ 0x76d6d5d8, 0x1dd2, 0x11b2, \
{0xb3, 0x61, 0x85, 0x0d, 0xdf, 0x15, 0xef, 0x07} }
class nsFingerHandler : public nsIProtocolHandler
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIPROTOCOLHANDLER
// nsFingerHandler methods:
nsFingerHandler();
virtual ~nsFingerHandler();
// Define a Create method to be used with a factory:
static NS_METHOD Create(nsISupports* aOuter, const nsIID& aIID, void* *aResult);
};
#endif /* nsFingerHandler_h___ */

View File

@@ -0,0 +1,34 @@
/* -*- 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):
*/
#include "nsIGenericFactory.h"
#include "nsFingerHandler.h"
static nsModuleComponentInfo gResComponents[] = {
{ "The Finger Protocol Handler",
NS_FINGERHANDLER_CID,
NS_NETWORK_PROTOCOL_PROGID_PREFIX "finger",
nsFingerHandler::Create
}
};
NS_IMPL_NSGETMODULE("finger", gResComponents)

View File

@@ -1,28 +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>
# Krishna Mohan Khandrika <kkhandrika@netscape.com>
#
DEPTH=..\..
DIRS=mapihook resources mapiDll
include <$(DEPTH)\config\rules.mak>

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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>

View File

@@ -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"
%}

View File

@@ -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);

View File

@@ -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_

View File

@@ -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

View File

@@ -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_

View File

@@ -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);
}

View File

@@ -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_

View File

@@ -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
}

View File

@@ -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__

View File

@@ -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;
}
}

View File

@@ -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_

View File

@@ -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

View File

@@ -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

View File

@@ -1,14 +0,0 @@
EXPORTS
MAPILogon
MAPILogoff
MAPISendMail
MAPISendDocuments
MAPIFreeBuffer
MAPIFindNext
MAPIReadMail
MAPISaveMail
MAPIDeleteMail
MAPIAddress
MAPIDetails
MAPIResolveName
MAPIGetNetscapeVersion

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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__

View File

@@ -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);
}

View File

@@ -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__

View File

@@ -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[] = {"&nbsp;", "&lt;", "&amp;", 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;
}

View File

@@ -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_

View File

@@ -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 */

View File

@@ -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

View File

@@ -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
}

View File

@@ -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

View File

@@ -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

View File

@@ -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
}

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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]));
}
}

View File

@@ -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");
}
}

View File

@@ -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"\

View File

@@ -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

View File

@@ -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>
{{{
}}}
###############################################################################

View File

@@ -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>

View File

@@ -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

View File

@@ -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 */

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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>

View File

@@ -1,4 +0,0 @@
messenger.jar:
content/messenger/pref-mailnewsOverlay.xul
+ content/messenger/contents.rdf
content/messenger/pref-mailnewsOverlay.js

View File

@@ -1,26 +0,0 @@
#!nmake
#
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are
# Copyright (C) 2001 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s):
# Srilatha Moturi <srilatha@netscape.com>
#
DEPTH=..\..\..\..
include <$(DEPTH)\config\rules.mak>

View File

@@ -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>

View File

@@ -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();
}
}

View File

@@ -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>

View File

@@ -1,3 +0,0 @@
en-US.jar:
locale/en-US/messenger/pref-mailnewsOverlay.dtd
locale/en-US/messenger/mapi.properties

View File

@@ -1,26 +0,0 @@
#!nmake
#
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are
# Copyright (C) 2001 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s):
# Srilatha Moturi <srilatha@netscape.com>
#
DEPTH=..\..\..\..\..
include <$(DEPTH)\config\rules.mak>

View File

@@ -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

View File

@@ -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">

View File

@@ -1,28 +0,0 @@
#!nmake
#
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is mozilla.org code.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are
# Copyright (C) 2001 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s):
# Srilatha Moturi <srilatha@netscape.com>
#
DEPTH=..\..\..\..
DIRS=en-US
include <$(DEPTH)\config\rules.mak>

View File

@@ -1,27 +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>
#
DEPTH=..\..\..
DIRS=content locale
include <$(DEPTH)\config\rules.mak>

View File

@@ -0,0 +1,39 @@
/* -*- Mode: IDL; 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):
*/
#include "nsIChannel.idl"
interface nsISimpleEnumerator;
[scriptable, uuid(c7e410d1-85f2-11d3-9f63-006008a6efe9)]
interface nsIJARChannel : nsIChannel
{
/**
* Enumerates all the entries in the JAR (the root URI).
* ARGUMENTS:
* aRoot - a string representing the root dir to enumerate from
* or null to enumerate the whole thing.
*/
nsISimpleEnumerator EnumerateEntries(in string aRoot);
};

View File

@@ -0,0 +1,32 @@
/* -*- 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 "nsIProtocolHandler.idl"
[scriptable, uuid(92c3b42c-98c4-11d3-8cd9-0060b0fc14a3)]
interface nsIJARProtocolHandler : nsIProtocolHandler {
/**
* Add any jar-specific methods here later.
*/
};

View File

@@ -0,0 +1,42 @@
/* -*- Mode: IDL; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "nsIURI.idl"
/**
* JAR URLs have the following syntax
*
* jar:<jar-file-uri>!/<jar-entry>
*
* EXAMPLE: jar:http://www.big.com/blue.jar!/ocean.html
*/
[scriptable, uuid(c7e410d3-85f2-11d3-9f63-006008a6efe9)]
interface nsIJARURI : nsIURI {
/**
* Returns the root URI (the one for the actual JAR file) for this JAR.
* eg http://www.big.com/blue.jar
*/
attribute nsIURI JARFile;
/**
* Returns the entry specified for this JAR URI.
* eg ocean.html
*/
attribute string JAREntry;
};

View File

@@ -0,0 +1,978 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*
*/
#include "nsNetUtil.h"
#include "nsIComponentManager.h"
#include "nsIServiceManager.h"
#include "nsSpecialSystemDirectory.h"
#include "nsJARChannel.h"
#include "nsCRT.h"
#include "nsIFileTransportService.h"
#include "nsIURL.h"
#include "nsIMIMEService.h"
#include "nsAutoLock.h"
#include "nsIFileStreams.h"
#include "nsMimeTypes.h"
#include "nsScriptSecurityManager.h"
#include "nsIAggregatePrincipal.h"
static NS_DEFINE_CID(kFileTransportServiceCID, NS_FILETRANSPORTSERVICE_CID);
static NS_DEFINE_CID(kMIMEServiceCID, NS_MIMESERVICE_CID);
static NS_DEFINE_CID(kZipReaderCID, NS_ZIPREADER_CID);
static NS_DEFINE_CID(kScriptSecurityManagerCID, NS_SCRIPTSECURITYMANAGER_CID);
#if defined(PR_LOGGING)
#include "nsXPIDLString.h"
//
// Log module for SocketTransport logging...
//
// To enable logging (see prlog.h for full details):
//
// set NSPR_LOG_MODULES=nsJarProtocol:5
// set NSPR_LOG_FILE=nspr.log
//
// this enables PR_LOG_DEBUG level information and places all output in
// the file nspr.log
//
PRLogModuleInfo* gJarProtocolLog = nsnull;
#endif /* PR_LOGGING */
////////////////////////////////////////////////////////////////////////////////
class nsJARDownloadObserver : public nsIStreamObserver
{
public:
NS_DECL_ISUPPORTS
NS_IMETHOD OnStartRequest(nsIChannel* jarCacheTransport,
nsISupports* context) {
return NS_OK;
}
NS_IMETHOD OnStopRequest(nsIChannel* jarCacheTransport,
nsISupports* context,
nsresult status,
const PRUnichar* aMsg) {
nsresult rv = NS_OK;
nsAutoMonitor monitor(mJARChannel->mMonitor);
#ifdef PR_LOGGING
nsCOMPtr<nsIURI> jarURI;
rv = jarCacheTransport->GetURI(getter_AddRefs(jarURI));
if (NS_SUCCEEDED(rv)) {
nsXPIDLCString jarURLStr;
rv = jarURI->GetSpec(getter_Copies(jarURLStr));
if (NS_SUCCEEDED(rv)) {
PR_LOG(gJarProtocolLog, PR_LOG_DEBUG,
("nsJarProtocol: jar download complete %s status=%x",
(const char*)jarURLStr, status));
}
}
#endif
if (NS_SUCCEEDED(status) && mJARChannel->mJarCacheTransport) {
NS_ASSERTION(jarCacheTransport == (mJARChannel->mJarCacheTransport).get(),
"wrong transport");
// after successfully downloading the jar file to the cache,
// start the extraction process:
nsCOMPtr<nsIFileChannel> jarCacheFile;
rv = NS_NewLocalFileChannel(getter_AddRefs(jarCacheFile),
mJarCacheFile,
PR_RDONLY,
0);
if (NS_FAILED(rv)) return rv;
rv = jarCacheFile->SetLoadGroup(mJARChannel->mLoadGroup);
if (NS_FAILED(rv)) return rv;
rv = jarCacheFile->SetBufferSegmentSize(mJARChannel->mBufferSegmentSize);
if (NS_FAILED(rv)) return rv;
rv = jarCacheFile->SetBufferMaxSize(mJARChannel->mBufferMaxSize);
if (NS_FAILED(rv)) return rv;
rv = jarCacheFile->SetLoadAttributes(mJARChannel->mLoadAttributes);
if (NS_FAILED(rv)) return rv;
rv = jarCacheFile->SetNotificationCallbacks(mJARChannel->mCallbacks);
if (NS_FAILED(rv)) return rv;
mJARChannel->SetJARBaseFile(jarCacheFile);
rv = mOnJARFileAvailable(mJARChannel, mClosure);
}
mJARChannel->mJarCacheTransport = nsnull;
return rv;
}
nsJARDownloadObserver(nsIFile* jarCacheFile, nsJARChannel* jarChannel,
OnJARFileAvailableFun onJARFileAvailable,
void* closure)
: mJarCacheFile(jarCacheFile),
mJARChannel(jarChannel),
mOnJARFileAvailable(onJARFileAvailable),
mClosure(closure)
{
NS_INIT_REFCNT();
NS_ADDREF(mJARChannel);
}
virtual ~nsJARDownloadObserver() {
NS_RELEASE(mJARChannel);
}
protected:
nsCOMPtr<nsIFile> mJarCacheFile;
nsJARChannel* mJARChannel;
OnJARFileAvailableFun mOnJARFileAvailable;
void* mClosure;
};
NS_IMPL_THREADSAFE_ISUPPORTS1(nsJARDownloadObserver, nsIStreamObserver)
////////////////////////////////////////////////////////////////////////////////
nsJARChannel::nsJARChannel()
: mContentType(nsnull),
mContentLength(-1),
mLoadAttributes(LOAD_NORMAL),
mStartPosition(0),
mReadCount(-1),
mJAREntry(nsnull),
mMonitor(nsnull),
mStatus(NS_OK)
{
NS_INIT_REFCNT();
#if defined(PR_LOGGING)
//
// Initialize the global PRLogModule for socket transport logging
// if necessary...
//
if (nsnull == gJarProtocolLog) {
gJarProtocolLog = PR_NewLogModule("nsJarProtocol");
}
#endif /* PR_LOGGING */
}
nsJARChannel::~nsJARChannel()
{
if (mContentType)
nsCRT::free(mContentType);
if (mJAREntry)
nsCRT::free(mJAREntry);
if (mMonitor)
PR_DestroyMonitor(mMonitor);
}
NS_IMPL_ISUPPORTS6(nsJARChannel,
nsIJARChannel,
nsIChannel,
nsIRequest,
nsIStreamObserver,
nsIStreamListener,
nsIFileSystem)
NS_METHOD
nsJARChannel::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult)
{
nsresult rv;
if (aOuter)
return NS_ERROR_NO_AGGREGATION;
nsJARChannel* jarChannel = new nsJARChannel();
if (jarChannel == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(jarChannel);
rv = jarChannel->QueryInterface(aIID, aResult);
NS_RELEASE(jarChannel);
return rv;
}
nsresult
nsJARChannel::Init(nsIJARProtocolHandler* aHandler, nsIURI* uri)
{
nsresult rv;
mURI = do_QueryInterface(uri, &rv);
if (NS_FAILED(rv)) return rv;
mMonitor = PR_NewMonitor();
if (mMonitor == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////
// nsIRequest methods
NS_IMETHODIMP
nsJARChannel::IsPending(PRBool* result)
{
NS_NOTREACHED("nsJARChannel::IsPending");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsJARChannel::GetStatus(nsresult *status)
{
*status = mStatus;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::Cancel(nsresult status)
{
nsresult rv;
nsAutoMonitor monitor(mMonitor);
if (mJarCacheTransport) {
rv = mJarCacheTransport->Cancel(status);
if (NS_FAILED(rv)) return rv;
mJarCacheTransport = nsnull;
}
if (mJarExtractionTransport) {
rv = mJarExtractionTransport->Cancel(status);
if (NS_FAILED(rv)) return rv;
mJarExtractionTransport = nsnull;
}
mStatus = status;
return rv;
}
NS_IMETHODIMP
nsJARChannel::Suspend()
{
nsresult rv;
nsAutoMonitor monitor(mMonitor);
if (mJarCacheTransport) {
rv = mJarCacheTransport->Suspend();
if (NS_FAILED(rv)) return rv;
}
if (mJarExtractionTransport) {
rv = mJarExtractionTransport->Suspend();
if (NS_FAILED(rv)) return rv;
}
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::Resume()
{
nsresult rv;
nsAutoMonitor monitor(mMonitor);
if (mJarCacheTransport) {
rv = mJarCacheTransport->Resume();
if (NS_FAILED(rv)) return rv;
}
if (mJarExtractionTransport) {
rv = mJarExtractionTransport->Resume();
if (NS_FAILED(rv)) return rv;
}
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////
// nsIChannel methods
NS_IMETHODIMP
nsJARChannel::GetOriginalURI(nsIURI* *aOriginalURI)
{
*aOriginalURI = mOriginalURI ? mOriginalURI : nsCOMPtr<nsIURI>(mURI);
NS_ADDREF(*aOriginalURI);
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetOriginalURI(nsIURI* aOriginalURI)
{
mOriginalURI = aOriginalURI;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetURI(nsIURI* *aURI)
{
*aURI = mURI;
NS_ADDREF(*aURI);
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetURI(nsIURI* aURI)
{
nsresult rv;
mURI = do_QueryInterface(aURI, &rv);
return rv;
}
static nsresult
OpenJARElement(nsJARChannel* channel, void* closure)
{
nsresult rv;
nsIInputStream* *result = (nsIInputStream**)closure;
nsAutoCMonitor mon(channel);
rv = channel->Open(nsnull, nsnull);
if (NS_FAILED(rv)) return rv;
rv = channel->GetInputStream(result);
mon.Notify(); // wake up OpenInputStream
return rv;
}
NS_IMETHODIMP
nsJARChannel::OpenInputStream(nsIInputStream* *result)
{
nsAutoCMonitor mon(this);
nsresult rv;
*result = nsnull;
rv = EnsureJARFileAvailable(OpenJARElement, result);
if (NS_FAILED(rv)) return rv;
if (*result == nsnull)
mon.Wait();
return rv;
}
NS_IMETHODIMP
nsJARChannel::OpenOutputStream(nsIOutputStream* *result)
{
NS_NOTREACHED("nsJARChannel::OpenOutputStream");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsJARChannel::AsyncOpen(nsIStreamObserver* observer, nsISupports* ctxt)
{
NS_NOTREACHED("nsJARChannel::AsyncOpen");
return NS_ERROR_NOT_IMPLEMENTED;
}
static nsresult
ReadJARElement(nsJARChannel* channel, void* closure)
{
nsresult rv;
rv = channel->AsyncReadJARElement();
return rv;
}
NS_IMETHODIMP
nsJARChannel::AsyncRead(nsIStreamListener* listener, nsISupports* ctxt)
{
mUserContext = ctxt;
mUserListener = listener;
return EnsureJARFileAvailable(ReadJARElement, nsnull);
}
nsresult
nsJARChannel::EnsureJARFileAvailable(OnJARFileAvailableFun onJARFileAvailable,
void* closure)
{
nsresult rv;
#ifdef PR_LOGGING
nsXPIDLCString jarURLStr;
mURI->GetSpec(getter_Copies(jarURLStr));
PR_LOG(gJarProtocolLog, PR_LOG_DEBUG,
("nsJarProtocol: EnsureJARFileAvailable %s", (const char*)jarURLStr));
#endif
rv = mURI->GetJARFile(getter_AddRefs(mJARBaseURI));
if (NS_FAILED(rv)) return rv;
rv = mURI->GetJAREntry(&mJAREntry);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIChannel> jarBaseChannel;
rv = NS_OpenURI(getter_AddRefs(jarBaseChannel), mJARBaseURI, nsnull);
if (NS_FAILED(rv)) return rv;
rv = jarBaseChannel->SetLoadGroup(mLoadGroup);
if (NS_FAILED(rv)) return rv;
rv = jarBaseChannel->SetLoadAttributes(mLoadAttributes);
if (NS_FAILED(rv)) return rv;
rv = jarBaseChannel->SetNotificationCallbacks(mCallbacks);
if (NS_FAILED(rv)) return rv;
if (mLoadGroup)
(void)mLoadGroup->AddChannel(this, nsnull);
// mJARBaseFile = do_QueryInterface(jarBaseChannel, &rv);
PRBool shouldCache;
rv = jarBaseChannel->GetShouldCache(&shouldCache);
if (NS_SUCCEEDED(rv) && !shouldCache) {
// then we've already got a local jar file -- no need to download it
PR_LOG(gJarProtocolLog, PR_LOG_DEBUG,
("nsJarProtocol: extracting local jar file %s", (const char*)jarURLStr));
rv = onJARFileAvailable(this, closure);
}
else {
// otherwise, we need to download the jar file
nsCOMPtr<nsIFile> jarCacheFile;
rv = GetCacheFile(getter_AddRefs(jarCacheFile));
if (NS_FAILED(rv)) return rv;
PRBool filePresent;
rv = jarCacheFile->IsFile(&filePresent);
if (NS_SUCCEEDED(rv) && filePresent)
{
// then we've already got the file in the local cache -- no need to download it
rv = NS_NewLocalFileChannel(getter_AddRefs(mJARBaseFile),
jarCacheFile,
PR_RDONLY,
0);
if (NS_FAILED(rv)) return rv;
rv = mJARBaseFile->SetBufferSegmentSize(mBufferSegmentSize);
if (NS_FAILED(rv)) return rv;
rv = mJARBaseFile->SetBufferMaxSize(mBufferMaxSize);
if (NS_FAILED(rv)) return rv;
PR_LOG(gJarProtocolLog, PR_LOG_DEBUG,
("nsJarProtocol: jar file already in cache %s", (const char*)jarURLStr));
rv = onJARFileAvailable(this, closure);
return rv;
}
NS_WITH_SERVICE(nsIFileTransportService, fts, kFileTransportServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
nsAutoMonitor monitor(mMonitor);
// use a file transport to serve as a data pump for the download (done
// on some other thread)
nsCOMPtr<nsIChannel> jarCacheTransport;
rv = fts->CreateTransport(jarCacheFile, PR_RDONLY, 0,
getter_AddRefs(mJarCacheTransport));
if (NS_FAILED(rv)) return rv;
rv = mJarCacheTransport->SetBufferSegmentSize(mBufferSegmentSize);
if (NS_FAILED(rv)) return rv;
rv = mJarCacheTransport->SetBufferMaxSize(mBufferMaxSize);
if (NS_FAILED(rv)) return rv;
rv = mJarCacheTransport->SetNotificationCallbacks(mCallbacks);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIStreamObserver> downloadObserver =
new nsJARDownloadObserver(jarCacheFile, this, onJARFileAvailable, closure);
if (downloadObserver == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
PR_LOG(gJarProtocolLog, PR_LOG_DEBUG,
("nsJarProtocol: downloading jar file %s", (const char*)jarURLStr));
nsCOMPtr<nsIInputStream> jarBaseIn;
rv = jarBaseChannel->OpenInputStream(getter_AddRefs(jarBaseIn));
if (NS_FAILED(rv)) return rv;
rv = mJarCacheTransport->AsyncWrite(jarBaseIn, nsnull, downloadObserver);
}
return rv;
}
nsresult
nsJARChannel::GetCacheFile(nsIFile* *cacheFile)
{
// XXX change later to use the real network cache
nsresult rv;
nsCOMPtr<nsIFile> jarCacheFile;
rv = NS_GetSpecialDirectory("xpcom.currentProcess.componentDirectory",
getter_AddRefs(jarCacheFile));
if (NS_FAILED(rv)) return rv;
jarCacheFile->Append("jarCache");
PRBool exists;
rv = jarCacheFile->Exists(&exists);
if (NS_FAILED(rv)) return rv;
if (!exists) {
rv = jarCacheFile->Create(nsIFile::DIRECTORY_TYPE, 0664);
if (NS_FAILED(rv)) return rv;
}
nsCOMPtr<nsIURL> jarBaseURL = do_QueryInterface(mJARBaseURI, &rv);
if (NS_FAILED(rv)) return rv;
char* jarFileName;
rv = jarBaseURL->GetFileName(&jarFileName);
if (NS_FAILED(rv)) return rv;
rv = jarCacheFile->Append(jarFileName);
nsCRT::free(jarFileName);
if (NS_FAILED(rv)) return rv;
*cacheFile = jarCacheFile;
NS_ADDREF(*cacheFile);
return rv;
}
nsresult
nsJARChannel::AsyncReadJARElement()
{
nsresult rv;
nsAutoMonitor monitor(mMonitor);
NS_ASSERTION(mJARBaseFile, "mJARBaseFile is null");
if (mLoadGroup) {
nsCOMPtr<nsILoadGroupListenerFactory> factory;
//
// Create a load group "proxy" listener...
//
rv = mLoadGroup->GetGroupListenerFactory(getter_AddRefs(factory));
if (factory) {
nsIStreamListener *newListener;
rv = factory->CreateLoadGroupListener(mUserListener, &newListener);
if (NS_SUCCEEDED(rv)) {
mUserListener = newListener;
NS_RELEASE(newListener);
}
}
rv = mLoadGroup->AddChannel(this, nsnull);
if (NS_FAILED(rv)) return rv;
}
NS_WITH_SERVICE(nsIFileTransportService, fts, kFileTransportServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
rv = fts->CreateTransportFromFileSystem(this,
getter_AddRefs(mJarExtractionTransport));
if (NS_FAILED(rv)) return rv;
rv = mJarExtractionTransport->SetBufferSegmentSize(mBufferSegmentSize);
if (NS_FAILED(rv)) return rv;
rv = mJarExtractionTransport->SetBufferMaxSize(mBufferMaxSize);
if (NS_FAILED(rv)) return rv;
rv = mJarExtractionTransport->SetNotificationCallbacks(mCallbacks);
if (NS_FAILED(rv)) return rv;
#ifdef PR_LOGGING
nsXPIDLCString jarURLStr;
mURI->GetSpec(getter_Copies(jarURLStr));
PR_LOG(gJarProtocolLog, PR_LOG_DEBUG,
("nsJarProtocol: AsyncRead jar entry %s", (const char*)jarURLStr));
#endif
rv = mJarExtractionTransport->SetTransferOffset(mStartPosition);
if (NS_FAILED(rv)) return rv;
rv = mJarExtractionTransport->SetTransferCount(mReadCount);
if (NS_FAILED(rv)) return rv;
rv = mJarExtractionTransport->AsyncRead(this, nsnull);
return rv;
}
NS_IMETHODIMP
nsJARChannel::AsyncWrite(nsIInputStream* fromStream,
nsIStreamObserver* observer,
nsISupports* ctxt)
{
NS_NOTREACHED("nsJARChannel::AsyncWrite");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsJARChannel::GetLoadAttributes(PRUint32* aLoadFlags)
{
*aLoadFlags = mLoadAttributes;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetLoadAttributes(PRUint32 aLoadFlags)
{
mLoadAttributes = aLoadFlags;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetContentType(char* *aContentType)
{
nsresult rv = NS_OK;
if (mContentType == nsnull) {
char* fileName = new char[PL_strlen(mJAREntry)+1];
PL_strcpy(fileName, mJAREntry);
if (fileName != nsnull) {
PRInt32 len = nsCRT::strlen(fileName);
const char* ext = nsnull;
for (PRInt32 i = len; i >= 0; i--) {
if (fileName[i] == '.') {
ext = &fileName[i + 1];
break;
}
}
if (ext) {
NS_WITH_SERVICE(nsIMIMEService, mimeServ, kMIMEServiceCID, &rv);
if (NS_SUCCEEDED(rv)) {
rv = mimeServ->GetTypeFromExtension(ext, &mContentType);
}
}
else
rv = NS_ERROR_FAILURE;
nsCRT::free(fileName);
}
else {
rv = NS_ERROR_FAILURE;
}
if (NS_FAILED(rv)) {
mContentType = nsCRT::strdup(UNKNOWN_CONTENT_TYPE);
if (mContentType == nsnull)
rv = NS_ERROR_OUT_OF_MEMORY;
else
rv = NS_OK;
}
}
if (NS_SUCCEEDED(rv)) {
*aContentType = nsCRT::strdup(mContentType);
if (*aContentType == nsnull)
rv = NS_ERROR_OUT_OF_MEMORY;
}
return rv;
}
NS_IMETHODIMP
nsJARChannel::SetContentType(const char *aContentType)
{
if (mContentType) {
nsCRT::free(mContentType);
}
mContentType = nsCRT::strdup(aContentType);
if (!mContentType) return NS_ERROR_OUT_OF_MEMORY;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetContentLength(PRInt32* aContentLength)
{
if (mContentLength == -1)
return NS_ERROR_FAILURE;
*aContentLength = mContentLength;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetContentLength(PRInt32 aContentLength)
{
NS_NOTREACHED("nsJARChannel::SetContentLength");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsJARChannel::GetTransferOffset(PRUint32 *aTransferOffset)
{
*aTransferOffset = mStartPosition;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetTransferOffset(PRUint32 aTransferOffset)
{
mStartPosition = aTransferOffset;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetTransferCount(PRInt32 *aTransferCount)
{
*aTransferCount = mReadCount;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetTransferCount(PRInt32 aTransferCount)
{
mReadCount = aTransferCount;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetBufferSegmentSize(PRUint32 *aBufferSegmentSize)
{
*aBufferSegmentSize = mBufferSegmentSize;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetBufferSegmentSize(PRUint32 aBufferSegmentSize)
{
mBufferSegmentSize = aBufferSegmentSize;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetBufferMaxSize(PRUint32 *aBufferMaxSize)
{
*aBufferMaxSize = mBufferMaxSize;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetBufferMaxSize(PRUint32 aBufferMaxSize)
{
mBufferMaxSize = aBufferMaxSize;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetShouldCache(PRBool *aShouldCache)
{
// Jar files report that you shouldn't cache them because this is really
// a question about the jar entry, and the jar entry is always in a jar
// file on disk.
*aShouldCache = PR_FALSE;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetPipeliningAllowed(PRBool *aPipeliningAllowed)
{
*aPipeliningAllowed = PR_FALSE;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetPipeliningAllowed(PRBool aPipeliningAllowed)
{
NS_NOTREACHED("SetPipeliningAllowed");
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsJARChannel::GetLoadGroup(nsILoadGroup* *aLoadGroup)
{
*aLoadGroup = mLoadGroup;
NS_IF_ADDREF(*aLoadGroup);
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetLoadGroup(nsILoadGroup* aLoadGroup)
{
mLoadGroup = aLoadGroup;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetOwner(nsISupports* *aOwner)
{
if (!mOwner)
{
nsCOMPtr<nsIPrincipal> certificate;
PRInt16 result;
nsresult rv = mJAR->GetCertificatePrincipal(mJAREntry,
getter_AddRefs(certificate),
&result);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
if (certificate)
{ // Get the codebase principal
NS_WITH_SERVICE(nsIScriptSecurityManager, secMan,
kScriptSecurityManagerCID, &rv);
if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
nsCOMPtr<nsIPrincipal> codebase;
rv = secMan->GetCodebasePrincipal(mJARBaseURI,
getter_AddRefs(codebase));
if (NS_FAILED(rv)) return rv;
// Join the certificate and the codebase
nsCOMPtr<nsIAggregatePrincipal> agg;
agg = do_QueryInterface(certificate, &rv);
NS_ASSERTION(NS_SUCCEEDED(rv),
"Certificate principal is not an aggregate");
rv = agg->SetCodebase(codebase);
if (NS_FAILED(rv)) return rv;
mOwner = do_QueryInterface(agg, &rv);
if (NS_FAILED(rv)) return rv;
}
}
*aOwner = mOwner;
NS_IF_ADDREF(*aOwner);
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetOwner(nsISupports* aOwner)
{
mOwner = aOwner;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetNotificationCallbacks(nsIInterfaceRequestor* *aNotificationCallbacks)
{
*aNotificationCallbacks = mCallbacks.get();
NS_IF_ADDREF(*aNotificationCallbacks);
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::SetNotificationCallbacks(nsIInterfaceRequestor* aNotificationCallbacks)
{
mCallbacks = aNotificationCallbacks;
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetSecurityInfo(nsISupports * *aSecurityInfo)
{
*aSecurityInfo = nsnull;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////
// nsIStreamObserver methods:
NS_IMETHODIMP
nsJARChannel::OnStartRequest(nsIChannel* jarExtractionTransport,
nsISupports* context)
{
return mUserListener->OnStartRequest(this, mUserContext);
}
NS_IMETHODIMP
nsJARChannel::OnStopRequest(nsIChannel* jarExtractionTransport,
nsISupports* context,
nsresult status,
const PRUnichar* aMsg)
{
nsresult rv;
#ifdef PR_LOGGING
nsCOMPtr<nsIURI> jarURI;
nsXPIDLCString jarURLStr;
rv = mURI->GetSpec(getter_Copies(jarURLStr));
if (NS_SUCCEEDED(rv)) {
PR_LOG(gJarProtocolLog, PR_LOG_DEBUG,
("nsJarProtocol: jar extraction complete %s status=%x",
(const char*)jarURLStr, status));
}
#endif
rv = mUserListener->OnStopRequest(this, mUserContext, status, aMsg);
if (mLoadGroup) {
if (NS_SUCCEEDED(rv)) {
mLoadGroup->RemoveChannel(this, context, status, aMsg);
}
}
mUserListener = nsnull;
mUserContext = nsnull;
mJarExtractionTransport = nsnull;
return rv;
}
////////////////////////////////////////////////////////////////////////////////
// nsIStreamListener methods:
NS_IMETHODIMP
nsJARChannel::OnDataAvailable(nsIChannel* jarCacheTransport,
nsISupports* context,
nsIInputStream *inStr,
PRUint32 sourceOffset,
PRUint32 count)
{
return mUserListener->OnDataAvailable(this, mUserContext,
inStr, sourceOffset, count);
}
////////////////////////////////////////////////////////////////////////////////
// nsIFileSystem methods:
NS_IMETHODIMP
nsJARChannel::Open(char* *contentType, PRInt32 *contentLength)
{
nsresult rv;
NS_ASSERTION(mJARBaseFile, "mJARBaseFile is null");
rv = nsComponentManager::CreateInstance(kZipReaderCID,
nsnull,
NS_GET_IID(nsIZipReader),
getter_AddRefs(mJAR));
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIFile> fs;
rv = mJARBaseFile->GetFile(getter_AddRefs(fs));
if (NS_FAILED(rv)) return rv;
rv = mJAR->Init(fs);
if (NS_FAILED(rv)) return rv;
rv = mJAR->Open();
if (NS_FAILED(rv)) return rv;
// If this fails, GetOwner will fail, but otherwise we can continue.
mJAR->ParseManifest();
nsCOMPtr<nsIZipEntry> entry;
rv = mJAR->GetEntry(mJAREntry, getter_AddRefs(entry));
if (NS_FAILED(rv)) return rv;
if (contentLength) {
rv = entry->GetRealSize((PRUint32*)contentLength);
if (NS_FAILED(rv)) return rv;
}
if (contentType) {
rv = GetContentType(contentType);
if (NS_FAILED(rv)) return rv;
}
return rv;
}
NS_IMETHODIMP
nsJARChannel::Close(nsresult status)
{
mJAR = null_nsCOMPtr();
return NS_OK;
}
NS_IMETHODIMP
nsJARChannel::GetInputStream(nsIInputStream* *aInputStream)
{
#ifdef PR_LOGGING
nsXPIDLCString jarURLStr;
mURI->GetSpec(getter_Copies(jarURLStr));
PR_LOG(gJarProtocolLog, PR_LOG_DEBUG,
("nsJarProtocol: GetInputStream jar entry %s", (const char*)jarURLStr));
#endif
return mJAR->GetInputStream(mJAREntry, aInputStream);
}
NS_IMETHODIMP
nsJARChannel::GetOutputStream(nsIOutputStream* *aOutputStream)
{
NS_NOTREACHED("nsJARChannel::GetOutputStream");
return NS_ERROR_NOT_IMPLEMENTED;
}
////////////////////////////////////////////////////////////////////////////////
// nsIJARChannel methods:
NS_IMETHODIMP
nsJARChannel::EnumerateEntries(const char *aRoot, nsISimpleEnumerator **_retval)
{
NS_NOTREACHED("nsJARChannel::EnumerateEntries");
return NS_ERROR_NOT_IMPLEMENTED;
}
////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,115 @@
/* -*- 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):
*/
#ifndef nsJARChannel_h__
#define nsJARChannel_h__
#include "nsIJARChannel.h"
#include "nsIStreamListener.h"
#include "nsIJARProtocolHandler.h"
#include "nsIJARURI.h"
#include "nsIFileSystem.h"
#include "nsIChannel.h"
#include "nsIZipReader.h"
#include "nsIChannel.h"
#include "nsILoadGroup.h"
#include "nsIInterfaceRequestor.h"
#include "nsCOMPtr.h"
#include "nsIFile.h"
#include "prmon.h"
class nsIFileChannel;
class nsJARChannel;
#define NS_JARCHANNEL_CID \
{ /* 0xc7e410d5-0x85f2-11d3-9f63-006008a6efe9 */ \
0xc7e410d5, \
0x85f2, \
0x11d3, \
{0x9f, 0x63, 0x00, 0x60, 0x08, 0xa6, 0xef, 0xe9} \
}
#define JAR_DIRECTORY "jarCache"
typedef nsresult
(*OnJARFileAvailableFun)(nsJARChannel* channel, void* closure);
class nsJARChannel : public nsIJARChannel,
public nsIStreamListener,
public nsIFileSystem
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIREQUEST
NS_DECL_NSICHANNEL
NS_DECL_NSIJARCHANNEL
NS_DECL_NSISTREAMOBSERVER
NS_DECL_NSISTREAMLISTENER
NS_DECL_NSIFILESYSTEM
nsJARChannel();
virtual ~nsJARChannel();
// Define a Create method to be used with a factory:
static NS_METHOD
Create(nsISupports* aOuter, REFNSIID aIID, void **aResult);
nsresult Init(nsIJARProtocolHandler* aHandler, nsIURI* uri);
nsresult EnsureJARFileAvailable(OnJARFileAvailableFun fun,
void* closure);
nsresult AsyncReadJARElement();
nsresult GetCacheFile(nsIFile* *cacheFile);
void SetJARBaseFile(nsIFileChannel* channel) { mJARBaseFile = channel; }
friend class nsJARDownloadObserver;
protected:
nsCOMPtr<nsIJARURI> mURI;
nsCOMPtr<nsILoadGroup> mLoadGroup;
nsCOMPtr<nsIInterfaceRequestor> mCallbacks;
nsCOMPtr<nsIURI> mOriginalURI;
nsLoadFlags mLoadAttributes;
nsCOMPtr<nsISupports> mOwner;
PRUint32 mStartPosition;
PRInt32 mReadCount;
nsCOMPtr<nsISupports> mUserContext;
nsCOMPtr<nsIStreamListener> mUserListener;
char* mContentType;
PRInt32 mContentLength;
nsCOMPtr<nsIURI> mJARBaseURI;
nsCOMPtr<nsIFileChannel> mJARBaseFile;
char* mJAREntry;
nsCOMPtr<nsIZipReader> mJAR;
PRUint32 mBufferSegmentSize;
PRUint32 mBufferMaxSize;
nsresult mStatus;
PRMonitor* mMonitor;
nsCOMPtr<nsIChannel> mJarCacheTransport;
nsCOMPtr<nsIChannel> mJarExtractionTransport;
};
#endif // nsJARChannel_h__

View File

@@ -0,0 +1,138 @@
/* -*- 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):
*/
#include "nsJARProtocolHandler.h"
#include "nsIIOService.h"
#include "nsCRT.h"
#include "nsIComponentManager.h"
#include "nsIServiceManager.h"
#include "nsJARURI.h"
#include "nsIURL.h"
#include "nsJARChannel.h"
static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
static NS_DEFINE_CID(kJARUriCID, NS_JARURI_CID);
////////////////////////////////////////////////////////////////////////////////
nsJARProtocolHandler::nsJARProtocolHandler()
{
NS_INIT_REFCNT();
}
nsresult
nsJARProtocolHandler::Init()
{
return NS_OK;
}
nsJARProtocolHandler::~nsJARProtocolHandler()
{
}
NS_IMPL_ISUPPORTS2(nsJARProtocolHandler,
nsIJARProtocolHandler,
nsIProtocolHandler)
NS_METHOD
nsJARProtocolHandler::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult)
{
if (aOuter)
return NS_ERROR_NO_AGGREGATION;
nsJARProtocolHandler* ph = new nsJARProtocolHandler();
if (ph == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(ph);
nsresult rv = ph->Init();
if (NS_SUCCEEDED(rv)) {
rv = ph->QueryInterface(aIID, aResult);
}
NS_RELEASE(ph);
return rv;
}
////////////////////////////////////////////////////////////////////////////////
// nsIProtocolHandler methods:
NS_IMETHODIMP
nsJARProtocolHandler::GetScheme(char* *result)
{
*result = nsCRT::strdup("jar");
if (*result == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
return NS_OK;
}
NS_IMETHODIMP
nsJARProtocolHandler::GetDefaultPort(PRInt32 *result)
{
*result = -1; // no port for JAR: URLs
return NS_OK;
}
NS_IMETHODIMP
nsJARProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI,
nsIURI **result)
{
nsresult rv;
nsIURI* url;
if (aBaseURI) {
rv = aBaseURI->Clone(&url);
if (NS_FAILED(rv)) return rv;
rv = url->SetRelativePath(aSpec);
}
else {
rv = nsJARURI::Create(nsnull, NS_GET_IID(nsIJARURI), (void**)&url);
if (NS_FAILED(rv)) return rv;
rv = url->SetSpec((char*)aSpec);
}
if (NS_FAILED(rv)) {
NS_RELEASE(url);
return rv;
}
*result = url;
return rv;
}
NS_IMETHODIMP
nsJARProtocolHandler::NewChannel(nsIURI* uri, nsIChannel* *result)
{
nsresult rv;
nsJARChannel* channel;
rv = nsJARChannel::Create(nsnull, NS_GET_IID(nsIJARChannel), (void**)&channel);
if (NS_FAILED(rv)) return rv;
rv = channel->Init(this, uri);
if (NS_FAILED(rv)) {
NS_RELEASE(channel);
return rv;
}
*result = channel;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,57 @@
/* -*- 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):
*/
#ifndef nsJARProtocolHandler_h___
#define nsJARProtocolHandler_h___
#include "nsIJARProtocolHandler.h"
#include "nsIProtocolHandler.h"
#include "nsIJARURI.h"
#define NS_JARPROTOCOLHANDLER_CID \
{ /* 0xc7e410d4-0x85f2-11d3-9f63-006008a6efe9 */ \
0xc7e410d4, \
0x85f2, \
0x11d3, \
{0x9f, 0x63, 0x00, 0x60, 0x08, 0xa6, 0xef, 0xe9} \
}
class nsJARProtocolHandler : public nsIJARProtocolHandler
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIPROTOCOLHANDLER
// nsJARProtocolHandler methods:
nsJARProtocolHandler();
virtual ~nsJARProtocolHandler();
static NS_METHOD
Create(nsISupports *aOuter, REFNSIID aIID, void **aResult);
nsresult Init();
protected:
};
#endif /* nsJARProtocolHandler_h___ */

View File

@@ -0,0 +1,38 @@
/* -*- 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):
*/
#include "nsIModule.h"
#include "nsIGenericFactory.h"
#include "nsJARProtocolHandler.h"
static nsModuleComponentInfo components[] =
{
{ "JAR Protocol Handler",
NS_JARPROTOCOLHANDLER_CID,
NS_NETWORK_PROTOCOL_PROGID_PREFIX "jar",
nsJARProtocolHandler::Create
},
};
NS_IMPL_NSGETMODULE("nsJarProtocolModule", components);

View File

@@ -0,0 +1,384 @@
/* -*- Mode: IDL; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "nsJARURI.h"
#include "nsNetUtil.h"
#include "nsIIOService.h"
#include "nsFileSpec.h"
#include "nsCRT.h"
#include "nsIComponentManager.h"
#include "nsIServiceManager.h"
#include "nsIZipReader.h"
static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
////////////////////////////////////////////////////////////////////////////////
nsJARURI::nsJARURI()
: mJAREntry(nsnull)
{
NS_INIT_REFCNT();
}
nsJARURI::~nsJARURI()
{
}
NS_IMPL_ISUPPORTS2(nsJARURI, nsIJARURI, nsIURI)
NS_METHOD
nsJARURI::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult)
{
if (aOuter)
return NS_ERROR_NO_AGGREGATION;
nsJARURI* uri = new nsJARURI();
if (uri == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(uri);
nsresult rv = uri->Init();
if (NS_SUCCEEDED(rv)) {
rv = uri->QueryInterface(aIID, aResult);
}
NS_RELEASE(uri);
return rv;
}
nsresult
nsJARURI::Init()
{
return NS_OK;
}
#define NS_JAR_SCHEME "jar:"
#define NS_JAR_DELIMITER "!/"
nsresult
nsJARURI::FormatSpec(const char* entryPath, char* *result)
{
nsresult rv;
char* jarFileSpec;
rv = mJARFile->GetSpec(&jarFileSpec);
if (NS_FAILED(rv)) return rv;
nsCString spec(NS_JAR_SCHEME);
spec += jarFileSpec;
nsCRT::free(jarFileSpec);
spec += NS_JAR_DELIMITER;
spec += entryPath;
*result = nsCRT::strdup(spec);
return *result ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
////////////////////////////////////////////////////////////////////////////////
// nsURI methods:
NS_IMETHODIMP
nsJARURI::GetSpec(char* *aSpec)
{
return FormatSpec(mJAREntry, aSpec);
}
NS_IMETHODIMP
nsJARURI::SetSpec(const char * aSpec)
{
nsresult rv;
NS_WITH_SERVICE(nsIIOService, serv, kIOServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
PRUint32 startPos, endPos;
rv = serv->ExtractScheme(aSpec, &startPos, &endPos, nsnull);
if (NS_FAILED(rv)) return rv;
if (nsCRT::strncmp("jar", &aSpec[startPos], endPos - startPos - 1) != 0)
return NS_ERROR_MALFORMED_URI;
// Search backward from the end for the "!/" delimiter. Remember, jar URLs
// can nest, e.g.:
// jar:jar:http://www.foo.com/bar.jar!/a.jar!/b.html
// This gets the b.html document from out of the a.jar file, that's
// contained within the bar.jar file.
nsCAutoString jarPath(aSpec);
PRInt32 pos = jarPath.RFind(NS_JAR_DELIMITER);
if (pos == -1 || endPos + 1 > (PRUint32)pos)
return NS_ERROR_MALFORMED_URI;
jarPath.Cut(pos, jarPath.Length());
jarPath.Cut(0, endPos);
rv = serv->NewURI(jarPath, nsnull, getter_AddRefs(mJARFile));
if (NS_FAILED(rv)) return rv;
nsCAutoString entry(aSpec);
entry.Cut(0, pos + 2); // 2 == strlen(NS_JAR_DELIMITER)
rv = serv->ResolveRelativePath(entry, nsnull, &mJAREntry);
return rv;
}
NS_IMETHODIMP
nsJARURI::GetScheme(char * *aScheme)
{
*aScheme = nsCRT::strdup("jar");
return *aScheme ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
NS_IMETHODIMP
nsJARURI::SetScheme(const char * aScheme)
{
// doesn't make sense to set the scheme of a jar: URL
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARURI::GetUsername(char * *aUsername)
{
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARURI::SetUsername(const char * aUsername)
{
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARURI::GetPassword(char * *aPassword)
{
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARURI::SetPassword(const char * aPassword)
{
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARURI::GetPreHost(char * *aPreHost)
{
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARURI::SetPreHost(const char * aPreHost)
{
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARURI::GetHost(char * *aHost)
{
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARURI::SetHost(const char * aHost)
{
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARURI::GetPort(PRInt32 *aPort)
{
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARURI::SetPort(PRInt32 aPort)
{
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARURI::GetPath(char * *aPath)
{
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARURI::SetPath(const char * aPath)
{
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARURI::GetURLParser(nsIURLParser * *aURLParser)
{
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARURI::SetURLParser(nsIURLParser * aURLParser)
{
return NS_ERROR_FAILURE;
}
NS_IMETHODIMP
nsJARURI::Equals(nsIURI *other, PRBool *result)
{
nsresult rv;
*result = PR_FALSE;
nsJARURI* otherJAR;
rv = other->QueryInterface(NS_GET_IID(nsIJARURI), (void**)&otherJAR);
if (NS_FAILED(rv))
return NS_OK; // not equal
nsCOMPtr<nsIURI> otherJARFile;
rv = otherJAR->GetJARFile(getter_AddRefs(otherJARFile));
if (NS_FAILED(rv)) return rv;
PRBool equal;
rv = mJARFile->Equals(otherJARFile, &equal);
if (NS_FAILED(rv)) return rv;
if (!equal)
return NS_OK; // not equal
char* otherJAREntry;
rv = otherJAR->GetJAREntry(&otherJAREntry);
if (NS_FAILED(rv)) return rv;
*result = nsCRT::strcmp(mJAREntry, otherJAREntry) == 0;
nsCRT::free(otherJAREntry);
return NS_OK;
}
NS_IMETHODIMP
nsJARURI::Clone(nsIURI **result)
{
nsresult rv;
nsCOMPtr<nsIURI> newJARFile;
rv = mJARFile->Clone(getter_AddRefs(newJARFile));
if (NS_FAILED(rv)) return rv;
char* newJAREntry = nsCRT::strdup(mJAREntry);
if (newJAREntry == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
nsJARURI* uri = new nsJARURI();
if (uri == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(uri);
uri->mJARFile = newJARFile;
uri->mJAREntry = newJAREntry;
*result = uri;
return NS_OK;
}
NS_IMETHODIMP
nsJARURI::SetRelativePath(const char *relativePath)
{
nsresult rv;
NS_WITH_SERVICE(nsIIOService, serv, kIOServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
nsCAutoString path(mJAREntry);
PRInt32 pos = path.RFind("/");
if (pos >= 0)
path.Truncate(pos + 1);
else
path = "";
char* resolvedEntry;
rv = serv->ResolveRelativePath(relativePath, path.GetBuffer(),
&resolvedEntry);
if (NS_FAILED(rv)) return rv;
nsCRT::free(mJAREntry);
mJAREntry = resolvedEntry;
return NS_OK;
}
NS_IMETHODIMP
nsJARURI::Resolve(const char *relativePath, char **result)
{
nsresult rv;
NS_WITH_SERVICE(nsIIOService, serv, kIOServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
nsCAutoString path(mJAREntry);
PRInt32 pos = path.RFind("/");
if (pos >= 0)
path.Truncate(pos + 1);
else
path = "";
char* resolvedEntry;
rv = serv->ResolveRelativePath(relativePath, path.GetBuffer(),
&resolvedEntry);
if (NS_FAILED(rv)) return rv;
rv = FormatSpec(resolvedEntry, result);
nsCRT::free(resolvedEntry);
return rv;
}
////////////////////////////////////////////////////////////////////////////////
// nsIJARUri methods:
NS_IMETHODIMP
nsJARURI::GetJARFile(nsIURI* *jarFile)
{
*jarFile = mJARFile;
NS_ADDREF(*jarFile);
return NS_OK;
}
NS_IMETHODIMP
nsJARURI::SetJARFile(nsIURI* jarFile)
{
mJARFile = jarFile;
return NS_OK;
}
NS_IMETHODIMP
nsJARURI::GetJAREntry(char* *entryPath)
{
nsCAutoString entry(mJAREntry);
PRInt32 pos = entry.RFindCharInSet("#?;");
if (pos >= 0)
entry.Truncate(pos);
*entryPath = entry.ToNewCString();
return *entryPath ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
}
NS_IMETHODIMP
nsJARURI::SetJAREntry(const char* entryPath)
{
nsresult rv;
NS_WITH_SERVICE(nsIIOService, serv, kIOServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
if (mJAREntry)
nsCRT::free(mJAREntry);
rv = serv->ResolveRelativePath(entryPath, nsnull, &mJAREntry);
return rv;
}
////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,55 @@
/* -*- Mode: IDL; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#ifndef nsJARURI_h__
#define nsJARURI_h__
#include "nsIJARURI.h"
#include "nsCOMPtr.h"
#define NS_JARURI_CID \
{ /* 0xc7e410d7-0x85f2-11d3-9f63-006008a6efe9 */ \
0xc7e410d7, \
0x85f2, \
0x11d3, \
{0x9f, 0x63, 0x00, 0x60, 0x08, 0xa6, 0xef, 0xe9} \
}
class nsJARURI : public nsIJARURI
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIURI
NS_DECL_NSIJARURI
// nsJARURI
nsJARURI();
virtual ~nsJARURI();
static NS_METHOD
Create(nsISupports *aOuter, REFNSIID aIID, void **aResult);
nsresult Init();
nsresult FormatSpec(const char* entryPath, char* *result);
protected:
nsCOMPtr<nsIURI> mJARFile;
char *mJAREntry;
};
#endif // nsJARURI_h__

View File

@@ -0,0 +1,45 @@
#
# 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 = ..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
DIRS = \
cache \
base \
dns \
socket \
build \
protocol \
mime \
streamconv \
$(NULL)
ifdef ENABLE_TESTS
DIRS += test
endif
include $(topsrcdir)/config/rules.mk

View File

@@ -0,0 +1,32 @@
#
# 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 = ../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
DIRS = public src
include $(topsrcdir)/config/rules.mk

View File

@@ -0,0 +1,31 @@
#!gmake
#
# 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 = necko
DIRS= \
public \
src \
$(NULL)
include <$(DEPTH)\config\rules.mak>

View File

@@ -0,0 +1,7 @@
#
# This is a list of local files which get copied to the mozilla:dist directory
#
netCore.h
nsNetUtil.h
nsUnixColorPrintf.h

View File

@@ -0,0 +1,17 @@
#
# This is a list of local files which get copied to the mozilla:dist directory
#
nsIStreamListener.idl
nsIStreamObserver.idl
nsIURI.idl
nsIURL.idl
nsIChannel.idl
nsIRequest.idl
nsISocketTransportService.idl
nsIFileTransportService.idl
nsIFileSystem.idl
nsIPrompt.idl
nsIStreamLoader.idl
nsIURLParser.idl
nsIProtocolProxyService.idl

View File

@@ -0,0 +1,67 @@
#
# 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 = ../../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = necko
XPIDL_MODULE = necko_base
XPIDLSRCS = \
nsIFileStreams.idl \
nsIRequest.idl \
nsIChannel.idl \
nsIURI.idl \
nsIURL.idl \
nsIStreamObserver.idl \
nsIStreamListener.idl \
nsIIOService.idl \
nsIPrompt.idl \
nsIProtocolHandler.idl \
nsIProgressEventSink.idl \
nsINetModRegEntry.idl \
nsINetModuleMgr.idl \
nsINetNotify.idl \
nsILoadGroup.idl \
nsIFileTransportService.idl \
nsISocketTransportService.idl \
nsIStatusCodeEventSink.idl \
nsIFileSystem.idl \
nsIStreamLoader.idl \
nsINetPrompt.idl \
nsISocketTransport.idl \
nsIURLParser.idl \
nsIProxy.idl \
nsIProtocolProxyService.idl \
$(NULL)
EXPORTS = \
netCore.h \
nsNetUtil.h \
nsUnixColorPrintf.h \
$(NULL)
include $(topsrcdir)/config/rules.mk

View File

@@ -0,0 +1,66 @@
#!gmake
#
# 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):
MODULE = necko
DEPTH = ..\..\..
include <$(DEPTH)/config/config.mak>
EXPORTS = \
netCore.h \
nsNetUtil.h \
nsUnixColorPrintf.h \
$(NULL)
XPIDLSRCS = \
.\nsIFileStreams.idl \
.\nsIRequest.idl \
.\nsIChannel.idl \
.\nsIURI.idl \
.\nsIURL.idl \
.\nsIStreamObserver.idl \
.\nsIStreamListener.idl \
.\nsIIOService.idl \
.\nsIPrompt.idl \
.\nsIProtocolHandler.idl \
.\nsIProgressEventSink.idl \
.\nsINetModRegEntry.idl \
.\nsINetModuleMgr.idl \
.\nsINetNotify.idl \
.\nsILoadGroup.idl \
.\nsISocketTransportService.idl \
.\nsIFileTransportService.idl \
.\nsIStatusCodeEventSink.idl \
.\nsIFileSystem.idl \
.\nsIStreamLoader.idl \
.\nsINetPrompt.idl \
.\nsISocketTransport.idl \
.\nsIURLParser.idl \
.\nsIProxy.idl \
.\nsIProtocolProxyService.idl \
$(NULL)
include <$(DEPTH)/config/rules.mak>
$(DEPTH)\netwerk\dist\include:
-mkdir $(DEPTH)\netwerk\dist
-mkdir $(DEPTH)\netwerk\dist\include

View File

@@ -0,0 +1,64 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/*
* The contents of this file are subject to the Netscape Public
* License Version 1.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):
*/
#ifndef __netCore_h__
#define __netCore_h__
#include "nsError.h"
/* networking error codes */
// NET RANGE: 1 -20
// FTP RANGE: 21-30
// HTTP RANGE: 31-40
// DNS RANGE: 41-50
#define NS_ERROR_ALREADY_CONNECTED \
NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_NETWORK, 11)
#define NS_ERROR_NOT_CONNECTED \
NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_NETWORK, 12)
/* NS_ERROR_CONNECTION_REFUSED and NS_ERROR_NET_TIMEOUT moved to nsISocketTransportService.idl */
#define NS_ERROR_IN_PROGRESS \
NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_NETWORK, 15)
#define NS_ERROR_OFFLINE \
NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_NETWORK, 16)
#undef NS_NET
#ifdef _IMPL_NS_NET
#ifdef XP_PC
#define NS_NET _declspec(dllexport)
#else /* !XP_PC */
#define NS_NET
#endif /* !XP_PC */
#else /* !_IMPL_NS_NET */
#ifdef XP_PC
#define NS_NET _declspec(dllimport)
#else /* !XP_PC */
#define NS_NET
#endif /* !XP_PC */
#endif /* !_IMPL_NS_NET */
#endif // __netCore_h__

View File

@@ -0,0 +1,403 @@
/* -*- 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 "nsIRequest.idl"
interface nsIURI;
interface nsIInputStream;
interface nsIOutputStream;
interface nsIStreamObserver;
interface nsIStreamListener;
interface nsILoadGroup;
interface nsIInterfaceRequestor;
interface nsIFile;
typedef unsigned long nsLoadFlags;
/**
* The nsIChannel interface allows the user to construct I/O requests for
* specific protocols, and manage them in a uniform way. Once a channel
* is created (via nsIIOService::NewChannel), parameters for that request
* may be set by using the channel attributes, or by QueryInterfacing to a
* subclass of nsIChannel for protocol-specific parameters. Then the actual
* request can be issued in one of several ways:
*
* - AsyncRead and AsyncWrite allow for asynchronous requests, calling
* back the user's stream listener or observer,
* - OpenInputStream and OpenOutputStream allow for synchronous reads
* and writes on the underlying channel.
*
* After a request has been completed, the channel is still valid for
* accessing protocol-specific results. For example, QueryInterfacing to
* nsIHTTPChannel allows response headers to be retrieved that result from
* http transactions.
*
* Note that a channel is really only valid for one request. Reusing a channel
* after a request has completed for a subsequent request may have undefined
* results, depending on the channel implementation.
*
* Also of note are a special kind of channel called "transports." Transports
* also implement the nsIChannel interface, but operate at a lower level from
* protocol channels. The socket and file transports are notable implementations
* of transports and allow higher level channels to be implemented. The cache
* may also behave as a transport, and possibly things like sound playing services
* etc. Transports usually operate in a separate thread and often multiplex
* multiple requests for the same kind of service or resources.
*/
[scriptable, uuid(1788e79e-f947-11d3-8cda-0060b0fc14a3)]
interface nsIChannel : nsIRequest
{
////////////////////////////////////////////////////////////////////////////
// nsIChannel accessors
////////////////////////////////////////////////////////////////////////////
/**
* Returns the original URL used to construct the channel.
* This is used in the case of a redirect or URI "resolution" (e.g.
* resolving a resource: URI to a file: URI) so that the original
* pre-redirect URI can still be obtained.
*
* Note that this is distinctly different from the http referrer
* (referring URI) which is typically the page that contained the
* original URI (accessible from nsIHTTPChannel).
*/
attribute nsIURI originalURI;
/**
* Returns the URL to which the channel currently refers. If a redirect
* or URI resolution occurs, this accessor returns the current location
* to which the channel is referring.
*/
attribute nsIURI URI;
/**
* Accesses the start offset from the beginning of the data from/to which
* reads/writes will occur. Users may set the transferOffset before making
* any of the following requests: asyncOpen, asyncRead, asyncWrite,
* openInputStream, openOutputstream.
*/
attribute unsigned long transferOffset;
/**
* Accesses the count of bytes to be transfered. For openInputStream and
* asyncRead, this specifies the amount to read, for asyncWrite, this
* specifies the amount to write (note that for openOutputStream, the
* end of the data can be signified simply by closing the stream).
* If the transferCount is set after reading has been initiated, the
* amount specified will become the current remaining amount to read
* before the channel is closed (this can be useful if the content
* length is encoded at the start of the stream).
*
* A transferCount value of -1 means the amount is unspecified, i.e.
* read or write all the data that is available.
*/
attribute long transferCount;
/**
* Accesses the load attributes for the channel. E.g. setting the load
* attributes with the LOAD_QUIET bit set causes the loading process to
* not deliver status notifications to the program performing the load,
* and to not contribute to keeping any nsILoadGroup it may be contained
* in from firing its OnLoadComplete notification.
*/
attribute nsLoadFlags loadAttributes;
/**
* Returns the content MIME type of the channel if available. Note that the
* content type can often be wrongly specified (wrong file extension, wrong
* MIME type, wrong document type stored on a server, etc.) and the caller
* most likely wants to verify with the actual data.
*/
attribute string contentType;
/**
* Returns the length of the data associated with the channel if available.
* If the length is unknown then -1 is returned.
*/
attribute long contentLength;
/**
* Accesses the owner corresponding to the entity that is
* responsible for this channel. Used by security code to grant
* or deny privileges to mobile code loaded from this channel.
*
* Note: This is a strong reference to the owner, so if the owner is also
* holding a pointer to the channel, care must be taken to explicitly drop
* its reference to the channel -- otherwise a leak will result.
*/
attribute nsISupports owner;
/**
* Accesses the load group in which the channel is a currently a member.
*/
attribute nsILoadGroup loadGroup;
/**
* Accesses the capabilities callbacks of the channel. This is set by clients
* who wish to provide a means to receive progress, status and protocol-specific
* notifications.
*/
attribute nsIInterfaceRequestor notificationCallbacks;
/**
* Any security information about this channel. This can be null.
*/
readonly attribute nsISupports securityInfo;
/**
* Accesses the buffer segment size. The buffer segment size is used as
* the initial size for any transfer buffers, and the increment size for
* whenever the buffer space needs to be grown.
* (Note this parameter is passed along to any underlying nsIPipe objects.)
* If unspecified, the channel implementation picks a default.
*/
attribute unsigned long bufferSegmentSize;
/**
* Accesses the buffer maximum size. The buffer maximum size is the limit
* size that buffer will be grown to before suspending the channel.
* (Note this parameter is passed along to any underlying nsIPipe objects.)
* If unspecified, the channel implementation picks a default.
*/
attribute unsigned long bufferMaxSize;
/**
* Returns true if the data from this channel should be cached. Local files
* report false because they exist on the local disk and need not be cached.
* Input stream channels, data protocol, datetime protocol and finger
* protocol channels also should not be cached. Http and ftp on the other
* hand should. Note that the value of this attribute doesn't reflect any
* http headers that may specify that this channel should not be cached.
*/
readonly attribute boolean shouldCache;
/**
* Setting pipeliningAllowed causes the load of a URL (issued via asyncOpen,
* asyncRead or asyncWrite) to be deferred in order to allow the request to
* be pipelined for greater throughput efficiency. Pipelined requests will
* be forced to load when the first non-pipelined request is issued.
*/
attribute boolean pipeliningAllowed;
////////////////////////////////////////////////////////////////////////////
// Load attribute flags. These may be or'd together.
////////////////////////////////////////////////////////////////////////////
/**
* Note that more will follow for each protocol's implementation of a channel,
* although channel writers have to be careful to not let the flag bits
* overlap. Otherwise, users won't be able to create a single flag word
* of load attributes that applies to a number of different channel types.
*/
/**
* No special load attributes -- use defaults:
*/
const unsigned long LOAD_NORMAL = 0;
/**
* Don't deliver status notifications to the nsIProgressEventSink, or keep
* this load from completing the nsILoadGroup it may belong to:
*/
const unsigned long LOAD_BACKGROUND = 1 << 0;
const unsigned long LOAD_DOCUMENT_URI = 1 << 1;
/**
* If the end consumer for this load has been retargeted after discovering
* it's content, this flag will be set:
*/
const unsigned long LOAD_RETARGETED_DOCUMENT_URI = 1 << 2;
////////////////////////////////////////////////////////////////////////////
/**
* The following flags control caching behavior. Not all protocols pay
* attention to all these flags, but they are applicable to more than one
* protocol, so they are defined here.
*/
/**
* Don't store data in the disk cache. This can be used to preserve
* privacy, e.g. so that no https transactions are recorded, or to avoid
* caching a stream to disk that is already stored in a local file,
* e.g. the mailbox: protocol.
*/
const unsigned long INHIBIT_PERSISTENT_CACHING = 1 << 8;
/**
* Force an end-to-end download of content data from the origin server (and
* any intervening proxies that sit between it and the client), e.g. this
* flag is used for a shift-reload.
*/
const unsigned long FORCE_RELOAD = 1 << 9;
/**
* Force revalidation with server (or proxy) to verify that cached content
* is up-to-date, e.g. by comparing last-modified date on server with that
* of the cached version. For example, this flag is used when the reload
* button is pressed.
*/
const unsigned long FORCE_VALIDATION = 1 << 10;
/**
* If the CACHE_AS_FILE flag is set, any stream content is stored in the
* cache as a single disk file. Content will not be cached in the memory
* cache nor will it be stored in any other type of cache, e.g. a flat-file
* cache database. This is used to implement the jar protocol handler and
* to provide the stream-as-file semantics required by the classic browser
* plugin API.
*/
const unsigned long CACHE_AS_FILE = 1 << 11;
/**
* When cache data is potentially out of date, it can be revalidated with
* the origin server to see if the content needs to be reloaded. The
* following four flags control how often this validation occurs.
* These flags are commonly used for "normal" loading. Note that
* the VALIDATE_HEURISTICALLY and VALIDATE_ONCE_PER_SESSION flags can be
* combined to validate heuristically but no more than once per session.
*/
const unsigned long VALIDATE_NEVER = 1 << 12;
const unsigned long VALIDATE_ALWAYS = 1 << 13;
const unsigned long VALIDATE_ONCE_PER_SESSION = 1 << 14;
const unsigned long VALIDATE_HEURISTICALLY = 1 << 15;
////////////////////////////////////////////////////////////////////////////
// nsIChannel operations
////////////////////////////////////////////////////////////////////////////
/**
* Opens a blocking input stream to the URL's specified source.
* @param startPosition - The offset from the start of the data
* from which to read.
* @param readCount - The number of bytes to read. If -1, everything
* up to the end of the data is read. If greater than the end of
* the data, the amount available is returned in the stream.
*/
nsIInputStream openInputStream();
/**
* Opens a blocking output stream to the URL's specified destination.
* @param startPosition - The offset from the start of the data
* from which to begin writing.
*/
nsIOutputStream openOutputStream();
/**
* Opens the channel asynchronously. The nsIStreamObserver's OnStartRequest
* method is called back when the channel actually becomes open, providing
* the content type. Its OnStopRequest method is called when the channel
* becomes closed.
*/
void asyncOpen(in nsIStreamObserver observer,
in nsISupports ctxt);
/**
* Reads asynchronously from the URL's specified source. Notifications
* are provided to the stream listener on the thread of the specified
* event queue.
* The startPosition argument designates the offset in the source where
* the data will be read.
* If the readCount == -1 then all the available data is delivered to
* the stream listener.
*/
void asyncRead(in nsIStreamListener listener,
in nsISupports ctxt);
/**
* Writes asynchronously to the URL's specified destination. Notifications
* are provided to the stream observer on the thread of the specified
* event queue.
* The startPosition argument designates the offset in the destination where
* the data will be written.
* If the writeCount == -1, then all the available data in the input
* stream is written.
*/
void asyncWrite(in nsIInputStream fromStream,
in nsIStreamObserver observer,
in nsISupports ctxt);
};
////////////////////////////////////////////////////////////////////////////////
/**
* nsIInputStreamChannel is an interface that allows for the initialization
* of a simple nsIChannel that is constructed from a single input stream and
* associated content type. Input stream channels only allow the input stream
* to be accessed, not the output stream.
*/
[scriptable, uuid(43070d6a-f947-11d3-8cda-0060b0fc14a3)]
interface nsIInputStreamChannel : nsIChannel
{
void init(in nsIURI uri,
in nsIInputStream inStr,
in string contentType,
in long contentLength);
};
%{C++
#define NS_INPUTSTREAMCHANNEL_CID \
{ /* 54d0d8e6-f947-11d3-8cda-0060b0fc14a3 */ \
0x54d0d8e6, \
0xf947, \
0x11d3, \
{0x8c, 0xda, 0x00, 0x60, 0xb0, 0xfc, 0x14, 0xa3} \
}
%}
////////////////////////////////////////////////////////////////////////////////
/**
* nsIFileChannel is an interface that allows for the initialization
* of a simple nsIChannel that is constructed from a single nsIFile and
* associated content type.
*/
[scriptable, uuid(68a26506-f947-11d3-8cda-0060b0fc14a3)]
interface nsIFileChannel : nsIChannel
{
void init(in nsIFile file,
in long ioFlags,
in long perm);
readonly attribute nsIFile file;
attribute long ioFlags;
attribute long permissions;
};
%{C++
#define NS_LOCALFILECHANNEL_CLASSNAME "Local File Channel"
#define NS_LOCALFILECHANNEL_PROGID "component://netscape/network/local-file-channel"
#define NS_LOCALFILECHANNEL_CID \
{ /* 6d5b2d44-f947-11d3-8cda-0060b0fc14a3 */ \
0x6d5b2d44, \
0xf947, \
0x11d3, \
{0x8c, 0xda, 0x00, 0x60, 0xb0, 0xfc, 0x14, 0xa3} \
}
%}
////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,30 @@
/* -*- 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 "nsISupports.idl"
[scriptable, uuid(fb65fd70-1881-11d3-9337-00104ba0fd40)]
interface nsIEventSinkGetter : nsISupports
{
nsISupports getEventSink(in string command, in nsIIDRef eventSinkIID);
};

View File

@@ -0,0 +1,241 @@
/* -*- 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 "nsIInputStream.idl"
#include "nsIOutputStream.idl"
#include "nsILocalFile.idl"
[scriptable, uuid(e3d56a20-c7ec-11d3-8cda-0060b0fc14a3)]
interface nsIFileInputStream : nsIInputStream
{
void init(in nsIFile file, in long ioFlags, in long perm);
};
[scriptable, uuid(e6f68040-c7ec-11d3-8cda-0060b0fc14a3)]
interface nsIFileOutputStream : nsIOutputStream
{
void init(in nsIFile file, in long ioFlags, in long perm);
};
[scriptable, uuid(e9de5df0-c7ec-11d3-8cda-0060b0fc14a3)]
interface nsISeekableStream : nsISupports
{
// correspond to PRSeekWhence values
const long NS_SEEK_SET = 0;
const long NS_SEEK_CUR = 1;
const long NS_SEEK_END = 2;
void seek(in long whence, in long offset);
unsigned long tell();
};
[scriptable, uuid(616f5b48-da09-11d3-8cda-0060b0fc14a3)]
interface nsIBufferedInputStream : nsIInputStream
{
void init(in nsIInputStream fillFromStream,
in unsigned long bufferSize);
};
[scriptable, uuid(6476378a-da09-11d3-8cda-0060b0fc14a3)]
interface nsIBufferedOutputStream : nsIOutputStream
{
void init(in nsIOutputStream sinkToStream,
in unsigned long bufferSize);
};
%{C++
////////////////////////////////////////////////////////////////////////////////
#define NS_LOCALFILEINPUTSTREAM_CLASSNAME "Local File Input Stream"
#define NS_LOCALFILEINPUTSTREAM_PROGID "component://netscape/network/file-input-stream"
#define NS_LOCALFILEINPUTSTREAM_CID \
{ /* be9a53ae-c7e9-11d3-8cda-0060b0fc14a3 */ \
0xbe9a53ae, \
0xc7e9, \
0x11d3, \
{0x8c, 0xda, 0x00, 0x60, 0xb0, 0xfc, 0x14, 0xa3} \
}
#define NS_LOCALFILEOUTPUTSTREAM_CLASSNAME "Local File Output Stream"
#define NS_LOCALFILEOUTPUTSTREAM_PROGID "component://netscape/network/file-output-stream"
#define NS_LOCALFILEOUTPUTSTREAM_CID \
{ /* c272fee0-c7e9-11d3-8cda-0060b0fc14a3 */ \
0xc272fee0, \
0xc7e9, \
0x11d3, \
{0x8c, 0xda, 0x00, 0x60, 0xb0, 0xfc, 0x14, 0xa3} \
}
////////////////////////////////////////////////////////////////////////////////
#define NS_BUFFEREDINPUTSTREAM_CLASSNAME "Buffered Input Stream"
#define NS_BUFFEREDINPUTSTREAM_PROGID "component://netscape/network/buffered-input-stream"
#define NS_BUFFEREDINPUTSTREAM_CID \
{ /* 9226888e-da08-11d3-8cda-0060b0fc14a3 */ \
0x9226888e, \
0xda08, \
0x11d3, \
{0x8c, 0xda, 0x00, 0x60, 0xb0, 0xfc, 0x14, 0xa3} \
}
#define NS_BUFFEREDOUTPUTSTREAM_CLASSNAME "Buffered Output Stream"
#define NS_BUFFEREDOUTPUTSTREAM_PROGID "component://netscape/network/buffered-output-stream"
#define NS_BUFFEREDOUTPUTSTREAM_CID \
{ /* 9868b4ce-da08-11d3-8cda-0060b0fc14a3 */ \
0x9868b4ce, \
0xda08, \
0x11d3, \
{0x8c, 0xda, 0x00, 0x60, 0xb0, 0xfc, 0x14, 0xa3} \
}
////////////////////////////////////////////////////////////////////////////////
// move to nsNetUtil.h later...
#include "nsILoadGroup.h"
#include "nsIInterfaceRequestor.h"
#include "nsCOMPtr.h"
#include "nsIServiceManager.h"
#include "nsIChannel.h"
#include "nsILocalFile.h"
#include "nsIInputStream.h"
#include "nsIOutputStream.h"
#include "prio.h" // for read/write flags, permissions, etc.
// This will QI the file argument to an nsILocalFile in the Init method.
inline nsresult
NS_NewLocalFileChannel(nsIFileChannel **result,
nsIFile* file,
PRInt32 ioFlags = -1,
PRInt32 perm = -1)
{
nsresult rv;
nsCOMPtr<nsIFileChannel> channel;
static NS_DEFINE_CID(kLocalFileChannelCID, NS_LOCALFILECHANNEL_CID);
rv = nsComponentManager::CreateInstance(kLocalFileChannelCID,
nsnull,
NS_GET_IID(nsIFileChannel),
getter_AddRefs(channel));
if (NS_FAILED(rv)) return rv;
rv = channel->Init(file, ioFlags, perm);
if (NS_FAILED(rv)) return rv;
*result = channel;
NS_ADDREF(*result);
return NS_OK;
}
// This will QI the file argument to an nsILocalFile in the Init method.
inline nsresult
NS_NewLocalFileInputStream(nsIInputStream* *result,
nsIFile* file,
PRInt32 ioFlags = -1,
PRInt32 perm = -1)
{
nsresult rv;
nsCOMPtr<nsIFileInputStream> in;
static NS_DEFINE_CID(kLocalFileInputStreamCID, NS_LOCALFILEINPUTSTREAM_CID);
rv = nsComponentManager::CreateInstance(kLocalFileInputStreamCID,
nsnull,
NS_GET_IID(nsIFileInputStream),
getter_AddRefs(in));
if (NS_FAILED(rv)) return rv;
rv = in->Init(file, ioFlags, perm);
if (NS_FAILED(rv)) return rv;
*result = in;
NS_ADDREF(*result);
return NS_OK;
}
// This will QI the file argument to an nsILocalFile in the Init method.
inline nsresult
NS_NewLocalFileOutputStream(nsIOutputStream* *result,
nsIFile* file,
PRInt32 ioFlags = -1,
PRInt32 perm = -1)
{
nsresult rv;
nsCOMPtr<nsIFileOutputStream> out;
static NS_DEFINE_CID(kLocalFileOutputStreamCID, NS_LOCALFILEOUTPUTSTREAM_CID);
rv = nsComponentManager::CreateInstance(kLocalFileOutputStreamCID,
nsnull,
NS_GET_IID(nsIFileOutputStream),
getter_AddRefs(out));
if (NS_FAILED(rv)) return rv;
rv = out->Init(file, ioFlags, perm);
if (NS_FAILED(rv)) return rv;
*result = out;
NS_ADDREF(*result);
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////
inline nsresult
NS_NewBufferedInputStream(nsIInputStream* *result,
nsIInputStream* str,
PRUint32 bufferSize)
{
nsresult rv;
nsCOMPtr<nsIBufferedInputStream> in;
static NS_DEFINE_CID(kBufferedInputStreamCID, NS_BUFFEREDINPUTSTREAM_CID);
rv = nsComponentManager::CreateInstance(kBufferedInputStreamCID,
nsnull,
NS_GET_IID(nsIBufferedInputStream),
getter_AddRefs(in));
if (NS_FAILED(rv)) return rv;
rv = in->Init(str, bufferSize);
if (NS_FAILED(rv)) return rv;
*result = in;
NS_ADDREF(*result);
return NS_OK;
}
inline nsresult
NS_NewBufferedOutputStream(nsIOutputStream* *result,
nsIOutputStream* str,
PRUint32 bufferSize)
{
nsresult rv;
nsCOMPtr<nsIBufferedOutputStream> out;
static NS_DEFINE_CID(kBufferedOutputStreamCID, NS_BUFFEREDOUTPUTSTREAM_CID);
rv = nsComponentManager::CreateInstance(kBufferedOutputStreamCID,
nsnull,
NS_GET_IID(nsIBufferedOutputStream),
getter_AddRefs(out));
if (NS_FAILED(rv)) return rv;
rv = out->Init(str, bufferSize);
if (NS_FAILED(rv)) return rv;
*result = out;
NS_ADDREF(*result);
return NS_OK;
}
%}

View File

@@ -0,0 +1,40 @@
/* -*- 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 "nsISupports.idl"
interface nsIInputStream;
interface nsIOutputStream;
[scriptable, uuid(818e1370-77c4-11d3-9395-00104ba0fd40)]
interface nsIFileSystem : nsISupports
{
void open(out string contentType,
out long contentLength);
void close(in nsresult status);
readonly attribute nsIInputStream inputStream;
readonly attribute nsIOutputStream outputStream;
};

View File

@@ -0,0 +1,65 @@
/* -*- 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 "nsISupports.idl"
%{C++
#include "nsFileSpec.h"
%}
interface nsIChannel;
interface nsIFileSystem;
interface nsIEventSinkGetter;
interface nsIInputStream;
interface nsIRunnable;
interface nsIFile;
[scriptable, uuid(57211a60-8c45-11d3-93ac-00104ba0fd40)]
interface nsIFileTransportService : nsISupports
{
nsIChannel createTransport(in nsIFile file,
in long ioFlags,
in long perm);
// This version can be used with an existing input stream to serve
// as a data pump:
nsIChannel createTransportFromStream(in nsIInputStream fromStream,
in string contentType,
in long contentLength);
nsIChannel createTransportFromFileSystem(in nsIFileSystem fsObj);
void dispatchRequest(in nsIRunnable runnable);
void suspend(in nsIRunnable trans);
void resume(in nsIRunnable trans);
void processPendingRequests();
void shutdown();
};
%{C++
#define NS_FILETRANSPORTSERVICE_CID \
{ /* 2bb2b250-ea35-11d2-931b-00104ba0fd40 */ \
0x2bb2b250, \
0xea35, \
0x11d2, \
{0x93, 0x1b, 0x00, 0x10, 0x4b, 0xa0, 0xfd, 0x40} \
}
%}

View File

@@ -0,0 +1,169 @@
/* -*- 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 "nsISupports.idl"
#include "nsIChannel.idl"
interface nsIProtocolHandler;
interface nsIURI;
interface nsIInterfaceRequestor;
interface nsIStreamObserver;
interface nsIStreamListener;
interface nsIEventQueue;
interface nsIBufferInputStream;
interface nsIInputStream;
interface nsIBufferOutputStream;
interface nsIFileChannel;
interface nsILoadGroup;
interface nsILoadGroupObserver;
interface nsIFile;
interface nsIInputStream;
interface nsIOutputStream;
[scriptable, uuid(ab7c3a84-d488-11d3-8cda-0060b0fc14a3)]
interface nsIIOService : nsISupports
{
/**
* Returns a protocol handler for a given URI scheme.
*/
nsIProtocolHandler getProtocolHandler(in string scheme);
/**
* This method constructs a new URI by first determining the scheme
* of the URI spec, and then delegating the construction of the URI
* to the protocol handler for that scheme. QueryInterface can be used
* on the resulting URI object to obtain a more specific type of URI.
*/
nsIURI newURI(in string aSpec, in nsIURI aBaseURI);
/**
* Creates a channel for a given URI. The notificationCallbacks argument
* is used to obtain the appropriate callbacks for the URI's protocol from the
* application.
*
* @param originalURI - Specifies the original URI which caused the creation
* of this channel. This can occur when the construction of one channel
* (e.g. for resource:) causes another channel to be created on its behalf
* (e.g. a file: channel), or if a redirect occurs, causing the current
* URL to become different from the original URL. If NULL, the aURI parameter
* will be used as the originalURI instead.
*/
nsIChannel newChannelFromURI(in nsIURI aURI);
/**
* Convenience routine that first creates a URI by calling NewURI, and
* then passes the URI to NewChannelFromURI.
*
* @param originalURI - Specifies the original URI which caused the creation
* of this channel. This can occur when the construction of one channel
* (e.g. for resource:) causes another channel to be created on its behalf
* (e.g. a file: channel), or if a redirect occurs, causing the current
* URL to become different from the original URL. If NULL, the aURI parameter
* will be used as the originalURI instead.
*/
nsIChannel newChannel(in string aSpec, in nsIURI aBaseURI);
/**
* Returns true if networking is in "offline" mode. When in offline mode, attempts
* to access the network will fail (although this is not necessarily corrolated with
* whether there is actually a network available -- that's hard to detect without
* causing the dialer to come up).
*/
attribute boolean offline;
////////////////////////////////////////////////////////////////////////////
// URL parsing utilities
/**
* Utility for protocol implementors -- extracts the scheme from a URL
* string, consistently and according to spec.
* @param urlString - the URL string to parse
* @param schemeStartPos - the resulting starting position of the scheme substring
* (may skip over whitespace)
* @param schemeEndPos - the resulting ending position of the scheme substring
* (the position of the colon)
* @param scheme - an allocated substring containing the scheme. If this parameter
* is null going into the routine, then the scheme is not allocated and
* returned. Free with nsCRT::free.
*
* @return NS_OK - if successful
* @return NS_ERROR_MALFORMED_URI - if the urlString is not of the right form
*/
void extractScheme(in string urlString,
out unsigned long schemeStartPos,
out unsigned long schemeEndPos,
out string scheme);
/**
* Constants for the mask in the call to Escape
*/
const short url_Scheme = (1<<0);
const short url_Username = (1<<1);
const short url_Password = (1<<2);
const short url_Host = (1<<3);
const short url_Directory = (1<<4);
const short url_FileBaseName = (1<<5);
const short url_FileExtension = (1<<6);
const short url_Param = (1<<7);
const short url_Query = (1<<8);
const short url_Ref = (1<<9);
const short url_Forced = (1<<10);
/**
* Encode characters into % escaped hexcodes.
*/
string escape(in string str, in short mask);
/**
* Decode % escaped hex codes into character values.
*/
string unescape(in string str);
/**
* Get port from string.
*/
long extractPort(in string str);
/**
* Resolves a relative path string containing "." and ".."
* with respect to a base path (assumed to already be resolved).
* For example, resolving "../../foo/./bar/../baz.html" w.r.t.
* "/a/b/c/d/e/" yields "/a/b/c/foo/baz.html". Attempting to
* ascend above the base results in the NS_ERROR_MALFORMED_URI
* exception. If basePath is null, it treats it as "/".
*/
string resolveRelativePath(in string relativePath,
in string basePath);
};
%{C++
#define NS_IOSERVICE_CID \
{ /* 9ac9e770-18bc-11d3-9337-00104ba0fd40 */ \
0x9ac9e770, \
0x18bc, \
0x11d3, \
{0x93, 0x37, 0x00, 0x10, 0x4b, 0xa0, 0xfd, 0x40} \
}
#define DUD 3.14
%}

View File

@@ -0,0 +1,104 @@
/* -*- 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 "nsIRequest.idl"
interface nsIChannel;
interface nsISimpleEnumerator;
interface nsIStreamObserver;
interface nsIStreamListener;
interface nsIInputStream;
[scriptable, uuid(60fdf550-5392-11d3-9a97-0080c7cb1080)]
interface nsILoadGroupListenerFactory : nsISupports
{
nsIStreamListener createLoadGroupListener(in nsIStreamListener alistener);
};
/**
* A load group maintains a collection of active URL requests.
*/
[scriptable, uuid(19845248-29ab-11d3-8cce-0060b0fc14a3)]
interface nsILoadGroup : nsIRequest
{
void init(in nsIStreamObserver observer);
/**
* Accesses the default load attributes for the group, returned as
* a flag word. Setting the default load attributes will cause them
* to be applied to each new channel inserted into the group.
*/
attribute unsigned long defaultLoadAttributes;
/**
* Accesses the default load channel for the group. Each time a number
* of channels are added to a group, the DefaultLoadChannel may be set
* to indicate that all of the channels are related to a particular URL.
*/
attribute nsIChannel defaultLoadChannel;
/**
* Adds a new channel to the group. This will cause the default load
* attributes to be applied to that channel. If the channel added is
* the first channel in the group, the group's observer's OnStartRequest
* method is called.
*/
void addChannel(in nsIChannel channel,
in nsISupports ctxt);
/**
* Removes a channel from the group. If the channel removed is
* the last channel in the group, the group's observer's OnStopRequest
* method is called.
*/
void removeChannel(in nsIChannel channel,
in nsISupports ctxt,
in nsresult status,
in wstring errorMsg);
/**
* Returns the channels contained directly in this group.
* Enumerator element type: nsIChannel.
*/
readonly attribute nsISimpleEnumerator channels;
attribute nsIStreamObserver groupObserver;
attribute nsILoadGroupListenerFactory groupListenerFactory;
readonly attribute unsigned long activeCount;
};
%{C++
#define NS_LOADGROUP_CID \
{ /* e1c61582-2a84-11d3-8cce-0060b0fc14a3 */ \
0xe1c61582, \
0x2a84, \
0x11d3, \
{0x8c, 0xce, 0x00, 0x60, 0xb0, 0xfc, 0x14, 0xa3} \
}
%}

View File

@@ -0,0 +1,47 @@
/* -*- Mode: IDL; 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):
*/
/* This interface defines a registry entry for the networking libraries
* external module registry. */
#include "nsISupports.idl"
#include "nsINetNotify.idl"
interface nsIEventQueue;
interface nsINetModRegEntry;
interface nsINetNotify;
%{ C++
// {F126BD90-1472-11d3-A15A-0050041CAF44}
#define NS_NETMODREGENTRY_CID \
{ 0xf126bd90, 0x1472, 0x11d3, { 0xa1, 0x5a, 0x0, 0x50, 0x4, 0x1c, 0xaf, 0x44 } }
%}
[scriptable, uuid(9F482BD0-1476-11d3-A15A-0050041CAF44)]
interface nsINetModRegEntry : nsISupports
{
readonly attribute nsINetNotify syncProxy;
readonly attribute nsINetNotify asyncProxy;
readonly attribute string topic;
boolean equals(in nsINetModRegEntry aEntry);
};

Some files were not shown because too many files have changed in this diff Show More