Compare commits
107 Commits
MAPI_TRUNK
...
CacheInteg
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
22c40d96b2 | ||
|
|
06a79b2069 | ||
|
|
ebc4face0d | ||
|
|
150696bb86 | ||
|
|
683045595b | ||
|
|
7f09538b93 | ||
|
|
bb364ef512 | ||
|
|
7c96c92a19 | ||
|
|
a6defdef4c | ||
|
|
76159a2caf | ||
|
|
1988cb05b5 | ||
|
|
dd8c6b3bed | ||
|
|
bc64749366 | ||
|
|
2e9287bd58 | ||
|
|
0f2274a140 | ||
|
|
957fa10cac | ||
|
|
e603146886 | ||
|
|
cb698a0df1 | ||
|
|
1b918d9ef0 | ||
|
|
6407144c9f | ||
|
|
2ed563a178 | ||
|
|
4becc0b508 | ||
|
|
7d5427ea31 | ||
|
|
99904bcc48 | ||
|
|
bcb56c9593 | ||
|
|
f18bc8e6cd | ||
|
|
7d14c5669a | ||
|
|
c0dd3df02e | ||
|
|
e5cc84978f | ||
|
|
5694537330 | ||
|
|
297c5ceba3 | ||
|
|
e0311312f7 | ||
|
|
cf3dc77b02 | ||
|
|
dd2506a737 | ||
|
|
b1bee1f21c | ||
|
|
48ecc5625b | ||
|
|
1b791685e6 | ||
|
|
dc94d1d6e2 | ||
|
|
f5b437ade3 | ||
|
|
8c0b4b3e4a | ||
|
|
fb640ab144 | ||
|
|
106e263b33 | ||
|
|
85045a8552 | ||
|
|
a2279be132 | ||
|
|
0ce702d402 | ||
|
|
f14d03cd67 | ||
|
|
b91343fdf6 | ||
|
|
2c517489b5 | ||
|
|
ae57da58eb | ||
|
|
8d4586dd65 | ||
|
|
9b473ad9be | ||
|
|
2ad227a994 | ||
|
|
94d8da33c1 | ||
|
|
81c05809fd | ||
|
|
e30547b2b2 | ||
|
|
257f9cfaaa | ||
|
|
96e2654e43 | ||
|
|
3b023433be | ||
|
|
1b89716afe | ||
|
|
ad02058877 | ||
|
|
fa8a3196e7 | ||
|
|
5c2c543e58 | ||
|
|
c588721cc0 | ||
|
|
0b049b17ba | ||
|
|
854ef4631d | ||
|
|
051c558653 | ||
|
|
37a04adb09 | ||
|
|
c823c04b45 | ||
|
|
03cbd000eb | ||
|
|
a91e91a1c7 | ||
|
|
be7a5a48b6 | ||
|
|
b2bc7468e8 | ||
|
|
9692dfd994 | ||
|
|
f3edd4cfb5 | ||
|
|
33403345c1 | ||
|
|
20c850de23 | ||
|
|
e8b619cd02 | ||
|
|
eed396bb92 | ||
|
|
41d44c070b | ||
|
|
698ba42268 | ||
|
|
1a0fd23991 | ||
|
|
67dded330b | ||
|
|
936ff4777a | ||
|
|
96c55e42f7 | ||
|
|
82fa0cf06a | ||
|
|
98c8285334 | ||
|
|
bad4b683f4 | ||
|
|
cb5269a28a | ||
|
|
74712f3635 | ||
|
|
9f8ea739db | ||
|
|
97a10dd7c6 | ||
|
|
85a132fac0 | ||
|
|
e594eee877 | ||
|
|
9148eee3d6 | ||
|
|
b5989a8382 | ||
|
|
2b861f60d9 | ||
|
|
87db050b37 | ||
|
|
ffe483cf95 | ||
|
|
52aa17a1c3 | ||
|
|
5fdb3aa69e | ||
|
|
8cae473bc0 | ||
|
|
0719303755 | ||
|
|
90d3e40858 | ||
|
|
c792b2d35c | ||
|
|
7a4377d840 | ||
|
|
a5fa416010 | ||
|
|
49d00db5e2 |
@@ -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>
|
||||
@@ -1,54 +0,0 @@
|
||||
; ***** BEGIN LICENSE BLOCK *****
|
||||
; Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
;
|
||||
; The contents of this file are subject to the Mozilla Public License Version
|
||||
; 1.1 (the "License"); you may not use this file except in compliance with
|
||||
; the License. You may obtain a copy of the License at
|
||||
; http://www.mozilla.org/MPL/
|
||||
;
|
||||
; Software distributed under the License is distributed on an "AS IS" basis,
|
||||
; WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
; for the specific language governing rights and limitations under the
|
||||
; License.
|
||||
;
|
||||
; The Original Code is Mozilla.
|
||||
;
|
||||
; The Initial Developer of the Original Code is
|
||||
; Netscape Communications Corp.
|
||||
; Portions created by the Initial Developer are Copyright (C) 2001
|
||||
; the Initial Developer. All Rights Reserved.
|
||||
;
|
||||
; Contributor(s): Krishna Mohan Khandrika (kkhandrika@netscape.com)
|
||||
;
|
||||
; Alternatively, the contents of this file may be used under the terms of
|
||||
; either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
; the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
; in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
; of those above. If you wish to allow use of your version of this file only
|
||||
; under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
; use your version of this file under the terms of the MPL, indicate your
|
||||
; decision by deleting the provisions above and replace them with the notice
|
||||
; and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
; the provisions above, a recipient may use your version of this file under
|
||||
; the terms of any one of the MPL, the GPL or the LGPL.
|
||||
;
|
||||
; ***** END LICENSE BLOCK *****
|
||||
|
||||
LIBRARY mozMapi32.dll
|
||||
DESCRIPTION 'Mozilla Simple MAPI Support'
|
||||
|
||||
EXPORTS
|
||||
MAPILogon
|
||||
MAPILogoff
|
||||
MAPISendMail
|
||||
MAPISendDocuments
|
||||
MAPIFindNext
|
||||
MAPIReadMail
|
||||
MAPISaveMail
|
||||
MAPIDeleteMail
|
||||
MAPIAddress
|
||||
MAPIDetails
|
||||
MAPIResolveName
|
||||
MAPIFreeBuffer
|
||||
GetMapiDllVersion
|
||||
|
||||
@@ -1,335 +0,0 @@
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Mozilla
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corp.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2001
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Krishna Mohan Khandrika (kkhandrika@netscape.com)
|
||||
* Contributor(s): Rajiv Dayal (rdayal@netscape.com)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include <windows.h>
|
||||
#include <tchar.h>
|
||||
#include <assert.h>
|
||||
#include <mapidefs.h>
|
||||
#include <mapi.h>
|
||||
#include "msgMapi.h"
|
||||
#include "msgMapiMain.h"
|
||||
|
||||
#define MAX_RECIPS 100
|
||||
#define MAX_FILES 100
|
||||
|
||||
const CLSID CLSID_nsMapiImp = {0x29f458be, 0x8866, 0x11d5,
|
||||
{0xa3, 0xdd, 0x0, 0xb0, 0xd0, 0xf3, 0xba, 0xa7}};
|
||||
const IID IID_nsIMapi = {0x6EDCD38E,0x8861,0x11d5,
|
||||
{0xA3,0xDD,0x00,0xB0,0xD0,0xF3,0xBA,0xA7}};
|
||||
|
||||
DWORD tId = 0;
|
||||
|
||||
BOOL WINAPI DllMain(HINSTANCE aInstance, DWORD aReason, LPVOID aReserved)
|
||||
{
|
||||
switch (aReason)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH : tId = TlsAlloc();
|
||||
if (tId == 0xFFFFFFFF)
|
||||
return FALSE;
|
||||
break;
|
||||
|
||||
case DLL_PROCESS_DETACH : TlsFree(tId);
|
||||
break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL InitMozillaReference(nsIMapi **aRetValue)
|
||||
{
|
||||
// Check wehther this thread has a valid Interface
|
||||
// by looking into thread-specific-data variable
|
||||
|
||||
*aRetValue = (nsIMapi *)TlsGetValue(tId);
|
||||
|
||||
// Check whether the pointer actually resolves to
|
||||
// a valid method call; otherwise mozilla is not running
|
||||
|
||||
if ((*aRetValue) && (*aRetValue)->IsValid() == S_OK)
|
||||
return TRUE;
|
||||
|
||||
HRESULT hRes = CoInitialize(NULL);
|
||||
|
||||
hRes = ::CoCreateInstance(CLSID_nsMapiImp, NULL, CLSCTX_LOCAL_SERVER,
|
||||
IID_nsIMapi, (LPVOID *)aRetValue);
|
||||
|
||||
if (hRes == S_OK && (*aRetValue)->Initialize() == S_OK)
|
||||
if (TlsSetValue(tId, (LPVOID)(*aRetValue)))
|
||||
return TRUE;
|
||||
|
||||
// Either CoCreate or TlsSetValue failed; so return FALSE
|
||||
|
||||
if ((*aRetValue))
|
||||
(*aRetValue)->Release();
|
||||
|
||||
::CoUninitialize();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
// The MAPILogon function begins a Simple MAPI session, loading the default message ////
|
||||
// store and address book providers ////
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ULONG FAR PASCAL MAPILogon(ULONG aUIParam, LPTSTR aProfileName,
|
||||
LPTSTR aPassword, FLAGS aFlags,
|
||||
ULONG aReserved, LPLHANDLE aSession)
|
||||
{
|
||||
HRESULT hr = 0;
|
||||
ULONG nSessionId = 0;
|
||||
nsIMapi *pNsMapi = NULL;
|
||||
|
||||
if (!InitMozillaReference(&pNsMapi))
|
||||
return MAPI_E_FAILURE;
|
||||
|
||||
if (!(aFlags & MAPI_UNICODE))
|
||||
{
|
||||
// Need to convert the parameters to Unicode.
|
||||
|
||||
char *pUserName = (char *) aProfileName;
|
||||
char *pPassWord = (char *) aPassword;
|
||||
|
||||
TCHAR ProfileName[MAX_NAME_LEN] = {0};
|
||||
TCHAR PassWord[MAX_PW_LEN] = {0};
|
||||
|
||||
if (pUserName != NULL)
|
||||
{
|
||||
if (!MultiByteToWideChar(CP_ACP, 0, pUserName, -1, ProfileName,
|
||||
MAX_NAME_LEN))
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
if (pPassWord != NULL)
|
||||
{
|
||||
if (!MultiByteToWideChar(CP_ACP, 0, pPassWord, -1, PassWord,
|
||||
MAX_NAME_LEN))
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
hr = pNsMapi->Login(aUIParam, ProfileName, PassWord, aFlags,
|
||||
&nSessionId);
|
||||
}
|
||||
else
|
||||
hr = pNsMapi->Login(aUIParam, aProfileName, aPassword,
|
||||
aFlags, &nSessionId);
|
||||
if (hr == S_OK)
|
||||
(*aSession) = (LHANDLE) nSessionId;
|
||||
else
|
||||
return nSessionId;
|
||||
|
||||
return SUCCESS_SUCCESS;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPILogoff (LHANDLE aSession, ULONG aUIParam,
|
||||
FLAGS aFlags, ULONG aReserved)
|
||||
{
|
||||
nsIMapi *pNsMapi = (nsIMapi *)TlsGetValue(tId);
|
||||
if (pNsMapi != NULL)
|
||||
{
|
||||
if (pNsMapi->Logoff((ULONG) aSession) == S_OK)
|
||||
pNsMapi->Release();
|
||||
pNsMapi = NULL;
|
||||
}
|
||||
|
||||
TlsSetValue(tId, NULL);
|
||||
|
||||
::CoUninitialize();
|
||||
|
||||
return SUCCESS_SUCCESS;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPISendMail (LHANDLE lhSession, ULONG ulUIParam, lpnsMapiMessage lpMessage,
|
||||
FLAGS flFlags, ULONG ulReserved )
|
||||
{
|
||||
HRESULT hr = 0;
|
||||
BOOL bTempSession = FALSE ;
|
||||
nsIMapi *pNsMapi = NULL;
|
||||
|
||||
if (!InitMozillaReference(&pNsMapi))
|
||||
return MAPI_E_FAILURE;
|
||||
|
||||
if (lpMessage->nRecipCount > MAX_RECIPS)
|
||||
return MAPI_E_TOO_MANY_RECIPIENTS ;
|
||||
|
||||
if (lpMessage->nFileCount > MAX_FILES)
|
||||
return MAPI_E_TOO_MANY_FILES ;
|
||||
|
||||
if ( (!(flFlags & MAPI_DIALOG)) && (lpMessage->lpRecips == NULL) )
|
||||
return MAPI_E_UNKNOWN_RECIPIENT ;
|
||||
|
||||
if (!lhSession || pNsMapi->IsValidSession(lhSession) != S_OK)
|
||||
{
|
||||
FLAGS LoginFlag ;
|
||||
if ( (flFlags & MAPI_LOGON_UI) && (flFlags & MAPI_NEW_SESSION) )
|
||||
LoginFlag = MAPI_LOGON_UI | MAPI_NEW_SESSION ;
|
||||
else if (flFlags & MAPI_LOGON_UI)
|
||||
LoginFlag = MAPI_LOGON_UI ;
|
||||
|
||||
hr = MAPILogon (ulUIParam, (LPTSTR) NULL, (LPTSTR) NULL, LoginFlag, 0, &lhSession) ;
|
||||
if (hr != SUCCESS_SUCCESS)
|
||||
return MAPI_E_LOGIN_FAILURE ;
|
||||
bTempSession = TRUE ;
|
||||
}
|
||||
|
||||
// we need to deal with null data passed in by MAPI clients, specially when MAPI_DIALOG is set.
|
||||
// The MS COM type lib code generated by MIDL for the MS COM interfaces checks for these parameters
|
||||
// to be non null, although null is a valid value for them here.
|
||||
nsMapiRecipDesc * lpRecips ;
|
||||
nsMapiFileDesc * lpFiles ;
|
||||
|
||||
nsMapiMessage Message ;
|
||||
memset (&Message, 0, sizeof (nsMapiMessage) ) ;
|
||||
nsMapiRecipDesc Recipient ;
|
||||
memset (&Recipient, 0, sizeof (nsMapiRecipDesc) );
|
||||
nsMapiFileDesc Files ;
|
||||
memset (&Files, 0, sizeof (nsMapiFileDesc) ) ;
|
||||
|
||||
if(!lpMessage)
|
||||
{
|
||||
lpMessage = &Message ;
|
||||
}
|
||||
if(!lpMessage->lpRecips)
|
||||
{
|
||||
lpRecips = &Recipient ;
|
||||
}
|
||||
else
|
||||
lpRecips = lpMessage->lpRecips ;
|
||||
if(!lpMessage->lpFiles)
|
||||
{
|
||||
lpFiles = &Files ;
|
||||
}
|
||||
else
|
||||
lpFiles = lpMessage->lpFiles ;
|
||||
|
||||
hr = pNsMapi->SendMail (lhSession, lpMessage,
|
||||
(short) lpMessage->nRecipCount, lpRecips,
|
||||
(short) lpMessage->nFileCount, lpFiles,
|
||||
flFlags, ulReserved);
|
||||
|
||||
if (bTempSession)
|
||||
MAPILogoff (lhSession, ulUIParam, 0,0) ;
|
||||
|
||||
// we are seeing a problem when using Word, although we return success from the MAPI support
|
||||
// MS COM interface in mozilla, we are getting this error here. This is a temporary hack !!
|
||||
if (hr == 0x800703e6)
|
||||
return SUCCESS_SUCCESS;
|
||||
|
||||
return hr ;
|
||||
}
|
||||
|
||||
|
||||
ULONG FAR PASCAL MAPISendDocuments(ULONG ulUIParam, LPTSTR lpszDelimChar, LPTSTR lpszFilePaths,
|
||||
LPTSTR lpszFileNames, ULONG ulReserved)
|
||||
{
|
||||
LHANDLE lhSession ;
|
||||
nsIMapi *pNsMapi = NULL;
|
||||
|
||||
if (!InitMozillaReference(&pNsMapi))
|
||||
return MAPI_E_FAILURE;
|
||||
|
||||
unsigned long result = MAPILogon (ulUIParam, (LPTSTR) NULL, (LPTSTR) NULL, MAPI_LOGON_UI, 0, &lhSession) ;
|
||||
if (result != SUCCESS_SUCCESS)
|
||||
return MAPI_E_LOGIN_FAILURE ;
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
hr = pNsMapi->SendDocuments(lhSession, (LPTSTR) lpszDelimChar, (LPTSTR) lpszFilePaths,
|
||||
(LPTSTR) lpszFileNames, ulReserved) ;
|
||||
|
||||
MAPILogoff (lhSession, ulUIParam, 0,0) ;
|
||||
|
||||
return hr ;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPIFindNext(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszMessageType,
|
||||
LPTSTR lpszSeedMessageID, FLAGS flFlags, ULONG ulReserved,
|
||||
LPTSTR lpszMessageID)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPIReadMail(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszMessageID,
|
||||
FLAGS flFlags, ULONG ulReserved, lpMapiMessage FAR *lppMessage)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPISaveMail(LHANDLE lhSession, ULONG ulUIParam, lpMapiMessage lpMessage,
|
||||
FLAGS flFlags, ULONG ulReserved, LPTSTR lpszMessageID)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPIDeleteMail(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszMessageID,
|
||||
FLAGS flFlags, ULONG ulReserved)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPIAddress(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszCaption,
|
||||
ULONG nEditFields, LPTSTR lpszLabels, ULONG nRecips,
|
||||
lpMapiRecipDesc lpRecips, FLAGS flFlags,
|
||||
ULONG ulReserved, LPULONG lpnNewRecips,
|
||||
lpMapiRecipDesc FAR *lppNewRecips)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPIDetails(LHANDLE lhSession, ULONG ulUIParam, lpMapiRecipDesc lpRecip,
|
||||
FLAGS flFlags, ULONG ulReserved)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPIResolveName(LHANDLE lhSession, ULONG ulUIParam, LPTSTR lpszName,
|
||||
FLAGS flFlags, ULONG ulReserved, lpMapiRecipDesc FAR *lppRecip)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL MAPIFreeBuffer(LPVOID pv)
|
||||
{
|
||||
return MAPI_E_FAILURE;
|
||||
}
|
||||
|
||||
ULONG FAR PASCAL GetMapiDllVersion()
|
||||
{
|
||||
return 94;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public License Version
|
||||
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
# http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
# for the specific language governing rights and limitations under the
|
||||
# License.
|
||||
#
|
||||
# The Original Code is Mozilla.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# Netscape Communications Corp.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2001
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Krishna Mohan Khandrika (kkhandrika@netscape.com)
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
# of those above. If you wish to allow use of your version of this file only
|
||||
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
# use your version of this file under the terms of the MPL, indicate your
|
||||
# decision by deleting the provisions above and replace them with the notice
|
||||
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
# the provisions above, a recipient may use your version of this file under
|
||||
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
DEPTH=..\..\..
|
||||
|
||||
MODULE = mozMapi32
|
||||
EXPORT_LIBRARY = $(MODULE)
|
||||
LIBRARY_NAME = $(MODULE)
|
||||
DEFFILE = Mapi32.def
|
||||
|
||||
REQUIRES = MapiProxy \
|
||||
msgMapi \
|
||||
xpcom \
|
||||
string \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\config.mak>
|
||||
###############################################################
|
||||
|
||||
LCFLAGS=-DUNICODE -D_UNICODE
|
||||
|
||||
|
||||
OBJS= .\$(OBJDIR)\MapiDll.obj
|
||||
|
||||
WIN_LIBS= ole32.lib
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2001
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Krishna Mohan Khandrika <kkhandrika@netscape.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsISupports.idl"
|
||||
|
||||
/**
|
||||
* This interface provides support for registering Mozilla as a COM component
|
||||
* for extending the use of Mail/News through Simple MAPI.
|
||||
*
|
||||
*/
|
||||
|
||||
[noscript, uuid(8967fed2-c8bb-11d5-a3e9-00b0d0f3baa7)]
|
||||
interface nsIMapiSupport : nsISupports {
|
||||
|
||||
/** Initiates MAPI support
|
||||
*/
|
||||
|
||||
void initializeMAPISupport();
|
||||
|
||||
/** Shuts down the MAPI support
|
||||
*/
|
||||
|
||||
void shutdownMAPISupport();
|
||||
};
|
||||
|
||||
%{C++
|
||||
#define NS_IMAPISUPPORT_CONTRACTID "@mozilla.org/mapisupport;1"
|
||||
#define NS_IMAPISUPPORT_CLASSNAME "Mozilla MAPI Support"
|
||||
%}
|
||||
|
||||
@@ -1,174 +0,0 @@
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Mozilla
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corp.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2001
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Krishna Mohan Khandrika (kkhandrika@netscape.com)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#include "nsComPtr.h"
|
||||
#include "nsMapiSupport.h"
|
||||
#include "nsISupports.h"
|
||||
#include "nsMapiRegistry.h"
|
||||
#include "nsIGenericFactory.h"
|
||||
#include "nsIObserverService.h"
|
||||
#include "nsIAppStartupNotifier.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsICategoryManager.h"
|
||||
|
||||
const CLSID CLSID_nsMapiImp = {0x29f458be, 0x8866, 0x11d5, \
|
||||
{0xa3, 0xdd, 0x0, 0xb0, 0xd0, 0xf3, 0xba, 0xa7}};
|
||||
|
||||
/** Implementation of the nsIMapiSupport interface.
|
||||
* Use standard implementation of nsISupports stuff.
|
||||
*/
|
||||
|
||||
NS_IMPL_THREADSAFE_ISUPPORTS2(nsMapiSupport, nsIMapiSupport, nsIObserver);
|
||||
|
||||
static NS_METHOD nsMapiRegistrationProc(nsIComponentManager *aCompMgr,
|
||||
nsIFile *aPath, const char *registryLocation, const char *componentType,
|
||||
const nsModuleComponentInfo *info)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
nsCOMPtr<nsICategoryManager> categoryManager(do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv));
|
||||
if (NS_SUCCEEDED(rv))
|
||||
rv = categoryManager->AddCategoryEntry(APPSTARTUP_CATEGORY, "Mapi Support",
|
||||
"service," NS_IMAPISUPPORT_CONTRACTID, PR_TRUE, PR_TRUE, nsnull);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMapiSupport::Observe(nsISupports *aSubject, const char *aTopic, const PRUnichar *aData)
|
||||
{
|
||||
if (!nsCRT::strcmp(aTopic, "profile-after-change"))
|
||||
return InitializeMAPISupport();
|
||||
|
||||
if (!nsCRT::strcmp(aTopic, NS_XPCOM_SHUTDOWN_OBSERVER_ID))
|
||||
return ShutdownMAPISupport();
|
||||
|
||||
nsresult rv;
|
||||
|
||||
nsCOMPtr<nsIObserverService> observerService(do_GetService("@mozilla.org/observer-service;1", &rv));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = observerService->AddObserver(this,"profile-after-change", PR_FALSE);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = observerService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, PR_FALSE);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsMapiSupport::nsMapiSupport()
|
||||
: m_dwRegister(0),
|
||||
m_nsMapiFactory(nsnull)
|
||||
{
|
||||
NS_INIT_ISUPPORTS();
|
||||
}
|
||||
|
||||
nsMapiSupport::~nsMapiSupport()
|
||||
{
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMapiSupport::InitializeMAPISupport()
|
||||
{
|
||||
::CoInitialize(nsnull);
|
||||
if (m_nsMapiFactory == nsnull) // No Registering if already done. Sanity Check!!
|
||||
{
|
||||
m_nsMapiFactory = new nsMapiFactory();
|
||||
|
||||
if (m_nsMapiFactory != nsnull)
|
||||
{
|
||||
HRESULT hr = ::CoRegisterClassObject(CLSID_nsMapiImp, \
|
||||
m_nsMapiFactory, \
|
||||
CLSCTX_LOCAL_SERVER, \
|
||||
REGCLS_MULTIPLEUSE, \
|
||||
&m_dwRegister);
|
||||
|
||||
if (FAILED(hr))
|
||||
{
|
||||
m_nsMapiFactory->Release() ;
|
||||
m_nsMapiFactory = nsnull;
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMapiSupport::ShutdownMAPISupport()
|
||||
{
|
||||
if (m_dwRegister != 0)
|
||||
::CoRevokeClassObject(m_dwRegister);
|
||||
|
||||
if (m_nsMapiFactory != nsnull)
|
||||
{
|
||||
m_nsMapiFactory->Release();
|
||||
m_nsMapiFactory = nsnull;
|
||||
}
|
||||
|
||||
::CoUninitialize();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsMapiRegistry);
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsMapiSupport);
|
||||
|
||||
// The list of components we register
|
||||
static nsModuleComponentInfo components[] =
|
||||
{
|
||||
{
|
||||
NS_IMAPIREGISTRY_CLASSNAME,
|
||||
NS_IMAPIREGISTRY_CID,
|
||||
NS_IMAPIREGISTRY_CONTRACTID,
|
||||
nsMapiRegistryConstructor
|
||||
},
|
||||
|
||||
{
|
||||
NS_IMAPISUPPORT_CLASSNAME,
|
||||
NS_IMAPISUPPORT_CID,
|
||||
NS_IMAPISUPPORT_CONTRACTID,
|
||||
nsMapiSupportConstructor,
|
||||
nsMapiRegistrationProc,
|
||||
nsnull
|
||||
}
|
||||
};
|
||||
|
||||
NS_IMPL_NSGETMODULE(msgMapiModule, components);
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is Mozilla
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
# Netscape Communications Corp.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2001
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Krishna Mohan Khandrika (kkhandrika@netscape.com)
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef NS_MAPI_SUPPORT_H_
|
||||
#define NS_MAPI_SUPPORT_H_
|
||||
|
||||
#include <nsIObserver.h>
|
||||
#include <nsIMapiSupport.h>
|
||||
#include "msgMapiFactory.h"
|
||||
|
||||
|
||||
#define NS_IMAPISUPPORT_CID \
|
||||
{0x8967fed2, 0xc8bb, 0x11d5, \
|
||||
{ 0xa3, 0xe9, 0x00, 0xb0, 0xd0, 0xf3, 0xba, 0xa7 }}
|
||||
|
||||
class nsMapiSupport : public nsIMapiSupport, public nsIObserver
|
||||
{
|
||||
public :
|
||||
|
||||
nsMapiSupport();
|
||||
~nsMapiSupport();
|
||||
|
||||
// Declare all interface methods we must implement.
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSIOBSERVER
|
||||
NS_DECL_NSIMAPISUPPORT
|
||||
|
||||
private :
|
||||
|
||||
DWORD m_dwRegister;
|
||||
nsMapiFactory *m_nsMapiFactory;
|
||||
};
|
||||
|
||||
#endif // NS_MAPI_SUPPORT_H_
|
||||
@@ -1,64 +0,0 @@
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
|
||||
DEPTH=..\..\..
|
||||
MODULE=mapiguts
|
||||
|
||||
################################################################################
|
||||
## exports
|
||||
|
||||
#EXPORTS =
|
||||
|
||||
|
||||
################################################################################
|
||||
## library
|
||||
|
||||
LIBNAME = .\$(OBJDIR)\mapiguts
|
||||
|
||||
!ifdef MOZ_STATIC_COMPONENT_LIBS
|
||||
LIB = $(LIBNAME).lib
|
||||
!else
|
||||
DLL = $(LIBNAME).dll
|
||||
!endif
|
||||
|
||||
DEFINES= -NS_DEBUG
|
||||
|
||||
OBJS= \
|
||||
.\$(OBJDIR)\mapihook.obj \
|
||||
.\$(OBJDIR)\mapimail.obj \
|
||||
$(NULL)
|
||||
|
||||
LLIBS= \
|
||||
$(LLIBS) \
|
||||
$(LIBNSPR) \
|
||||
$(DIST)\lib\xppref32.lib \
|
||||
$(DIST)\lib\xpcom.lib \
|
||||
$(DIST)\lib\mapiutils_s.lib \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
!ifdef MOZ_STATIC_COMPONENT_LIBS
|
||||
install:: $(LIb)
|
||||
$(MAKE_INSTALL) $(LIBNAME).$(LIB_SUFFIX) $(DIST)\bin\components
|
||||
!else
|
||||
install:: $(DLL)
|
||||
$(MAKE_INSTALL) $(LIBNAME).$(DLL_SUFFIX) $(DIST)\bin\components
|
||||
!endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,48 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#ifndef _MAPI_HOOK_H_
|
||||
#define _MAPI_HOOK_H_
|
||||
|
||||
#include <structs.h> // for MWContext
|
||||
|
||||
//
|
||||
// This is the entry point to the MAPI session manager that lives
|
||||
// inside of Communicator.
|
||||
//
|
||||
LONG ProcessNetscapeMAPIHook(WPARAM wParam, LPARAM lParam);
|
||||
|
||||
#endif // _MAPI_HOOK_H_
|
||||
@@ -1,853 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// More MAPI Hooks for Communicator
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#include "windows.h"
|
||||
#include "template.h"
|
||||
#include "msgcom.h"
|
||||
#include "wfemsg.h"
|
||||
#include "compstd.h"
|
||||
#include "compbar.h"
|
||||
#include "compmisc.h"
|
||||
#include "compfrm.h"
|
||||
#include "prefapi.h"
|
||||
#include "intl_csi.h"
|
||||
#include "dlghtmrp.h"
|
||||
#include "dlghtmmq.h"
|
||||
|
||||
// rhp - was breaking the optimized build!
|
||||
//#include "edt.h"
|
||||
//#include "edview.h"
|
||||
//#include "postal.h"
|
||||
//#include "apiaddr.h"
|
||||
//#include "mailmisc.h"
|
||||
|
||||
extern "C" {
|
||||
#include "xpgetstr.h"
|
||||
extern int MK_MSG_MSG_COMPOSITION;
|
||||
};
|
||||
|
||||
#include "mapimail.h"
|
||||
#include "nscpmapi.h"
|
||||
#include "mailpriv.h"
|
||||
#include "nsstrseq.h"
|
||||
|
||||
MWContext
|
||||
*GetUsableContext(void)
|
||||
{
|
||||
CGenericFrame *pFrame = (CGenericFrame * )FEU_GetLastActiveFrame();
|
||||
|
||||
ASSERT(pFrame != NULL);
|
||||
if (pFrame == NULL)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
// Now return the context...
|
||||
return((MWContext *) pFrame->GetMainContext());
|
||||
}
|
||||
|
||||
//
|
||||
// This function will create a composition window and either do
|
||||
// a blind send or pop up the compose window for the user to
|
||||
// complete the operation
|
||||
//
|
||||
// Return: appropriate MAPI return code...
|
||||
//
|
||||
//
|
||||
extern "C" LONG
|
||||
DoFullMAPIMailOperation(MAPISendMailType *sendMailPtr,
|
||||
const char *pInitialText,
|
||||
BOOL winShowFlag)
|
||||
{
|
||||
CGenericDoc *pDocument;
|
||||
LPSTR subject;
|
||||
NSstringSeq mailInfoSeq;
|
||||
DWORD stringCount = 6;
|
||||
DWORD i;
|
||||
CString csDefault;
|
||||
|
||||
// Get a context to use for this call...
|
||||
MWContext *pOldContext = GetUsableContext();
|
||||
if (!pOldContext)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
// Don't allow a compose window to be created if the user hasn't
|
||||
// specified an email address
|
||||
const char *real_addr = FE_UsersMailAddress();
|
||||
if (MISC_ValidateReturnAddress(pOldContext, real_addr) < 0)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
//
|
||||
// Now, we must build the fields object...
|
||||
//
|
||||
mailInfoSeq = (NSstringSeq) &(sendMailPtr->dataBuf[0]);
|
||||
subject = NSStrSeqGet(mailInfoSeq, 0);
|
||||
|
||||
// We should give it a subject to preven the prompt from coming
|
||||
// up...
|
||||
if ((!subject) || !(*subject))
|
||||
{
|
||||
csDefault.LoadString(IDS_COMPOSE_DEFAULTNOSUBJECT);
|
||||
subject = csDefault.GetBuffer(2);
|
||||
}
|
||||
|
||||
TRACE("MAPI: ProcessMAPISendMail() Subject = [%s]\n", subject);
|
||||
TRACE("MAPI: ProcessMAPISendMail() Text Size = [%d]\n", strlen((const char *)pInitialText));
|
||||
TRACE("MAPI: ProcessMAPISendMail() # of Recipients = [%d]\n", sendMailPtr->MSG_nRecipCount);
|
||||
|
||||
|
||||
char toString[1024] = "";
|
||||
char ccString[1024] = "";
|
||||
char bccString[1024] = "";
|
||||
|
||||
for (i=0; i<sendMailPtr->MSG_nRecipCount; i++)
|
||||
{
|
||||
LPSTR ptr;
|
||||
UCHAR tempString[256];
|
||||
|
||||
ULONG addrType = atoi(NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
|
||||
// figure which type of address this is?
|
||||
if (addrType == MAPI_CC)
|
||||
ptr = ccString;
|
||||
else if (addrType == MAPI_BCC)
|
||||
ptr = bccString;
|
||||
else
|
||||
ptr = toString;
|
||||
|
||||
LPSTR namePtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
|
||||
LPSTR emailPtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
|
||||
if ( (lstrlen(emailPtr) > 5) && (*(emailPtr + 4) == ':') )
|
||||
{
|
||||
emailPtr += 5;
|
||||
}
|
||||
|
||||
// Now build the temp string to tack on in the format
|
||||
// "Rich Pizzarro" <rhp@netscape.com>
|
||||
wsprintf((LPSTR) tempString, "\"%s\" <%s>", namePtr, emailPtr);
|
||||
|
||||
// add a comma if not the first one
|
||||
if (ptr[0] != '\0')
|
||||
lstrcat(ptr, ",");
|
||||
|
||||
// tack on string!
|
||||
lstrcat(ptr, (LPSTR) tempString);
|
||||
}
|
||||
|
||||
BOOL bEncrypt = FALSE;
|
||||
BOOL bSign = FALSE;
|
||||
|
||||
PREF_GetBoolPref("mail.crypto_sign_outgoing_mail", &bSign);
|
||||
PREF_GetBoolPref("mail.encrypt_outgoing_mail", &bEncrypt);
|
||||
MSG_CompositionFields *fields =
|
||||
MSG_CreateCompositionFields(real_addr, real_addr,
|
||||
toString,
|
||||
ccString,
|
||||
bccString,
|
||||
"", "", "",
|
||||
"", subject, "",
|
||||
"", "", "",
|
||||
"",
|
||||
bEncrypt,
|
||||
bSign);
|
||||
if (!fields)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
// RICHIE
|
||||
// INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(pOldContext);
|
||||
// int16 win_csid = INTL_GetCSIWinCSID(csi);
|
||||
|
||||
pDocument = (CGenericDoc*)theApp.m_TextComposeTemplate->OpenDocumentFile(NULL, NULL, /*win_csid RICHIE*/ winShowFlag);
|
||||
if ( !pDocument )
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
CWinCX * pContext = (CWinCX*) pDocument->GetContext();
|
||||
if ( !pContext )
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
MSG_CompositionPaneCallbacks Callbacks;
|
||||
Callbacks.CreateRecipientsDialog = CreateRecipientsDialog;
|
||||
Callbacks.CreateAskHTMLDialog = CreateAskHTMLDialog;
|
||||
|
||||
int16 doccsid;
|
||||
MWContext *context = pContext->GetContext();
|
||||
CComposeFrame *pCompose = (CComposeFrame *) pContext->GetFrame()->GetFrameWnd();
|
||||
|
||||
pCompose->SetComposeStuff(context, fields); // squirl away stuff for post-create
|
||||
|
||||
// This needs to be set TRUE if using the old non-HTML text frame
|
||||
// to prevent dropping dragged URLs
|
||||
pContext->m_bDragging = !pCompose->UseHtml();
|
||||
if (!pCompose->UseHtml())
|
||||
{
|
||||
pCompose->SetMsgPane(
|
||||
MSG_CreateCompositionPane(pContext->GetContext(),
|
||||
context,
|
||||
g_MsgPrefs.m_pMsgPrefs,
|
||||
fields,
|
||||
WFE_MSGGetMaster())
|
||||
);
|
||||
}
|
||||
|
||||
ASSERT(pCompose->GetMsgPane());
|
||||
MSG_SetFEData(pCompose->GetMsgPane(),(void *)pCompose);
|
||||
pCompose->UpdateAttachmentInfo();
|
||||
|
||||
// Pass doccsid info to new context for MailToWin conversion
|
||||
doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context));
|
||||
INTL_SetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context),
|
||||
(doccsid ? doccsid : INTL_DefaultDocCharSetID(context)));
|
||||
|
||||
pCompose->DisplayHeaders(NULL);
|
||||
|
||||
CComposeBar * pBar = pCompose->GetComposeBar();
|
||||
ASSERT(pBar);
|
||||
LPADDRESSCONTROL pIAddressList = pBar->GetAddressWidgetInterface();
|
||||
|
||||
if (!pIAddressList->IsCreated())
|
||||
{
|
||||
pBar->CreateAddressingBlock();
|
||||
}
|
||||
|
||||
// rhp - Deal with addressing the brute force way! This is a
|
||||
// "fix" for bad behavior when creating these windows and not
|
||||
// showing them on the desktop.
|
||||
if (!winShowFlag) // Hack to fix the window not being mapped
|
||||
{
|
||||
pCompose->AppendAddress(MSG_TO_HEADER_MASK, "");
|
||||
pCompose->AppendAddress(MSG_CC_HEADER_MASK, "");
|
||||
pCompose->AppendAddress(MSG_BCC_HEADER_MASK, "");
|
||||
}
|
||||
|
||||
// Always do plain text composition!
|
||||
pCompose->CompleteComposeInitialization();
|
||||
|
||||
// Do this so we don't get popups on "empty" messages
|
||||
if ( (!pInitialText) || (!(*pInitialText)) )
|
||||
pInitialText = " ";
|
||||
|
||||
const char * pBody = pInitialText ? pInitialText : MSG_GetCompBody(pCompose->GetMsgPane());
|
||||
if (pBody)
|
||||
{
|
||||
FE_InsertMessageCompositionText(context,pBody,TRUE);
|
||||
}
|
||||
|
||||
//
|
||||
// Now set the message as being edited!
|
||||
//
|
||||
pCompose->SetModified(TRUE);
|
||||
|
||||
//
|
||||
// Finally deal with the attachments...
|
||||
//
|
||||
if (sendMailPtr->MSG_nFileCount > 0)
|
||||
{
|
||||
// Send this puppy when done with the attachments...
|
||||
if (!winShowFlag)
|
||||
{
|
||||
pCompose->SetMAPISendMode(MAPI_SEND);
|
||||
}
|
||||
|
||||
MSG_AttachmentData *pAttach = (MSG_AttachmentData *)
|
||||
XP_CALLOC((sendMailPtr->MSG_nFileCount + 1),
|
||||
sizeof(MSG_AttachmentData));
|
||||
if (!pAttach)
|
||||
{
|
||||
return(MAPI_E_INSUFFICIENT_MEMORY);
|
||||
}
|
||||
|
||||
memset(pAttach, 0, (sendMailPtr->MSG_nFileCount + 1) *
|
||||
sizeof(MSG_AttachmentData));
|
||||
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
|
||||
{
|
||||
CString cs;
|
||||
// Create URL from filename...
|
||||
WFE_ConvertFile2Url(cs,
|
||||
(const char *)NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
pAttach[i].url = XP_STRDUP(cs);
|
||||
|
||||
// Now also include the "display" name...
|
||||
StrAllocCopy(pAttach[i].real_name, NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
}
|
||||
|
||||
// Set the list!
|
||||
MSG_SetAttachmentList(pCompose->GetMsgPane(), pAttach);
|
||||
|
||||
// Now free everything...
|
||||
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
|
||||
{
|
||||
if (pAttach[i].url)
|
||||
XP_FREE(pAttach[i].url);
|
||||
|
||||
if (pAttach[i].real_name)
|
||||
XP_FREE(pAttach[i].real_name);
|
||||
}
|
||||
|
||||
XP_FREE(pAttach);
|
||||
}
|
||||
|
||||
//
|
||||
// Now, if we were supposed to do the blind send...do it, otherwise,
|
||||
// just popup the window...
|
||||
//
|
||||
if (winShowFlag)
|
||||
{
|
||||
// Post message to compose window to set the initial focus.
|
||||
pCompose->PostMessage(WM_COMP_SET_INITIAL_FOCUS);
|
||||
}
|
||||
else if (sendMailPtr->MSG_nFileCount <= 0) // Send NOW if no attachments!
|
||||
{
|
||||
pCompose->PostMessage(WM_COMMAND, IDM_SEND);
|
||||
}
|
||||
|
||||
return(SUCCESS_SUCCESS);
|
||||
}
|
||||
|
||||
//
|
||||
// This function will create a composition window and just attach
|
||||
// the attachments of interest and pop up the window...
|
||||
//
|
||||
// Return: appropriate MAPI return code...
|
||||
//
|
||||
//
|
||||
extern "C" LONG
|
||||
DoPartialMAPIMailOperation(MAPISendDocumentsType *sendDocPtr)
|
||||
{
|
||||
CGenericDoc *pDocument;
|
||||
|
||||
// Get a context to use for this call...
|
||||
MWContext *pOldContext = GetUsableContext();
|
||||
if (!pOldContext)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
// Don't allow a compose window to be created if the user hasn't
|
||||
// specified an email address
|
||||
const char *real_addr = FE_UsersMailAddress();
|
||||
if (MISC_ValidateReturnAddress(pOldContext, real_addr) < 0)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
//
|
||||
// Now, build the fields object w/o much info...
|
||||
//
|
||||
BOOL bEncrypt = FALSE;
|
||||
BOOL bSign = FALSE;
|
||||
|
||||
PREF_GetBoolPref("mail.crypto_sign_outgoing_mail", &bSign);
|
||||
PREF_GetBoolPref("mail.encrypt_outgoing_mail", &bEncrypt);
|
||||
|
||||
MSG_CompositionFields *fields =
|
||||
MSG_CreateCompositionFields(real_addr, real_addr, NULL,
|
||||
"", "",
|
||||
"", "", "",
|
||||
"", "", "",
|
||||
"", "", "",
|
||||
"",
|
||||
bEncrypt,
|
||||
bSign);
|
||||
if (!fields)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
// RICHIE - INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(pOldContext);
|
||||
// int16 win_csid = INTL_GetCSIWinCSID(csi);
|
||||
|
||||
pDocument = (CGenericDoc*)theApp.m_TextComposeTemplate->OpenDocumentFile(NULL, NULL, /*RICHIE win_csid,*/ TRUE);
|
||||
if ( !pDocument )
|
||||
{
|
||||
// cleanup fields object
|
||||
MSG_DestroyCompositionFields(fields);
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
CWinCX * pContext = (CWinCX*) pDocument->GetContext();
|
||||
if ( !pContext )
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
MSG_CompositionPaneCallbacks Callbacks;
|
||||
Callbacks.CreateRecipientsDialog = CreateRecipientsDialog;
|
||||
Callbacks.CreateAskHTMLDialog = CreateAskHTMLDialog;
|
||||
|
||||
MWContext *context = pContext->GetContext();
|
||||
CComposeFrame *pCompose = (CComposeFrame *) pContext->GetFrame()->GetFrameWnd();
|
||||
pCompose->SetComposeStuff(context,fields); // squirl away stuff for post-create
|
||||
|
||||
// This needs to be set TRUE if using the old non-HTML text frame
|
||||
// to prevent dropping dragged URLs
|
||||
pContext->m_bDragging = !pCompose->UseHtml();
|
||||
if (!pCompose->UseHtml())
|
||||
{
|
||||
pCompose->SetMsgPane(MSG_CreateCompositionPane(
|
||||
pContext->GetContext(),
|
||||
context,
|
||||
g_MsgPrefs.m_pMsgPrefs, fields,
|
||||
WFE_MSGGetMaster()));
|
||||
}
|
||||
|
||||
ASSERT(pCompose->GetMsgPane());
|
||||
MSG_SetFEData(pCompose->GetMsgPane(),(void *)pCompose);
|
||||
|
||||
pCompose->UpdateAttachmentInfo();
|
||||
|
||||
// Pass doccsid info to new context for MailToWin conversion
|
||||
/***
|
||||
doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(pOldContext));
|
||||
|
||||
INTL_SetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context),
|
||||
(doccsid ? doccsid : INTL_DefaultDocCharSetID(pOldContext)));
|
||||
****/
|
||||
|
||||
pCompose->DisplayHeaders(NULL);
|
||||
|
||||
CComposeBar * pBar = pCompose->GetComposeBar();
|
||||
ASSERT(pBar);
|
||||
LPADDRESSCONTROL pIAddressList = pBar->GetAddressWidgetInterface();
|
||||
|
||||
if (!pIAddressList->IsCreated())
|
||||
{
|
||||
pBar->CreateAddressingBlock();
|
||||
}
|
||||
|
||||
// Always do plain text composition!
|
||||
pCompose->CompleteComposeInitialization();
|
||||
|
||||
//
|
||||
// Finally deal with the attachments...
|
||||
//
|
||||
NSstringSeq mailInfoSeq = (NSstringSeq) &(sendDocPtr->dataBuf[0]);
|
||||
DWORD stringCount = 0;
|
||||
DWORD i;
|
||||
|
||||
TRACE("MAPI: ProcessMAPISendDocuments() # of Attachments = [%d]\n", sendDocPtr->nFileCount);
|
||||
|
||||
if (sendDocPtr->nFileCount > 0)
|
||||
{
|
||||
MSG_AttachmentData *pAttach = (MSG_AttachmentData *)
|
||||
XP_CALLOC((sendDocPtr->nFileCount + 1),
|
||||
sizeof(MSG_AttachmentData));
|
||||
if (!pAttach)
|
||||
{
|
||||
return(MAPI_E_INSUFFICIENT_MEMORY);
|
||||
}
|
||||
|
||||
memset(pAttach, 0, (sendDocPtr->nFileCount + 1) *
|
||||
sizeof(MSG_AttachmentData));
|
||||
for (i=0; i<sendDocPtr->nFileCount; i++)
|
||||
{
|
||||
CString cs;
|
||||
// Create URL from filename...
|
||||
WFE_ConvertFile2Url(cs,
|
||||
(const char *)NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
pAttach[i].url = XP_STRDUP(cs);
|
||||
|
||||
// Now also include the "display" name...
|
||||
StrAllocCopy(pAttach[i].real_name, NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
}
|
||||
|
||||
// Set the list!
|
||||
MSG_SetAttachmentList(pCompose->GetMsgPane(), pAttach);
|
||||
|
||||
// Now free everything...
|
||||
for (i=0; i<sendDocPtr->nFileCount; i++)
|
||||
{
|
||||
if (pAttach[i].url)
|
||||
XP_FREE(pAttach[i].url);
|
||||
|
||||
if (pAttach[i].real_name)
|
||||
XP_FREE(pAttach[i].real_name);
|
||||
}
|
||||
|
||||
XP_FREE(pAttach);
|
||||
}
|
||||
|
||||
//
|
||||
// Now some checking for ... well I'm not sure...
|
||||
//
|
||||
if (MSG_GetAttachmentList(pCompose->GetMsgPane()))
|
||||
pCompose->SetModified(TRUE);
|
||||
else
|
||||
pCompose->SetModified(FALSE);
|
||||
|
||||
// Post message to compose window to set the initial focus.
|
||||
pCompose->PostMessage(WM_COMP_SET_INITIAL_FOCUS);
|
||||
|
||||
//
|
||||
// Now, just popup the window...
|
||||
//
|
||||
pCompose->ShowWindow(TRUE);
|
||||
|
||||
// return pCompose->GetMsgPane(); rhp - used to return the MsgPane
|
||||
return(SUCCESS_SUCCESS);
|
||||
}
|
||||
|
||||
static void _GetMailCallback(HWND hwnd, MSG_Pane *pane, void *closure)
|
||||
{
|
||||
if (pane != NULL)
|
||||
{
|
||||
ShowWindow(hwnd, SW_HIDE);
|
||||
MSG_Command( pane, MSG_GetNewMail, NULL, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
static void _GetMailDoneCallback(HWND hwnd, MSG_Pane *pane, void *closure)
|
||||
{
|
||||
for(CGenericFrame * f = theApp.m_pFrameList; f; f = f->m_pNext)
|
||||
f->PostMessage(WM_COMMAND, (WPARAM) ID_DONEGETTINGMAIL, (LPARAM) 0);
|
||||
}
|
||||
|
||||
//
|
||||
// This will fire off a "get mail in background operation" in an
|
||||
// async. fashion.
|
||||
//
|
||||
extern "C" void
|
||||
MAPIGetNewMessagesInBackground(void)
|
||||
{
|
||||
CGenericFrame *pFrame = (CGenericFrame * )FEU_GetLastActiveFrame();
|
||||
|
||||
// rhp - we should not hit the net if we are offline!
|
||||
if (NET_IsOffline())
|
||||
return;
|
||||
|
||||
if (!pFrame)
|
||||
return;
|
||||
|
||||
MWContext *pOldContext = GetUsableContext();
|
||||
if (!pOldContext)
|
||||
return;
|
||||
|
||||
TRACE("MAPI: DOWNLOAD MAIL IN BACKGROUND\n");
|
||||
new CProgressDialog(
|
||||
pFrame->GetFrameWnd(),
|
||||
NULL,
|
||||
_GetMailCallback, NULL, NULL,
|
||||
_GetMailDoneCallback);
|
||||
}
|
||||
|
||||
//
|
||||
// This function will save a message into the Communicator "Drafts"
|
||||
// folder with no UI showing.
|
||||
//
|
||||
// Return: appropriate MAPI return code...
|
||||
//
|
||||
//
|
||||
extern "C" LONG
|
||||
DoMAPISaveMailOperation(MAPISendMailType *sendMailPtr,
|
||||
const char *pInitialText)
|
||||
{
|
||||
CGenericDoc *pDocument;
|
||||
LPSTR subject;
|
||||
NSstringSeq mailInfoSeq;
|
||||
DWORD stringCount = 6;
|
||||
DWORD i;
|
||||
BOOL winShowFlag = FALSE;
|
||||
|
||||
// Get a context to use for this call...
|
||||
MWContext *pOldContext = GetUsableContext();
|
||||
if (!pOldContext)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
// Don't allow a compose window to be created if the user hasn't
|
||||
// specified an email address
|
||||
const char *real_addr = FE_UsersMailAddress();
|
||||
if (MISC_ValidateReturnAddress(pOldContext, real_addr) < 0)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
//
|
||||
// Now, we must build the fields object...
|
||||
//
|
||||
mailInfoSeq = (NSstringSeq) &(sendMailPtr->dataBuf[0]);
|
||||
subject = NSStrSeqGet(mailInfoSeq, 0);
|
||||
|
||||
TRACE("MAPI: ProcessMAPISendMail() Subject = [%s]\n", subject);
|
||||
TRACE("MAPI: ProcessMAPISendMail() Text Size = [%d]\n", strlen((const char *)pInitialText));
|
||||
TRACE("MAPI: ProcessMAPISendMail() # of Recipients = [%d]\n", sendMailPtr->MSG_nRecipCount);
|
||||
|
||||
|
||||
char toString[1024] = "";
|
||||
char ccString[1024] = "";
|
||||
char bccString[1024] = "";
|
||||
|
||||
for (i=0; i<sendMailPtr->MSG_nRecipCount; i++)
|
||||
{
|
||||
LPSTR ptr;
|
||||
UCHAR tempString[256];
|
||||
|
||||
ULONG addrType = atoi(NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
|
||||
// figure which type of address this is?
|
||||
if (addrType == MAPI_CC)
|
||||
ptr = ccString;
|
||||
else if (addrType == MAPI_BCC)
|
||||
ptr = bccString;
|
||||
else
|
||||
ptr = toString;
|
||||
|
||||
LPSTR namePtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
|
||||
LPSTR emailPtr = (LPSTR) NSStrSeqGet(mailInfoSeq, stringCount++);
|
||||
|
||||
if ( (!emailPtr) && (!namePtr))
|
||||
{
|
||||
return(MAPI_E_INVALID_RECIPS);
|
||||
}
|
||||
|
||||
if (!emailPtr)
|
||||
emailPtr = namePtr;
|
||||
|
||||
char *tptr = strchr(emailPtr, ':');
|
||||
if (tptr != NULL)
|
||||
{
|
||||
if ( (*tptr != '\0') && (*(tptr+1) != '\0') )
|
||||
{
|
||||
emailPtr = (tptr + 1);
|
||||
}
|
||||
}
|
||||
/**
|
||||
if ( (lstrlen(emailPtr) > 5) && (*(emailPtr + 4) == ':') )
|
||||
{
|
||||
emailPtr += 5;
|
||||
}
|
||||
**/
|
||||
// Now build the temp string to tack on in the format
|
||||
// "Rich Pizzarro" <rhp@netscape.com>
|
||||
wsprintf((LPSTR) tempString, "\"%s\" <%s>", namePtr, emailPtr);
|
||||
|
||||
// add a comma if not the first one
|
||||
if (ptr[0] != '\0')
|
||||
lstrcat(ptr, ",");
|
||||
|
||||
// tack on string!
|
||||
lstrcat(ptr, (LPSTR) tempString);
|
||||
}
|
||||
|
||||
BOOL bEncrypt = FALSE;
|
||||
BOOL bSign = FALSE;
|
||||
|
||||
PREF_GetBoolPref("mail.crypto_sign_outgoing_mail", &bSign);
|
||||
PREF_GetBoolPref("mail.encrypt_outgoing_mail", &bEncrypt);
|
||||
MSG_CompositionFields *fields =
|
||||
MSG_CreateCompositionFields(real_addr, real_addr,
|
||||
toString,
|
||||
ccString,
|
||||
bccString,
|
||||
"", "", "",
|
||||
"", subject, "",
|
||||
"", "", "",
|
||||
"",
|
||||
bEncrypt,
|
||||
bSign);
|
||||
if (!fields)
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
// RICHIE
|
||||
// INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(pOldContext);
|
||||
// int16 win_csid = INTL_GetCSIWinCSID(csi);
|
||||
|
||||
pDocument = (CGenericDoc*)theApp.m_TextComposeTemplate->OpenDocumentFile(NULL, NULL, /*win_csid RICHIE*/ winShowFlag);
|
||||
if ( !pDocument )
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
CWinCX * pContext = (CWinCX*) pDocument->GetContext();
|
||||
if ( !pContext )
|
||||
{
|
||||
return(MAPI_E_FAILURE);
|
||||
}
|
||||
|
||||
MSG_CompositionPaneCallbacks Callbacks;
|
||||
Callbacks.CreateRecipientsDialog = CreateRecipientsDialog;
|
||||
Callbacks.CreateAskHTMLDialog = CreateAskHTMLDialog;
|
||||
|
||||
int16 doccsid;
|
||||
MWContext *context = pContext->GetContext();
|
||||
CComposeFrame *pCompose = (CComposeFrame *) pContext->GetFrame()->GetFrameWnd();
|
||||
|
||||
pCompose->SetComposeStuff(context, fields); // squirl away stuff for post-create
|
||||
|
||||
// This needs to be set TRUE if using the old non-HTML text frame
|
||||
// to prevent dropping dragged URLs
|
||||
pContext->m_bDragging = !pCompose->UseHtml();
|
||||
if (!pCompose->UseHtml())
|
||||
{
|
||||
pCompose->SetMsgPane(
|
||||
MSG_CreateCompositionPane(pContext->GetContext(),
|
||||
context,
|
||||
g_MsgPrefs.m_pMsgPrefs,
|
||||
fields,
|
||||
WFE_MSGGetMaster())
|
||||
);
|
||||
}
|
||||
|
||||
ASSERT(pCompose->GetMsgPane());
|
||||
MSG_SetFEData(pCompose->GetMsgPane(),(void *)pCompose);
|
||||
pCompose->UpdateAttachmentInfo();
|
||||
|
||||
// Pass doccsid info to new context for MailToWin conversion
|
||||
doccsid = INTL_GetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context));
|
||||
INTL_SetCSIDocCSID(LO_GetDocumentCharacterSetInfo(context),
|
||||
(doccsid ? doccsid : INTL_DefaultDocCharSetID(context)));
|
||||
|
||||
pCompose->DisplayHeaders(NULL);
|
||||
|
||||
CComposeBar * pBar = pCompose->GetComposeBar();
|
||||
ASSERT(pBar);
|
||||
LPADDRESSCONTROL pIAddressList = pBar->GetAddressWidgetInterface();
|
||||
|
||||
if (!pIAddressList->IsCreated())
|
||||
{
|
||||
pBar->CreateAddressingBlock();
|
||||
}
|
||||
|
||||
// rhp - Deal with addressing the brute force way! This is a
|
||||
// "fix" for bad behavior when creating these windows and not
|
||||
// showing them on the desktop.
|
||||
if (!winShowFlag) // Hack to fix the window not being mapped
|
||||
{
|
||||
pCompose->AppendAddress(MSG_TO_HEADER_MASK, "");
|
||||
pCompose->AppendAddress(MSG_CC_HEADER_MASK, "");
|
||||
pCompose->AppendAddress(MSG_BCC_HEADER_MASK, "");
|
||||
}
|
||||
|
||||
// Always do plain text composition!
|
||||
pCompose->CompleteComposeInitialization();
|
||||
|
||||
// Do this so we don't get popups on "empty" messages
|
||||
if ( (!pInitialText) || (!(*pInitialText)) )
|
||||
pInitialText = " ";
|
||||
|
||||
const char * pBody = pInitialText ? pInitialText : MSG_GetCompBody(pCompose->GetMsgPane());
|
||||
if (pBody)
|
||||
{
|
||||
FE_InsertMessageCompositionText(context,pBody,TRUE);
|
||||
}
|
||||
|
||||
//
|
||||
// Now set the message as being edited!
|
||||
//
|
||||
pCompose->SetModified(TRUE);
|
||||
|
||||
//
|
||||
// Finally deal with the attachments...
|
||||
//
|
||||
if (sendMailPtr->MSG_nFileCount > 0)
|
||||
{
|
||||
// Send this puppy when done with the attachments...
|
||||
if (!winShowFlag)
|
||||
{
|
||||
pCompose->SetMAPISendMode(MAPI_SAVE);
|
||||
}
|
||||
|
||||
MSG_AttachmentData *pAttach = (MSG_AttachmentData *)
|
||||
XP_CALLOC((sendMailPtr->MSG_nFileCount + 1),
|
||||
sizeof(MSG_AttachmentData));
|
||||
if (!pAttach)
|
||||
{
|
||||
return(MAPI_E_INSUFFICIENT_MEMORY);
|
||||
}
|
||||
|
||||
memset(pAttach, 0, (sendMailPtr->MSG_nFileCount + 1) *
|
||||
sizeof(MSG_AttachmentData));
|
||||
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
|
||||
{
|
||||
CString cs;
|
||||
// Create URL from filename...
|
||||
WFE_ConvertFile2Url(cs,
|
||||
(const char *)NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
pAttach[i].url = XP_STRDUP(cs);
|
||||
|
||||
// Now also include the "display" name...
|
||||
StrAllocCopy(pAttach[i].real_name, NSStrSeqGet(mailInfoSeq, stringCount++));
|
||||
}
|
||||
|
||||
// Set the list!
|
||||
MSG_SetAttachmentList(pCompose->GetMsgPane(), pAttach);
|
||||
|
||||
// Now free everything...
|
||||
for (i=0; i<sendMailPtr->MSG_nFileCount; i++)
|
||||
{
|
||||
if (pAttach[i].url)
|
||||
XP_FREE(pAttach[i].url);
|
||||
|
||||
if (pAttach[i].real_name)
|
||||
XP_FREE(pAttach[i].real_name);
|
||||
}
|
||||
|
||||
XP_FREE(pAttach);
|
||||
}
|
||||
|
||||
//
|
||||
// Now, if we were supposed to do the blind send...do it, otherwise,
|
||||
// just popup the window...
|
||||
//
|
||||
if (winShowFlag)
|
||||
{
|
||||
// Post message to compose window to set the initial focus.
|
||||
pCompose->PostMessage(WM_COMP_SET_INITIAL_FOCUS);
|
||||
}
|
||||
else if (sendMailPtr->MSG_nFileCount <= 0) // Send NOW if no attachments!
|
||||
{
|
||||
pCompose->PostMessage(WM_COMMAND, IDM_SAVEASDRAFT);
|
||||
}
|
||||
|
||||
return(SUCCESS_SUCCESS);
|
||||
}
|
||||
@@ -1,89 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#ifndef _MAPI_MAIL_H_
|
||||
#define _MAPI_MAIL_H_
|
||||
|
||||
#include "nscpmapi.h"
|
||||
#include <structs.h> // for MWContext
|
||||
|
||||
//extern "C" {
|
||||
|
||||
//
|
||||
// This function will create a composition window and either do
|
||||
// a blind send or pop up the compose window for the user to
|
||||
// complete the operation
|
||||
//
|
||||
// Return: appropriate MAPI return code...
|
||||
//
|
||||
//
|
||||
extern "C" LONG
|
||||
DoFullMAPIMailOperation(MAPISendMailType *sendMailPtr,
|
||||
const char *pInitialText,
|
||||
BOOL winShowFlag);
|
||||
|
||||
//
|
||||
// This function will create a composition window and just attach
|
||||
// the attachments of interest and pop up the window...
|
||||
//
|
||||
// Return: appropriate MAPI return code...
|
||||
//
|
||||
//
|
||||
extern "C" LONG
|
||||
DoPartialMAPIMailOperation(MAPISendDocumentsType *sendDocPtr);
|
||||
|
||||
//
|
||||
// This function will save a message into the Communicator "Drafts"
|
||||
// folder with no UI showing.
|
||||
//
|
||||
// Return: appropriate MAPI return code...
|
||||
//
|
||||
//
|
||||
extern "C" LONG
|
||||
DoMAPISaveMailOperation(MAPISendMailType *sendMailPtr,
|
||||
const char *pInitialText);
|
||||
|
||||
//
|
||||
// This will fire off a "get mail in background operation" in an
|
||||
// async. fashion.
|
||||
//
|
||||
extern "C" void
|
||||
MAPIGetNewMessagesInBackground(void);
|
||||
|
||||
|
||||
// } // extern "C"
|
||||
|
||||
#endif // _MAPI_MAIL_H_
|
||||
@@ -1,173 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// smem.cpp - This deals with all shared memory functions needed for
|
||||
// the MAPI component of Communicator
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
|
||||
#include "mapismem.h"
|
||||
|
||||
|
||||
#ifndef ZeroMemory
|
||||
#include <memory.h>
|
||||
#define ZeroMemory(PTR, SIZE) memset(PTR, 0, SIZE)
|
||||
#endif // ZeroMemory
|
||||
|
||||
//
|
||||
// *create new* shared memory chunk
|
||||
// once this is created, use the pointer
|
||||
// to the segment to to store data
|
||||
// e.g.:
|
||||
// lpString = "string for communicator";
|
||||
// lstrcpy((LPSTR)pData->m_buf[0], lpString);
|
||||
//
|
||||
CSharedMem *
|
||||
NSCreateSharedMemory(DWORD memSize, LPCTSTR memName, HANDLE *hSharedMemory)
|
||||
{
|
||||
#ifdef WIN32
|
||||
|
||||
BOOL bExistedBefore;
|
||||
CSharedMem *pData;
|
||||
|
||||
LPCTSTR szObjectName = memName;
|
||||
DWORD dwSize = sizeof(CSharedMem) + memSize;
|
||||
*hSharedMemory = CreateFileMapping(
|
||||
(HANDLE)0xFFFFFFFF,0,PAGE_READWRITE,0,dwSize,szObjectName);
|
||||
if(*hSharedMemory == 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
bExistedBefore = (GetLastError() == ERROR_ALREADY_EXISTS);
|
||||
if(bExistedBefore)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pData = (CSharedMem *)MapViewOfFile(
|
||||
*hSharedMemory, FILE_MAP_ALL_ACCESS, 0, 0, 0);
|
||||
if(pData == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZeroMemory(pData, dwSize);
|
||||
pData->m_dwSize = memSize;
|
||||
|
||||
return pData;
|
||||
#else
|
||||
CSharedMem *sMemChunk = NULL;
|
||||
DWORD dwSize = memSize = (sizeof(CSharedMem) + memSize);
|
||||
|
||||
if (sMemChunk != NULL)
|
||||
return(sMemChunk);
|
||||
|
||||
sMemChunk = (CSharedMem *) GlobalAllocPtr(GMEM_MOVEABLE, dwSize);
|
||||
ZeroMemory(sMemChunk, (size_t) dwSize);
|
||||
sMemChunk->m_dwSize = dwSize; // Missing in Communicator code!
|
||||
return(sMemChunk);
|
||||
|
||||
#endif // WIN32
|
||||
}
|
||||
|
||||
//
|
||||
// *open existing* shared memory chunk
|
||||
// once you have the pointer to the new segment
|
||||
// use this pointer to access data, e.g.:
|
||||
//
|
||||
CSharedMem *
|
||||
NSOpenExistingSharedMemory(LPCTSTR memName, HANDLE *hSharedMemory)
|
||||
{
|
||||
#ifdef WIN32
|
||||
CSharedMem *pData;
|
||||
DWORD dwSize;
|
||||
|
||||
LPCTSTR szObjectName = memName;
|
||||
*hSharedMemory = OpenFileMapping(
|
||||
FILE_MAP_WRITE,FALSE,szObjectName);
|
||||
if(*hSharedMemory == 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pData = (CSharedMem *)MapViewOfFile(
|
||||
*hSharedMemory,FILE_MAP_ALL_ACCESS,0,0,0);
|
||||
if(pData == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dwSize = pData->m_dwSize;
|
||||
return pData;
|
||||
#else
|
||||
|
||||
return(NULL); // In Win16, this is really meaningless...
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
//
|
||||
// to close shared memory segment
|
||||
//
|
||||
void
|
||||
NSCloseSharedMemory(CSharedMem *pData, HANDLE hSharedMemory)
|
||||
{
|
||||
#ifdef WIN32
|
||||
if(pData != 0)
|
||||
{
|
||||
UnmapViewOfFile(pData);
|
||||
pData = 0;
|
||||
}
|
||||
|
||||
if(hSharedMemory != 0)
|
||||
{
|
||||
CloseHandle(hSharedMemory);
|
||||
hSharedMemory = 0;
|
||||
}
|
||||
#else
|
||||
|
||||
if (pData != NULL)
|
||||
{
|
||||
GlobalFreePtr(pData);
|
||||
pData = NULL;
|
||||
}
|
||||
|
||||
#endif // WIN32
|
||||
}
|
||||
@@ -1,116 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#ifndef __SMEM_HPP__
|
||||
#define __SMEM_HPP__
|
||||
|
||||
//
|
||||
// Need this for Win16 since it is an undocumented message
|
||||
//
|
||||
#ifndef WIN32
|
||||
|
||||
#define WM_COPYDATA 0x004A
|
||||
|
||||
/*
|
||||
* lParam of WM_COPYDATA message points to...
|
||||
*/
|
||||
typedef struct tagCOPYDATASTRUCT {
|
||||
DWORD dwData;
|
||||
DWORD cbData;
|
||||
LPVOID lpData;
|
||||
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
|
||||
|
||||
# ifndef LPCTSTR
|
||||
# define LPCTSTR LPCSTR
|
||||
# endif
|
||||
|
||||
|
||||
#endif // ifndef WIN32
|
||||
|
||||
// The following structure will be stored in the shared memory
|
||||
// and will be used to pass data back and forth
|
||||
|
||||
#pragma pack(4)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD m_dwSize; // size of the shared memory block
|
||||
BYTE m_buf[1]; // this is the buffer of memory to be used
|
||||
} CSharedMem;
|
||||
|
||||
#pragma pack(4)
|
||||
|
||||
// ******************************************************
|
||||
// Public routines...
|
||||
// ******************************************************
|
||||
//
|
||||
//
|
||||
// *create new* shared memory chunk
|
||||
// once this is created, use the pointer
|
||||
// to the segment to to store data
|
||||
// e.g.:
|
||||
// lpString = "string for communicator";
|
||||
// lstrcpy((LPSTR)pData->m_buf[0], lpString);
|
||||
// pData->m_dwBytesUsed = lstrlen(lpString) + 1; // count '\0'
|
||||
//
|
||||
CSharedMem *
|
||||
NSCreateSharedMemory(DWORD memSize, LPCTSTR memName, HANDLE *hSharedMemory);
|
||||
|
||||
//
|
||||
// *open existing* shared memory chunk
|
||||
// once you have the pointer to the new segment
|
||||
// use this pointer to access data, e.g.:
|
||||
//
|
||||
// This will return the pointer to the memory chunk as well as
|
||||
// fill out the hSharedMemory argument that is needed for subsequent
|
||||
// operations.
|
||||
//
|
||||
// if(pData->m_dwBytesUsed > 0)
|
||||
// {
|
||||
// // use pData->m_buf here
|
||||
// }
|
||||
//
|
||||
CSharedMem *
|
||||
NSOpenExistingSharedMemory(LPCTSTR memName, HANDLE *hSharedMemory);
|
||||
|
||||
//
|
||||
// You must pass in the pointer to the memory chunk as well as
|
||||
// the hSharedMemory HANDLE to close shared memory segment
|
||||
//
|
||||
void
|
||||
NSCloseSharedMemory(CSharedMem *pData, HANDLE hSharedMemory);
|
||||
|
||||
#endif // __SMEM_HPP__
|
||||
@@ -1,230 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// This is a string sequence handling routine to take complex
|
||||
// structures and merge them into a chunk of memory.
|
||||
//
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
|
||||
#include "nsstrseq.h"
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL '\0'
|
||||
#endif
|
||||
|
||||
#define MARKER '\377'
|
||||
|
||||
//
|
||||
// Delete an existing string sequence
|
||||
//
|
||||
void NSStrSeqDelete(NSstringSeq seq)
|
||||
{
|
||||
if (seq != NULL)
|
||||
free(seq);
|
||||
|
||||
seq = NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// Allocate a new sequence, copying the given strings into it.
|
||||
//
|
||||
NSstringSeq NSStrSeqNew(LPSTR strings[])
|
||||
{
|
||||
int size;
|
||||
if (!strings)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
{
|
||||
int i;
|
||||
for (i=0,size=0; strings[i]; i++)
|
||||
{
|
||||
size+=strlen(strings[i])+1;
|
||||
switch (strings[i][0])
|
||||
{
|
||||
// Need to pad "" or anything starting with 255
|
||||
// to allow for multiple blank strings in a row
|
||||
case 0:
|
||||
case MARKER:
|
||||
size++;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
NSstringSeq s=(NSstringSeq)malloc(size+1);
|
||||
if (!s)
|
||||
{ return NULL;}
|
||||
|
||||
{
|
||||
int i,offset;
|
||||
for (i=0,offset=0; strings[i]; i++)
|
||||
{
|
||||
switch (strings[i][0])
|
||||
{
|
||||
// Need to pad "" or anything starting with 255
|
||||
case 0:
|
||||
case MARKER:
|
||||
s[offset++]=MARKER;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
strcpy(s+offset,strings[i]);
|
||||
offset+=strlen(strings[i])+1;
|
||||
}
|
||||
s[offset]=0;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Get the # of bytes required for the sequence
|
||||
//
|
||||
LONG NSStrSeqSize(NSstringSeq seq)
|
||||
{
|
||||
const char* s;
|
||||
if (!seq)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (s=seq+1; ((*s) || (*(s-1))); s++)
|
||||
;
|
||||
|
||||
// At this point, s points to the second 0
|
||||
// of the double 0 at the end
|
||||
return (s-seq)+1;
|
||||
}
|
||||
|
||||
//
|
||||
// Get the # of strings in the sequence
|
||||
//
|
||||
LONG NSStrSeqNumStrs(NSstringSeq seq)
|
||||
{
|
||||
const char* s;
|
||||
int N;
|
||||
if (!seq)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (s=seq+1,N=0; ((*s) || (*(s-1))); s++)
|
||||
{
|
||||
if (!(*s))
|
||||
N++;
|
||||
}
|
||||
|
||||
return N;
|
||||
}
|
||||
|
||||
static LPSTR correct(LPSTR s)
|
||||
{
|
||||
if (s[0]==MARKER)
|
||||
return s+1;
|
||||
else // Anup , 4/96
|
||||
return s;
|
||||
}
|
||||
|
||||
//
|
||||
// Extract the index'th string in the sequence
|
||||
//
|
||||
LPSTR NSStrSeqGet(NSstringSeq seq, LONG index)
|
||||
{
|
||||
char* s;
|
||||
int N;
|
||||
|
||||
if (!seq)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (index<0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!index)
|
||||
return correct(seq);
|
||||
|
||||
for (s=seq+1,N=0; ((*s) || (*(s-1))) && (N<index); s++)
|
||||
{
|
||||
if (!(*s))
|
||||
N++;
|
||||
}
|
||||
|
||||
if (N==index)
|
||||
return correct(s);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
LPSTR * NSStrSeqGetAll(NSstringSeq seq)
|
||||
{
|
||||
LONG N=NSStrSeqNumStrs(seq);
|
||||
if (N<0)
|
||||
return NULL;
|
||||
|
||||
{
|
||||
char** res=(char**)malloc( (size_t) ((N+1)*sizeof(char*)) );
|
||||
int i;
|
||||
|
||||
if (!res)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
for (i=0; i<N; i++)
|
||||
res[i]=NSStrSeqGet(seq,i);
|
||||
res[N]=NULL;
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#ifndef __SEQUENCES_OF_STRINGS_H_
|
||||
#define __SEQUENCES_OF_STRINGS_H
|
||||
|
||||
|
||||
typedef LPSTR NSstringSeq;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
void NSStrSeqDelete(NSstringSeq seq);
|
||||
NSstringSeq NSStrSeqNew(LPSTR strings[]);
|
||||
|
||||
// Get the # of bytes required for the sequence
|
||||
LONG NSStrSeqSize(NSstringSeq seq);
|
||||
|
||||
// Get the # of strings in the sequence
|
||||
LONG NSStrSeqNumStrs(NSstringSeq seq);
|
||||
|
||||
// Extract the index'th string in the sequence
|
||||
LPSTR NSStrSeqGet(NSstringSeq seq, LONG index);
|
||||
|
||||
// Build an array of all the strings in the sequence
|
||||
LPSTR *NSStrSeqGetAll(NSstringSeq seq);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif // __sequences_of_strings_h_
|
||||
@@ -1,100 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// DLLMain to get a handle on an hInstance
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
#include <windows.h>
|
||||
|
||||
//
|
||||
// global variables
|
||||
//
|
||||
HINSTANCE hInstance;
|
||||
|
||||
//
|
||||
// DLL entry
|
||||
//
|
||||
#ifdef WIN32
|
||||
/****************************************************************************
|
||||
FUNCTION: DllMain(HANDLE, DWORD, LPVOID)
|
||||
|
||||
PURPOSE: DllMain is called by Windows when
|
||||
the DLL is initialized, Thread Attached, and other times.
|
||||
Refer to SDK documentation, as to the different ways this
|
||||
may be called.
|
||||
|
||||
The DllMain function should perform additional initialization
|
||||
tasks required by the DLL. In this example, no initialization
|
||||
tasks are required. DllMain should return a value of 1 if
|
||||
the initialization is successful.
|
||||
|
||||
*******************************************************************************/
|
||||
BOOL APIENTRY DllMain(HANDLE hInstLocal, DWORD ul_reason_being_called, LPVOID lpReserved)
|
||||
{
|
||||
hInstance = (HINSTANCE)hInstLocal;
|
||||
|
||||
if (hInstance != NULL)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else // WIN16
|
||||
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// LibMain( hInstance, wDataSegment, wHeapSize, lpszCmdLine ) : WORD
|
||||
//
|
||||
// hInstance library instance handle
|
||||
// wDataSegment library data segment
|
||||
// wHeapSize default heap size
|
||||
// lpszCmdLine command line arguments
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
|
||||
int CALLBACK LibMain(HINSTANCE hInstLocal, WORD wDataSegment, WORD wHeapSize, LPSTR lpszCmdLine)
|
||||
{
|
||||
hInstance = hInstLocal;
|
||||
/* return result 1 = success; 0 = fail */
|
||||
if (hInstance != NULL)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif // WIN16
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
|
||||
DEPTH=..\..\..
|
||||
MODULE=mapi32
|
||||
|
||||
################################################################################
|
||||
## exports
|
||||
|
||||
#EXPORTS =
|
||||
|
||||
|
||||
################################################################################
|
||||
## library
|
||||
|
||||
LIBNAME = .\$(OBJDIR)\mapi32
|
||||
DEFINES= -NS_DEBUG
|
||||
DEFFILE=MAPI32.def
|
||||
|
||||
!ifdef MOZ_STATIC_COMPONENT_LIBS
|
||||
LIB = $(LIBNAME).lib
|
||||
!else
|
||||
DLL = $(LIBNAME).dll
|
||||
!endif
|
||||
|
||||
OBJS= \
|
||||
.\$(OBJDIR)\maindll.obj \
|
||||
.\$(OBJDIR)\mapi32.obj \
|
||||
.\$(OBJDIR)\mapiipc.obj \
|
||||
.\$(OBJDIR)\mapimem.obj \
|
||||
.\$(OBJDIR)\mapiutl.obj \
|
||||
.\$(OBJDIR)\smem.obj \
|
||||
.\$(OBJDIR)\trace.obj \
|
||||
.\$(OBJDIR)\xpapi.obj \
|
||||
$(NULL)
|
||||
|
||||
LLIBS= \
|
||||
$(LLIBS) \
|
||||
$(LIBNSPR) \
|
||||
$(DIST)\lib\xppref32.lib \
|
||||
$(DIST)\lib\xpcom.lib \
|
||||
$(DIST)\lib\mapiutils_s.lib \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
!ifdef MOZ_STATIC_COMPONENT_LIBS
|
||||
install:: $(LIB)
|
||||
$(MAKE_INSTALL) $(LIBNAME).$(LIB_SUFFIX) $(DIST)\bin\components
|
||||
!else
|
||||
install:: $(DLL)
|
||||
$(MAKE_INSTALL) $(LIBNAME).$(DLL_SUFFIX) $(DIST)\bin\components
|
||||
!endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,14 +0,0 @@
|
||||
EXPORTS
|
||||
MAPILogon
|
||||
MAPILogoff
|
||||
MAPISendMail
|
||||
MAPISendDocuments
|
||||
MAPIFreeBuffer
|
||||
MAPIFindNext
|
||||
MAPIReadMail
|
||||
MAPISaveMail
|
||||
MAPIDeleteMail
|
||||
MAPIAddress
|
||||
MAPIDetails
|
||||
MAPIResolveName
|
||||
MAPIGetNetscapeVersion
|
||||
@@ -1,146 +0,0 @@
|
||||
// Insert copyright and license here 1997
|
||||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
ID_DIALOG_MAPI DIALOGEX 0, 0, 186, 111
|
||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
EXSTYLE WS_EX_TOOLWINDOW
|
||||
CAPTION "Netscape MAPI Support"
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "OK",IDOK,41,95,50,14
|
||||
PUSHBUTTON "Cancel",IDCANCEL,104,95,50,14
|
||||
GROUPBOX "Diagnostic Information",IDC_STATIC,2,2,182,91
|
||||
CTEXT "This window will contain MAPI relative\ninformation for Netscape Communicator",
|
||||
IDC_STATIC,11,14,159,30
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DESIGNINFO
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO DISCARDABLE
|
||||
BEGIN
|
||||
ID_DIALOG_MAPI, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 2
|
||||
RIGHTMARGIN, 184
|
||||
TOPMARGIN, 2
|
||||
BOTTOMMARGIN, 109
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
#ifndef _MAC
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 5,0,0,1
|
||||
PRODUCTVERSION 5,0,0,1
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x40004L
|
||||
FILETYPE 0x2L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "Comments", "Simple MAPI DLL\0"
|
||||
VALUE "CompanyName", "Netscape Communications Corporation\0"
|
||||
VALUE "FileDescription", "mapi32\0"
|
||||
VALUE "FileVersion", "5, 0, 0, 1\0"
|
||||
VALUE "InternalName", "mapi32\0"
|
||||
VALUE "LegalCopyright", "Copyright © 1997\0"
|
||||
VALUE "LegalTrademarks", "Netscape and Netscape Navigator are registered trademarks of Netscape Communications Corporation.\0"
|
||||
VALUE "OriginalFilename", "mapi32.dll\0"
|
||||
VALUE "ProductName", "Netscape Communications Simple MAPI\0"
|
||||
VALUE "ProductVersion", "5, 0, 0, 1\0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
|
||||
#endif // !_MAC
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
||||
@@ -1,249 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// MAPI IPC Routines
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
#include <nscpmapi.h> // Should live in Communicator
|
||||
|
||||
#include "resource.h"
|
||||
#include "mapiipc.h"
|
||||
#include "mapismem.h"
|
||||
#include "trace.h"
|
||||
|
||||
#ifndef WIN32
|
||||
#include <string.h>
|
||||
#endif
|
||||
|
||||
//
|
||||
// Necessary variables...
|
||||
//
|
||||
static LONG instanceCount = 0;
|
||||
HWND hWndMAPI = NULL;
|
||||
char szClassName[] = "NetscapeMAPIClient";
|
||||
char szWindowName[] = "NetscapeMAPI";
|
||||
|
||||
//
|
||||
// External declares...
|
||||
//
|
||||
extern HINSTANCE hInstance;
|
||||
|
||||
void
|
||||
ProcessCommand(HWND hWnd, int id, HWND hCtl, UINT codeNotify)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case IDOK:
|
||||
case IDCANCEL:
|
||||
{
|
||||
ShowWindow(hWnd, SW_HIDE);
|
||||
}
|
||||
|
||||
default:
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL CALLBACK LOADDS
|
||||
MyDlgProc(HWND hWndMain, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (wMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
hWndMAPI = hWndMain;
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_CLOSE:
|
||||
// DestroyWindow(hWndMain);
|
||||
break;
|
||||
|
||||
case WM_DESTROY:
|
||||
hWndMain = NULL;
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
HANDLE_WM_COMMAND(hWndMAPI, wParam, lParam, ProcessCommand);
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL
|
||||
InitInstance(HINSTANCE hInstance)
|
||||
{
|
||||
//
|
||||
// Create a main window for this application instance.
|
||||
//
|
||||
/* RICHIE - TRY SOME CHANGES!!!
|
||||
hWndMAPI = CreateDialog((HINSTANCE) hInstance,
|
||||
MAKEINTRESOURCE(ID_DIALOG_QAHOOK),
|
||||
(HWND) NULL, (DLGPROC) MyDlgProc);
|
||||
******/
|
||||
hWndMAPI = CreateWindow(
|
||||
szClassName, // pointer to registered class name
|
||||
szWindowName, // pointer to window name
|
||||
WS_CHILD, // window style
|
||||
-10, // horizontal position of window
|
||||
-10, // vertical position of window
|
||||
1, // window width
|
||||
1, // window height
|
||||
GetDesktopWindow(), // handle to parent or owner window
|
||||
NULL, // handle to menu or child-window identifier
|
||||
hInstance, // handle to application instance
|
||||
NULL // pointer to window-creation data
|
||||
);
|
||||
if (!hWndMAPI)
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL
|
||||
InitApp(void)
|
||||
{
|
||||
#ifdef WIN32
|
||||
WNDCLASS wc;
|
||||
wc.style = 0;
|
||||
wc.lpfnWndProc = DefDlgProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = DLGWINDOWEXTRA;
|
||||
wc.hInstance = hInstance;
|
||||
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ID_ICON_APP));
|
||||
wc.hCursor = LoadCursor(0, IDC_ARROW);
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = szClassName;
|
||||
|
||||
if(!RegisterClass(&wc))
|
||||
return FALSE;
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
} // end InitApp
|
||||
|
||||
BOOL
|
||||
InitDLL(void)
|
||||
{
|
||||
if (hWndMAPI != NULL)
|
||||
return TRUE;
|
||||
|
||||
if (!InitApp())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!InitInstance(hInstance))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// ShowWindow(hWndMAPI, SW_SHOW); Just for jollies
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
//*************************************************************
|
||||
//* Calls exposed for rest of DLL...
|
||||
//*************************************************************
|
||||
//
|
||||
// Purpose: Open the API
|
||||
// Return: 1 on success
|
||||
// 0 on failure
|
||||
//
|
||||
DWORD nsMAPI_OpenAPI(void)
|
||||
{
|
||||
if (instanceCount > 0)
|
||||
{
|
||||
return(1);
|
||||
}
|
||||
|
||||
++instanceCount;
|
||||
return(1);
|
||||
}
|
||||
|
||||
//
|
||||
// Purpose: Close the API
|
||||
//
|
||||
void nsMAPI_CloseAPI(void)
|
||||
{
|
||||
--instanceCount;
|
||||
if (instanceCount <= 0)
|
||||
{
|
||||
instanceCount = 0;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
// Send the actual request to Communicator
|
||||
//
|
||||
LRESULT
|
||||
SendMAPIRequest(HWND hWnd,
|
||||
DWORD mapiRequestID,
|
||||
MAPIIPCType *ipcInfo)
|
||||
{
|
||||
LRESULT returnVal = 0;
|
||||
COPYDATASTRUCT cds;
|
||||
|
||||
if (!InitDLL())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
cds.dwData = mapiRequestID;
|
||||
cds.cbData = sizeof(MAPIIPCType);
|
||||
cds.lpData = ipcInfo;
|
||||
|
||||
// Make the call into Communicator
|
||||
returnVal = SendMessage(hWnd, WM_COPYDATA, (WPARAM) hWndMAPI, (LPARAM) &cds);
|
||||
|
||||
// Now kill the window...
|
||||
DestroyWindow(hWndMAPI);
|
||||
hWndMAPI = NULL;
|
||||
UnregisterClass(szClassName, hInstance);
|
||||
|
||||
return returnVal;
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#ifndef __MAPIIPC_HPP__
|
||||
#define __MAPIIPC_HPP__
|
||||
|
||||
#include "port.h"
|
||||
#include <nscpmapi.h>
|
||||
|
||||
//********************************************************
|
||||
// Open and close functions for API
|
||||
//********************************************************
|
||||
// Open the API
|
||||
// Return: 1 on success, 0 on failure
|
||||
//
|
||||
DWORD nsMAPI_OpenAPI(void);
|
||||
|
||||
//
|
||||
// Purpose: Close the API
|
||||
//
|
||||
void nsMAPI_CloseAPI(void);
|
||||
|
||||
//
|
||||
// Send the actual request to Communicator
|
||||
//
|
||||
LRESULT SendMAPIRequest(HWND hWnd,
|
||||
DWORD mapiRequestID,
|
||||
MAPIIPCType *ipcInfo);
|
||||
|
||||
#endif // __MAPIIPC_HPP__
|
||||
@@ -1,363 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// mem.cpp
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
// This implements various memory management functions for use with
|
||||
// MAPI features of Communicator
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <memory.h>
|
||||
#include <malloc.h>
|
||||
#include "mapimem.h"
|
||||
#include <nscpmapi.h> // lives in communicator winfe
|
||||
#include "nsstrseq.h"
|
||||
#include "trace.h"
|
||||
#include "mapiutl.h"
|
||||
#include "xpapi.h"
|
||||
|
||||
LPSTR
|
||||
CheckNullString(LPSTR inStr)
|
||||
{
|
||||
static UCHAR str[1];
|
||||
|
||||
str[0] = '\0';
|
||||
if (inStr == NULL)
|
||||
return((LPSTR)str);
|
||||
else
|
||||
return(inStr);
|
||||
}
|
||||
|
||||
void
|
||||
FreeMAPIFile(lpMapiFileDesc pv)
|
||||
{
|
||||
if (!pv)
|
||||
return;
|
||||
|
||||
if (pv->lpszPathName != NULL)
|
||||
free(pv->lpszPathName);
|
||||
|
||||
if (pv->lpszFileName != NULL)
|
||||
free(pv->lpszFileName);
|
||||
}
|
||||
|
||||
void
|
||||
FreeMAPIMessage(lpMapiMessage pv)
|
||||
{
|
||||
ULONG i;
|
||||
|
||||
if (!pv)
|
||||
return;
|
||||
|
||||
if (pv->lpszSubject != NULL)
|
||||
free(pv->lpszSubject);
|
||||
|
||||
if (pv->lpszNoteText)
|
||||
free(pv->lpszNoteText);
|
||||
|
||||
if (pv->lpszMessageType)
|
||||
free(pv->lpszMessageType);
|
||||
|
||||
if (pv->lpszDateReceived)
|
||||
free(pv->lpszDateReceived);
|
||||
|
||||
if (pv->lpszConversationID)
|
||||
free(pv->lpszConversationID);
|
||||
|
||||
if (pv->lpOriginator)
|
||||
FreeMAPIRecipient(pv->lpOriginator);
|
||||
|
||||
for (i=0; i<pv->nRecipCount; i++)
|
||||
{
|
||||
if (&(pv->lpRecips[i]) != NULL)
|
||||
{
|
||||
FreeMAPIRecipient(&(pv->lpRecips[i]));
|
||||
}
|
||||
}
|
||||
|
||||
if (pv->lpRecips != NULL)
|
||||
{
|
||||
free(pv->lpRecips);
|
||||
}
|
||||
|
||||
for (i=0; i<pv->nFileCount; i++)
|
||||
{
|
||||
if (&(pv->lpFiles[i]) != NULL)
|
||||
{
|
||||
FreeMAPIFile(&(pv->lpFiles[i]));
|
||||
}
|
||||
}
|
||||
|
||||
if (pv->lpFiles != NULL)
|
||||
{
|
||||
free(pv->lpFiles);
|
||||
}
|
||||
|
||||
free(pv);
|
||||
pv = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
FreeMAPIRecipient(lpMapiRecipDesc pv)
|
||||
{
|
||||
if (!pv)
|
||||
return;
|
||||
|
||||
if (pv->lpszName != NULL)
|
||||
free(pv->lpszName);
|
||||
|
||||
if (pv->lpszAddress != NULL)
|
||||
free(pv->lpszAddress);
|
||||
|
||||
if (pv->lpEntryID != NULL)
|
||||
free(pv->lpEntryID);
|
||||
}
|
||||
|
||||
//
|
||||
// This routine will take an lpMapiMessage structure and "flatten" it into
|
||||
// one contiguous chunk of memory that can be easily passed around. After this
|
||||
// is done, "extract" routines will be written to get complicated string routines
|
||||
// out of the chunk of memory at the end.
|
||||
//
|
||||
LPVOID
|
||||
FlattenMAPIMessageStructure(lpMapiMessage msg, DWORD *totalSize)
|
||||
{
|
||||
MAPISendMailType *mailPtr;
|
||||
LPSTR *strArray;
|
||||
DWORD strCount = 0;
|
||||
DWORD currentString = 0;
|
||||
DWORD arrayBufSize = 0;
|
||||
DWORD i;
|
||||
|
||||
*totalSize = 0;
|
||||
if (!msg)
|
||||
return(NULL);
|
||||
|
||||
//
|
||||
// Allocate the initial structure to hold all of the mail info.
|
||||
//
|
||||
*totalSize = sizeof(MAPISendMailType);
|
||||
mailPtr = (MAPISendMailType *) malloc(sizeof(MAPISendMailType));
|
||||
if (!mailPtr)
|
||||
return(NULL);
|
||||
memset(mailPtr, 0, sizeof(MAPISendMailType));
|
||||
|
||||
//
|
||||
// First, assign all of the easy numeric values...
|
||||
//
|
||||
mailPtr->MSG_flFlags = msg->flFlags; // unread,return receipt
|
||||
mailPtr->MSG_nRecipCount = msg->nRecipCount; // Number of recipients
|
||||
mailPtr->MSG_nFileCount = msg->nFileCount; // # of file attachments
|
||||
if (msg->lpOriginator != NULL)
|
||||
{
|
||||
mailPtr->MSG_ORIG_ulRecipClass = msg->lpOriginator->ulRecipClass; // Recipient class - MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG
|
||||
}
|
||||
|
||||
//
|
||||
// Now, figure out how many string pointers we need...
|
||||
//
|
||||
strCount = 4; // These are the 4 KNOWN strings up front for a message
|
||||
strCount += 2; // This is for the originator name and address
|
||||
|
||||
strCount += msg->nRecipCount * 3; // Name, address & class (cc, bcc) for each recipient
|
||||
strCount += msg->nFileCount * 2; // filename and display name for each attachment
|
||||
|
||||
//
|
||||
// Now allocate a new string sequence...add one entry for NULL at the end
|
||||
//
|
||||
arrayBufSize = sizeof(LPSTR) * (strCount + 1);
|
||||
|
||||
#ifdef WIN16 // Check for max mem allocation...
|
||||
if ((sizeof(MAPISendMailType) + arrayBufSize) > 64000)
|
||||
{
|
||||
free(mailPtr);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
//
|
||||
// Allocate a buffer for the string pointers and if this fails,
|
||||
// cleanup and return.
|
||||
//
|
||||
strArray = (LPSTR *)malloc( (size_t) arrayBufSize);
|
||||
if (!strArray)
|
||||
{
|
||||
free(mailPtr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(strArray, 0, (size_t) arrayBufSize); // Set the array to NULL
|
||||
strArray[currentString++] = CheckNullString(msg->lpszSubject); // Message Subject
|
||||
strArray[currentString++] = CheckNullString(msg->lpszNoteText); // Message Text
|
||||
strArray[currentString++] = CheckNullString(msg->lpszDateReceived); // in YYYY/MM/DD HH:MM format
|
||||
strArray[currentString++] = CheckNullString(msg->lpszConversationID); // conversation thread ID
|
||||
|
||||
if (msg->lpOriginator)
|
||||
{
|
||||
strArray[currentString++] = CheckNullString(msg->lpOriginator[0].lpszName);
|
||||
strArray[currentString++] = CheckNullString(msg->lpOriginator[0].lpszAddress);
|
||||
}
|
||||
else
|
||||
{
|
||||
strArray[currentString++] = CheckNullString(NULL);
|
||||
strArray[currentString++] = CheckNullString(NULL);
|
||||
}
|
||||
|
||||
//
|
||||
// Assign pointers for the Name and address of each recipient
|
||||
//
|
||||
LPSTR toString = "1";
|
||||
LPSTR ccString = "2";
|
||||
LPSTR bccString = "3";
|
||||
|
||||
for (i=0; i<msg->nRecipCount; i++)
|
||||
{
|
||||
// rhp - need message class
|
||||
if (msg->lpRecips[i].ulRecipClass == MAPI_BCC)
|
||||
strArray[currentString++] = CheckNullString(bccString);
|
||||
else if (msg->lpRecips[i].ulRecipClass == MAPI_CC)
|
||||
strArray[currentString++] = CheckNullString(ccString);
|
||||
else
|
||||
strArray[currentString++] = CheckNullString(toString);
|
||||
|
||||
strArray[currentString++] = CheckNullString(msg->lpRecips[i].lpszName);
|
||||
strArray[currentString++] = CheckNullString(msg->lpRecips[i].lpszAddress);
|
||||
}
|
||||
|
||||
BYTE szNewFileName[_MAX_PATH];
|
||||
|
||||
for (i=0; i<msg->nFileCount; i++)
|
||||
{
|
||||
char *namePtr;
|
||||
// have to copy/create temp files here of office won't work...
|
||||
|
||||
if (
|
||||
(msg->lpFiles[i].lpszFileName != NULL) &&
|
||||
(*msg->lpFiles[i].lpszFileName != '\0')
|
||||
)
|
||||
{
|
||||
namePtr = (char *)msg->lpFiles[i].lpszFileName;
|
||||
}
|
||||
else
|
||||
{
|
||||
namePtr = (char *)msg->lpFiles[i].lpszPathName;
|
||||
}
|
||||
|
||||
if (GetTempMailNameWithExtension((char *)szNewFileName, namePtr) == 0)
|
||||
{
|
||||
free(strArray);
|
||||
free(mailPtr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!XP_CopyFile((char *)msg->lpFiles[i].lpszPathName, (char *)szNewFileName, TRUE))
|
||||
{
|
||||
free(strArray);
|
||||
free(mailPtr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
strArray[currentString++] = CheckNullString((char *)szNewFileName);
|
||||
strArray[currentString++] = CheckNullString(msg->lpFiles[i].lpszFileName);
|
||||
|
||||
AddTempFile((LPSTR) szNewFileName);
|
||||
// strArray[currentString++] = CheckNullString(msg->lpFiles[i].lpszPathName);
|
||||
// strArray[currentString++] = CheckNullString(msg->lpFiles[i].lpszFileName);
|
||||
}
|
||||
|
||||
if (currentString != strCount)
|
||||
{
|
||||
TRACE("MAPI PROBLEM!!!!!! FlattenMAPIMessageStructure() currentString != strCount\n");
|
||||
}
|
||||
|
||||
strArray[strCount] = NULL; // terminate at the end
|
||||
NSstringSeq strSeq = NSStrSeqNew(strArray);
|
||||
if (!strSeq)
|
||||
{
|
||||
free(strArray);
|
||||
free(mailPtr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// Now we need to copy the structure into a big, contiguous chunk of memory
|
||||
//
|
||||
LONG totalArraySize = NSStrSeqSize(strSeq);
|
||||
LONG totalMemSize = sizeof(MAPISendMailType) + totalArraySize;
|
||||
|
||||
#ifdef WIN16
|
||||
if (totalMemSize > 64000)
|
||||
{
|
||||
free(strArray);
|
||||
NSStrSeqDelete(strSeq);
|
||||
free(mailPtr);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
MAPISendMailType *newMailPtr = (MAPISendMailType *)malloc((size_t)totalMemSize);
|
||||
if (!newMailPtr)
|
||||
{
|
||||
free(strArray);
|
||||
NSStrSeqDelete(strSeq);
|
||||
free(mailPtr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(newMailPtr, 0, (size_t) totalMemSize);
|
||||
//
|
||||
// Finally do the copy...
|
||||
//
|
||||
memcpy(newMailPtr, mailPtr, sizeof(MAPISendMailType));
|
||||
memcpy(newMailPtr->dataBuf, strSeq, (size_t) totalArraySize);
|
||||
*totalSize = totalMemSize;
|
||||
|
||||
//
|
||||
// Cleanup and scram...
|
||||
//
|
||||
if (strArray)
|
||||
free(strArray);
|
||||
|
||||
if (strSeq)
|
||||
NSStrSeqDelete(strSeq);
|
||||
|
||||
if (mailPtr)
|
||||
free(mailPtr);
|
||||
|
||||
return(newMailPtr);
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#ifndef __MY_MEM_HPP__
|
||||
#define __MY_MEM_HPP__
|
||||
|
||||
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
|
||||
#include <mapi.h>
|
||||
#endif
|
||||
|
||||
//
|
||||
// Needed for turning NULL's into ""'s for string sequence routines...
|
||||
//
|
||||
LPSTR CheckNullString(LPSTR inStr);
|
||||
|
||||
//
|
||||
// Memory allocation functions...
|
||||
//
|
||||
|
||||
//
|
||||
// This will free an lpMapiMessage structure allocated by this DLL
|
||||
//
|
||||
void FreeMAPIMessage(lpMapiMessage pv);
|
||||
|
||||
//
|
||||
// This will free an lpMapiRecipDesc structure allocated by this DLL
|
||||
//
|
||||
void FreeMAPIRecipient(lpMapiRecipDesc pv);
|
||||
|
||||
//
|
||||
// Frees a mapi file object...
|
||||
//
|
||||
void FreeMAPIFile(lpMapiFileDesc pv);
|
||||
|
||||
//
|
||||
// This routine will take an lpMapiMessage structure and "flatten" it into
|
||||
// one contiguous chunk of memory that can be easily passed around.
|
||||
//
|
||||
LPVOID FlattenMAPIMessageStructure(lpMapiMessage msg, DWORD *totalSize);
|
||||
|
||||
|
||||
|
||||
#endif // __MY_MEM_HPP__
|
||||
@@ -1,899 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// Various utils needed for the MAPI functions
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <time.h>
|
||||
#include <sys/stat.h>
|
||||
#include <io.h>
|
||||
#include "xpapi.h"
|
||||
#include "trace.h"
|
||||
#include "mapiipc.h"
|
||||
#include "mapiutl.h"
|
||||
|
||||
//
|
||||
// Global variables
|
||||
//
|
||||
BOOL gLoggingEnabled = FALSE;
|
||||
|
||||
void
|
||||
SetLoggingEnabled(BOOL val)
|
||||
{
|
||||
gLoggingEnabled = val;
|
||||
}
|
||||
|
||||
// Log File
|
||||
void
|
||||
LogString(LPCSTR pStr1)
|
||||
{
|
||||
// Off of the declaration line...
|
||||
LPCSTR pStr2 = NULL;
|
||||
BOOL useStr1 = TRUE;
|
||||
|
||||
if (gLoggingEnabled)
|
||||
{
|
||||
char tempPath[_MAX_PATH] = "";
|
||||
if (getenv("TEMP"))
|
||||
{
|
||||
lstrcpy((LPSTR) tempPath, getenv("TEMP")); // environmental variable
|
||||
}
|
||||
|
||||
int len = lstrlen(tempPath);
|
||||
if ((len > 1) && tempPath[len - 1] != '\\')
|
||||
{
|
||||
lstrcat(tempPath, "\\");
|
||||
}
|
||||
lstrcat(tempPath, szMapiLog);
|
||||
HFILE hFile = _lopen(tempPath, OF_WRITE);
|
||||
if (hFile == HFILE_ERROR)
|
||||
{
|
||||
hFile = _lcreat(tempPath, 0);
|
||||
}
|
||||
if (hFile != HFILE_ERROR)
|
||||
{
|
||||
_llseek(hFile, 0, SEEK_END); // seek to the end of the file
|
||||
LPCSTR pTemp = useStr1 ? pStr1 : pStr2;
|
||||
_lwrite(hFile, pTemp, lstrlen(pTemp));
|
||||
_lclose(hFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Find Communicator and return an HWND, if not, start Communicator,
|
||||
// then find an HWND
|
||||
//
|
||||
HWND
|
||||
GetCommunicatorIPCWindow(void)
|
||||
{
|
||||
HWND hWnd = NULL;
|
||||
DWORD timeCount = 0;
|
||||
BOOL launchTry = FALSE;
|
||||
|
||||
//
|
||||
// This will wait for 10 seconds before giving up and failing
|
||||
//
|
||||
while ((hWnd == NULL) && (timeCount < 20))
|
||||
{
|
||||
if ((hWnd = FindWindow("AfxFrameOrView", NULL)) && !FindWindow("aHiddenFrameClass", NULL))
|
||||
return(hWnd);
|
||||
else if ((hWnd = FindWindow("aHiddenFrameClass", NULL)))
|
||||
return(hWnd);
|
||||
|
||||
if (!launchTry)
|
||||
{
|
||||
char szPath[_MAX_PATH] = "";
|
||||
DWORD nMAPIERROR;
|
||||
|
||||
if ((nMAPIERROR = XP_GetInstallLocation(szPath, _MAX_PATH)) != SUCCESS_SUCCESS)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
WORD nReturn = XP_CallProcess(szPath, " -MAPICLIENT");
|
||||
launchTry = TRUE;
|
||||
}
|
||||
|
||||
//
|
||||
// Pause for 1/2 a second and try to connect again...
|
||||
//
|
||||
#ifdef WIN32
|
||||
Sleep(500);
|
||||
#else
|
||||
Yield();
|
||||
#endif
|
||||
|
||||
timeCount++;
|
||||
}
|
||||
|
||||
return(hWnd);
|
||||
}
|
||||
|
||||
void
|
||||
BuildMemName(LPSTR name, ULONG winSeed)
|
||||
{
|
||||
static DWORD id = 0;
|
||||
|
||||
if (id == 0)
|
||||
{
|
||||
// Seed the random-number generator with current time so that
|
||||
// the numbers will be different every time we run.
|
||||
srand( (unsigned)time( NULL ) );
|
||||
id = rand();
|
||||
}
|
||||
|
||||
wsprintf(name, "MAPI_IPC_SMEM-%d", (winSeed + id++));
|
||||
TRACE("Shared Memory Name = [%s]\n", name);
|
||||
}
|
||||
|
||||
DWORD
|
||||
ValidateFile(LPCSTR szFile)
|
||||
{
|
||||
struct _stat buf;
|
||||
int result;
|
||||
|
||||
result = _stat( szFile, &buf );
|
||||
if (result != 0)
|
||||
return(1);
|
||||
|
||||
if (!(buf.st_mode & S_IREAD))
|
||||
return(2);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
//
|
||||
// return of zero is ok
|
||||
// 1 = MAPI_E_ATTACHMENT_NOT_FOUND
|
||||
// 2 = MAPI_E_ATTACHMENT_OPEN_FAILURE
|
||||
//
|
||||
DWORD
|
||||
SanityCheckAttachmentFiles(lpMapiMessage lpMessage)
|
||||
{
|
||||
ULONG i;
|
||||
DWORD rc;
|
||||
|
||||
for (i=0; i<lpMessage->nFileCount; i++)
|
||||
{
|
||||
if ((rc = ValidateFile(lpMessage->lpFiles[i].lpszPathName)) != 0)
|
||||
{
|
||||
return(rc);
|
||||
}
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
DWORD
|
||||
GetFileCount(LPSTR pFiles, LPSTR delimChar)
|
||||
{
|
||||
DWORD count = 1;
|
||||
if ((!pFiles) || (!*pFiles))
|
||||
return(0);
|
||||
|
||||
for (DWORD i=0; i<strlen(pFiles); i++)
|
||||
{
|
||||
if (pFiles[i] == delimChar[0])
|
||||
{
|
||||
++count;
|
||||
}
|
||||
}
|
||||
|
||||
return(count);
|
||||
}
|
||||
|
||||
//
|
||||
// Extract a filename from a string
|
||||
// Return TRUE if file found, else FALSE
|
||||
//
|
||||
BOOL
|
||||
ExtractFile(LPSTR pFiles, LPSTR delimChar, DWORD fIndex, LPSTR fName)
|
||||
{
|
||||
LPSTR ptr = pFiles;
|
||||
DWORD loc;
|
||||
DWORD count = 0;
|
||||
|
||||
if ((!pFiles) || (!*pFiles))
|
||||
return(0);
|
||||
|
||||
// Get to the fIndex'th entry
|
||||
for (loc=0; loc<strlen(pFiles); loc++)
|
||||
{
|
||||
if (count == fIndex)
|
||||
break;
|
||||
if (pFiles[loc] == delimChar[0])
|
||||
count++;
|
||||
}
|
||||
|
||||
if (loc >= strlen(pFiles)) // Got to the end of string!
|
||||
return(FALSE);
|
||||
|
||||
lstrcpy(fName, (LPSTR)pFiles + loc);
|
||||
//
|
||||
// Truncate at 2nd delimiter
|
||||
//
|
||||
for (DWORD i=0; i<strlen(fName); i++)
|
||||
{
|
||||
if (fName[i] == delimChar[0])
|
||||
{
|
||||
fName[i] = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
ULONG
|
||||
GetFileSize(LPSTR fName)
|
||||
{
|
||||
struct _stat buf;
|
||||
int result;
|
||||
|
||||
result = _stat( fName, &buf );
|
||||
if (result != 0)
|
||||
return(0);
|
||||
|
||||
return(buf.st_size);
|
||||
}
|
||||
|
||||
LPVOID
|
||||
LoadBlobToMemory(LPSTR fName)
|
||||
{
|
||||
UCHAR *ptr = NULL;
|
||||
ULONG bufSize = GetFileSize(fName);
|
||||
|
||||
if (bufSize == 0)
|
||||
{
|
||||
_unlink(fName);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
ptr = (UCHAR *)malloc( (size_t) bufSize);
|
||||
if (!ptr)
|
||||
{
|
||||
_unlink(fName);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
HFILE hFile = _lopen(fName, OF_READ);
|
||||
if (hFile == HFILE_ERROR)
|
||||
{
|
||||
_unlink(fName);
|
||||
free(ptr);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
UINT numRead = _lread(hFile, ptr, (size_t) bufSize);
|
||||
_lclose(hFile);
|
||||
|
||||
if (numRead != bufSize)
|
||||
{
|
||||
_unlink(fName);
|
||||
free(ptr);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
_unlink(fName);
|
||||
return(ptr);
|
||||
}
|
||||
|
||||
LONG
|
||||
WriteMemoryBufferToDisk(LPSTR fName, LONG bufSize, LPSTR buf)
|
||||
{
|
||||
if (!buf)
|
||||
{
|
||||
return(-1);
|
||||
}
|
||||
|
||||
HFILE hFile = _lcreat(fName, 0);
|
||||
if (hFile == HFILE_ERROR)
|
||||
{
|
||||
return(-1);
|
||||
}
|
||||
|
||||
LONG writeCount = _lwrite(hFile, buf, (size_t) bufSize);
|
||||
_lclose(hFile);
|
||||
|
||||
if (writeCount != bufSize)
|
||||
{
|
||||
_unlink(fName);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
LPSTR
|
||||
GetTheTempDirectoryOnTheSystem(void)
|
||||
{
|
||||
static UCHAR retPath[_MAX_PATH];
|
||||
|
||||
if (getenv("TEMP"))
|
||||
{
|
||||
lstrcpy((LPSTR) retPath, getenv("TEMP")); // environmental variable
|
||||
}
|
||||
else if (getenv("TMP"))
|
||||
{
|
||||
lstrcpy((LPSTR) retPath, getenv("TMP")); // How about this environmental variable?
|
||||
}
|
||||
else
|
||||
{
|
||||
GetWindowsDirectory((LPSTR) retPath, sizeof(retPath));
|
||||
}
|
||||
|
||||
return((LPSTR) &(retPath[0]));
|
||||
}
|
||||
|
||||
#ifdef WIN16
|
||||
int WINAPI EXPORT ISGetTempFileName(LPCSTR a_pDummyPath, LPCSTR a_pPrefix, UINT a_uUnique, LPSTR a_pResultName)
|
||||
{
|
||||
#ifdef GetTempFileName // we need the real thing comming up next...
|
||||
#undef GetTempFileName
|
||||
#endif
|
||||
return GetTempFileName(0, a_pPrefix, a_uUnique, a_pResultName);
|
||||
}
|
||||
#endif
|
||||
|
||||
LONG
|
||||
GetTempAttachmentName(LPSTR fName)
|
||||
{
|
||||
UINT res;
|
||||
static UINT uUnique = 1;
|
||||
|
||||
if (!fName)
|
||||
return(-1);
|
||||
|
||||
LPSTR szTempPath = GetTheTempDirectoryOnTheSystem();
|
||||
|
||||
TRYAGAIN:
|
||||
#ifdef WIN32
|
||||
res = GetTempFileName(szTempPath, "MAPI", uUnique++, fName);
|
||||
#else
|
||||
res = ISGetTempFileName(szTempPath, "MAPI", uUnique++, fName);
|
||||
#endif
|
||||
|
||||
if (ValidateFile(fName) != 1)
|
||||
{
|
||||
if (uUnique < 32000)
|
||||
{
|
||||
goto TRYAGAIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// RICHIE - strip all of the HTML stuff out of the message...
|
||||
int
|
||||
CheckForInlineHTML(char *noteBody, DWORD len, DWORD *curPos, char *newBody, DWORD *realLen)
|
||||
{
|
||||
LPSTR tags[] = {" ", "<", "&", NULL};
|
||||
UCHAR tagsSubst[] = {' ', '<', '&', NULL};
|
||||
int x = 0;
|
||||
|
||||
while (tags[x])
|
||||
{
|
||||
// should we check for first tag
|
||||
if ( (*curPos+strlen(tags[x])) < len)
|
||||
{
|
||||
if (strncmp(tags[x], noteBody, strlen(tags[x])) == 0)
|
||||
{
|
||||
*curPos += strlen(tags[x]) - 1;
|
||||
newBody[*realLen] = tagsSubst[x];
|
||||
*realLen += 1;
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
|
||||
++x;
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
//
|
||||
// RICHIE - This is also temporary fix for now...
|
||||
//
|
||||
LPSTR
|
||||
StripSignedMessage(LPSTR noteText, DWORD totalCR)
|
||||
{
|
||||
char *newBuf;
|
||||
LPSTR startTag = "<HTML>";
|
||||
LPSTR endTag = "/HTML>";
|
||||
DWORD i;
|
||||
DWORD realLen = 0;
|
||||
DWORD startPos = 0;
|
||||
DWORD len = strlen(noteText);;
|
||||
|
||||
// create a new buffer...
|
||||
newBuf = (char *) malloc((size_t)(len + totalCR));
|
||||
if (!newBuf)
|
||||
return(noteText);
|
||||
|
||||
newBuf[0] = '\0';
|
||||
|
||||
// First, find the start of the HTML for the message...
|
||||
for (i=0; i<len; i++)
|
||||
{
|
||||
// should we check for first tag
|
||||
if ( (i+strlen(startTag)) < len)
|
||||
{
|
||||
if (strncmp(startTag, (noteText + i), strlen(startTag)) == 0)
|
||||
{
|
||||
startPos = i + strlen(startTag);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Didn't find any HTML start tag
|
||||
if (i == len)
|
||||
return(noteText);
|
||||
|
||||
BOOL inHTML = FALSE;
|
||||
BOOL firstChar = FALSE;
|
||||
|
||||
for (i=startPos; i<len; i++)
|
||||
{
|
||||
char *ptr = (noteText + i);
|
||||
|
||||
if ( ((*ptr == 0x0D) || (*ptr == 0x20)) && (!firstChar) )
|
||||
continue;
|
||||
else
|
||||
firstChar = TRUE;
|
||||
|
||||
// First, check for the end /HTML> tag
|
||||
if ( (i+strlen(endTag)) < len)
|
||||
{
|
||||
if (strncmp(endTag, ptr, strlen(endTag)) == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// If we are in HTML, check for a ">"...
|
||||
if (inHTML)
|
||||
{
|
||||
if (*ptr == '>')
|
||||
{
|
||||
inHTML = FALSE;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check for NEW HTML...
|
||||
if (*ptr == '<')
|
||||
{
|
||||
inHTML = TRUE;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (CheckForInlineHTML(ptr, len, &i, newBuf, &realLen))
|
||||
continue;
|
||||
|
||||
newBuf[realLen++] = *ptr;
|
||||
// Tack on a line feed if we hit a CR...
|
||||
if ( *ptr == 0x0D )
|
||||
{
|
||||
newBuf[realLen++] = 0x0A;
|
||||
}
|
||||
}
|
||||
|
||||
// terminate the buffer - reallocate and move on...
|
||||
newBuf[realLen++] = '\0';
|
||||
newBuf = (LPSTR) realloc(newBuf, (size_t) realLen);
|
||||
|
||||
// check if the realloc worked and if so, free old memory and
|
||||
// return...if not, just return the original buffer
|
||||
if (!newBuf)
|
||||
{
|
||||
return(noteText);
|
||||
}
|
||||
else
|
||||
{
|
||||
free(noteText);
|
||||
return(newBuf);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// RICHIE - this is a temporary fix for now to get rid of
|
||||
// html stuff within the text of a message - if there was a
|
||||
// valid noteText buffer coming into this call, we need to
|
||||
// free it on the way out.
|
||||
//
|
||||
LPSTR
|
||||
StripHTML(LPSTR noteText)
|
||||
{
|
||||
char *newBuf;
|
||||
LPSTR signTag = "This is a cryptographically signed message in MIME format.";
|
||||
LPSTR mimeTag = "This is a multi-part message in MIME format.";
|
||||
|
||||
DWORD i;
|
||||
DWORD realLen = 0;
|
||||
DWORD totalCR = 0;
|
||||
|
||||
// do sanity checking...
|
||||
if ((!noteText) || (!(*noteText)))
|
||||
return(noteText);
|
||||
|
||||
// more sanity checking...
|
||||
DWORD len = strlen(noteText) + 1;
|
||||
if (len <= 0)
|
||||
return(noteText);
|
||||
|
||||
// Get the number of CR's in this message and add room for
|
||||
// the LF's
|
||||
for (i=0; i<len; i++)
|
||||
{
|
||||
if ( (*(noteText + i)) == 0x0D )
|
||||
++totalCR;
|
||||
}
|
||||
|
||||
// This is a check for a signed message in the start of a message
|
||||
// check for sign line...
|
||||
if ( strlen(signTag) < len)
|
||||
{
|
||||
if (
|
||||
(strncmp(signTag, noteText, strlen(signTag)) == 0) ||
|
||||
(strncmp(mimeTag, noteText, strlen(mimeTag)) == 0)
|
||||
)
|
||||
{
|
||||
return( StripSignedMessage(noteText, totalCR) );
|
||||
}
|
||||
}
|
||||
|
||||
// create a new buffer...
|
||||
newBuf = (char *) malloc((size_t)(len + totalCR));
|
||||
if (!newBuf)
|
||||
return(noteText);
|
||||
|
||||
newBuf[0] = '\0';
|
||||
|
||||
BOOL firstChar = FALSE;
|
||||
|
||||
// Now do the translation for the body of the note...
|
||||
for (i=0; i<len; i++)
|
||||
{
|
||||
char *ptr = (noteText + i);
|
||||
|
||||
if ( ((*ptr == 0x0D) || (*ptr == 0x20)) && (!firstChar) )
|
||||
continue;
|
||||
else
|
||||
firstChar = TRUE;
|
||||
|
||||
if (CheckForInlineHTML(ptr, len, &i, newBuf, &realLen))
|
||||
continue;
|
||||
|
||||
newBuf[realLen++] = *ptr;
|
||||
if ( *ptr == 0x0D )
|
||||
{
|
||||
newBuf[realLen++] = 0x0A;
|
||||
}
|
||||
}
|
||||
|
||||
// terminate the buffer - reallocate and move on...
|
||||
newBuf[realLen++] = '\0';
|
||||
newBuf = (LPSTR) realloc(newBuf, (size_t) realLen);
|
||||
|
||||
// check if the realloc worked and if so, free old memory and
|
||||
// return...if not, just return the original buffer
|
||||
if (!newBuf)
|
||||
{
|
||||
return(noteText);
|
||||
}
|
||||
else
|
||||
{
|
||||
free(noteText);
|
||||
return(newBuf);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef WIN16
|
||||
|
||||
void
|
||||
GetWin16TempName(LPSTR realFileName, LPSTR tempPath,
|
||||
LPSTR szTempFileName, UINT uUnique)
|
||||
{
|
||||
char *dotPtr = strrchr(realFileName, '.');
|
||||
if (dotPtr != NULL)
|
||||
{
|
||||
*dotPtr = '\0';
|
||||
}
|
||||
|
||||
int nameLen = lstrlen(realFileName);
|
||||
if (dotPtr != NULL)
|
||||
{
|
||||
*dotPtr = '.';
|
||||
}
|
||||
|
||||
if (nameLen <= 7)
|
||||
{
|
||||
wsprintf(szTempFileName, "%s\\%d%s", tempPath, uUnique, realFileName);
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(szTempFileName, "%s\\%d%s", tempPath, uUnique, (realFileName + 1));
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#define MAXTRY 9999 // How many times do we try..
|
||||
|
||||
UINT
|
||||
GetTempMailNameWithExtension(LPSTR szTempFileName,
|
||||
LPSTR origName)
|
||||
{
|
||||
UINT res = 1;
|
||||
UINT uUnique = 0;
|
||||
char *szTempPath = GetTheTempDirectoryOnTheSystem();
|
||||
char *tmpPtr;
|
||||
char *realFileName = NULL;
|
||||
|
||||
if ( (origName != NULL) && (*origName != '\0') )
|
||||
{
|
||||
tmpPtr = origName;
|
||||
}
|
||||
else
|
||||
{
|
||||
tmpPtr = szTempFileName;
|
||||
}
|
||||
|
||||
realFileName = strrchr(tmpPtr, '\\');
|
||||
if (!realFileName)
|
||||
realFileName = tmpPtr;
|
||||
else
|
||||
realFileName++;
|
||||
|
||||
TRYAGAIN:
|
||||
|
||||
#ifdef WIN32
|
||||
if (uUnique == 0)
|
||||
{
|
||||
wsprintf(szTempFileName, "%s\\%s", szTempPath, realFileName);
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(szTempFileName, "%s\\%d_%s",
|
||||
szTempPath, uUnique, realFileName);
|
||||
}
|
||||
#else // WIN16
|
||||
if ( (uUnique == 0) && (strlen(realFileName) <= 12) )
|
||||
{
|
||||
wsprintf(szTempFileName, "%s\\%s", szTempPath, realFileName);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (uUnique < 10)
|
||||
{
|
||||
GetWin16TempName(realFileName, szTempPath, szTempFileName, uUnique);
|
||||
}
|
||||
else
|
||||
{
|
||||
res = ISGetTempFileName(szTempPath, "ns", uUnique++, szTempFileName);
|
||||
}
|
||||
|
||||
// Now add the correct extension...
|
||||
char *origExt = strrchr(realFileName, '.');
|
||||
if (origExt != NULL)
|
||||
{
|
||||
char *tmpExt = strrchr(szTempFileName, '.');
|
||||
if (tmpExt != NULL)
|
||||
{
|
||||
origExt++;
|
||||
tmpExt++;
|
||||
|
||||
while ( ((tmpExt) && (origExt)) && (*origExt != '\0') )
|
||||
{
|
||||
*tmpExt = *origExt;
|
||||
tmpExt++;
|
||||
origExt++;
|
||||
}
|
||||
|
||||
*tmpExt = '\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if ( (ValidateFile(szTempFileName) != 1) && (uUnique < MAXTRY) )
|
||||
{
|
||||
uUnique++;
|
||||
if (uUnique >= MAXTRY)
|
||||
return(1);
|
||||
goto TRYAGAIN;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
#define kMaxTempFiles 10
|
||||
#define kMaxListLength (10 * _MAX_PATH)
|
||||
|
||||
void GetTempFiles(LPSTR pBuf, int lenBuf)
|
||||
{
|
||||
if (!GetConfigInfoStr(szMapiSection, szTempFiles, pBuf, lenBuf, HKEY_ROOT))
|
||||
{
|
||||
*pBuf = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void WriteTempFiles(LPSTR pBuf)
|
||||
{
|
||||
SetConfigInfoStr(szMapiSection, szTempFiles, pBuf, HKEY_ROOT);
|
||||
}
|
||||
|
||||
void AddTempFile(LPCSTR pFileName)
|
||||
{
|
||||
if ( (!pFileName) || (pFileName[0] == '\0') )
|
||||
return;
|
||||
|
||||
char *files = (char *)malloc(kMaxListLength);
|
||||
|
||||
if (!files)
|
||||
return;
|
||||
|
||||
GetTempFiles(files, kMaxListLength);
|
||||
if ((lstrlen(files) + lstrlen(pFileName) + 2) >= kMaxListLength)
|
||||
{
|
||||
free(files);
|
||||
return;
|
||||
}
|
||||
|
||||
if (lstrlen(files) != 0)
|
||||
{
|
||||
lstrcat(files, ";");
|
||||
}
|
||||
|
||||
lstrcat(files, pFileName);
|
||||
WriteTempFiles(files);
|
||||
free(files);
|
||||
}
|
||||
|
||||
void DeleteFirstTempFile(LPSTR pFiles)
|
||||
{
|
||||
if (!*pFiles)
|
||||
return;
|
||||
LPSTR pTemp = strchr(pFiles, ';');
|
||||
if (pTemp)
|
||||
{
|
||||
*pTemp = 0;
|
||||
}
|
||||
|
||||
//#ifndef _DEBUG
|
||||
_unlink(pFiles);
|
||||
//#endif
|
||||
|
||||
if (pTemp)
|
||||
{
|
||||
memmove(pFiles, pTemp + 1, lstrlen(pTemp + 1) + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
*pFiles = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RemoveAllTempFiles(void)
|
||||
{
|
||||
char *files = (char *)malloc(kMaxListLength);
|
||||
|
||||
if (!files)
|
||||
return;
|
||||
|
||||
GetTempFiles(files, kMaxListLength);
|
||||
|
||||
while (*files)
|
||||
{
|
||||
DeleteFirstTempFile(files);
|
||||
}
|
||||
|
||||
WriteTempFiles(files);
|
||||
free(files);
|
||||
}
|
||||
|
||||
void CheckAgeTempFiles(void)
|
||||
{
|
||||
char *files = (char *)malloc(kMaxListLength);
|
||||
|
||||
if (!files)
|
||||
return;
|
||||
|
||||
GetTempFiles(files, kMaxListLength);
|
||||
int i = 0;
|
||||
LPSTR pTemp = files;
|
||||
while (TRUE)
|
||||
{
|
||||
pTemp = strchr(pTemp, ';');
|
||||
if (!pTemp)
|
||||
break;
|
||||
++pTemp;
|
||||
++i;
|
||||
}
|
||||
|
||||
if (i >= 10)
|
||||
{
|
||||
DeleteFirstTempFile(files);
|
||||
WriteTempFiles(files);
|
||||
}
|
||||
|
||||
free(files);
|
||||
}
|
||||
|
||||
void
|
||||
CleanupMAPITempFiles(void)
|
||||
{
|
||||
if (Is_16_OR_32_BIT_CommunitorRunning() == 0)
|
||||
{
|
||||
RemoveAllTempFiles(); // if Communicator not running, clean up all the temp files
|
||||
}
|
||||
else
|
||||
{
|
||||
CheckAgeTempFiles();
|
||||
}
|
||||
}
|
||||
|
||||
void *
|
||||
CleanMalloc(size_t mallocSize)
|
||||
{
|
||||
void *ptr = malloc(mallocSize);
|
||||
if (!ptr)
|
||||
return(NULL);
|
||||
|
||||
memset(ptr, 0, mallocSize);
|
||||
return(ptr);
|
||||
}
|
||||
|
||||
void
|
||||
SafeFree(void *ptr)
|
||||
{
|
||||
if (!ptr)
|
||||
return;
|
||||
|
||||
free(ptr);
|
||||
ptr = NULL;
|
||||
}
|
||||
@@ -1,89 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#ifndef __UTILS_
|
||||
#define __UTILS_
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
|
||||
#include <mapi.h>
|
||||
#endif
|
||||
|
||||
//
|
||||
// Utility functions...
|
||||
//
|
||||
void SetLoggingEnabled(BOOL val); // Set a logging enabled flag
|
||||
void LogString(LPCSTR pStr1); // Log a string to a file...
|
||||
void BuildMemName(LPSTR name, ULONG winSeed); // Shared memory name
|
||||
HWND GetCommunicatorIPCWindow(void); // Get the IPC window we will use...
|
||||
DWORD SanityCheckAttachmentFiles(lpMapiMessage lpMessage); // Check attachments
|
||||
DWORD ValidateFile(LPCSTR szFile); // Is this a valid file - 0=Yes 1 = NOT_FOUND 2 = OPEN_FAILURE
|
||||
|
||||
DWORD GetFileCount(LPSTR pFiles, LPSTR delimChar); // Get File count from string of file1;file2, etc..
|
||||
BOOL ExtractFile(LPSTR pFiles, LPSTR delimChar, DWORD fIndex, LPSTR fName); // Extract a filename from a string
|
||||
|
||||
LPVOID LoadBlobToMemory(LPSTR fName); // Load the blob into memory!
|
||||
LONG GetTempAttachmentName(LPSTR fName); // Get a temp file name and put it in fName
|
||||
|
||||
UINT GetTempMailNameWithExtension(LPSTR szTempFileName, LPSTR origName);
|
||||
void CleanupMAPITempFiles(void);
|
||||
void AddTempFile(LPCSTR pFileName);
|
||||
|
||||
void *CleanMalloc(size_t mallocSize);
|
||||
void SafeFree(void *ptr);
|
||||
|
||||
//
|
||||
// RICHIE - this is a temporary fix for now to get rid of
|
||||
// html stuff within the text of a message - if there was a
|
||||
// valid noteText buffer coming into this call, we need to
|
||||
// free it on the way out.
|
||||
//
|
||||
LPSTR StripHTML(LPSTR noteText);
|
||||
|
||||
//
|
||||
// Write a buffer to disk
|
||||
// Return 0 on success -1 on failure
|
||||
//
|
||||
LONG WriteMemoryBufferToDisk(LPSTR fName, LONG bufSize, LPSTR buf);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __UTILS_
|
||||
@@ -1,303 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
|
||||
#ifndef PORT_H
|
||||
#define PORT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*****************************************************************\
|
||||
* *
|
||||
* PORT.H *
|
||||
* *
|
||||
* Win16/Win32 portability stuff *
|
||||
* *
|
||||
* A.Sokolsky *
|
||||
* 3.10.94 distilled into this header *
|
||||
* *
|
||||
\*****************************************************************/
|
||||
|
||||
/*
|
||||
* calling conventions
|
||||
*/
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
#ifndef CDECL
|
||||
#define CDECL __cdecl
|
||||
#endif // CDECL
|
||||
|
||||
#ifndef PASCAL
|
||||
#define PASCAL __pascal
|
||||
#endif // PASCAL
|
||||
|
||||
#ifdef FASTCALL
|
||||
#error FASTCALL defined
|
||||
#endif // FASTCALL
|
||||
|
||||
|
||||
#ifdef NDEBUG
|
||||
#define FASTCALL __fastcall
|
||||
#else
|
||||
#define FASTCALL PASCAL
|
||||
#endif // NDEBUG
|
||||
|
||||
|
||||
|
||||
#ifndef HWND2DWORD
|
||||
# ifdef WIN32
|
||||
# define HWND2DWORD(X_hWnd) ( (DWORD)(X_hWnd) )
|
||||
# else // WIN16
|
||||
# define HWND2DWORD(X_hWnd) ( (DWORD)MAKELONG(((WORD)(X_hWnd)), 0) )
|
||||
# endif
|
||||
#endif // HWND2DWORD
|
||||
|
||||
|
||||
/*
|
||||
* WIN16 - WIN32 compatibility stuff
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
# define DLLEXPORT __declspec( dllexport )
|
||||
# define EXPORT
|
||||
# define LOADDS
|
||||
# define HUGE
|
||||
# ifndef FAR
|
||||
# define FAR
|
||||
# endif // FAR
|
||||
# ifndef NEAR
|
||||
# define NEAR
|
||||
# endif // NEAR
|
||||
# ifdef UNICODE
|
||||
# define SIZEOF(x) (sizeof(x)/sizeof(WCHAR))
|
||||
# else
|
||||
# define SIZEOF(x) sizeof(x)
|
||||
# endif
|
||||
|
||||
#else // !WIN32 == WIN16
|
||||
|
||||
# define DLLEXPORT
|
||||
# define EXPORT __export
|
||||
# define LOADDS __loadds
|
||||
# define HUGE __huge
|
||||
# ifndef FAR
|
||||
# define FAR __far
|
||||
# define NEAR __near
|
||||
# endif // FAR
|
||||
# define CONST const
|
||||
# define SIZEOF(x) sizeof(x)
|
||||
# define CHAR char
|
||||
# define TCHAR char
|
||||
# define WCHAR char
|
||||
# ifndef LPTSTR
|
||||
# define LPTSTR LPSTR
|
||||
# endif
|
||||
# ifndef LPCTSTR
|
||||
# define LPCTSTR LPCSTR
|
||||
# endif
|
||||
# define UNREFERENCED_PARAMETER(x) x;
|
||||
# ifndef TEXT
|
||||
# define TEXT(x) x
|
||||
# endif
|
||||
# define GetWindowTextW GetWindowText
|
||||
# define lstrcpyW lstrcpy
|
||||
|
||||
# define BN_DBLCLK BN_DOUBLECLICKED // ~~MRJ needed for custom control.
|
||||
// ~~MRJ begin Win95 backward compat section
|
||||
# define LPWSTR LPSTR
|
||||
# define LPCWSTR LPCSTR
|
||||
|
||||
// button check state for WIN16
|
||||
#ifndef BST_UNCHECKED
|
||||
#define BST_UNCHECKED 0x0000
|
||||
#endif
|
||||
|
||||
#ifndef BST_CHECKED
|
||||
#define BST_CHECKED 0x0001
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef WIN95_COMPAT
|
||||
# define WIN95_COMPAT
|
||||
#endif
|
||||
|
||||
// ~~MRJ end Win95 compat section.
|
||||
|
||||
// critical section API stubs
|
||||
typedef DWORD CRITICAL_SECTION;
|
||||
typedef CRITICAL_SECTION FAR * LPCRITICAL_SECTION;
|
||||
#ifdef __cplusplus
|
||||
inline void InitializeCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
inline void DeleteCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
inline void EnterCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
inline void LeaveCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
#endif // __cplusplus
|
||||
|
||||
// Added for nssock16 ---Neeti
|
||||
#ifndef ZeroMemory
|
||||
#include <memory.h>
|
||||
#define ZeroMemory(PTR, SIZE) memset(PTR, 0, SIZE)
|
||||
#endif // ZeroMemory
|
||||
|
||||
#endif // WIN16
|
||||
|
||||
/*
|
||||
* unix - windows compatibility stuff
|
||||
*/
|
||||
typedef DWORD u_int32;
|
||||
typedef WORD u_int16;
|
||||
typedef BYTE u_int8;
|
||||
#ifdef WIN32
|
||||
typedef short int Bool16;
|
||||
#else // WIN16
|
||||
typedef BOOL Bool16;
|
||||
#endif // WIN16
|
||||
|
||||
/*
|
||||
* Cross Platform Compatibility
|
||||
*/
|
||||
#ifndef UNALIGNED
|
||||
# ifdef _M_ALPHA
|
||||
# define UNALIGNED __unaligned
|
||||
# else // !_M_ALPHA
|
||||
# define UNALIGNED
|
||||
# endif // !_M_ALPHA
|
||||
#endif // UNALIGNED
|
||||
|
||||
//
|
||||
// RICHIE - for the Alpha port
|
||||
//
|
||||
#ifdef _M_ALPHA
|
||||
# undef pascal
|
||||
# undef PASCAL
|
||||
# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
|
||||
# define pascal __stdcall
|
||||
# define PASCAL __stdcall
|
||||
# else
|
||||
# define PASCAL
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Useful Types
|
||||
*/
|
||||
typedef char HUGE *HPSTR;
|
||||
typedef const char HUGE *HPCSTR;
|
||||
typedef unsigned char HUGE *HPBYTE;
|
||||
typedef WORD HUGE *HPWORD;
|
||||
typedef UINT FAR *LPUINT;
|
||||
typedef BOOL (CALLBACK *USERABORTPROC)();
|
||||
typedef BOOL (CALLBACK *PROGRESSPROC)(UINT uPos, UINT uRange);
|
||||
typedef int INT; // ~~MRJ a function needed this defined.
|
||||
typedef MINMAXINFO FAR *LPMINMAXINFO; // ~~MRJ
|
||||
|
||||
//
|
||||
// stuff missing from windows.h
|
||||
//
|
||||
#ifndef MAKEWORD
|
||||
#define MAKEWORD(low, high) ((WORD)(((BYTE)(low)) | (((WORD)((BYTE)(high))) << 8)))
|
||||
#endif // MAKEWORD
|
||||
|
||||
#ifdef WIN32
|
||||
# ifndef hmemcpy
|
||||
# define hmemcpy memcpy
|
||||
# endif // !defined(hmemcpy)
|
||||
# define _fmemset memset
|
||||
|
||||
# include <malloc.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
inline BOOL IsGDIObject(HGDIOBJ hObj) { return (hObj != 0); }
|
||||
inline void *_halloc(long num, unsigned int size) { return malloc(num * size); }
|
||||
inline void _hfree( void *memblock ) { free(memblock); }
|
||||
/*
|
||||
inline BOOL IsInstance(HINSTANCE hInst) {
|
||||
# ifdef WIN32
|
||||
return (hInst != 0);
|
||||
# else // WIN16
|
||||
return (hInst > HINSTANCE_ERROR);
|
||||
# endif
|
||||
}
|
||||
*/
|
||||
|
||||
#endif // __cplusplus
|
||||
|
||||
WINUSERAPI HANDLE WINAPI LoadImageA(HINSTANCE, LPCSTR, UINT, int, int, UINT);
|
||||
|
||||
#endif // WIN32
|
||||
|
||||
#ifdef __cplusplus
|
||||
inline BOOL IsInstance(HINSTANCE hInst) {
|
||||
# ifdef WIN32
|
||||
return (hInst != 0);
|
||||
# else // WIN16
|
||||
return (hInst > HINSTANCE_ERROR);
|
||||
# endif
|
||||
}
|
||||
inline void SetWindowSmallIcon(HINSTANCE hInst, HWND hWnd, UINT uIconResourceId) {
|
||||
#ifdef WIN32
|
||||
# ifndef WM_SETICON
|
||||
# define WM_SETICON 0x0080
|
||||
# endif // WM_SETICON
|
||||
# ifndef IMAGE_ICON
|
||||
# define IMAGE_ICON 1
|
||||
# endif
|
||||
assert(IsWindow(hWnd));
|
||||
HICON hIcon = (HICON)LoadImageA(hInst, MAKEINTRESOURCE(uIconResourceId), IMAGE_ICON,
|
||||
16, 16, 0);
|
||||
if(NULL != hIcon) {
|
||||
SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);
|
||||
} else {
|
||||
HICON hIcon = LoadIcon(hInst, MAKEINTRESOURCE(uIconResourceId));
|
||||
assert(hIcon != 0);
|
||||
SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);
|
||||
}
|
||||
#endif // WIN32
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* PORT_H */
|
||||
@@ -1,54 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by mapi32.rc
|
||||
//
|
||||
#define ID_DIALOG_QAHOOK 101
|
||||
#define ID_DIALOG_MAPI 101
|
||||
#define ID_ICON_APP 102
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 103
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1000
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
||||
@@ -1,172 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// smem.cpp - This deals with all shared memory functions needed for
|
||||
// the MAPI component of Communicator
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
|
||||
#include "mapismem.h"
|
||||
|
||||
#ifndef ZeroMemory
|
||||
#include <memory.h>
|
||||
#define ZeroMemory(PTR, SIZE) memset(PTR, 0, SIZE)
|
||||
#endif // ZeroMemory
|
||||
|
||||
//
|
||||
// *create new* shared memory chunk
|
||||
// once this is created, use the pointer
|
||||
// to the segment to to store data
|
||||
// e.g.:
|
||||
// lpString = "string for communicator";
|
||||
// lstrcpy((LPSTR)pData->m_buf[0], lpString);
|
||||
//
|
||||
CSharedMem *
|
||||
NSCreateSharedMemory(DWORD memSize, LPCTSTR memName, HANDLE *hSharedMemory)
|
||||
{
|
||||
#ifdef WIN32
|
||||
|
||||
BOOL bExistedBefore;
|
||||
CSharedMem *pData;
|
||||
|
||||
LPCTSTR szObjectName = memName;
|
||||
DWORD dwSize = sizeof(CSharedMem) + memSize;
|
||||
*hSharedMemory = CreateFileMapping(
|
||||
(HANDLE)0xFFFFFFFF,0,PAGE_READWRITE,0,dwSize,szObjectName);
|
||||
if(*hSharedMemory == 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
bExistedBefore = (GetLastError() == ERROR_ALREADY_EXISTS);
|
||||
if(bExistedBefore)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pData = (CSharedMem *)MapViewOfFile(
|
||||
*hSharedMemory, FILE_MAP_ALL_ACCESS, 0, 0, 0);
|
||||
if(pData == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZeroMemory(pData, dwSize);
|
||||
pData->m_dwSize = memSize;
|
||||
|
||||
return pData;
|
||||
#else
|
||||
CSharedMem *sMemChunk = NULL;
|
||||
DWORD dwSize = memSize = (sizeof(CSharedMem) + memSize);
|
||||
|
||||
if (sMemChunk != NULL)
|
||||
return(sMemChunk);
|
||||
|
||||
sMemChunk = (CSharedMem *) GlobalAllocPtr(GMEM_MOVEABLE, dwSize);
|
||||
ZeroMemory(sMemChunk, (size_t) dwSize);
|
||||
sMemChunk->m_dwSize = dwSize; // Missing in Communicator code!
|
||||
return(sMemChunk);
|
||||
|
||||
#endif // WIN32
|
||||
}
|
||||
|
||||
//
|
||||
// *open existing* shared memory chunk
|
||||
// once you have the pointer to the new segment
|
||||
// use this pointer to access data, e.g.:
|
||||
//
|
||||
CSharedMem *
|
||||
NSOpenExistingSharedMemory(LPCTSTR memName, HANDLE *hSharedMemory)
|
||||
{
|
||||
#ifdef WIN32
|
||||
CSharedMem *pData;
|
||||
DWORD dwSize;
|
||||
|
||||
LPCTSTR szObjectName = memName;
|
||||
*hSharedMemory = OpenFileMapping(
|
||||
PAGE_READWRITE,FALSE,szObjectName);
|
||||
if(*hSharedMemory == 0)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pData = (CSharedMem *)MapViewOfFile(
|
||||
*hSharedMemory,FILE_MAP_ALL_ACCESS,0,0,0);
|
||||
if(pData == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dwSize = pData->m_dwSize;
|
||||
return pData;
|
||||
#else
|
||||
|
||||
return(NULL); // In Win16, this is really meaningless...
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
//
|
||||
// to close shared memory segment
|
||||
//
|
||||
void
|
||||
NSCloseSharedMemory(CSharedMem *pData, HANDLE hSharedMemory)
|
||||
{
|
||||
#ifdef WIN32
|
||||
if(pData != 0)
|
||||
{
|
||||
UnmapViewOfFile(pData);
|
||||
pData = 0;
|
||||
}
|
||||
|
||||
if(hSharedMemory != 0)
|
||||
{
|
||||
CloseHandle(hSharedMemory);
|
||||
hSharedMemory = 0;
|
||||
}
|
||||
#else
|
||||
|
||||
if (pData != NULL)
|
||||
{
|
||||
GlobalFreePtr(pData);
|
||||
pData = NULL;
|
||||
}
|
||||
|
||||
#endif // WIN32
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <tchar.h>
|
||||
#include "trace.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
|
||||
#ifndef WIN16
|
||||
void CDECL AfxTrace(LPCTSTR lpszFormat, ...)
|
||||
#else
|
||||
void CDECL AfxTrace(LPCSTR lpszFormat, ...)
|
||||
#endif
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, lpszFormat);
|
||||
|
||||
int nBuf;
|
||||
TCHAR szBuffer[512];
|
||||
|
||||
nBuf = _vstprintf(szBuffer, lpszFormat, args);
|
||||
va_end(args);
|
||||
OutputDebugString(szBuffer);
|
||||
return;
|
||||
}
|
||||
|
||||
BOOL AfxAssertFailedLine(LPCSTR lpszFileName, int nLine)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,81 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
#include <windows.h>
|
||||
|
||||
#ifdef _DEBUG
|
||||
BOOL AfxAssertFailedLine(LPCSTR lpszFileName, int nLine);
|
||||
|
||||
#ifndef WIN16
|
||||
void CDECL AfxTrace(LPCTSTR lpszFormat, ...);
|
||||
#else
|
||||
void CDECL AfxTrace(LPCSTR lpszFormat, ...);
|
||||
#endif
|
||||
|
||||
#define TRACE ::AfxTrace
|
||||
#define THIS_FILE __FILE__
|
||||
#define ASSERT(f) \
|
||||
do \
|
||||
{ \
|
||||
if (!(f) && AfxAssertFailedLine(THIS_FILE, __LINE__)) \
|
||||
AfxDebugBreak(); \
|
||||
} while (0) \
|
||||
|
||||
#define VERIFY(f) ASSERT(f)
|
||||
#define TRACE_FN(name) LogFn __logFn(name)
|
||||
class LogFn
|
||||
{
|
||||
public:
|
||||
LogFn(LPCSTR pFnName) {m_pFnName = pFnName; TRACE("--%s: In--\n", pFnName);}
|
||||
~LogFn() {TRACE("--%s: Out--\n", m_pFnName);}
|
||||
private:
|
||||
LPCSTR m_pFnName;
|
||||
};
|
||||
#else
|
||||
// NDEBUG
|
||||
#define ASSERT(f) ((void)0)
|
||||
#define VERIFY(f) ((void)(f))
|
||||
#define ASSERT_VALID(pOb) ((void)0)
|
||||
#define DEBUG_ONLY(f) ((void)0)
|
||||
#ifdef WIN32
|
||||
inline void CDECL AfxTrace(LPCTSTR, ...) { }
|
||||
#else
|
||||
inline void CDECL AfxTrace(LPCSTR, ...) { }
|
||||
#endif
|
||||
#define TRACE 1 ? (void)0 : ::AfxTrace
|
||||
#define TRACE_FN(name)
|
||||
#endif // _DEBUG
|
||||
|
||||
@@ -1,347 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// XPAPI.CPP
|
||||
// API implementation file for mapi16.dll and mapi32.dll
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include "xpapi.h"
|
||||
#include "mapiutl.h"
|
||||
|
||||
WORD LOAD_DS XP_CallProcess(LPCSTR pPath, LPCSTR pCmdLine)
|
||||
{
|
||||
WORD wReturn = 0;
|
||||
#ifndef WIN16
|
||||
STARTUPINFO startupInfo;
|
||||
PROCESS_INFORMATION processInfo;
|
||||
|
||||
memset(&startupInfo, 0, sizeof(startupInfo));
|
||||
startupInfo.cb = sizeof(startupInfo);
|
||||
if (wReturn = CreateProcess(pPath, (LPTSTR)pCmdLine, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_PROCESS_GROUP, NULL, NULL, &startupInfo, &processInfo))
|
||||
{
|
||||
WaitForInputIdle(processInfo.hProcess, 120000);
|
||||
}
|
||||
#else
|
||||
// char szMsg[80];
|
||||
char szExecute[512];
|
||||
lstrcpy(szExecute, pPath);
|
||||
lstrcat(szExecute, " ");
|
||||
lstrcat(szExecute, pCmdLine);
|
||||
wReturn = WinExec(szExecute,SW_SHOW);
|
||||
|
||||
if (wReturn < 32)
|
||||
{
|
||||
wReturn = 0;
|
||||
}
|
||||
#endif
|
||||
return wReturn;
|
||||
}
|
||||
|
||||
HKEY LOAD_DS RegOpenParent(LPCSTR pSection, HKEY hRootKey, REGSAM access)
|
||||
{
|
||||
HKEY hKey;
|
||||
#ifndef WIN16
|
||||
if (RegOpenKeyEx(hRootKey, pSection, 0, access, &hKey) != ERROR_SUCCESS)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
#else
|
||||
if (RegOpenKey(hRootKey, pSection, &hKey) != ERROR_SUCCESS)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
#endif
|
||||
return(hKey);
|
||||
}
|
||||
|
||||
HKEY LOAD_DS RegCreateParent(LPCSTR pSection, HKEY hMasterKey)
|
||||
{
|
||||
HKEY hKey;
|
||||
if (RegCreateKey(hMasterKey, pSection, &hKey) != ERROR_SUCCESS)
|
||||
{
|
||||
return(NULL);
|
||||
}
|
||||
return(hKey);
|
||||
}
|
||||
|
||||
BOOL LOAD_DS GetConfigInfoStr(LPCSTR pSection, LPCSTR pKey, LPSTR pBuf, int lenBuf, HKEY hMasterKey)
|
||||
{
|
||||
HKEY hKey;
|
||||
hKey = RegOpenParent(pSection, hMasterKey, KEY_QUERY_VALUE);
|
||||
if (!hKey)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
DWORD len = (DWORD)lenBuf;
|
||||
#ifndef WIN16
|
||||
BOOL retVal = (RegQueryValueEx(hKey, pKey, NULL, NULL, (LPBYTE)pBuf, &len) == ERROR_SUCCESS);
|
||||
#else
|
||||
BOOL retVal = (RegQueryValue(hKey, pKey, pBuf, (long far*)&len) == ERROR_SUCCESS);
|
||||
#endif
|
||||
RegCloseKey(hKey);
|
||||
return(retVal);
|
||||
}
|
||||
|
||||
BOOL LOAD_DS GetConfigInfoNum(LPCSTR pSection, LPCSTR pKey, DWORD* pVal, HKEY hMasterKey)
|
||||
{
|
||||
HKEY hKey;
|
||||
hKey = RegOpenParent(pSection, hMasterKey, KEY_QUERY_VALUE);
|
||||
if (!hKey)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
DWORD len = sizeof(DWORD);
|
||||
#ifndef WIN16
|
||||
BOOL retVal = (RegQueryValueEx(hKey, pKey, NULL, NULL, (LPBYTE)pVal, &len) == ERROR_SUCCESS);
|
||||
#else
|
||||
BOOL retVal = (RegQueryValue(hKey, pKey, (char far*)pVal, (long far*)&len) == ERROR_SUCCESS);
|
||||
#endif
|
||||
RegCloseKey(hKey);
|
||||
return(retVal);
|
||||
}
|
||||
|
||||
BOOL LOAD_DS SetConfigInfoStr(LPCSTR pSection, LPCSTR pKey, LPSTR pStr, HKEY hMasterKey)
|
||||
{
|
||||
HKEY hKey;
|
||||
hKey = RegCreateParent(pSection, hMasterKey);
|
||||
if (!hKey)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
#ifndef WIN16
|
||||
BOOL retVal = (RegSetValueEx(hKey, pKey, 0, REG_SZ, (LPBYTE)pStr, lstrlen(pStr) + 1) == ERROR_SUCCESS);
|
||||
#else
|
||||
BOOL retVal = (RegSetValue(hKey, pKey, REG_SZ, pStr, lstrlen(pStr) + 1) == ERROR_SUCCESS);
|
||||
#endif
|
||||
RegCloseKey(hKey);
|
||||
return(retVal);
|
||||
}
|
||||
|
||||
|
||||
BOOL LOAD_DS XP_GetInstallDirectory(LPCSTR pcurVersionSection, LPCSTR pInstallDirKey, LPSTR path, UINT nSize, HKEY hKey)
|
||||
{
|
||||
#ifdef WIN32
|
||||
if (!GetConfigInfoStr(pcurVersionSection, pInstallDirKey, path, nSize, hKey))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
#else
|
||||
if ( 0 < GetPrivateProfileString(pcurVersionSection, pInstallDirKey,"ERROR", path, nSize, szNetscapeINI))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
BOOL LOAD_DS XP_GetVersionInfoString(LPCSTR pNavigatorSection, LPCSTR pCurrentVersionKey, LPSTR pcurVersionStr, UINT nSize, HKEY hKey)
|
||||
{
|
||||
#ifdef WIN32
|
||||
if (!GetConfigInfoStr(pNavigatorSection, pCurrentVersionKey, pcurVersionStr, nSize, HKEY_LOCAL_MACHINE))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
#else
|
||||
if ( 0 < GetPrivateProfileString(pNavigatorSection, pCurrentVersionKey,"ERROR", pcurVersionStr, nSize, szNetscapeINI))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
DWORD LOAD_DS XP_GetInstallLocation(LPSTR pPath, UINT nSize)
|
||||
{
|
||||
char curVersionStr[256];
|
||||
char curVersionSection[256];
|
||||
|
||||
if (!pPath)
|
||||
return MAPI_E_LOGON_FAILURE;
|
||||
|
||||
#ifdef WIN32
|
||||
if (!XP_GetVersionInfoString(szNavigatorSection, szCurrentVersionKey, curVersionStr,
|
||||
sizeof(curVersionStr), HKEY_LOCAL_MACHINE))
|
||||
{
|
||||
return (MAPI_E_LOGON_FAILURE);
|
||||
}
|
||||
|
||||
wsprintf(curVersionSection, szNavigatorCurVersionSection, curVersionStr);
|
||||
|
||||
if (!XP_GetInstallDirectory(curVersionSection, szInstallDirKey, pPath,
|
||||
nSize, HKEY_LOCAL_MACHINE))
|
||||
{
|
||||
return (MAPI_E_ACCESS_DENIED);
|
||||
|
||||
}
|
||||
|
||||
lstrcat(pPath, "\\");
|
||||
lstrcat(pPath, "Program\\netscape.exe");
|
||||
|
||||
return SUCCESS_SUCCESS;
|
||||
#else
|
||||
if (32 == Is_16_OR_32_BIT_CommunitorRunning())
|
||||
{
|
||||
if (!GetConfigInfoStr("snews\\shell\\open", "command", curVersionStr, sizeof(curVersionStr), HKEY_CLASSES_ROOT))
|
||||
{
|
||||
return (MAPI_E_ACCESS_DENIED);
|
||||
}
|
||||
else
|
||||
{
|
||||
char *pFind = strstr(curVersionStr,"-h");
|
||||
|
||||
if (pFind)
|
||||
{
|
||||
*pFind=0;
|
||||
lstrcpy(pPath,curVersionStr);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (MAPI_E_ACCESS_DENIED);
|
||||
}
|
||||
}
|
||||
|
||||
return SUCCESS_SUCCESS;
|
||||
}
|
||||
else //setup up to start navstart since we are a sixteen bit DLL.
|
||||
{
|
||||
if (!XP_GetVersionInfoString(szNavigatorSection, szCurrentVersionKey, curVersionStr, sizeof(curVersionStr), HKEY_LOCAL_MACHINE))
|
||||
{
|
||||
return (MAPI_E_LOGON_FAILURE);
|
||||
}
|
||||
|
||||
wsprintf(curVersionSection, szNavigatorCurVersionSection, curVersionStr);
|
||||
|
||||
if (!XP_GetInstallDirectory(curVersionSection, szInstallDirKey, pPath,nSize, HKEY_LOCAL_MACHINE))
|
||||
{
|
||||
return (MAPI_E_ACCESS_DENIED);
|
||||
}
|
||||
|
||||
lstrcat(pPath, "\\");
|
||||
lstrcat(pPath, "NAVSTART.EXE");
|
||||
return SUCCESS_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int LOAD_DS Is_16_OR_32_BIT_CommunitorRunning()
|
||||
{
|
||||
if (FindWindow("AfxFrameOrView", NULL) && !FindWindow("aHiddenFrameClass", NULL))
|
||||
return(16);
|
||||
else if (FindWindow("aHiddenFrameClass", NULL))
|
||||
return(32);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
// size of buffer to use for copying files.
|
||||
#define COPYBUFSIZE 1024
|
||||
|
||||
#ifdef WIN16
|
||||
|
||||
BOOL Win16CopyFile(LPCSTR a_Src, LPCSTR a_Dest, BOOL a_bOverwrite)
|
||||
{
|
||||
OFSTRUCT ofSrc, ofDest;
|
||||
HFILE hSrc, hDest;
|
||||
BOOL bResult;
|
||||
|
||||
ofDest.cBytes = ofSrc.cBytes = sizeof(OFSTRUCT);
|
||||
hDest = OpenFile(a_Dest, &ofDest, OF_EXIST);
|
||||
if (hDest != HFILE_ERROR && !a_bOverwrite)
|
||||
bResult = FALSE; // file exists but caller doesn't want file overwritten
|
||||
else { // file either doesn't exist, or caller wants it overwritten.
|
||||
hSrc = OpenFile(a_Src, &ofSrc, OF_READ);
|
||||
hDest = OpenFile(a_Dest, &ofDest, OF_WRITE | OF_CREATE);
|
||||
if (hSrc != HFILE_ERROR && hDest != HFILE_ERROR) {
|
||||
unsigned char buf[COPYBUFSIZE];
|
||||
UINT bufsize = COPYBUFSIZE;
|
||||
UINT bytesread;
|
||||
|
||||
bResult = TRUE;
|
||||
while (0 != (bytesread = _lread(hSrc, (LPVOID)buf, bufsize))) {
|
||||
if ((bytesread == HFILE_ERROR) || // check for read error...
|
||||
// and write error
|
||||
(bytesread != _lwrite(hDest, (LPVOID)buf, bytesread))) {
|
||||
bResult = FALSE; // could be out of diskspace
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
bResult = FALSE;
|
||||
|
||||
if (hSrc != HFILE_ERROR)
|
||||
_lclose(hSrc);
|
||||
if (hDest != HFILE_ERROR)
|
||||
_lclose(hDest);
|
||||
}
|
||||
|
||||
return bResult;
|
||||
}
|
||||
|
||||
#endif // WIN16
|
||||
|
||||
BOOL LOAD_DS
|
||||
XP_CopyFile(LPCSTR lpExistingFile, LPCSTR lpNewFile, BOOL bFailifExist)
|
||||
{
|
||||
#ifdef WIN32
|
||||
return CopyFile(lpExistingFile, lpNewFile, bFailifExist);
|
||||
#else
|
||||
return Win16CopyFile(lpExistingFile, lpNewFile, TRUE);
|
||||
#endif
|
||||
}
|
||||
@@ -1,138 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// Various routines for MAPI functions.
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
// November 1997
|
||||
//
|
||||
#ifndef __XPAPI_H
|
||||
#define __XPAPI_H
|
||||
|
||||
#ifdef WIN16
|
||||
|
||||
#include <string.h>
|
||||
#include <direct.h>
|
||||
#include <shellapi.h>
|
||||
#include <stdlib.h>
|
||||
#else
|
||||
#include <winreg.h>
|
||||
#endif
|
||||
|
||||
#ifdef WIN16
|
||||
extern "C" {
|
||||
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
|
||||
#include <mapi.h>
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
//#include <mapi.h>
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#define MAPI_IMPLEMENT(param) param PASCAL
|
||||
#define LOAD_DS
|
||||
#else
|
||||
#define LOAD_DS __loadds
|
||||
#define MAPI_IMPLEMENT(param) extern "C" param FAR PASCAL
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef WIN16
|
||||
#define _MAX_PATH 260 /* max. length of full pathname*/
|
||||
#define MAPI_E_LOGON_FAILURE 3
|
||||
#define MAPI_E_ACCESS_DENIED 6
|
||||
#define INVALID_HANDLE_VALUE (HANDLE)-1
|
||||
#define KEY_QUERY_VALUE 0x0001
|
||||
#define HKEY_LOCAL_MACHINE ((HKEY)0x80000002)
|
||||
#define HKEY_ROOT HKEY_CLASSES_ROOT
|
||||
#else
|
||||
#define HKEY_ROOT ((HKEY)0x80000002)
|
||||
#endif
|
||||
|
||||
//
|
||||
// registry keys
|
||||
//
|
||||
#ifdef WIN32
|
||||
static char szNavigatorSection[] = "Software\\Netscape\\Netscape Navigator";
|
||||
static char szNavigatorCurVersionSection[] = "Software\\Netscape\\Netscape Navigator\\%s\\Main";
|
||||
static char szCurrentVersionKey[] = "CurrentVersion";
|
||||
static char szInstallDirKey[] = "Install Directory";
|
||||
static char szMapiSection[] = "Software\\Netscape\\Netscape Navigator\\MAPI";
|
||||
static char szTempFiles[] = "TempFiles";
|
||||
static char szMapiLog[] = "NSMAPI32.LOG";
|
||||
#else
|
||||
//32 bit key strings for trying to read the 32bit registry
|
||||
static char szNavigatorSection32[] = "Software\\Netscape\\Netscape Navigator";
|
||||
static char szNavigatorCurVersionSection32[] = "Software\\Netscape\\Netscape Navigator\\%s\\Main";
|
||||
static char szMapiSection32[] = "Software\\Netscape\\Netscape Navigator\\MAPI";
|
||||
|
||||
// ini section and key strings
|
||||
static char szNetscapeINI[] = "nscp.ini";
|
||||
static char szNavigatorSection[] = "Netscape Navigator";
|
||||
static char szNavigatorCurVersionSection[] = "Netscape Navigator-%s";
|
||||
static char szCurrentVersionKey[] = "CurrentVersion";
|
||||
static char szInstallDirKey[] = "Install Directory";
|
||||
static char szMapiSection[] = "MAPI";
|
||||
static char szTempFiles[] = "TempFiles";
|
||||
static char szExeName[] = "NAVSTART.EXE";
|
||||
static char szMapiLog[] = "NSMAPI16.LOG";
|
||||
#endif
|
||||
|
||||
//Since REGSAM is just an ACCESS_MASK which is just a DWORD and it's not
|
||||
//declared in win16 we'll make one hear for the purpose of keeping parameters
|
||||
//the same even though the access rights don't get used for win16.
|
||||
|
||||
typedef DWORD REGSAM;
|
||||
|
||||
|
||||
// XP declarations
|
||||
|
||||
int LOAD_DS Is_16_OR_32_BIT_CommunitorRunning();
|
||||
WORD LOAD_DS XP_CallProcess(LPCSTR pPath, LPCSTR pCmdLine);
|
||||
HKEY LOAD_DS RegOpenParent(LPCSTR pSection, HKEY hRootKey, REGSAM access);
|
||||
HKEY LOAD_DS RegCreateParent(LPCSTR pSection, HKEY hMasterKey);
|
||||
BOOL LOAD_DS GetConfigInfoStr(LPCSTR pSection, LPCSTR pKey, LPSTR pBuf, int lenBuf, HKEY hMasterKey);
|
||||
BOOL LOAD_DS GetConfigInfoNum(LPCSTR pSection, LPCSTR pKey, DWORD* pVal, HKEY hMasterKey);
|
||||
BOOL LOAD_DS SetConfigInfoStr(LPCSTR pSection, LPCSTR pKey, LPSTR pStr, HKEY hMasterKey);
|
||||
|
||||
BOOL LOAD_DS XP_GetInstallDirectory(LPCSTR pcurVersionSection, LPCSTR pInstallDirKey, LPSTR path, UINT nSize, HKEY hKey);
|
||||
BOOL LOAD_DS XP_GetVersionInfoString(LPCSTR pNavigatorSection, LPCSTR pCurrentVersionKey, LPSTR pcurVersionStr, UINT nSize, HKEY hKey);
|
||||
DWORD LOAD_DS XP_GetInstallLocation(LPSTR pPath, UINT nSize);
|
||||
BOOL LOAD_DS XP_CopyFile(LPCSTR lpExistingFile, LPCSTR lpNewFile, BOOL bFailifExist);
|
||||
|
||||
#endif // __XPAPI_H
|
||||
@@ -1,351 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
// This is a header file for the MAPI support within
|
||||
// Communicator.
|
||||
//
|
||||
// Written by: Rich Pizzarro (rhp@netscape.com)
|
||||
//
|
||||
#ifndef _NSCPMAPI
|
||||
#define _NSCPMAPI
|
||||
|
||||
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
|
||||
#include <mapi.h> // for MAPI specific types...
|
||||
#endif
|
||||
|
||||
#ifdef WIN16
|
||||
typedef unsigned char UCHAR;
|
||||
#endif
|
||||
|
||||
|
||||
#define MAX_NAME_LEN 256
|
||||
#define MAX_PW_LEN 256
|
||||
#define MAX_MSGINFO_LEN 512
|
||||
#define MAX_CON 4 // Maximum MAPI session supported
|
||||
#define MAX_POINTERS 32
|
||||
|
||||
//
|
||||
// The MAPI class that will act as the internal mechanism for
|
||||
// Communicator to control multiple MAPI sessions.
|
||||
//
|
||||
class CMAPIConnection
|
||||
{
|
||||
protected:
|
||||
LONG m_ID;
|
||||
BOOL m_defaultConnection;
|
||||
LONG m_sessionCount;
|
||||
LONG m_messageIndex;
|
||||
LPVOID m_cookie;
|
||||
UCHAR m_messageFindInfo[MAX_MSGINFO_LEN];
|
||||
UCHAR m_profileName[MAX_NAME_LEN];
|
||||
UCHAR m_password[MAX_PW_LEN];
|
||||
|
||||
// Methods
|
||||
|
||||
public:
|
||||
CMAPIConnection ( LONG, LPSTR, LPSTR );
|
||||
~CMAPIConnection ( );
|
||||
|
||||
// ID related methods
|
||||
LONG GetID( ) { return m_ID; } ;
|
||||
|
||||
// Dealing with the default session...
|
||||
BOOL IsDefault( ) { return m_defaultConnection; } ;
|
||||
void SetDefault( BOOL flag ) { m_defaultConnection = flag; } ;
|
||||
|
||||
// For handling multiple sessions on a profile name...
|
||||
LONG GetSessionCount( ) { return m_sessionCount; } ;
|
||||
void IncrementSessionCount() { ++m_sessionCount; } ;
|
||||
void DecrementSessionCount() { --m_sessionCount; } ;
|
||||
|
||||
// Information retrieval stuff...
|
||||
LPSTR GetProfileName( ) { return (LPSTR) m_profileName; };
|
||||
LPSTR GetPassword( ) { return (LPSTR) m_password; };
|
||||
|
||||
// Dealing with message information...
|
||||
void SetMessageIndex( LONG mIndex ) { m_messageIndex = mIndex; } ;
|
||||
LONG GetMessageIndex( ) { return m_messageIndex; };
|
||||
|
||||
void SetMessageFindInfo( LPSTR info ) { lstrcpy((LPSTR)m_messageFindInfo, info); } ;
|
||||
LPSTR GetMessageFindInfo( ) { return (LPSTR) m_messageFindInfo; };
|
||||
|
||||
// For enumerating Messages...
|
||||
void SetMapiListContext( LPVOID cookie) { m_cookie = cookie; } ;
|
||||
LPVOID GetMapiListContext( ) { return m_cookie; };
|
||||
};
|
||||
|
||||
//
|
||||
// Defines needed for requests being made with the WM_COPYDATA call...
|
||||
//
|
||||
typedef enum {
|
||||
NSCP_MAPIStartRequestID = 0,
|
||||
NSCP_MAPILogon,
|
||||
NSCP_MAPILogoff,
|
||||
NSCP_MAPIFree,
|
||||
NSCP_MAPISendMail,
|
||||
NSCP_MAPISendDocuments,
|
||||
NSCP_MAPIFindNext,
|
||||
NSCP_MAPIReadMail,
|
||||
NSCP_MAPISaveMail,
|
||||
NSCP_MAPIDeleteMail,
|
||||
NSCP_MAPIAddress,
|
||||
NSCP_MAPIDetails,
|
||||
NSCP_MAPIResolveName,
|
||||
NSCP_MAPIEndRequestID // Note: this is a marker for MAPI IPC requests
|
||||
} NSCP_IPC_REQUEST;
|
||||
|
||||
//
|
||||
// This is to keep track of the pointers allocated in the MAPI DLL
|
||||
// and deal with them correctly.
|
||||
//
|
||||
#define MAPI_MESSAGE_TYPE 0
|
||||
#define MAPI_RECIPIENT_TYPE 1
|
||||
|
||||
typedef struct {
|
||||
LPVOID lpMem;
|
||||
UCHAR memType;
|
||||
} memTrackerType;
|
||||
|
||||
//
|
||||
// This is the generic message that WM_COPYDATA will send to the
|
||||
// Communicator product to allow it to attach to shared memory.
|
||||
// NOTE: On Win16, this will simply reference a pointer.
|
||||
//
|
||||
typedef struct {
|
||||
UCHAR smemName[64]; // Name of shared memory
|
||||
DWORD smemSize; // Size of shared memory
|
||||
LPVOID lpsmem; // Will be really used in Win16 only
|
||||
} MAPIIPCType;
|
||||
|
||||
//
|
||||
// These are message specific structures that will be used for
|
||||
// the various MAPI operations.
|
||||
//
|
||||
typedef struct {
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
LHANDLE lhSession;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
// LPSTR strSequence, // LPSTR lpszProfileName, LPSTR lpszPassword
|
||||
// This is here to document the fact there will be a string sequence at
|
||||
// this location
|
||||
} MAPILogonType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
} MAPILogoffType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
// The following is the "FLAT" representation of the (lpMapiMessage lpMessage)
|
||||
// argument of this structure
|
||||
FLAGS MSG_flFlags; // unread,return receipt
|
||||
ULONG MSG_nRecipCount; // Number of recipients
|
||||
ULONG MSG_nFileCount; // # of file attachments
|
||||
ULONG MSG_ORIG_ulRecipClass; // Recipient class - MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG
|
||||
BYTE dataBuf[1]; // For easy referencing
|
||||
//
|
||||
// This is where it gets CONFUSING...the following buffer of memory is a
|
||||
// contiguous chunk of memory for various strings that are part of this
|
||||
// multilevel structure. For any of the following structure, any numbers
|
||||
// are represented by strings that will have to be converted back to numeric
|
||||
// values with atoi() calls.
|
||||
|
||||
// String 0: LPSTR lpszSubject; // Message Subject
|
||||
// String 1: LPSTR lpszNoteText FILE NAME; // Message Text will be
|
||||
// stored into a temp file and this will be the pointer to that file.
|
||||
// String 2: LPSTR lpszDateReceived; // in YYYY/MM/DD HH:MM format
|
||||
// String 3: LPSTR lpszConversationID; // conversation thread ID
|
||||
//
|
||||
// The following are for the originator of the message. Only ONE of these.
|
||||
//
|
||||
// String 4: LPSTR lpszName; // Originator name
|
||||
// String 5: LPSTR lpszAddress; // Originator address (optional)
|
||||
//
|
||||
// The following strings are for the recipients for this message. There are
|
||||
// MSG_nRecipCount of these in a row:
|
||||
//
|
||||
// for (i=0; i<MSG_nRecipCount; i++)
|
||||
// String x: LPSTR lpszRecipClass (ULONG) // Recipient class - MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG
|
||||
// String x: LPSTR lpszName; // Recipient N name
|
||||
// String x: LPSTR lpszAddress; // Recipient N address (optional)
|
||||
//
|
||||
// Now, finally, add the attachments for this beast. There are MSG_nFileCount
|
||||
// attachments so it would look like the following:
|
||||
//
|
||||
// for (i=0; i<MSG_nFileCount; i++)
|
||||
//
|
||||
// String x: LPSTR lpszPathName // Fully qualified path of the attached file.
|
||||
// // This path should include the disk drive letter and directory name.
|
||||
// String x: LPSTR lpszFileName // The display name for the attached file
|
||||
//
|
||||
} MAPISendMailType;
|
||||
|
||||
typedef struct {
|
||||
ULONG ulUIParam;
|
||||
ULONG nFileCount;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
BYTE dataBuf[1]; // For easy referencing
|
||||
//
|
||||
// The sequence of strings to follow are groups of PathName/FileName couples.
|
||||
// The strings will be parsed in MAPI[32].DLL and then put into this format:
|
||||
//
|
||||
// for (i=0; i<nFileCount; i++)
|
||||
//
|
||||
// String x: LPSTR lpszPathName // Fully qualified path of the attached file.
|
||||
// // This path should include the disk drive letter and directory name.
|
||||
// String x: LPSTR lpszFileName // The display name for the attached file
|
||||
} MAPISendDocumentsType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
UCHAR lpszSeedMessageID[MAX_MSGINFO_LEN];
|
||||
UCHAR lpszMessageID[MAX_MSGINFO_LEN];
|
||||
} MAPIFindNextType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
UCHAR lpszMessageID[MAX_MSGINFO_LEN];
|
||||
} MAPIDeleteMailType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
UCHAR lpszName[MAX_NAME_LEN];
|
||||
// These are returned by Communicator
|
||||
UCHAR lpszABookID[MAX_NAME_LEN];
|
||||
UCHAR lpszABookName[MAX_NAME_LEN];
|
||||
UCHAR lpszABookAddress[MAX_NAME_LEN];
|
||||
} MAPIResolveNameType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
UCHAR lpszABookID[MAX_NAME_LEN];
|
||||
} MAPIDetailsType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
UCHAR lpszMessageID[MAX_MSGINFO_LEN];
|
||||
//
|
||||
// The following is the "FLAT" representation of the (lpMapiMessage lpMessage)
|
||||
// argument of this structure
|
||||
//
|
||||
FLAGS MSG_flFlags; // unread, return or receipt
|
||||
ULONG MSG_nRecipCount; // Number of recipients
|
||||
ULONG MSG_nFileCount; // # of file attachments
|
||||
ULONG MSG_ORIG_ulRecipClass; // Recipient class - MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG
|
||||
//
|
||||
// Output parameter for blob of information that will live on disk.
|
||||
//
|
||||
UCHAR lpszBlob[MAX_MSGINFO_LEN]; // file name on disk
|
||||
//
|
||||
// The format of this blob of information will be:
|
||||
//
|
||||
// String 0: LPSTR lpszSubject; // Message Subject
|
||||
// String 1: LPSTR lpszNoteText FILE NAME; // Message Text will be
|
||||
// stored into a temp file and this will be the pointer to that file.
|
||||
// String 2: LPSTR lpszDateReceived; // in YYYY/MM/DD HH:MM format
|
||||
// String 3: LPSTR lpszConversationID; // conversation thread ID
|
||||
//
|
||||
// The following are for the originator of the message. Only ONE of these.
|
||||
//
|
||||
// String 4: LPSTR lpszName; // Originator name
|
||||
// String 5: LPSTR lpszAddress; // Originator address (optional)
|
||||
//
|
||||
// The following strings are for the recipients for this message. There are
|
||||
// MSG_nRecipCount of these in a row:
|
||||
//
|
||||
// for (i=0; i<MSG_nRecipCount; i++)
|
||||
// String x: LPSTR lpszName; // Recipient N name
|
||||
// String x: LPSTR lpszAddress; // Recipient N address (optional)
|
||||
// String x: LPSTR lpszRecipClass // recipient class - sprintf of ULONG
|
||||
//
|
||||
// Now, finally, add the attachments for this beast. There are MSG_nFileCount
|
||||
// attachments so it would look like the following:
|
||||
//
|
||||
// for (i=0; i<MSG_nFileCount; i++)
|
||||
//
|
||||
// String x: LPSTR lpszPathName // Fully qualified path of the attached file.
|
||||
// // This path should include the disk drive letter and directory name.
|
||||
// String x: LPSTR lpszFileName // The display name for the attached file
|
||||
//
|
||||
} MAPIReadMailType;
|
||||
|
||||
typedef struct {
|
||||
LHANDLE lhSession;
|
||||
ULONG ulUIParam;
|
||||
FLAGS flFlags;
|
||||
UCHAR lpszCaption[MAX_MSGINFO_LEN];
|
||||
DWORD ipcWorked; // Necessary for IPC check with Communicator
|
||||
// The following is the "FLAT" representation of the (lpMapiRecipDesc lpRecips)
|
||||
// argument of this structure
|
||||
ULONG nRecips; // number of recips to start with...
|
||||
ULONG nNewRecips; // number of recips returned...
|
||||
UCHAR lpszBlob[MAX_MSGINFO_LEN]; // file name for blob of information
|
||||
// that will live on disk.
|
||||
BYTE dataBuf[1]; // For easy referencing
|
||||
//
|
||||
// The following contiguous chunk of memory is the buffer that holds
|
||||
// the recipients to load into the address picker...
|
||||
//
|
||||
// for (i=0; i<MSG_nRecipCount; i++)
|
||||
// String x: LPSTR lpszRecipClass (ULONG) // Recipient class - MAPI_TO, MAPI_CC, MAPI_BCC, MAPI_ORIG
|
||||
// String x: LPSTR lpszName; // Recipient N name
|
||||
// String x: LPSTR lpszAddress; // Recipient N address (optional)
|
||||
//
|
||||
} MAPIAddressType;
|
||||
|
||||
#endif // _NSCPMAPI
|
||||
@@ -1,239 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
|
||||
#include <mapi.h>
|
||||
#endif
|
||||
|
||||
#include "port.h"
|
||||
#include "resource.h"
|
||||
|
||||
#ifndef WM_PAINTICON
|
||||
#define WM_PAINTICON 0x26
|
||||
#endif // WM_PAINTICON
|
||||
|
||||
/*
|
||||
* Forward Declarations...
|
||||
*/
|
||||
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
|
||||
BOOL CALLBACK LOADDS MyDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
|
||||
extern void ProcessCommand(HWND hWnd, int id, HWND hCtl, UINT codeNotify);
|
||||
BOOL OpenMAPI(void);
|
||||
void CloseMAPI(void);
|
||||
|
||||
/*
|
||||
* Global variables
|
||||
*/
|
||||
HINSTANCE hInst;
|
||||
HWND hWnd;
|
||||
|
||||
#ifdef WIN16
|
||||
HICON hIconApp;
|
||||
#endif
|
||||
|
||||
char NEAR szAppName[] = "Netscape QA Helper";
|
||||
char NEAR szShortAppName[] = "QAHelper";
|
||||
char szClassName[] = "Netscape_QAHelper_Class_Name";
|
||||
|
||||
void
|
||||
AppCleanup(void)
|
||||
{
|
||||
extern void DoMAPILogoff(HWND hWnd);
|
||||
static BOOL isDone = FALSE;
|
||||
|
||||
if (isDone)
|
||||
return;
|
||||
|
||||
extern LHANDLE mapiSession;
|
||||
|
||||
if (mapiSession != 0)
|
||||
{
|
||||
DoMAPILogoff(hWnd);
|
||||
}
|
||||
|
||||
CloseMAPI();
|
||||
isDone = TRUE;
|
||||
}
|
||||
|
||||
BOOL
|
||||
InitInstance(HINSTANCE hInstance, int nCmdShow)
|
||||
{
|
||||
/* Create a main window for this application instance. */
|
||||
hWnd = CreateDialog((HINSTANCE) hInstance,
|
||||
MAKEINTRESOURCE(ID_DIALOG),
|
||||
(HWND) NULL, (DLGPROC) MyDlgProc);
|
||||
|
||||
if (!hWnd)
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL InitApp(void)
|
||||
{
|
||||
#ifndef WIN16
|
||||
WNDCLASS wc;
|
||||
wc.style = 0;
|
||||
wc.lpfnWndProc = DefDlgProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = DLGWINDOWEXTRA;
|
||||
wc.hInstance = hInst;
|
||||
wc.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_APP));
|
||||
wc.hCursor = LoadCursor(0, IDC_ARROW);
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = szClassName;
|
||||
|
||||
if(!RegisterClass(&wc))
|
||||
return FALSE;
|
||||
|
||||
#else
|
||||
hIconApp = LoadIcon(hInst, MAKEINTRESOURCE(ID_ICON_APP));
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
} // end InitApp
|
||||
|
||||
// Win Main
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
|
||||
{
|
||||
MSG msg;
|
||||
|
||||
hInst = hInstance;
|
||||
|
||||
if (!InitApp())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!InitInstance(hInstance, nCmdShow))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!OpenMAPI())
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ShowWindow(hWnd, SW_SHOW);
|
||||
|
||||
// Start the application
|
||||
while ((GetMessage(&msg, (HWND) NULL, (UINT) NULL, (UINT) NULL)))
|
||||
{
|
||||
if(IsDialogMessage(hWnd, &msg))
|
||||
continue;
|
||||
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
return(msg.wParam);
|
||||
}
|
||||
|
||||
BOOL CALLBACK LOADDS
|
||||
MyDlgProc(HWND hWndMain, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (wMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
hWnd = hWndMain;
|
||||
SetDlgItemText(hWnd, ID_EDIT_ROW, "0");
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_CLOSE:
|
||||
{
|
||||
DestroyWindow(hWnd);
|
||||
break;
|
||||
}
|
||||
|
||||
case WM_DESTROY:
|
||||
{
|
||||
AppCleanup();
|
||||
|
||||
#ifndef WIN16
|
||||
UnregisterClass(szClassName, hInst);
|
||||
#else
|
||||
// Destroy the 16 bit windows icon
|
||||
if(hIconApp != 0)
|
||||
DestroyIcon(hIconApp);
|
||||
#endif
|
||||
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
}
|
||||
case WM_COMMAND:
|
||||
HANDLE_WM_COMMAND(hWnd, wParam, lParam, ProcessCommand);
|
||||
break;
|
||||
|
||||
case WM_QUERYDRAGICON:
|
||||
#ifdef WIN16
|
||||
return (BOOL)hIconApp;
|
||||
#endif
|
||||
|
||||
case WM_PAINTICON:
|
||||
#ifdef WIN16
|
||||
SetClassWord(hWnd, GCW_HICON, 0);
|
||||
|
||||
// fall trough
|
||||
case WM_PAINT:
|
||||
{
|
||||
if(!IsIconic(hWnd))
|
||||
return FALSE;
|
||||
PAINTSTRUCT ps;
|
||||
HDC hDC = BeginPaint(hWnd, &ps);
|
||||
SetMapMode(hDC, MM_TEXT);
|
||||
DrawIcon(hDC, 2, 2, hIconApp);
|
||||
EndPaint(hWnd, &ps);
|
||||
break;
|
||||
}
|
||||
#endif //WIN16
|
||||
break; // RICHIE - if this is not here NT 3.51 Pukes!!!!
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//~~av return (DefWindowProc(hWnd, wMsg, wParam, lParam));
|
||||
return TRUE;
|
||||
}
|
||||
@@ -1,240 +0,0 @@
|
||||
# Microsoft Developer Studio Generated NMAKE File, Based on mapitest.dsp
|
||||
!IF "$(CFG)" == ""
|
||||
CFG=mapitest - Win32 Debug
|
||||
!MESSAGE No configuration specified. Defaulting to mapitest - Win32 Debug.
|
||||
!ENDIF
|
||||
|
||||
!IF "$(CFG)" != "mapitest - Win32 Release" && "$(CFG)" != "mapitest - Win32 Debug"
|
||||
!MESSAGE Invalid configuration "$(CFG)" specified.
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "mapitest.mak" CFG="mapitest - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "mapitest - Win32 Release" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "mapitest - Win32 Debug" (based on "Win32 (x86) Application")
|
||||
!MESSAGE
|
||||
!ERROR An invalid configuration is specified.
|
||||
!ENDIF
|
||||
|
||||
!IF "$(OS)" == "Windows_NT"
|
||||
NULL=
|
||||
!ELSE
|
||||
NULL=nul
|
||||
!ENDIF
|
||||
|
||||
!IF "$(CFG)" == "mapitest - Win32 Release"
|
||||
|
||||
OUTDIR=.\Release
|
||||
INTDIR=.\Release
|
||||
# Begin Custom Macros
|
||||
OutDir=.\Release
|
||||
# End Custom Macros
|
||||
|
||||
ALL : "$(OUTDIR)\mapitest.exe"
|
||||
|
||||
export :
|
||||
libs :
|
||||
install :
|
||||
|
||||
clobber_all : clobber
|
||||
|
||||
clobber:
|
||||
-@erase "$(INTDIR)\main.obj"
|
||||
-@erase "$(INTDIR)\mapimail.obj"
|
||||
-@erase "$(INTDIR)\mapiproc.obj"
|
||||
-@erase "$(INTDIR)\mtest32.res"
|
||||
-@erase "$(INTDIR)\readmail.obj"
|
||||
-@erase "$(INTDIR)\vc60.idb"
|
||||
-@erase "$(OUTDIR)\mapitest.exe"
|
||||
-@erase "$(OUTDIR)\mapitest.pch"
|
||||
|
||||
"$(OUTDIR)" :
|
||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
||||
|
||||
CPP=cl.exe
|
||||
CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"$(INTDIR)\mapitest.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
|
||||
|
||||
.c{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.c{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
MTL=midl.exe
|
||||
MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
RSC=rc.exe
|
||||
RSC_PROJ=/l 0x409 /fo"$(INTDIR)\mtest32.res" /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\mapitest.bsc"
|
||||
BSC32_SBRS= \
|
||||
|
||||
LINK32=link.exe
|
||||
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:no /pdb:"$(OUTDIR)\mapitest.pdb" /machine:I386 /out:"$(OUTDIR)\mapitest.exe"
|
||||
LINK32_OBJS= \
|
||||
"$(INTDIR)\main.obj" \
|
||||
"$(INTDIR)\mapimail.obj" \
|
||||
"$(INTDIR)\mapiproc.obj" \
|
||||
"$(INTDIR)\readmail.obj" \
|
||||
"$(INTDIR)\mtest32.res"
|
||||
|
||||
"$(OUTDIR)\mapitest.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
|
||||
$(LINK32) @<<
|
||||
$(LINK32_FLAGS) $(LINK32_OBJS)
|
||||
<<
|
||||
|
||||
!ELSEIF "$(CFG)" == "mapitest - Win32 Debug"
|
||||
|
||||
OUTDIR=.\Debug
|
||||
INTDIR=.\Debug
|
||||
# Begin Custom Macros
|
||||
OutDir=.\Debug
|
||||
# End Custom Macros
|
||||
|
||||
ALL : "$(OUTDIR)\mapitest.exe"
|
||||
|
||||
export :
|
||||
libs :
|
||||
install :
|
||||
|
||||
clobber_all : clobber
|
||||
|
||||
clobber :
|
||||
-@erase "$(INTDIR)\main.obj"
|
||||
-@erase "$(INTDIR)\mapimail.obj"
|
||||
-@erase "$(INTDIR)\mapiproc.obj"
|
||||
-@erase "$(INTDIR)\mtest32.res"
|
||||
-@erase "$(INTDIR)\readmail.obj"
|
||||
-@erase "$(INTDIR)\vc60.idb"
|
||||
-@erase "$(INTDIR)\vc60.pdb"
|
||||
-@erase "$(OUTDIR)\mapitest.exe"
|
||||
-@erase "$(OUTDIR)\mapitest.ilk"
|
||||
-@erase "$(OUTDIR)\mapitest.pdb"
|
||||
-@erase "$(OUTDIR)\mapitest.pch"
|
||||
|
||||
"$(OUTDIR)" :
|
||||
if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
|
||||
|
||||
CPP=cl.exe
|
||||
CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"$(INTDIR)\mapitest.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
|
||||
|
||||
.c{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.obj::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.c{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cpp{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
.cxx{$(INTDIR)}.sbr::
|
||||
$(CPP) @<<
|
||||
$(CPP_PROJ) $<
|
||||
<<
|
||||
|
||||
MTL=midl.exe
|
||||
MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
RSC=rc.exe
|
||||
RSC_PROJ=/l 0x409 /fo"$(INTDIR)\mtest32.res" /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
BSC32_FLAGS=/nologo /o"$(OUTDIR)\mapitest.bsc"
|
||||
BSC32_SBRS= \
|
||||
|
||||
LINK32=link.exe
|
||||
LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\mapitest.pdb" /debug /machine:I386 /out:"$(OUTDIR)\mapitest.exe" /pdbtype:sept
|
||||
LINK32_OBJS= \
|
||||
"$(INTDIR)\main.obj" \
|
||||
"$(INTDIR)\mapimail.obj" \
|
||||
"$(INTDIR)\mapiproc.obj" \
|
||||
"$(INTDIR)\readmail.obj" \
|
||||
"$(INTDIR)\mtest32.res"
|
||||
|
||||
"$(OUTDIR)\mapitest.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
|
||||
$(LINK32) @<<
|
||||
$(LINK32_FLAGS) $(LINK32_OBJS)
|
||||
<<
|
||||
|
||||
!ENDIF
|
||||
|
||||
|
||||
!IF "$(NO_EXTERNAL_DEPS)" != "1"
|
||||
!IF EXISTS("mapitest.dep")
|
||||
!INCLUDE "mapitest.dep"
|
||||
!ELSE
|
||||
!MESSAGE Warning: cannot find "mapitest.dep"
|
||||
!ENDIF
|
||||
!ENDIF
|
||||
|
||||
|
||||
!IF "$(CFG)" == "mapitest - Win32 Release" || "$(CFG)" == "mapitest - Win32 Debug"
|
||||
SOURCE=.\main.cpp
|
||||
|
||||
"$(INTDIR)\main.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
SOURCE=.\mapimail.cpp
|
||||
|
||||
"$(INTDIR)\mapimail.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
SOURCE=.\mapiproc.cpp
|
||||
|
||||
"$(INTDIR)\mapiproc.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
SOURCE=.\mtest32.rc
|
||||
|
||||
"$(INTDIR)\mtest32.res" : $(SOURCE) "$(INTDIR)"
|
||||
$(RSC) $(RSC_PROJ) $(SOURCE)
|
||||
|
||||
|
||||
SOURCE=.\readmail.cpp
|
||||
|
||||
"$(INTDIR)\readmail.obj" : $(SOURCE) "$(INTDIR)"
|
||||
|
||||
|
||||
|
||||
!ENDIF
|
||||
|
||||
@@ -1,772 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
#include <string.h>
|
||||
#include <mapi.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "port.h"
|
||||
#include "resource.h"
|
||||
|
||||
//
|
||||
// Variables...
|
||||
//
|
||||
extern HINSTANCE m_hInstMapi;
|
||||
extern LHANDLE mapiSession;
|
||||
|
||||
//
|
||||
// Forward declarations...
|
||||
//
|
||||
void DoMAPIFreeBuffer(HWND hWnd, LPVOID buf, BOOL alert);
|
||||
extern void ShowMessage(HWND hWnd, LPSTR msg);
|
||||
void DoMAPISendMail(HWND hWnd);
|
||||
void DoMAPISendDocuments(HWND hWnd);
|
||||
void DoMAPISaveMail(HWND hWnd);
|
||||
void DoMAPIAddress(HWND hWnd);
|
||||
extern void SetFooter(LPSTR msg);
|
||||
extern LPSTR GetMAPIError(LONG errorCode);
|
||||
|
||||
void
|
||||
ProcessMailCommand(HWND hWnd, int id, HWND hCtl, UINT codeNotify)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case IDCANCEL:
|
||||
EndDialog(hWnd, 0);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_MAPISENDMAIL:
|
||||
DoMAPISendMail(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_MAPISENDDOCUMENTS:
|
||||
DoMAPISendDocuments(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_MAPISAVEMAIL:
|
||||
DoMAPISaveMail(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_MAPIADDRESS:
|
||||
DoMAPIAddress(hWnd);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL CALLBACK LOADDS
|
||||
MailDlgProc(HWND hWndMain, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (wMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
HANDLE_WM_COMMAND(hWndMain, wParam, lParam, ProcessMailCommand);
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static LPSTR lpszDelimChar = ";";
|
||||
|
||||
void
|
||||
TackItOn(LPSTR fileBuf, LPSTR nameBuf, LPSTR addOn)
|
||||
{
|
||||
if (addOn[0] != '\0')
|
||||
{
|
||||
lstrcat(fileBuf, addOn);
|
||||
lstrcat(fileBuf, lpszDelimChar);
|
||||
|
||||
lstrcat(nameBuf, "NAMEOF.FILE");
|
||||
lstrcat(nameBuf, lpszDelimChar);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPISendDocuments(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPISendDocuments) (ULONG ulUIParam,
|
||||
LPTSTR lpszDelimChar, LPTSTR lpszFullPaths,
|
||||
LPTSTR lpszFileNames, ULONG ulReserved);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPISendDocuments = GetProcAddress(m_hInstMapi, "MAPISENDDOCUMENTS");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPISendDocuments = GetProcAddress(m_hInstMapi, "MAPISendDocuments");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPISendDocuments)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
char msg[1024];
|
||||
char tempFileName[_MAX_PATH] = "";
|
||||
char lpszFullPaths[(_MAX_PATH + 1) * 4] = "";
|
||||
char lpszFileNames[(_MAX_PATH + 1) * 4] = "";
|
||||
|
||||
// Now get the names of the files to attach...
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH1, tempFileName, sizeof(tempFileName));
|
||||
TackItOn(lpszFullPaths, lpszFileNames, tempFileName);
|
||||
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH2, tempFileName, sizeof(tempFileName));
|
||||
TackItOn(lpszFullPaths, lpszFileNames, tempFileName);
|
||||
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH3, tempFileName, sizeof(tempFileName));
|
||||
TackItOn(lpszFullPaths, lpszFileNames, tempFileName);
|
||||
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH4, tempFileName, sizeof(tempFileName));
|
||||
TackItOn(lpszFullPaths, lpszFileNames, tempFileName);
|
||||
|
||||
LONG rc = (*lpfnMAPISendDocuments)
|
||||
( (ULONG) hWnd,
|
||||
lpszDelimChar,
|
||||
lpszFullPaths,
|
||||
lpszFileNames,
|
||||
0);
|
||||
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
ShowMessage(hWnd, "Success with MAPISendDocuments");
|
||||
SetFooter("MAPISendDocuments success");
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPISendDocuments\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("MAPISendDocuments failed");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
FreeMAPIFile(lpMapiFileDesc pv)
|
||||
{
|
||||
if (!pv)
|
||||
return;
|
||||
|
||||
if (pv->lpszPathName != NULL)
|
||||
free(pv->lpszPathName);
|
||||
|
||||
if (pv->lpszFileName != NULL)
|
||||
free(pv->lpszFileName);
|
||||
}
|
||||
|
||||
void
|
||||
FreeMAPIRecipient(lpMapiRecipDesc pv)
|
||||
{
|
||||
if (!pv)
|
||||
return;
|
||||
|
||||
if (pv->lpszName != NULL)
|
||||
free(pv->lpszName);
|
||||
|
||||
if (pv->lpszAddress != NULL)
|
||||
free(pv->lpszAddress);
|
||||
|
||||
if (pv->lpEntryID != NULL)
|
||||
free(pv->lpEntryID);
|
||||
}
|
||||
|
||||
void
|
||||
FreeMAPIMessage(lpMapiMessage pv)
|
||||
{
|
||||
ULONG i;
|
||||
|
||||
if (!pv)
|
||||
return;
|
||||
|
||||
if (pv->lpszSubject != NULL)
|
||||
free(pv->lpszSubject);
|
||||
|
||||
if (pv->lpszNoteText)
|
||||
free(pv->lpszNoteText);
|
||||
|
||||
if (pv->lpszMessageType)
|
||||
free(pv->lpszMessageType);
|
||||
|
||||
if (pv->lpszDateReceived)
|
||||
free(pv->lpszDateReceived);
|
||||
|
||||
if (pv->lpszConversationID)
|
||||
free(pv->lpszConversationID);
|
||||
|
||||
if (pv->lpOriginator)
|
||||
FreeMAPIRecipient(pv->lpOriginator);
|
||||
|
||||
for (i=0; i<pv->nRecipCount; i++)
|
||||
{
|
||||
if (&(pv->lpRecips[i]) != NULL)
|
||||
{
|
||||
FreeMAPIRecipient(&(pv->lpRecips[i]));
|
||||
}
|
||||
}
|
||||
|
||||
if (pv->lpRecips != NULL)
|
||||
{
|
||||
free(pv->lpRecips);
|
||||
}
|
||||
|
||||
for (i=0; i<pv->nFileCount; i++)
|
||||
{
|
||||
if (&(pv->lpFiles[i]) != NULL)
|
||||
{
|
||||
FreeMAPIFile(&(pv->lpFiles[i]));
|
||||
}
|
||||
}
|
||||
|
||||
if (pv->lpFiles != NULL)
|
||||
{
|
||||
free(pv->lpFiles);
|
||||
}
|
||||
|
||||
free(pv);
|
||||
pv = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPISendMail(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPISendMail) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
lpMapiMessage lpMessage, FLAGS flFlags, ULONG ulReserved);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPISendMail = GetProcAddress(m_hInstMapi, "MAPISENDMAIL");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPISendMail = GetProcAddress(m_hInstMapi, "MAPISendMail");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPISendMail)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
FLAGS flFlags = 0;
|
||||
char msg[512];
|
||||
char file1[_MAX_PATH] = "";
|
||||
char file2[_MAX_PATH] = "";
|
||||
char file3[_MAX_PATH] = "";
|
||||
char file4[_MAX_PATH] = "";
|
||||
char toAddr[128];
|
||||
char ccAddr[128];
|
||||
char bccAddr[128];
|
||||
char subject[128];
|
||||
char noteText[4096];
|
||||
char dateReceived[128] = "N/A";
|
||||
char threadID[128] = "N/A";;
|
||||
char origName[128] = "N/A";;
|
||||
char origAddress[128] = "N/A";;
|
||||
|
||||
GetDlgItemText(hWnd, ID_EDIT_TOADDRESS, toAddr, sizeof(toAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_CCADDRESS, ccAddr, sizeof(ccAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_BCCADDRESS, bccAddr, sizeof(bccAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_SUBJECT, subject, sizeof(subject));
|
||||
GetDlgItemText(hWnd, ID_EDIT_NOTETEXT, noteText, sizeof(noteText));
|
||||
|
||||
// Do the one flag we support for this call...
|
||||
if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, ID_CHECK_SHOWDIALOG)))
|
||||
{
|
||||
flFlags |= MAPI_DIALOG;
|
||||
}
|
||||
|
||||
// Build the message to send off...
|
||||
lpMapiMessage msgPtr = (MapiMessage *)malloc(sizeof(MapiMessage));
|
||||
if (msgPtr == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
memset(msgPtr, 0, sizeof(MapiMessage));
|
||||
|
||||
//
|
||||
// At this point, we need to populate the structure of information
|
||||
// we are passing in via the *lppMessage
|
||||
//
|
||||
|
||||
// Set all of the general information first!
|
||||
msgPtr->lpszSubject = strdup(subject);
|
||||
msgPtr->lpszNoteText = strdup(noteText);
|
||||
msgPtr->lpszDateReceived = strdup(dateReceived);
|
||||
msgPtr->lpszConversationID = strdup(threadID);
|
||||
msgPtr->flFlags = flFlags;
|
||||
|
||||
// Now deal with the recipients of this message
|
||||
DWORD realRecips = 0;
|
||||
if (toAddr[0] != '\0') ++realRecips;
|
||||
if (ccAddr[0] != '\0') ++realRecips;
|
||||
if (bccAddr[0] != '\0') ++realRecips;
|
||||
|
||||
msgPtr->lpRecips = (lpMapiRecipDesc) malloc((size_t) (sizeof(MapiRecipDesc) * realRecips));
|
||||
if (!msgPtr->lpRecips)
|
||||
{
|
||||
FreeMAPIMessage(msgPtr);
|
||||
return;
|
||||
}
|
||||
|
||||
msgPtr->nRecipCount = realRecips;
|
||||
memset(msgPtr->lpRecips, 0, (size_t) (sizeof(MapiRecipDesc) * msgPtr->nRecipCount));
|
||||
|
||||
DWORD rCount = 0;
|
||||
if (toAddr[0] != '\0')
|
||||
{
|
||||
msgPtr->lpRecips[rCount].lpszName = strdup(toAddr);
|
||||
msgPtr->lpRecips[rCount].lpszAddress = strdup(toAddr);
|
||||
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_TO;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
if (ccAddr[0] != '\0')
|
||||
{
|
||||
msgPtr->lpRecips[rCount].lpszName = strdup(ccAddr);
|
||||
msgPtr->lpRecips[rCount].lpszAddress = strdup(ccAddr);
|
||||
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_CC;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
if (bccAddr[0] != '\0')
|
||||
{
|
||||
msgPtr->lpRecips[rCount].lpszName = strdup(bccAddr);
|
||||
msgPtr->lpRecips[rCount].lpszAddress = strdup(bccAddr);
|
||||
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_BCC;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
// Now get the names of the files to attach...
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH1, file1, sizeof(file1));
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH2, file2, sizeof(file2));
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH3, file3, sizeof(file3));
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH4, file4, sizeof(file4));
|
||||
|
||||
DWORD realFiles = 0;
|
||||
if (file1[0] != '\0') ++realFiles;
|
||||
if (file2[0] != '\0') ++realFiles;
|
||||
if (file3[0] != '\0') ++realFiles;
|
||||
if (file4[0] != '\0') ++realFiles;
|
||||
|
||||
// Now deal with the list of attachments! Since the nFileCount should be set
|
||||
// correctly, this loop will automagically be correct
|
||||
//
|
||||
msgPtr->nFileCount = realFiles;
|
||||
if (realFiles > 0)
|
||||
{
|
||||
msgPtr->lpFiles = (lpMapiFileDesc) malloc((size_t) (sizeof(MapiFileDesc) * realFiles));
|
||||
if (!msgPtr->lpFiles)
|
||||
{
|
||||
FreeMAPIMessage(msgPtr);
|
||||
return;
|
||||
}
|
||||
|
||||
memset(msgPtr->lpFiles, 0, (size_t) (sizeof(MapiFileDesc) * msgPtr->nFileCount));
|
||||
}
|
||||
|
||||
rCount = 0;
|
||||
if (file1[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file1);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file1);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
if (file2[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file2);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file2);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
if (file3[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file3);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file3);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
if (file4[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file4);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file4);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
// Finally, make the call...
|
||||
LONG rc = (*lpfnMAPISendMail)
|
||||
(mapiSession,
|
||||
(ULONG) hWnd,
|
||||
msgPtr,
|
||||
flFlags,
|
||||
0);
|
||||
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
ShowMessage(hWnd, "Success with MAPISendMail");
|
||||
SetFooter("MAPISendMail success");
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPISendMail\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("MAPISendMail failed");
|
||||
}
|
||||
|
||||
// Now cleanup and move on...
|
||||
FreeMAPIMessage(msgPtr);
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPISaveMail(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPISaveMail) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
lpMapiMessage lpMessage, FLAGS flFlags, ULONG ulReserved,
|
||||
LPTSTR lpszMessageID);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPISaveMail = GetProcAddress(m_hInstMapi, "MAPISAVEMAIL");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPISaveMail = GetProcAddress(m_hInstMapi, "MAPISaveMail");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPISaveMail)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
FLAGS flFlags = 0;
|
||||
char msg[512];
|
||||
char file1[_MAX_PATH] = "";
|
||||
char file2[_MAX_PATH] = "";
|
||||
char file3[_MAX_PATH] = "";
|
||||
char file4[_MAX_PATH] = "";
|
||||
char toAddr[128];
|
||||
char ccAddr[128];
|
||||
char bccAddr[128];
|
||||
char subject[128];
|
||||
char noteText[4096];
|
||||
char dateReceived[128] = "N/A";
|
||||
char threadID[128] = "N/A";;
|
||||
char origName[128] = "N/A";;
|
||||
char origAddress[128] = "N/A";;
|
||||
|
||||
GetDlgItemText(hWnd, ID_EDIT_TOADDRESS, toAddr, sizeof(toAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_CCADDRESS, ccAddr, sizeof(ccAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_BCCADDRESS, bccAddr, sizeof(bccAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_SUBJECT, subject, sizeof(subject));
|
||||
GetDlgItemText(hWnd, ID_EDIT_NOTETEXT, noteText, sizeof(noteText));
|
||||
|
||||
// Build the message to send off...
|
||||
lpMapiMessage msgPtr = (MapiMessage *)malloc(sizeof(MapiMessage));
|
||||
if (msgPtr == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
memset(msgPtr, 0, sizeof(MapiMessage));
|
||||
|
||||
//
|
||||
// At this point, we need to populate the structure of information
|
||||
// we are passing in via the *lppMessage
|
||||
//
|
||||
|
||||
// Set all of the general information first!
|
||||
msgPtr->lpszSubject = strdup(subject);
|
||||
msgPtr->lpszNoteText = strdup(noteText);
|
||||
msgPtr->lpszDateReceived = strdup(dateReceived);
|
||||
msgPtr->lpszConversationID = strdup(threadID);
|
||||
msgPtr->flFlags = flFlags;
|
||||
|
||||
// Now deal with the recipients of this message
|
||||
DWORD realRecips = 0;
|
||||
if (toAddr[0] != '\0') ++realRecips;
|
||||
if (ccAddr[0] != '\0') ++realRecips;
|
||||
if (bccAddr[0] != '\0') ++realRecips;
|
||||
|
||||
msgPtr->lpRecips = (lpMapiRecipDesc) malloc((size_t) (sizeof(MapiRecipDesc) * realRecips));
|
||||
if (!msgPtr->lpRecips)
|
||||
{
|
||||
FreeMAPIMessage(msgPtr);
|
||||
return;
|
||||
}
|
||||
|
||||
msgPtr->nRecipCount = realRecips;
|
||||
memset(msgPtr->lpRecips, 0, (size_t) (sizeof(MapiRecipDesc) * msgPtr->nRecipCount));
|
||||
|
||||
DWORD rCount = 0;
|
||||
if (toAddr[0] != '\0')
|
||||
{
|
||||
msgPtr->lpRecips[rCount].lpszName = strdup(toAddr);
|
||||
msgPtr->lpRecips[rCount].lpszAddress = strdup(toAddr);
|
||||
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_TO;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
if (ccAddr[0] != '\0')
|
||||
{
|
||||
msgPtr->lpRecips[rCount].lpszName = strdup(ccAddr);
|
||||
msgPtr->lpRecips[rCount].lpszAddress = strdup(ccAddr);
|
||||
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_CC;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
if (bccAddr[0] != '\0')
|
||||
{
|
||||
msgPtr->lpRecips[rCount].lpszName = strdup(bccAddr);
|
||||
msgPtr->lpRecips[rCount].lpszAddress = strdup(bccAddr);
|
||||
msgPtr->lpRecips[rCount].ulRecipClass = MAPI_BCC;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
// Now get the names of the files to attach...
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH1, file1, sizeof(file1));
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH2, file2, sizeof(file2));
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH3, file3, sizeof(file3));
|
||||
GetDlgItemText(hWnd, ID_EDIT_ATTACH4, file4, sizeof(file4));
|
||||
|
||||
DWORD realFiles = 0;
|
||||
if (file1[0] != '\0') ++realFiles;
|
||||
if (file2[0] != '\0') ++realFiles;
|
||||
if (file3[0] != '\0') ++realFiles;
|
||||
if (file4[0] != '\0') ++realFiles;
|
||||
|
||||
// Now deal with the list of attachments! Since the nFileCount should be set
|
||||
// correctly, this loop will automagically be correct
|
||||
//
|
||||
msgPtr->nFileCount = realFiles;
|
||||
if (realFiles > 0)
|
||||
{
|
||||
msgPtr->lpFiles = (lpMapiFileDesc) malloc((size_t) (sizeof(MapiFileDesc) * realFiles));
|
||||
if (!msgPtr->lpFiles)
|
||||
{
|
||||
FreeMAPIMessage(msgPtr);
|
||||
return;
|
||||
}
|
||||
|
||||
memset(msgPtr->lpFiles, 0, (size_t) (sizeof(MapiFileDesc) * msgPtr->nFileCount));
|
||||
}
|
||||
|
||||
rCount = 0;
|
||||
if (file1[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file1);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file1);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
if (file2[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file2);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file2);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
if (file3[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file3);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file3);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
if (file4[0] != '\0')
|
||||
{
|
||||
msgPtr->lpFiles[rCount].lpszPathName = strdup((LPSTR)file4);
|
||||
msgPtr->lpFiles[rCount].lpszFileName = strdup((LPSTR)file4);
|
||||
++rCount;
|
||||
}
|
||||
|
||||
// Finally, make the call...
|
||||
LONG rc = (*lpfnMAPISaveMail)
|
||||
(mapiSession,
|
||||
(ULONG) hWnd,
|
||||
msgPtr,
|
||||
flFlags,
|
||||
0, NULL);
|
||||
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
ShowMessage(hWnd, "Success with MAPISaveMail");
|
||||
SetFooter("MAPISaveMail success");
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPISaveMail\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("MAPISaveMail failed");
|
||||
}
|
||||
|
||||
// Now cleanup and move on...
|
||||
FreeMAPIMessage(msgPtr);
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPIAddress(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIAddress)
|
||||
(LHANDLE lhSession,
|
||||
ULONG ulUIParam,
|
||||
LPSTR lpszCaption,
|
||||
ULONG nEditFields,
|
||||
LPSTR lpszLabels,
|
||||
ULONG nRecips,
|
||||
lpMapiRecipDesc lpRecips,
|
||||
FLAGS flFlags,
|
||||
ULONG ulReserved,
|
||||
LPULONG lpnNewRecips,
|
||||
lpMapiRecipDesc FAR *lppNewRecips);
|
||||
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIAddress = GetProcAddress(m_hInstMapi, "MAPIADDRESS");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIAddress = GetProcAddress(m_hInstMapi, "MAPIAddress");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIAddress)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
DWORD i;
|
||||
FLAGS flFlags = 0;
|
||||
DWORD addrCount = 0;
|
||||
char msg[512];
|
||||
char toAddr[128];
|
||||
char ccAddr[128];
|
||||
char bccAddr[128];
|
||||
|
||||
GetDlgItemText(hWnd, ID_EDIT_TOADDRESS, toAddr, sizeof(toAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_CCADDRESS, ccAddr, sizeof(ccAddr));
|
||||
GetDlgItemText(hWnd, ID_EDIT_BCCADDRESS, bccAddr, sizeof(bccAddr));
|
||||
|
||||
if (toAddr[0]) ++addrCount;
|
||||
if (ccAddr[0]) ++addrCount;
|
||||
if (bccAddr[0]) ++addrCount;
|
||||
|
||||
lpMapiRecipDesc lpRecips = (lpMapiRecipDesc) malloc((size_t) (sizeof(MapiRecipDesc) * addrCount));
|
||||
if (!lpRecips)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
memset(lpRecips, 0, (size_t) (sizeof(MapiRecipDesc) * addrCount));
|
||||
|
||||
DWORD rCount = 0;
|
||||
if (toAddr[0] != '\0')
|
||||
{
|
||||
lpRecips[rCount].lpszName = strdup("To Address Name");
|
||||
lpRecips[rCount].lpszAddress = strdup(toAddr);
|
||||
lpRecips[rCount].ulRecipClass = MAPI_TO;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
if (ccAddr[0] != '\0')
|
||||
{
|
||||
lpRecips[rCount].lpszName = strdup("CC Address Name");
|
||||
lpRecips[rCount].lpszAddress = strdup(ccAddr);
|
||||
lpRecips[rCount].ulRecipClass = MAPI_CC;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
if (bccAddr[0] != '\0')
|
||||
{
|
||||
lpRecips[rCount].lpszName = strdup("BCC Address Name");
|
||||
lpRecips[rCount].lpszAddress = strdup(bccAddr);
|
||||
lpRecips[rCount].ulRecipClass = MAPI_BCC;
|
||||
rCount++;
|
||||
}
|
||||
|
||||
ULONG newRecips;
|
||||
lpMapiRecipDesc lpNewRecips;
|
||||
|
||||
// Finally, make the call...
|
||||
LONG rc = (*lpfnMAPIAddress)
|
||||
(mapiSession,
|
||||
0,
|
||||
"MAPI Test Address Picker",
|
||||
0,
|
||||
NULL,
|
||||
rCount,
|
||||
lpRecips,
|
||||
0,
|
||||
0,
|
||||
&newRecips,
|
||||
&lpNewRecips);
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
for (i=0; i<newRecips; i++)
|
||||
{
|
||||
char tMsg[512];
|
||||
|
||||
wsprintf(tMsg, "User %d\nName=[%s]\nEmail=[%s]\nType=[%d]",
|
||||
i,
|
||||
lpNewRecips[i].lpszName,
|
||||
lpNewRecips[i].lpszAddress,
|
||||
lpNewRecips[i].ulRecipClass);
|
||||
ShowMessage(hWnd, tMsg);
|
||||
}
|
||||
|
||||
SetFooter("MAPIAddress success");
|
||||
|
||||
DoMAPIFreeBuffer(hWnd, lpNewRecips, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPIAddress\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("MAPIAddress failed");
|
||||
}
|
||||
|
||||
// Now cleanup and move on...
|
||||
for (i=0; i<rCount; i++)
|
||||
{
|
||||
FreeMAPIRecipient(&(lpRecips[i]));
|
||||
}
|
||||
}
|
||||
@@ -1,832 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
|
||||
#include <mapi.h>
|
||||
#endif
|
||||
|
||||
#include "port.h"
|
||||
#include "resource.h"
|
||||
|
||||
//
|
||||
// Variables...
|
||||
//
|
||||
extern HINSTANCE hInst;
|
||||
HINSTANCE m_hInstMapi;
|
||||
LHANDLE mapiSession = 0;
|
||||
|
||||
//
|
||||
// Forward declarations...
|
||||
//
|
||||
void LoadNSCPVersionFunc(HWND hWnd);
|
||||
void DoMAPILogon(HWND hWnd);
|
||||
void DoMAPILogoff(HWND hWnd);
|
||||
void DoMAPIFreeBuffer(HWND hWnd, LPVOID buf, BOOL alert);
|
||||
void DoMAPISendMail(HWND hWnd);
|
||||
void DoMAPISendDocuments(HWND hWnd);
|
||||
void DoMAPIFindNext(HWND hWnd);
|
||||
void DoMAPIReadMail(HWND hWnd);
|
||||
void DoMAPIDeleteMail(HWND hWnd);
|
||||
void DoMAPIDetails(HWND hWnd);
|
||||
void DoMAPIResolveName(HWND hWnd);
|
||||
void DoMAPIResolveNameFreeBuffer(HWND hWnd);
|
||||
void SetFooter(LPSTR msg);
|
||||
void DoMAPI_NSCP_Sync(HWND hWnd);
|
||||
LPSTR GetMAPIError(LONG errorCode);
|
||||
extern void DisplayMAPIReadMail(HWND hWnd, lpMapiMessage msgPtr);
|
||||
lpMapiMessage GetMessage(HWND hWnd, LPSTR id);
|
||||
|
||||
void
|
||||
SetFooter(LPSTR msg)
|
||||
{
|
||||
extern HWND hWnd;
|
||||
|
||||
SetDlgItemText(hWnd, ID_STATIC_RESULT, msg);
|
||||
}
|
||||
|
||||
char FAR *
|
||||
GetMAPIError(LONG errorCode)
|
||||
{
|
||||
static char FAR msg[128];
|
||||
|
||||
switch (errorCode) {
|
||||
case MAPI_E_FAILURE:
|
||||
lstrcpy(msg, "General MAPI Failure");
|
||||
break;
|
||||
|
||||
case MAPI_E_INSUFFICIENT_MEMORY:
|
||||
strcpy(msg, "Insufficient Memory");
|
||||
break;
|
||||
|
||||
case MAPI_E_LOGIN_FAILURE:
|
||||
strcpy(msg, "Login Failure");
|
||||
break;
|
||||
|
||||
case MAPI_E_TOO_MANY_SESSIONS:
|
||||
strcpy(msg, "Too many MAPI sessions");
|
||||
break;
|
||||
|
||||
case MAPI_E_INVALID_SESSION:
|
||||
strcpy(msg, "Invalid Session!");
|
||||
break;
|
||||
|
||||
case MAPI_E_INVALID_MESSAGE:
|
||||
strcpy(msg, "Message identifier was bad!");
|
||||
break;
|
||||
|
||||
case MAPI_E_NO_MESSAGES:
|
||||
strcpy(msg, "No messages were found!");
|
||||
break;
|
||||
|
||||
case MAPI_E_ATTACHMENT_WRITE_FAILURE:
|
||||
strcpy(msg, "Attachment write failure!");
|
||||
break;
|
||||
|
||||
case MAPI_E_DISK_FULL:
|
||||
strcpy(msg, "Attachment write failure! DISK FULL");
|
||||
break;
|
||||
|
||||
case MAPI_E_AMBIGUOUS_RECIPIENT:
|
||||
strcpy(msg, "Recipient requested is not a unique address list entry.");
|
||||
break;
|
||||
|
||||
case MAPI_E_UNKNOWN_RECIPIENT:
|
||||
strcpy(msg, "Recipient requested does not exist.");
|
||||
break;
|
||||
|
||||
case MAPI_E_NOT_SUPPORTED:
|
||||
strcpy(msg, "Not supported by messaging system");
|
||||
break;
|
||||
|
||||
case SUCCESS_SUCCESS:
|
||||
strcpy(msg, "Success on MAPI operation");
|
||||
break;
|
||||
|
||||
case MAPI_E_INVALID_RECIPS:
|
||||
strcpy(msg, "Recipient specified in the lpRecip parameter was\nunknown. No dialog box was displayed.");
|
||||
break;
|
||||
|
||||
case MAPI_E_ATTACHMENT_OPEN_FAILURE:
|
||||
strcpy(msg, "One or more files could not be located. No message was sent.");
|
||||
break;
|
||||
|
||||
case MAPI_E_ATTACHMENT_NOT_FOUND:
|
||||
strcpy(msg, "The specified attachment was not found. No message was sent.");
|
||||
break;
|
||||
|
||||
case MAPI_E_BAD_RECIPTYPE:
|
||||
strcpy(msg, "The type of a recipient was not MAPI_TO, MAPI_CC, or MAPI_BCC. No message was sent.");
|
||||
break;
|
||||
|
||||
default:
|
||||
strcpy(msg, "Unknown MAPI Return Code");
|
||||
break;
|
||||
}
|
||||
|
||||
return((LPSTR) &(msg[0]));
|
||||
}
|
||||
|
||||
void
|
||||
ShowMessage(HWND hWnd, LPSTR msg)
|
||||
{
|
||||
MessageBox(hWnd, msg, "Info Message", MB_ICONINFORMATION);
|
||||
}
|
||||
|
||||
BOOL
|
||||
OpenMAPI(void)
|
||||
{
|
||||
#ifdef WIN16
|
||||
m_hInstMapi = LoadLibrary("Y:\\ns\\cmd\\winfe\\mapi\\MAPI.DLL");
|
||||
#else
|
||||
m_hInstMapi = LoadLibrary(".\\COMPONENTS\\MAPI32.DLL");
|
||||
#endif
|
||||
|
||||
if (!m_hInstMapi)
|
||||
{
|
||||
ShowMessage(NULL, "Error Loading the MAPI DLL...Probably not found!");
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
CloseMAPI(void)
|
||||
{
|
||||
if(m_hInstMapi)
|
||||
{
|
||||
FreeLibrary(m_hInstMapi);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ProcessCommand(HWND hWnd, int id, HWND hCtl, UINT codeNotify)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case ID_BUTTON_SYNC:
|
||||
DoMAPI_NSCP_Sync(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_NSCPVERSION:
|
||||
LoadNSCPVersionFunc(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_LOGON:
|
||||
DoMAPILogon(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_LOGOFF:
|
||||
DoMAPILogoff(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_FINDNEXT:
|
||||
case ID_MENU_MAPIFINDNEXT:
|
||||
DoMAPIFindNext(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_READMAIL:
|
||||
case ID_MENU_MAPIREADMAIL:
|
||||
DoMAPIReadMail(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_MAIL:
|
||||
{
|
||||
extern CALLBACK LOADDS
|
||||
MailDlgProc(HWND hWndMain, UINT wMsg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
DialogBox(hInst, MAKEINTRESOURCE(ID_DIALOG_MAIL), hWnd,
|
||||
(DLGPROC)MailDlgProc);
|
||||
}
|
||||
break;
|
||||
|
||||
case ID_BUTTON_DELETEMAIL:
|
||||
case ID_MENU_MAPIDELETEMAIL:
|
||||
DoMAPIDeleteMail(hWnd);
|
||||
break;
|
||||
|
||||
case ID_MENU_MYEXIT:
|
||||
DestroyWindow(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_CLEAR:
|
||||
case ID_MENU_CLEARRESULTS:
|
||||
ListBox_ResetContent(GetDlgItem(hWnd, ID_LIST_RESULT));
|
||||
break;
|
||||
|
||||
case ID_BUTTON_FREEBUFFER:
|
||||
DoMAPIResolveNameFreeBuffer(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_RESOLVENAME:
|
||||
DoMAPIResolveName(hWnd);
|
||||
break;
|
||||
|
||||
case ID_BUTTON_DETAILS:
|
||||
DoMAPIDetails(hWnd);
|
||||
break;
|
||||
|
||||
case ID_MENU_MYABOUT:
|
||||
MessageBox(hWnd,
|
||||
"Netscape MAPI Test Harness\nWritten by: Rich Pizzarro (rhp@netscape.com)",
|
||||
"About",
|
||||
MB_ICONINFORMATION);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPILogon(HWND hWnd)
|
||||
{
|
||||
char msg[1024];
|
||||
char user[128] = "";
|
||||
char pw[128] = "";
|
||||
|
||||
// Get Address of MAPI function...
|
||||
ULONG (FAR PASCAL *lpfnMAPILogon)(ULONG, LPSTR, LPSTR, FLAGS, ULONG, LPLHANDLE);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPILogon = GetProcAddress(m_hInstMapi, "MAPILOGON");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPILogon = GetProcAddress(m_hInstMapi, "MAPILogon");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPILogon)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
GetDlgItemText(hWnd, ID_EDIT_USERNAME, user, sizeof(user));
|
||||
GetDlgItemText(hWnd, ID_EDIT_PW, pw, sizeof(pw));
|
||||
|
||||
LONG rc = (*lpfnMAPILogon)((ULONG) hWnd, user, pw,
|
||||
MAPI_FORCE_DOWNLOAD | MAPI_NEW_SESSION, 0, &mapiSession);
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
wsprintf(msg, "Success with session = %d", mapiSession);
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("Logon success");
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from Logon\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("Logon failed");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPILogoff(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPILogoff) ( LHANDLE lhSession, ULONG ulUIParam,
|
||||
FLAGS flFlags, ULONG ulReserved);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPILogoff = GetProcAddress(m_hInstMapi, "MAPILOGOFF");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPILogoff = GetProcAddress(m_hInstMapi, "MAPILogoff");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPILogoff)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
char msg[1024];
|
||||
LONG rc = (*lpfnMAPILogoff)(mapiSession, (ULONG) hWnd, 0, 0);
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
wsprintf(msg, "Successful logoff");
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter(msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from Logoff\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("Logoff failed");
|
||||
}
|
||||
|
||||
mapiSession = 0;
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPIFreeBuffer(HWND hWnd, LPVOID buf, BOOL alert)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIFreeBuffer) (LPVOID lpBuffer);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIFreeBuffer = GetProcAddress(m_hInstMapi, "MAPIFREEBUFFER");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIFreeBuffer = GetProcAddress(m_hInstMapi, "MAPIFreeBuffer");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIFreeBuffer)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
char msg[1024];
|
||||
LONG rc = (*lpfnMAPIFreeBuffer)(buf);
|
||||
#ifdef WIN32
|
||||
if (rc == S_OK)
|
||||
#else
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
#endif
|
||||
{
|
||||
wsprintf(msg, "Successful Free Buffer Operation");
|
||||
if (alert)
|
||||
ShowMessage(hWnd, msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from Logoff", rc);
|
||||
ShowMessage(hWnd, msg);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPIFindNext(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIFindNext) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
LPTSTR lpszMessageType, LPTSTR lpszSeedMessageID, FLAGS flFlags,
|
||||
ULONG ulReserved, LPTSTR lpszMessageID);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIFindNext = GetProcAddress(m_hInstMapi, "MAPIFINDNEXT");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIFindNext = GetProcAddress(m_hInstMapi, "MAPIFindNext");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIFindNext)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Clear the list before we start...
|
||||
ListBox_ResetContent(GetDlgItem(hWnd, ID_LIST_RESULT));
|
||||
|
||||
char msg[1024];
|
||||
char messageID[512];
|
||||
LONG rc;
|
||||
#ifdef WIN32
|
||||
FLAGS flags = MAPI_GUARANTEE_FIFO | MAPI_LONG_MSGID | MAPI_UNREAD_ONLY;
|
||||
#else
|
||||
FLAGS flags = MAPI_GUARANTEE_FIFO | MAPI_UNREAD_ONLY;
|
||||
#endif
|
||||
|
||||
while ( (rc = (*lpfnMAPIFindNext) (mapiSession,
|
||||
(ULONG) hWnd,
|
||||
NULL,
|
||||
NULL,
|
||||
flags,
|
||||
0,
|
||||
messageID)) == SUCCESS_SUCCESS)
|
||||
{
|
||||
//
|
||||
|
||||
lpMapiMessage mapiMsg = GetMessage(hWnd, messageID);
|
||||
if (mapiMsg != NULL)
|
||||
{
|
||||
wsprintf(msg, "%s: \"%s\" Sender: %s",
|
||||
messageID,
|
||||
mapiMsg->lpszSubject,
|
||||
mapiMsg->lpOriginator->lpszName);
|
||||
DoMAPIFreeBuffer(hWnd, mapiMsg, FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
lstrcpy(msg, messageID);
|
||||
}
|
||||
|
||||
ListBox_InsertString(GetDlgItem(hWnd, ID_LIST_RESULT), 0, msg);
|
||||
}
|
||||
|
||||
wsprintf(msg, "Enumeration ended: Return code %d from MAPIFindNext\nCondition=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("Enumeration ended");
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPIReadMail(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIReadMail) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
LPTSTR lpszMessageID, FLAGS flFlags, ULONG ulReserved,
|
||||
lpMapiMessage FAR * lppMessage);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIReadMail = GetProcAddress(m_hInstMapi, "MAPIREADMAIL");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIReadMail = GetProcAddress(m_hInstMapi, "MAPIReadMail");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIReadMail)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
char msg[1024];
|
||||
char lpszMessageID[512];
|
||||
lpMapiMessage lpMessage = NULL;
|
||||
FLAGS flFlags = 0;
|
||||
|
||||
DWORD selected = ListBox_GetCurSel(GetDlgItem(hWnd, ID_LIST_RESULT));
|
||||
if (selected == LB_ERR)
|
||||
{
|
||||
ShowMessage(hWnd, "You need to select a valid message. Make sure\nyou have done a MAPIFindNext and selected\none of the resulting messages.");
|
||||
return;
|
||||
}
|
||||
|
||||
ListBox_GetText(GetDlgItem(hWnd, ID_LIST_RESULT), selected, lpszMessageID);
|
||||
|
||||
// Do the various flags for this call...
|
||||
if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK_BODYASFILE)))
|
||||
{
|
||||
flFlags |= MAPI_BODY_AS_FILE;
|
||||
}
|
||||
|
||||
if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK_ENVELOPEONLY)))
|
||||
{
|
||||
flFlags |= MAPI_ENVELOPE_ONLY;
|
||||
}
|
||||
|
||||
if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK_PEEK)))
|
||||
{
|
||||
flFlags |= MAPI_PEEK;
|
||||
}
|
||||
|
||||
if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK_SUPPRESSATTACH)))
|
||||
{
|
||||
flFlags |= MAPI_SUPPRESS_ATTACH;
|
||||
}
|
||||
|
||||
char *ptr = strchr( (const char *) lpszMessageID, ':');
|
||||
if (ptr) *ptr = '\0';
|
||||
|
||||
LONG rc = (*lpfnMAPIReadMail)
|
||||
(mapiSession,
|
||||
(ULONG) hWnd,
|
||||
lpszMessageID,
|
||||
flFlags,
|
||||
0,
|
||||
&lpMessage);
|
||||
|
||||
// Deal with error up front and return if need be...
|
||||
if (rc != SUCCESS_SUCCESS)
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPIReadMail\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("ReadMail failed");
|
||||
return;
|
||||
}
|
||||
|
||||
// Now display the message and then return...
|
||||
DisplayMAPIReadMail(hWnd, lpMessage);
|
||||
DoMAPIFreeBuffer(hWnd, lpMessage, TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPIDeleteMail(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIDeleteMail) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
LPTSTR lpszMessageID, FLAGS flFlags, ULONG ulReserved);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIDeleteMail = GetProcAddress(m_hInstMapi, "MAPIDELETEMAIL");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIDeleteMail = GetProcAddress(m_hInstMapi, "MAPIDeleteMail");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIDeleteMail)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
char msg[1024];
|
||||
char lpszMessageID[512];
|
||||
lpMapiMessage lpMessage = NULL;
|
||||
|
||||
DWORD selected = ListBox_GetCurSel(GetDlgItem(hWnd, ID_LIST_RESULT));
|
||||
if (selected == LB_ERR)
|
||||
{
|
||||
ShowMessage(hWnd, "You need to select a valid message. Make sure\nyou have done a MAPIFindNext and selected\none of the resulting messages.");
|
||||
return;
|
||||
}
|
||||
|
||||
ListBox_GetText(GetDlgItem(hWnd, ID_LIST_RESULT), selected, lpszMessageID);
|
||||
|
||||
char *ptr = strchr( (const char *) lpszMessageID, ':');
|
||||
if (ptr) *ptr = '\0';
|
||||
|
||||
LONG rc = (*lpfnMAPIDeleteMail)
|
||||
(mapiSession,
|
||||
(ULONG) hWnd,
|
||||
lpszMessageID,
|
||||
0,
|
||||
0);
|
||||
|
||||
// Deal with the return code...
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
wsprintf(msg, "Successful deletion");
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter(msg);
|
||||
|
||||
// If it worked, refresh the list...
|
||||
ShowMessage(hWnd, "The message list will now be refreshed\nsince one message was deleted.");
|
||||
DoMAPIFindNext(hWnd);
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPIDeleteMail\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("Logoff failed");
|
||||
}
|
||||
}
|
||||
|
||||
// This is for the name lookup stuff...
|
||||
lpMapiRecipDesc lpRecip = NULL;
|
||||
|
||||
void
|
||||
DoMAPIResolveName(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIResolveName) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
LPTSTR lpszName, FLAGS flFlags, ULONG ulReserved,
|
||||
lpMapiRecipDesc FAR * lppRecip);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIResolveName = GetProcAddress(m_hInstMapi, "MAPIRESOLVENAME");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIResolveName = GetProcAddress(m_hInstMapi, "MAPIResolveName");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIResolveName)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (lpRecip != NULL)
|
||||
{
|
||||
ShowMessage(hWnd, "We need to free memory from a previous call...");
|
||||
DoMAPIFreeBuffer(hWnd, lpRecip, TRUE);
|
||||
lpRecip = NULL;
|
||||
}
|
||||
|
||||
char userName[512];
|
||||
char msg[1024];
|
||||
FLAGS flFlags = 0; // We support none...
|
||||
|
||||
GetDlgItemText(hWnd, IDC_EDIT_RESOLVENAME, userName, sizeof(userName));
|
||||
LONG rc = (*lpfnMAPIResolveName)
|
||||
(mapiSession,
|
||||
(ULONG) hWnd,
|
||||
userName,
|
||||
flFlags,
|
||||
0,
|
||||
&lpRecip);
|
||||
|
||||
// Deal with error up front and return if need be...
|
||||
if (rc != SUCCESS_SUCCESS)
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from DoMAPIResolveName\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("DoMAPIResolveName failed");
|
||||
return;
|
||||
}
|
||||
|
||||
// If we get here, we should probably show the information that we
|
||||
// got back
|
||||
wsprintf(msg, "Received information for %s\nName=[%s]\nAddress=[%s]\nID=[%s]",
|
||||
userName, lpRecip->lpszName, lpRecip->lpszAddress, (LPSTR) lpRecip->lpEntryID);
|
||||
ShowMessage(hWnd, msg);
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPIResolveNameFreeBuffer(HWND hWnd)
|
||||
{
|
||||
if (lpRecip == NULL)
|
||||
{
|
||||
ShowMessage(hWnd, "There is no memory allocated from MAPIResolveName()\nto be freed. Request ignored.");
|
||||
}
|
||||
else
|
||||
{
|
||||
DoMAPIFreeBuffer(hWnd, lpRecip, TRUE);
|
||||
lpRecip = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPIDetails(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIDetails) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
lpMapiRecipDesc lpRecip, FLAGS flFlags, ULONG ulReserved);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIDetails = GetProcAddress(m_hInstMapi, "MAPIDetails");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIDetails = GetProcAddress(m_hInstMapi, "MAPIDetails");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIDetails)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
char msg[1024];
|
||||
FLAGS flFlags = 0; // We really don't support these...
|
||||
|
||||
LONG rc = (*lpfnMAPIDetails)
|
||||
(mapiSession,
|
||||
(ULONG) hWnd,
|
||||
lpRecip,
|
||||
flFlags,
|
||||
0);
|
||||
|
||||
if (rc == SUCCESS_SUCCESS)
|
||||
{
|
||||
|
||||
wsprintf(msg, "MAPIDetails call succeeded");
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter(msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPIDetails\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
|
||||
if (lpRecip == NULL)
|
||||
{
|
||||
lstrcat(msg, "\nNOTE: There is no valid pointer from a MAPIResolveName()\ncall to show details about.");
|
||||
}
|
||||
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("MAPIDetails failed");
|
||||
}
|
||||
}
|
||||
|
||||
lpMapiMessage
|
||||
GetMessage(HWND hWnd, LPSTR id)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnMAPIReadMail) (LHANDLE lhSession, ULONG ulUIParam,
|
||||
LPTSTR lpszMessageID, FLAGS flFlags, ULONG ulReserved,
|
||||
lpMapiMessage FAR * lppMessage);
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnMAPIReadMail = GetProcAddress(m_hInstMapi, "MAPIREADMAIL");
|
||||
#else
|
||||
(FARPROC&) lpfnMAPIReadMail = GetProcAddress(m_hInstMapi, "MAPIReadMail");
|
||||
#endif
|
||||
|
||||
if (!lpfnMAPIReadMail)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char msg[1024];
|
||||
lpMapiMessage lpMessage = NULL;
|
||||
FLAGS flFlags = 0;
|
||||
|
||||
flFlags |= MAPI_ENVELOPE_ONLY;
|
||||
LONG rc = (*lpfnMAPIReadMail)
|
||||
(mapiSession,
|
||||
(ULONG) hWnd,
|
||||
id,
|
||||
flFlags,
|
||||
0,
|
||||
&lpMessage);
|
||||
|
||||
// Deal with error up front and return if need be...
|
||||
if (rc != SUCCESS_SUCCESS)
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPIReadMail\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("ReadMail failed");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return(lpMessage);
|
||||
}
|
||||
|
||||
void
|
||||
LoadNSCPVersionFunc(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnLoadNSCPVersion) ( void );
|
||||
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnLoadNSCPVersion = GetProcAddress(m_hInstMapi, "MAPIGETNERSCAPEVERSION");
|
||||
#else
|
||||
(FARPROC&) lpfnLoadNSCPVersion = GetProcAddress(m_hInstMapi, "MAPIGetNetscapeVersion");
|
||||
#endif
|
||||
|
||||
if (!lpfnLoadNSCPVersion)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPIGetNetscapeVersion() function.");
|
||||
}
|
||||
else
|
||||
{
|
||||
ShowMessage(hWnd, "MAPIGetNetscapeVersion() function was FOUND!");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
DoMAPI_NSCP_Sync(HWND hWnd)
|
||||
{
|
||||
ULONG (FAR PASCAL *lpfnNSCPSync) ( LHANDLE lhSession,
|
||||
ULONG ulReserved );
|
||||
#ifdef WIN16
|
||||
(FARPROC&) lpfnNSCPSync = GetProcAddress(m_hInstMapi, "MAPI_NSCP_SYNCHRONIZECLIENT");
|
||||
#else
|
||||
(FARPROC&) lpfnNSCPSync = GetProcAddress(m_hInstMapi, "MAPI_NSCP_SynchronizeClient");
|
||||
#endif
|
||||
|
||||
if (!lpfnNSCPSync)
|
||||
{
|
||||
ShowMessage(hWnd, "Unable to locate MAPI function.");
|
||||
return;
|
||||
}
|
||||
|
||||
LONG rc = (*lpfnNSCPSync) (mapiSession, 0);
|
||||
|
||||
char msg[256];
|
||||
|
||||
// Deal with error up front and return if need be...
|
||||
if (rc != SUCCESS_SUCCESS)
|
||||
{
|
||||
wsprintf(msg, "FAILURE: Return code %d from MAPI_NSCP_SynchronizeClient\nError=[%s]",
|
||||
rc, GetMAPIError(rc));
|
||||
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("MAPI_NSCP_SynchronizeClient failed");
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
wsprintf(msg, "Success for MAPI_NSCP_SynchronizeClient");
|
||||
ShowMessage(hWnd, msg);
|
||||
SetFooter("MAPI_NSCP_SynchronizeClient success");
|
||||
}
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
# Microsoft Developer Studio Generated Dependency File, included by mapitest.mak
|
||||
|
||||
.\main.cpp : \
|
||||
".\port.h"\
|
||||
"c:\program files\msdev\vc98\include\basetsd.h"\
|
||||
|
||||
|
||||
.\mapimail.cpp : \
|
||||
".\port.h"\
|
||||
"c:\program files\msdev\vc98\include\basetsd.h"\
|
||||
|
||||
|
||||
.\mapiproc.cpp : \
|
||||
".\port.h"\
|
||||
"c:\program files\msdev\vc98\include\basetsd.h"\
|
||||
|
||||
|
||||
.\mtest32.rc : \
|
||||
".\nscicon.ico"\
|
||||
|
||||
|
||||
.\readmail.cpp : \
|
||||
".\port.h"\
|
||||
"c:\program files\msdev\vc98\include\basetsd.h"\
|
||||
|
||||
@@ -1,121 +0,0 @@
|
||||
# Microsoft Developer Studio Project File - Name="mapitest" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Application" 0x0101
|
||||
|
||||
CFG=mapitest - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "mapitest.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "mapitest.mak" CFG="mapitest - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "mapitest - Win32 Release" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "mapitest - Win32 Debug" (based on "Win32 (x86) Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "mapitest - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
|
||||
|
||||
!ELSEIF "$(CFG)" == "mapitest - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "mapitest - Win32 Release"
|
||||
# Name "mapitest - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\main.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\mapimail.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\mapiproc.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\mtest32.rc
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\readmail.cpp
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
||||
@@ -1,29 +0,0 @@
|
||||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "mapitest"=.\mapitest.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,44 +0,0 @@
|
||||
<html>
|
||||
<body>
|
||||
<pre>
|
||||
<h1>Build Log</h1>
|
||||
<h3>
|
||||
--------------------Configuration: mapitest - Win32 Debug--------------------
|
||||
</h3>
|
||||
<h3>Command Lines</h3>
|
||||
Creating command line "rc.exe /l 0x409 /fo"Debug/mtest32.res" /d "_DEBUG" "Y:\mozilla\mailnews\mapi\tests\mapitest\mtest32.rc""
|
||||
Creating temporary file "C:\TEMP\RSP38A.tmp" with contents
|
||||
[
|
||||
/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"Debug/mapitest.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c
|
||||
"Y:\mozilla\mailnews\mapi\tests\mapitest\readmail.cpp"
|
||||
"Y:\mozilla\mailnews\mapi\tests\mapitest\mapimail.cpp"
|
||||
"Y:\mozilla\mailnews\mapi\tests\mapitest\mapiproc.cpp"
|
||||
"Y:\mozilla\mailnews\mapi\tests\mapitest\main.cpp"
|
||||
]
|
||||
Creating command line "cl.exe @C:\TEMP\RSP38A.tmp"
|
||||
Creating temporary file "C:\TEMP\RSP38B.tmp" with contents
|
||||
[
|
||||
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:yes /pdb:"Debug/mapitest.pdb" /debug /machine:I386 /out:"Debug/mapitest.exe" /pdbtype:sept
|
||||
.\Debug\readmail.obj
|
||||
.\Debug\mapimail.obj
|
||||
.\Debug\mapiproc.obj
|
||||
.\Debug\mtest32.res
|
||||
.\Debug\main.obj
|
||||
]
|
||||
Creating command line "link.exe @C:\TEMP\RSP38B.tmp"
|
||||
<h3>Output Window</h3>
|
||||
Compiling resources...
|
||||
Compiling...
|
||||
readmail.cpp
|
||||
mapimail.cpp
|
||||
mapiproc.cpp
|
||||
main.cpp
|
||||
Linking...
|
||||
|
||||
|
||||
|
||||
<h3>Results</h3>
|
||||
mapitest.exe - 0 error(s), 0 warning(s)
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,245 +0,0 @@
|
||||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
ID_DIALOG DIALOG DISCARDABLE 0, 0, 344, 229
|
||||
STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Netscape MAPI Test Harness"
|
||||
MENU ID_MENU
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
GROUPBOX "Open/Close",IDC_STATIC,4,4,336,27
|
||||
LTEXT "User:",IDC_STATIC,9,17,18,11
|
||||
EDITTEXT ID_EDIT_USERNAME,28,15,41,12,ES_AUTOHSCROLL
|
||||
LTEXT "Password:",IDC_STATIC,74,17,38,11
|
||||
EDITTEXT ID_EDIT_PW,112,15,41,12,ES_PASSWORD | ES_AUTOHSCROLL
|
||||
PUSHBUTTON "MAPILogon",ID_BUTTON_LOGON,157,13,46,14
|
||||
PUSHBUTTON "MAPILogoff",ID_BUTTON_LOGOFF,209,13,46,14
|
||||
GROUPBOX "Mail Operations",IDC_STATIC,4,36,336,142
|
||||
PUSHBUTTON "MAPIFindNext",ID_BUTTON_FINDNEXT,17,50,57,14
|
||||
PUSHBUTTON "MAPIDeleteMail",ID_BUTTON_DELETEMAIL,80,50,57,14
|
||||
PUSHBUTTON "Clear Results",ID_BUTTON_CLEAR,143,50,57,14
|
||||
PUSHBUTTON "Send Mail",ID_BUTTON_MAIL,206,50,57,14
|
||||
LISTBOX ID_LIST_RESULT,9,66,325,56,LBS_SORT |
|
||||
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL |
|
||||
WS_TABSTOP
|
||||
GROUPBOX "User Information",IDC_STATIC,4,181,336,28
|
||||
PUSHBUTTON "MAPIResolveName",ID_BUTTON_RESOLVENAME,9,192,68,14
|
||||
EDITTEXT IDC_EDIT_RESOLVENAME,82,192,130,14,ES_AUTOHSCROLL
|
||||
PUSHBUTTON "MAPIDetails",ID_BUTTON_DETAILS,219,192,48,14
|
||||
LTEXT "",ID_STATIC_RESULT,4,214,336,13,SS_SUNKEN
|
||||
PUSHBUTTON "MAPIReadMail",ID_BUTTON_READMAIL,34,142,57,14
|
||||
CONTROL "MAPI_BODY_AS_FILE - Body as attachment",
|
||||
IDC_CHECK_BODYASFILE,"Button",BS_AUTOCHECKBOX |
|
||||
WS_TABSTOP,121,125,188,9
|
||||
CONTROL "MAPI_ENVELOPE_ONLY - Header information only",
|
||||
IDC_CHECK_ENVELOPEONLY,"Button",BS_AUTOCHECKBOX |
|
||||
WS_TABSTOP,121,138,188,9
|
||||
CONTROL "MAPI_PEEK - Don't mark message as read",IDC_CHECK_PEEK,
|
||||
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,121,151,188,9
|
||||
CONTROL "MAPI_SUPPRESS_ATTACH - Suppress attachments",
|
||||
IDC_CHECK_SUPPRESSATTACH,"Button",BS_AUTOCHECKBOX |
|
||||
WS_TABSTOP,121,164,188,9
|
||||
PUSHBUTTON "<- MAPIFreeBuffer",ID_BUTTON_FREEBUFFER,272,192,63,14
|
||||
PUSHBUTTON "MAPIGetNSCPVersion",ID_BUTTON_NSCPVERSION,261,13,76,14
|
||||
PUSHBUTTON "Synchronize",ID_BUTTON_SYNC,269,50,57,14
|
||||
END
|
||||
|
||||
ID_DIALOG_MAIL DIALOG DISCARDABLE 0, 0, 285, 246
|
||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Composition"
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
GROUPBOX "Address Information",IDC_STATIC,4,4,275,55
|
||||
LTEXT "To:",IDC_STATIC,21,19,12,8
|
||||
EDITTEXT ID_EDIT_TOADDRESS,36,16,239,13,ES_AUTOHSCROLL
|
||||
EDITTEXT ID_EDIT_CCADDRESS,36,30,239,13,ES_AUTOHSCROLL
|
||||
EDITTEXT ID_EDIT_BCCADDRESS,36,44,239,13,ES_AUTOHSCROLL
|
||||
LTEXT "Subject:",IDC_STATIC,5,65,29,9
|
||||
EDITTEXT ID_EDIT_SUBJECT,36,63,239,13,ES_AUTOHSCROLL
|
||||
EDITTEXT ID_EDIT_NOTETEXT,4,78,271,72,ES_MULTILINE |
|
||||
ES_AUTOHSCROLL
|
||||
GROUPBOX "Attachments",IDC_STATIC,4,153,275,39
|
||||
EDITTEXT ID_EDIT_ATTACH1,16,162,122,13,ES_AUTOHSCROLL
|
||||
EDITTEXT ID_EDIT_ATTACH2,16,176,122,13,ES_AUTOHSCROLL
|
||||
EDITTEXT ID_EDIT_ATTACH3,147,162,122,13,ES_AUTOHSCROLL
|
||||
EDITTEXT ID_EDIT_ATTACH4,147,175,122,13,ES_AUTOHSCROLL
|
||||
PUSHBUTTON "MAPISendMail",ID_BUTTON_MAPISENDMAIL,70,204,58,14
|
||||
PUSHBUTTON "Cancel",IDCANCEL,50,225,84,14
|
||||
PUSHBUTTON "MAPISendDocuments",ID_BUTTON_MAPISENDDOCUMENTS,132,204,
|
||||
79,14
|
||||
CONTROL "Show Dialog",ID_CHECK_SHOWDIALOG,"Button",
|
||||
BS_AUTOCHECKBOX | WS_TABSTOP,8,207,55,9
|
||||
LTEXT "cc:",IDC_STATIC,22,32,12,8
|
||||
LTEXT "bcc:",IDC_STATIC,18,47,15,8
|
||||
GROUPBOX "Send Operations",IDC_STATIC,4,196,275,26
|
||||
PUSHBUTTON "MAPISaveMail",ID_BUTTON_MAPISAVEMAIL,215,204,57,14
|
||||
PUSHBUTTON "MAPIAddress",ID_BUTTON_MAPIADDRESS,150,225,84,14
|
||||
END
|
||||
|
||||
ID_DIALOG_READMAIL DIALOG DISCARDABLE 0, 0, 269, 266
|
||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Mail Message"
|
||||
FONT 8, "MS Sans Serif"
|
||||
BEGIN
|
||||
LTEXT "Subject:",IDC_STATIC,5,71,27,9
|
||||
EDITTEXT IDC_EDIT_SUBJECT,36,69,229,12,ES_AUTOHSCROLL |
|
||||
ES_READONLY
|
||||
LISTBOX IDC_LIST_ATTACHMENTS,4,211,261,37,LBS_SORT |
|
||||
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
|
||||
EDITTEXT IDC_EDIT_BODYTEXT,4,113,261,85,ES_MULTILINE |
|
||||
ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY |
|
||||
ES_WANTRETURN
|
||||
LISTBOX IDC_LIST_RECIPIENTS,4,29,261,36,LBS_SORT |
|
||||
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
|
||||
LTEXT "Recipients:",IDC_STATIC,4,19,43,9
|
||||
LTEXT "Attachments:",IDC_STATIC,4,202,43,9
|
||||
EDITTEXT IDC_EDIT_DATETIME,36,83,229,12,ES_AUTOHSCROLL |
|
||||
ES_READONLY
|
||||
LTEXT "Date:",IDC_STATIC,13,84,19,9
|
||||
PUSHBUTTON "OK",ID_OK,114,249,42,13
|
||||
EDITTEXT IDC_EDIT_THREAD,36,97,229,12,ES_AUTOHSCROLL |
|
||||
ES_READONLY
|
||||
LTEXT "Thread:",IDC_STATIC,6,99,25,9
|
||||
LTEXT "From:",IDC_STATIC,4,6,19,9
|
||||
EDITTEXT IDC_EDIT_FROM,27,4,238,12,ES_AUTOHSCROLL | ES_READONLY
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DESIGNINFO
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO DISCARDABLE
|
||||
BEGIN
|
||||
ID_DIALOG, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 4
|
||||
RIGHTMARGIN, 340
|
||||
VERTGUIDE, 9
|
||||
VERTGUIDE, 309
|
||||
TOPMARGIN, 4
|
||||
BOTTOMMARGIN, 227
|
||||
HORZGUIDE, 206
|
||||
END
|
||||
|
||||
ID_DIALOG_MAIL, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 4
|
||||
RIGHTMARGIN, 281
|
||||
TOPMARGIN, 4
|
||||
BOTTOMMARGIN, 239
|
||||
END
|
||||
|
||||
ID_DIALOG_READMAIL, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 4
|
||||
RIGHTMARGIN, 265
|
||||
TOPMARGIN, 4
|
||||
BOTTOMMARGIN, 262
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon
|
||||
// remains consistent on all systems.
|
||||
ID_ICON_APP ICON DISCARDABLE "nscicon.ico"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Menu
|
||||
//
|
||||
|
||||
ID_MENU MENU DISCARDABLE
|
||||
BEGIN
|
||||
POPUP "&File"
|
||||
BEGIN
|
||||
MENUITEM "MAPI&FindNext", ID_MENU_MAPIFINDNEXT
|
||||
MENUITEM "MAPI&ReadMail", ID_MENU_MAPIREADMAIL
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "E&xit", ID_MENU_MYEXIT
|
||||
END
|
||||
POPUP "&Edit"
|
||||
BEGIN
|
||||
MENUITEM "MAPI&DeleteMail", ID_MENU_MAPIDELETEMAIL
|
||||
MENUITEM "&Clear Results", ID_MENU_CLEARRESULTS
|
||||
END
|
||||
POPUP "&Help"
|
||||
BEGIN
|
||||
MENUITEM "&About...", ID_MENU_MYABOUT
|
||||
END
|
||||
END
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 766 B |
@@ -1,303 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
|
||||
#ifndef PORT_H
|
||||
#define PORT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*****************************************************************\
|
||||
* *
|
||||
* PORT.H *
|
||||
* *
|
||||
* Win16/Win32 portability stuff *
|
||||
* *
|
||||
* A.Sokolsky *
|
||||
* 3.10.94 distilled into this header *
|
||||
* *
|
||||
\*****************************************************************/
|
||||
|
||||
/*
|
||||
* calling conventions
|
||||
*/
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
#ifndef CDECL
|
||||
#define CDECL __cdecl
|
||||
#endif // CDECL
|
||||
|
||||
#ifndef PASCAL
|
||||
#define PASCAL __pascal
|
||||
#endif // PASCAL
|
||||
|
||||
#ifdef FASTCALL
|
||||
#error FASTCALL defined
|
||||
#endif // FASTCALL
|
||||
|
||||
|
||||
#ifdef NDEBUG
|
||||
#define FASTCALL __fastcall
|
||||
#else
|
||||
#define FASTCALL PASCAL
|
||||
#endif // NDEBUG
|
||||
|
||||
|
||||
|
||||
#ifndef HWND2DWORD
|
||||
# ifdef WIN32
|
||||
# define HWND2DWORD(X_hWnd) ( (DWORD)(X_hWnd) )
|
||||
# else // WIN16
|
||||
# define HWND2DWORD(X_hWnd) ( (DWORD)MAKELONG(((WORD)(X_hWnd)), 0) )
|
||||
# endif
|
||||
#endif // HWND2DWORD
|
||||
|
||||
|
||||
/*
|
||||
* WIN16 - WIN32 compatibility stuff
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
# define DLLEXPORT __declspec( dllexport )
|
||||
# define EXPORT
|
||||
# define LOADDS
|
||||
# define HUGE
|
||||
# ifndef FAR
|
||||
# define FAR
|
||||
# endif // FAR
|
||||
# ifndef NEAR
|
||||
# define NEAR
|
||||
# endif // NEAR
|
||||
# ifdef UNICODE
|
||||
# define SIZEOF(x) (sizeof(x)/sizeof(WCHAR))
|
||||
# else
|
||||
# define SIZEOF(x) sizeof(x)
|
||||
# endif
|
||||
|
||||
#else // !WIN32 == WIN16
|
||||
|
||||
# define DLLEXPORT
|
||||
# define EXPORT __export
|
||||
# define LOADDS __loadds
|
||||
# define HUGE __huge
|
||||
# ifndef FAR
|
||||
# define FAR __far
|
||||
# define NEAR __near
|
||||
# endif // FAR
|
||||
# define CONST const
|
||||
# define SIZEOF(x) sizeof(x)
|
||||
# define CHAR char
|
||||
# define TCHAR char
|
||||
# define WCHAR char
|
||||
# ifndef LPTSTR
|
||||
# define LPTSTR LPSTR
|
||||
# endif
|
||||
# ifndef LPCTSTR
|
||||
# define LPCTSTR LPCSTR
|
||||
# endif
|
||||
# define UNREFERENCED_PARAMETER(x) x;
|
||||
# ifndef TEXT
|
||||
# define TEXT(x) x
|
||||
# endif
|
||||
# define GetWindowTextW GetWindowText
|
||||
# define lstrcpyW lstrcpy
|
||||
|
||||
# define BN_DBLCLK BN_DOUBLECLICKED // ~~MRJ needed for custom control.
|
||||
// ~~MRJ begin Win95 backward compat section
|
||||
# define LPWSTR LPSTR
|
||||
# define LPCWSTR LPCSTR
|
||||
|
||||
// button check state for WIN16
|
||||
#ifndef BST_UNCHECKED
|
||||
#define BST_UNCHECKED 0x0000
|
||||
#endif
|
||||
|
||||
#ifndef BST_CHECKED
|
||||
#define BST_CHECKED 0x0001
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef WIN95_COMPAT
|
||||
# define WIN95_COMPAT
|
||||
#endif
|
||||
|
||||
// ~~MRJ end Win95 compat section.
|
||||
|
||||
// critical section API stubs
|
||||
typedef DWORD CRITICAL_SECTION;
|
||||
typedef CRITICAL_SECTION FAR * LPCRITICAL_SECTION;
|
||||
#ifdef __cplusplus
|
||||
inline void InitializeCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
inline void DeleteCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
inline void EnterCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
inline void LeaveCriticalSection(LPCRITICAL_SECTION lpSection) {}
|
||||
#endif // __cplusplus
|
||||
|
||||
// Added for nssock16 ---Neeti
|
||||
#ifndef ZeroMemory
|
||||
#include <memory.h>
|
||||
#define ZeroMemory(PTR, SIZE) memset(PTR, 0, SIZE)
|
||||
#endif // ZeroMemory
|
||||
|
||||
#endif // WIN16
|
||||
|
||||
/*
|
||||
* unix - windows compatibility stuff
|
||||
*/
|
||||
typedef DWORD u_int32;
|
||||
typedef WORD u_int16;
|
||||
typedef BYTE u_int8;
|
||||
#ifdef WIN32
|
||||
typedef short int Bool16;
|
||||
#else // WIN16
|
||||
typedef BOOL Bool16;
|
||||
#endif // WIN16
|
||||
|
||||
/*
|
||||
* Cross Platform Compatibility
|
||||
*/
|
||||
#ifndef UNALIGNED
|
||||
# ifdef _M_ALPHA
|
||||
# define UNALIGNED __unaligned
|
||||
# else // !_M_ALPHA
|
||||
# define UNALIGNED
|
||||
# endif // !_M_ALPHA
|
||||
#endif // UNALIGNED
|
||||
|
||||
//
|
||||
// RICHIE - for the Alpha port
|
||||
//
|
||||
#ifdef _M_ALPHA
|
||||
# undef pascal
|
||||
# undef PASCAL
|
||||
# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
|
||||
# define pascal __stdcall
|
||||
# define PASCAL __stdcall
|
||||
# else
|
||||
# define PASCAL
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Useful Types
|
||||
*/
|
||||
typedef char HUGE *HPSTR;
|
||||
typedef const char HUGE *HPCSTR;
|
||||
typedef unsigned char HUGE *HPBYTE;
|
||||
typedef WORD HUGE *HPWORD;
|
||||
typedef UINT FAR *LPUINT;
|
||||
typedef BOOL (CALLBACK *USERABORTPROC)();
|
||||
typedef BOOL (CALLBACK *PROGRESSPROC)(UINT uPos, UINT uRange);
|
||||
typedef int INT; // ~~MRJ a function needed this defined.
|
||||
typedef MINMAXINFO FAR *LPMINMAXINFO; // ~~MRJ
|
||||
|
||||
//
|
||||
// stuff missing from windows.h
|
||||
//
|
||||
#ifndef MAKEWORD
|
||||
#define MAKEWORD(low, high) ((WORD)(((BYTE)(low)) | (((WORD)((BYTE)(high))) << 8)))
|
||||
#endif // MAKEWORD
|
||||
|
||||
#ifdef WIN32
|
||||
# ifndef hmemcpy
|
||||
# define hmemcpy memcpy
|
||||
# endif // !defined(hmemcpy)
|
||||
# define _fmemset memset
|
||||
|
||||
# include <malloc.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
inline BOOL IsGDIObject(HGDIOBJ hObj) { return (hObj != 0); }
|
||||
inline void *_halloc(long num, unsigned int size) { return malloc(num * size); }
|
||||
inline void _hfree( void *memblock ) { free(memblock); }
|
||||
/*
|
||||
inline BOOL IsInstance(HINSTANCE hInst) {
|
||||
# ifdef WIN32
|
||||
return (hInst != 0);
|
||||
# else // WIN16
|
||||
return (hInst > HINSTANCE_ERROR);
|
||||
# endif
|
||||
}
|
||||
*/
|
||||
|
||||
#endif // __cplusplus
|
||||
|
||||
WINUSERAPI HANDLE WINAPI LoadImageA(HINSTANCE, LPCSTR, UINT, int, int, UINT);
|
||||
|
||||
#endif // WIN32
|
||||
|
||||
#ifdef __cplusplus
|
||||
inline BOOL IsInstance(HINSTANCE hInst) {
|
||||
# ifdef WIN32
|
||||
return (hInst != 0);
|
||||
# else // WIN16
|
||||
return (hInst > HINSTANCE_ERROR);
|
||||
# endif
|
||||
}
|
||||
inline void SetWindowSmallIcon(HINSTANCE hInst, HWND hWnd, UINT uIconResourceId) {
|
||||
#ifdef WIN32
|
||||
# ifndef WM_SETICON
|
||||
# define WM_SETICON 0x0080
|
||||
# endif // WM_SETICON
|
||||
# ifndef IMAGE_ICON
|
||||
# define IMAGE_ICON 1
|
||||
# endif
|
||||
assert(IsWindow(hWnd));
|
||||
HICON hIcon = (HICON)LoadImageA(hInst, MAKEINTRESOURCE(uIconResourceId), IMAGE_ICON,
|
||||
16, 16, 0);
|
||||
if(NULL != hIcon) {
|
||||
SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);
|
||||
} else {
|
||||
HICON hIcon = LoadIcon(hInst, MAKEINTRESOURCE(uIconResourceId));
|
||||
assert(hIcon != 0);
|
||||
SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);
|
||||
}
|
||||
#endif // WIN32
|
||||
}
|
||||
#endif // __cplusplus
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* PORT_H */
|
||||
@@ -1,137 +0,0 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.1 (the "License"); you may not use this file except in
|
||||
* compliance with the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the NPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the NPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
//
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
|
||||
#ifndef MAPI_OLE // Because MSFT doesn't do this for us :-(
|
||||
#include <mapi.h>
|
||||
#endif
|
||||
|
||||
#include "port.h"
|
||||
#include "resource.h"
|
||||
|
||||
//
|
||||
// Variables...
|
||||
//
|
||||
extern HINSTANCE hInst;
|
||||
extern HINSTANCE m_hInstMapi;
|
||||
extern LHANDLE mapiSession;
|
||||
|
||||
//
|
||||
// Forward declarations...
|
||||
//
|
||||
extern void ShowMessage(HWND hWnd, LPSTR msg);
|
||||
extern void SetFooter(LPSTR msg);
|
||||
extern LPSTR GetMAPIError(LONG errorCode);
|
||||
lpMapiMessage mailPtr = NULL;
|
||||
|
||||
void
|
||||
ProcessReadMailCommand(HWND hWnd, int id, HWND hCtl, UINT codeNotify)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case ID_OK:
|
||||
case IDCANCEL:
|
||||
EndDialog(hWnd, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL CALLBACK LOADDS
|
||||
ReadMailDlgProc(HWND hWndMail, UINT wMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (wMsg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
DWORD i;
|
||||
// Do everything we need to display the message pointed to by
|
||||
// mailPtr
|
||||
if (!mailPtr)
|
||||
break;
|
||||
|
||||
// Start with the basics...
|
||||
SetDlgItemText(hWndMail, IDC_EDIT_SUBJECT, mailPtr->lpszSubject);
|
||||
SetDlgItemText(hWndMail, IDC_EDIT_DATETIME, mailPtr->lpszDateReceived);
|
||||
SetDlgItemText(hWndMail, IDC_EDIT_THREAD, mailPtr->lpszConversationID);
|
||||
SetDlgItemText(hWndMail, IDC_EDIT_BODYTEXT, mailPtr->lpszNoteText);
|
||||
|
||||
char buf[1024];
|
||||
wsprintf(buf, "%s (%s)", mailPtr->lpOriginator->lpszName,
|
||||
mailPtr->lpOriginator->lpszAddress);
|
||||
SetDlgItemText(hWndMail, IDC_EDIT_FROM, buf);
|
||||
|
||||
for (i=0; i<mailPtr->nRecipCount; i++)
|
||||
{
|
||||
wsprintf(buf, "%s (%s)", mailPtr->lpRecips[i].lpszName,
|
||||
mailPtr->lpRecips[i].lpszAddress);
|
||||
ListBox_InsertString(GetDlgItem(hWndMail, IDC_LIST_RECIPIENTS),
|
||||
ListBox_GetCount(GetDlgItem(hWndMail, IDC_LIST_RECIPIENTS)),
|
||||
buf);
|
||||
}
|
||||
|
||||
for (i=0; i<mailPtr->nFileCount; i++)
|
||||
{
|
||||
ListBox_InsertString(GetDlgItem(hWndMail, IDC_LIST_ATTACHMENTS),
|
||||
ListBox_GetCount(GetDlgItem(hWndMail, IDC_LIST_ATTACHMENTS)),
|
||||
mailPtr->lpFiles[i].lpszPathName);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
HANDLE_WM_COMMAND(hWndMail, wParam, lParam, ProcessReadMailCommand);
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
DisplayMAPIReadMail(HWND hWnd, lpMapiMessage msgPtr)
|
||||
{
|
||||
mailPtr = msgPtr;
|
||||
DialogBox(hInst, MAKEINTRESOURCE(ID_DIALOG_READMAIL), hWnd,
|
||||
(DLGPROC)ReadMailDlgProc);
|
||||
}
|
||||
@@ -1,108 +0,0 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by mtest32.rc
|
||||
//
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
#define ID_GUI_MESSAGE1 1
|
||||
#define ID_BUTTON_MAPIADDRESS 3
|
||||
#define ID_DIALOG 101
|
||||
#define ID_ICON_APP 102
|
||||
#define ID_MENU 104
|
||||
#define ID_DIALOG_MAIL 105
|
||||
#define ID_DIALOG_READMAIL 106
|
||||
#define ID_SETFROMEDIT 1000
|
||||
#define ID_SETTEXT 1001
|
||||
#define ID_GETROWS 1001
|
||||
#define ID_EDIT 1002
|
||||
#define ID_EDIT_HWND 1002
|
||||
#define ID_RESOURCETEXT 1003
|
||||
#define ID_GETTEXT 1003
|
||||
#define ID_STATIC_RESULT 1004
|
||||
#define ID_GETVISROWS 1005
|
||||
#define ID_GETWINID 1006
|
||||
#define ID_SETROWFOCUS 1007
|
||||
#define ID_GETROWFOCUS 1008
|
||||
#define ID_EDIT_ROW 1009
|
||||
#define ID_LIST_RESULT 1010
|
||||
#define ID_GETCOLCOUNT 1011
|
||||
#define ID_BUTTON_LOGON 1011
|
||||
#define ID_SETROWINVIEW 1012
|
||||
#define ID_BUTTON_LOGOFF 1012
|
||||
#define ID_GETNUMCHILDREN 1013
|
||||
#define ID_EDIT_USERNAME 1013
|
||||
#define ID_CLEARRESULTS 1014
|
||||
#define ID_EDIT_PW 1014
|
||||
#define ID_BUTTON_FINDNEXT 1015
|
||||
#define ID_BUTTON_CLEAR 1016
|
||||
#define ID_BUTTON_READMAIL 1017
|
||||
#define ID_BUTTON_DELETEMAIL 1018
|
||||
#define IDC_EDIT_RESOLVENAME 1019
|
||||
#define ID_BUTTON_MAPISENDMAIL 1020
|
||||
#define ID_BUTTON_NSCPVERSION 1020
|
||||
#define ID_BUTTON_RESOLVENAME 1021
|
||||
#define ID_BUTTON_MAPISENDDOCUMENTS 1021
|
||||
#define ID_EDIT_TOADDRESS 1022
|
||||
#define ID_EDIT_CCADDRESS 1023
|
||||
#define ID_BUTTON_DETAILS 1024
|
||||
#define ID_EDIT_BCCADDRESS 1024
|
||||
#define ID_EDIT_SUBJECT 1025
|
||||
#define ID_BUTTON_MAIL 1025
|
||||
#define ID_BUTTON_FREEBUFFER 1026
|
||||
#define ID_EDIT_NOTETEXT 1026
|
||||
#define ID_EDIT_ATTACH1 1027
|
||||
#define ID_BUTTON_SYNC 1027
|
||||
#define ID_EDIT_ATTACH2 1028
|
||||
#define IDC_CHECK_BODYASFILE 1028
|
||||
#define ID_EDIT_ATTACH3 1029
|
||||
#define IDC_CHECK_ENVELOPEONLY 1029
|
||||
#define IDC_LIST_ATTACHMENTS 1029
|
||||
#define ID_EDIT_ATTACH4 1030
|
||||
#define IDC_CHECK_PEEK 1030
|
||||
#define IDC_EDIT_BODYTEXT 1030
|
||||
#define IDC_CHECK_SUPPRESSATTACH 1031
|
||||
#define IDC_LIST_RECIPIENTS 1031
|
||||
#define ID_BUTTON_MAPISAVEMAIL 1031
|
||||
#define IDC_EDIT_SUBJECT 1032
|
||||
#define IDC_EDIT_DATETIME 1033
|
||||
#define ID_OK 1034
|
||||
#define IDC_EDIT_THREAD 1035
|
||||
#define ID_CHECK_SHOWDIALOG 1035
|
||||
#define IDC_EDIT_FROM 1036
|
||||
#define ID_MENU_MYEXIT 30001
|
||||
#define ID_MENU_CLEAR 30002
|
||||
#define ID_MENU_MYABOUT 30003
|
||||
#define ID_MENU_CLEARRESULTS 30004
|
||||
#define ID_MENU_MAPIDELETEMAIL 30005
|
||||
#define ID_MENU_MAPIFINDNEXT 30006
|
||||
#define ID_MENU_MAPIREADMAIL 30007
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 107
|
||||
#define _APS_NEXT_COMMAND_VALUE 30008
|
||||
#define _APS_NEXT_CONTROL_VALUE 1036
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
||||
@@ -1,117 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<!-- If you modify this file, please also update the following files -->
|
||||
<!-- mailnews/mapi/resources/content/contents.rdf in the ns tree -->
|
||||
|
||||
<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:chrome="http://www.mozilla.org/rdf/chrome#">
|
||||
|
||||
<!-- list all the packages being supplied by this jar -->
|
||||
<RDF:Seq about="urn:mozilla:package:root">
|
||||
<RDF:li resource="urn:mozilla:package:messenger"/>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- package information -->
|
||||
<RDF:Description about="urn:mozilla:package:messenger"
|
||||
chrome:displayName="Messenger"
|
||||
chrome:author="mozilla.org"
|
||||
chrome:name="messenger"
|
||||
chrome:localeVersion="0.9.4"
|
||||
chrome:skinVersion="0.9.4">
|
||||
</RDF:Description>
|
||||
|
||||
<!-- overlay information -->
|
||||
<RDF:Seq about="urn:mozilla:overlays">
|
||||
<RDF:li resource="chrome://communicator/content/pref/preftree.xul"/>
|
||||
<RDF:li resource="chrome://communicator/content/pref/pref-appearance.xul"/>
|
||||
<RDF:li resource="chrome://communicator/content/pref/pref-advanced.xul"/>
|
||||
<RDF:li resource="chrome://communicator/content/tasksOverlay.xul"/>
|
||||
<RDF:li resource="chrome://navigator/content/navigatorOverlay.xul"/>
|
||||
<RDF:li resource="chrome://communicator/content/history/history.xul"/>
|
||||
<RDF:li resource="chrome://communicator/content/bookmarks/bookmarks.xul"/>
|
||||
<RDF:li resource="chrome://communicator/content/bookmarks/bm-find.xul"/>
|
||||
<RDF:li resource="chrome://messenger/content/messenger.xul"/>
|
||||
<RDF:li resource="chrome://messenger/content/mail3PaneWindowVertLayout.xul"/>
|
||||
<RDF:li resource="chrome://messenger/content/messengercompose/messengercompose.xul"/>
|
||||
<RDF:li resource="chrome://messenger/content/addressbook/addressbook.xul"/>
|
||||
<RDF:li resource="chrome://messenger/content/addressbook/abSelectAddressesDialog.xul"/>
|
||||
<RDF:li resource="chrome://editor/content/editor.xul"/>
|
||||
<RDF:li resource="chrome://messenger/content/pref-mailnews.xul"/>
|
||||
</RDF:Seq>
|
||||
|
||||
|
||||
<!-- messenger preferences branches -->
|
||||
<RDF:Seq about="chrome://communicator/content/pref/preftree.xul">
|
||||
<RDF:li>chrome://messenger/content/mailPrefsOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger startup pref -->
|
||||
<RDF:Seq about="chrome://communicator/content/pref/pref-appearance.xul">
|
||||
<RDF:li>chrome://messenger/content/mailPrefsOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger js toggle pref -->
|
||||
<RDF:Seq about="chrome://communicator/content/pref/pref-advanced.xul">
|
||||
<RDF:li>chrome://messenger/content/mailPrefsOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger taskbar/tasks menu items -->
|
||||
<RDF:Seq about="chrome://communicator/content/tasksOverlay.xul">
|
||||
<RDF:li>chrome://messenger/content/mailTasksOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for History -->
|
||||
<RDF:Seq about="chrome://communicator/content/history/history.xul">
|
||||
<RDF:li>chrome://messenger/content/mailNavigatorOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for Bookmarks -->
|
||||
<RDF:Seq about="chrome://communicator/content/bookmarks/bookmarks.xul">
|
||||
<RDF:li>chrome://messenger/content/mailNavigatorOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for History -->
|
||||
<RDF:Seq about="chrome://communicator/content/bookmarks/bm-find.xul">
|
||||
<RDF:li>chrome://messenger/content/mailNavigatorOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for Navigator -->
|
||||
<RDF:Seq about="chrome://navigator/content/navigatorOverlay.xul">
|
||||
<RDF:li>chrome://messenger/content/mailNavigatorOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for Messenger -->
|
||||
<RDF:Seq about="chrome://messenger/content/messenger.xul">
|
||||
<RDF:li>chrome://messenger/content/mailMessengerOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
<RDF:Seq about="chrome://messenger/content/mail3PaneWindowVertLayout.xul">
|
||||
<RDF:li>chrome://messenger/content/mailMessengerOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for Mail Compose -->
|
||||
<RDF:Seq about="chrome://messenger/content/messengercompose/messengercompose.xul">
|
||||
<RDF:li>chrome://messenger/content/mailMessengerComposeOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for Addressbook -->
|
||||
<RDF:Seq about="chrome://messenger/content/addressbook/addressbook.xul">
|
||||
<RDF:li>chrome://messenger/content/mailABOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- messenger items for Select Addresses dialog -->
|
||||
<RDF:Seq about="chrome://messenger/content/addressbook/abSelectAddressesDialog.xul">
|
||||
<RDF:li>chrome://messenger/content/mailOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
|
||||
<!-- messenger items for Composer -->
|
||||
<RDF:Seq about="chrome://editor/content/editor.xul">
|
||||
<RDF:li>chrome://messenger/content/mailEditorOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
<!-- mapi items for Mail And Newsgroups preferences pane -->
|
||||
<RDF:Seq about="chrome://messenger/content/pref-mailnews.xul">
|
||||
<RDF:li>chrome://messenger/content/pref-mailnewsOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
</RDF:RDF>
|
||||
@@ -1,4 +0,0 @@
|
||||
messenger.jar:
|
||||
content/messenger/pref-mailnewsOverlay.xul
|
||||
+ content/messenger/contents.rdf
|
||||
content/messenger/pref-mailnewsOverlay.js
|
||||
@@ -1,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>
|
||||
@@ -1,14 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<RDF:RDF xmlns:chrome="http://www.mozilla.org/rdf/chrome#"
|
||||
xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||
|
||||
<!-- mapi items for mailnews preferences -->
|
||||
<RDF:Seq about="urn:mozilla:overlays">
|
||||
<RDF:li resource="chrome://messenger/content/pref-mailnews.xul"/>
|
||||
</RDF:Seq>
|
||||
|
||||
<RDF:Seq about="chrome://messenger/content/pref-mailnews.xul">
|
||||
<RDF:li>chrome://messenger/content/pref-mailnewsOverlay.xul</RDF:li>
|
||||
</RDF:Seq>
|
||||
|
||||
</RDF:RDF>
|
||||
@@ -1,104 +0,0 @@
|
||||
/*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 2001 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Srilatha Moturi <srilatha@netscape.com>
|
||||
*/
|
||||
|
||||
function mailnewsOverlayStartup() {
|
||||
mailnewsOverlayInit();
|
||||
parent.hPrefWindow.registerOKCallbackFunc(onOK);
|
||||
if (!("mapiPref" in parent)) {
|
||||
parent.mapiPref = new Object;
|
||||
parent.mapiPref.isDefaultMailClient =
|
||||
document.getElementById("mailnewsEnableMapi").checked;
|
||||
}
|
||||
else {
|
||||
// when we switch between different panes
|
||||
// set the checkbox based on the saved state
|
||||
var mailnewsEnableMapi = document.getElementById("mailnewsEnableMapi");
|
||||
if (parent.mapiPref.isDefaultMailClient)
|
||||
mailnewsEnableMapi.setAttribute("checked", "true");
|
||||
else
|
||||
mailnewsEnableMapi.setAttribute("checked", "false");
|
||||
}
|
||||
}
|
||||
|
||||
function mailnewsOverlayInit() {
|
||||
try {
|
||||
var mapiRegistry = Components.classes[ "@mozilla.org/mapiregistry;1" ].
|
||||
getService( Components.interfaces.nsIMapiRegistry );
|
||||
}
|
||||
catch(ex){
|
||||
mapiRegistry = null;
|
||||
}
|
||||
|
||||
const prefbase = "system.windows.lock_ui.";
|
||||
var mailnewsEnableMapi = document.getElementById("mailnewsEnableMapi");
|
||||
if (mapiRegistry) {
|
||||
// initialise preference component.
|
||||
// While the data is coming from the system registry, we use a set
|
||||
// of parallel preferences to indicate if the ui should be locked.
|
||||
try {
|
||||
var prefService = Components.classes["@mozilla.org/preferences-service;1"]
|
||||
.getService()
|
||||
.QueryInterface(Components.interfaces.nsIPrefService);
|
||||
var prefBranch = prefService.getBranch(prefbase);
|
||||
if (prefBranch && prefBranch.prefIsLocked("default_mail_client")) {
|
||||
if (prefBranch.getBoolPref("default_mail_client"))
|
||||
mapiRegistry.setDefaultMailClient();
|
||||
else
|
||||
mapiRegistry.unsetDefaultMailClient();
|
||||
mailnewsEnableMapi.setAttribute("disabled", "true");
|
||||
}
|
||||
}
|
||||
catch(ex) {}
|
||||
if (mapiRegistry.isDefaultMailClient)
|
||||
mailnewsEnableMapi.setAttribute("checked", "true");
|
||||
else
|
||||
mailnewsEnableMapi.setAttribute("checked", "false");
|
||||
}
|
||||
else
|
||||
mailnewsEnableMapi.setAttribute("disabled", "true");
|
||||
}
|
||||
|
||||
function onEnableMapi() {
|
||||
// save the state of the checkbox
|
||||
if ("mapiPref" in parent)
|
||||
parent.mapiPref.isDefaultMailClient =
|
||||
document.getElementById("mailnewsEnableMapi").checked;
|
||||
}
|
||||
|
||||
function onOK()
|
||||
{
|
||||
try {
|
||||
var mapiRegistry = Components.classes[ "@mozilla.org/mapiregistry;1" ].
|
||||
getService( Components.interfaces.nsIMapiRegistry );
|
||||
}
|
||||
catch(ex){
|
||||
mapiRegistry = null;
|
||||
}
|
||||
if (mapiRegistry &&
|
||||
("mapiPref" in parent) &&
|
||||
(mapiRegistry.isDefaultMailClient != parent.mapiPref.isDefaultMailClient)) {
|
||||
if (parent.mapiPref.isDefaultMailClient)
|
||||
mapiRegistry.setDefaultMailClient();
|
||||
else
|
||||
mapiRegistry.unsetDefaultMailClient();
|
||||
}
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<!--
|
||||
The contents of this file are subject to the Mozilla Public
|
||||
License Version 1.1 (the "License"); you may not use this file
|
||||
except in compliance with the License. You may obtain a copy of
|
||||
the License at http://www.mozilla.org/MPL/
|
||||
|
||||
oftware distributed under the License is distributed on an "AS
|
||||
IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
implied. See the License for the specific language governing
|
||||
rights and limitations under the License.
|
||||
|
||||
The Original Code is mozilla.org code.
|
||||
The Initial Developer of the Original Code is Netscape
|
||||
Communications Corporation. Portions created by Netscape are
|
||||
Copyright (C) 2001 Netscape Communications Corporation. All
|
||||
Rights Reserved.
|
||||
|
||||
Contributor(s):
|
||||
Srilatha Moturi <srilatha@netscape.com>
|
||||
-->
|
||||
|
||||
<!DOCTYPE window [
|
||||
<!ENTITY % brandDTD SYSTEM "chrome://global/locale/brand.dtd" >
|
||||
%brandDTD;
|
||||
<!ENTITY % prefMailnewsOverlayDTD SYSTEM "chrome://messenger/locale/pref-mailnewsOverlay.dtd" >
|
||||
%prefMailnewsOverlayDTD;
|
||||
]>
|
||||
<overlay id="prefMailnewsOverlay"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
||||
|
||||
<script type="application/x-javascript">
|
||||
<![CDATA[
|
||||
_elementIDs.push("mailnewsEnableMapi");
|
||||
]]>
|
||||
</script>
|
||||
<script type="application/x-javascript" src="chrome://messenger/content/pref-mailnewsOverlay.js"/>
|
||||
<hbox autostretch="never" id="mapi">
|
||||
<checkbox id="mailnewsEnableMapi" label="&enableMapi.label;"
|
||||
accesskey="&enableMapi.accesskey;"
|
||||
oncommand="onEnableMapi();"
|
||||
startFunc="mailnewsOverlayStartup();"/>
|
||||
</hbox>
|
||||
</overlay>
|
||||
@@ -1,3 +0,0 @@
|
||||
en-US.jar:
|
||||
locale/en-US/messenger/pref-mailnewsOverlay.dtd
|
||||
locale/en-US/messenger/mapi.properties
|
||||
@@ -1,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>
|
||||
@@ -1,18 +0,0 @@
|
||||
# Mail Integration Dialog
|
||||
dialogTitle=%S Mail
|
||||
dialogText=Do you want to use %S as the default mail application?
|
||||
checkboxText=Do not display this dialog again
|
||||
|
||||
# MAPI Messages
|
||||
loginText=Please enter your password for %S:
|
||||
loginTextwithName=Please enter your username and password
|
||||
loginTitle=%S Mail
|
||||
PasswordTitle=%S Mail
|
||||
|
||||
# MAPI Error Messages
|
||||
errorMessage=%S Mail could not be set as the default mail application because a registry key could not be updated. Verify with your system administrator that you have write access to your system registry, and then try again.
|
||||
errorMessageTitle=%S Mail
|
||||
|
||||
# MAPI Security Messages
|
||||
mapiBlindSendWarning=Another application is attempting to send mail using your user profile. Are you sure you want to send mail?
|
||||
mapiBlindSendDontShowAgain=Warn me whenever other applications try to send mail from me
|
||||
@@ -1,3 +0,0 @@
|
||||
<!ENTITY enableMapiTitle.label "When sending mail from other applications">
|
||||
<!ENTITY enableMapi.label "Use &vendorShortName; Mail as the default mail application.">
|
||||
<!ENTITY enableMapi.accesskey "u">
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
1153
mozilla/netwerk/base/src/nsFileTransport.cpp
Normal file
1153
mozilla/netwerk/base/src/nsFileTransport.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,3 @@
|
||||
#!nmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
@@ -18,10 +17,22 @@
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
#
|
||||
|
||||
DEPTH=..\..\..
|
||||
DEPTH = ../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
DIRS=mapitest
|
||||
DIRS = \
|
||||
public \
|
||||
memcache \
|
||||
filecache \
|
||||
mgr \
|
||||
build \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
13
mozilla/mailnews/mapi/old/makefile.win → mozilla/netwerk/cache/Makefile.win
vendored
Normal file → Executable file
13
mozilla/mailnews/mapi/old/makefile.win → mozilla/netwerk/cache/Makefile.win
vendored
Normal file → Executable file
@@ -1,4 +1,4 @@
|
||||
#!nmake
|
||||
#!gmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
@@ -19,8 +19,15 @@
|
||||
#
|
||||
# Contributor(s):
|
||||
|
||||
DEPTH=..\..
|
||||
|
||||
DIRS=public lib mapi32 tests hook
|
||||
DEPTH=..\..
|
||||
DIRS= \
|
||||
public \
|
||||
mgr \
|
||||
memcache \
|
||||
filecache \
|
||||
build \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
54
mozilla/netwerk/cache/build/Makefile.in
vendored
Normal file
54
mozilla/netwerk/cache/build/Makefile.in
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
#
|
||||
|
||||
DEPTH = ../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = nkcacke
|
||||
LIBRARY_NAME = necko_cache
|
||||
IS_COMPONENT = 1
|
||||
|
||||
CPPSRCS = nsNetDataCacheModule.cpp
|
||||
|
||||
SHARED_LIBRARY_LIBS = \
|
||||
$(DIST)/lib/libnkcachemgr_s.a \
|
||||
$(DIST)/lib/libnkfilecache_s.a \
|
||||
$(DIST)/lib/libnkmemcache_s.a \
|
||||
$(DIST)/lib/libmozdbm_s.a \
|
||||
$(DIST)/lib/libxpcomio_s.a \
|
||||
$(NULL)
|
||||
|
||||
LOCAL_INCLUDES = \
|
||||
-I$(DEPTH)/netwerk/cache/memcache \
|
||||
-I$(DEPTH)/netwerk/cache/filecache \
|
||||
-I$(DEPTH)/netwerk/cache/mgr \
|
||||
$(NULL)
|
||||
|
||||
EXTRA_DSO_LDOPTS = \
|
||||
$(MKSHLIB_FORCE_ALL) \
|
||||
$(SHARED_LIBRARY_LIBS) \
|
||||
$(MKSHLIB_UNFORCE_ALL) \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
$(LIBRARY) $(SHARED_LIBRARY): $(SHARED_LIBRARY_LIBS) Makefile
|
||||
|
||||
51
mozilla/netwerk/cache/build/makefile.win
vendored
Normal file
51
mozilla/netwerk/cache/build/makefile.win
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
#!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.
|
||||
#
|
||||
|
||||
DEPTH=..\..\..
|
||||
MODULE=nkcache
|
||||
|
||||
MAKE_OBJ_TYPE=DLL
|
||||
DLLNAME=nkcache
|
||||
DLL=.\$(OBJDIR)\$(DLLNAME).dll
|
||||
|
||||
CPP_OBJS= \
|
||||
.\$(OBJDIR)\nsNetDataCacheModule.obj \
|
||||
$(NULL)
|
||||
|
||||
LLIBS= \
|
||||
$(DIST)\lib\nkcachemgr_s.lib \
|
||||
$(DIST)\lib\nkfilecache_s.lib \
|
||||
$(DIST)\lib\nkmemcache_s.lib \
|
||||
$(DIST)\lib\dbm32.lib \
|
||||
$(DIST)\lib\xpcom.lib \
|
||||
$(LIBNSPR)
|
||||
|
||||
INCS = $(INCS) \
|
||||
-I$(DEPTH)\netwerk\cache\memcache \
|
||||
-I$(DEPTH)\netwerk\cache\filecache \
|
||||
-I$(DEPTH)\netwerk\cache\mgr \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
install:: $(DLL)
|
||||
$(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).dll $(DIST)\bin\components
|
||||
$(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).lib $(DIST)\lib
|
||||
|
||||
49
mozilla/netwerk/cache/build/nsNetDataCacheModule.cpp
vendored
Normal file
49
mozilla/netwerk/cache/build/nsNetDataCacheModule.cpp
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
/* -*- 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 Communicator client code, released
|
||||
* March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsIModule.h"
|
||||
#include "nscore.h"
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIGenericFactory.h"
|
||||
|
||||
#include "nsINetDataCache.h"
|
||||
#include "nsINetDataCacheManager.h"
|
||||
#include "nsMemCacheCID.h"
|
||||
#include "nsMemCache.h"
|
||||
#include "nsNetDiskCache.h"
|
||||
#include "nsNetDiskCacheCID.h"
|
||||
#include "nsCacheManager.h"
|
||||
|
||||
// Factory method to create a new nsMemCache instance. Used
|
||||
// by nsNetDataCacheModule
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsMemCache, Init)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsNetDiskCache, Init)
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsCacheManager, Init)
|
||||
|
||||
static nsModuleComponentInfo components[] = {
|
||||
{ "Memory Cache", NS_MEM_CACHE_FACTORY_CID, NS_NETWORK_MEMORY_CACHE_PROGID, nsMemCacheConstructor },
|
||||
{ "File Cache", NS_NETDISKCACHE_CID, NS_NETWORK_FILE_CACHE_PROGID, nsNetDiskCacheConstructor },
|
||||
{ "Cache Manager",NS_CACHE_MANAGER_CID, NS_NETWORK_CACHE_MANAGER_PROGID,nsCacheManagerConstructor }
|
||||
};
|
||||
|
||||
NS_IMPL_NSGETMODULE("Network Data Cache", components)
|
||||
60
mozilla/netwerk/cache/filecache/Makefile.in
vendored
Normal file
60
mozilla/netwerk/cache/filecache/Makefile.in
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
#
|
||||
# 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 Communicator.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Intel Corp.
|
||||
# Portions created by Intel Corp. are
|
||||
# Copyright (C) 1999, 1999 Intel Corp. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Yixiong Zou <yixiong.zou@intel.com>
|
||||
# Carl Wong <carl.wong@intel.com>
|
||||
#
|
||||
|
||||
DEPTH = ../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
VPATH = @srcdir@
|
||||
srcdir = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = nkcache
|
||||
|
||||
LIBRARY_NAME = nkfilecache_s
|
||||
|
||||
REQUIRES = nspr dbm
|
||||
|
||||
EXTRA_DSO_LDOPTS += -L$(DIST)/lib -lmozdbm_s
|
||||
|
||||
EXPORTS=nsNetDiskCacheCID.h \
|
||||
nsNetDiskCache.h \
|
||||
nsIDBAccessor.h \
|
||||
nsDBAccessor.h \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = \
|
||||
nsDBAccessor.cpp\
|
||||
nsDBEnumerator.cpp \
|
||||
nsNetDiskCache.cpp \
|
||||
nsDiskCacheRecord.cpp \
|
||||
nsDiskCacheRecordChannel.cpp \
|
||||
$(NULL)
|
||||
|
||||
EXTRA_LIBS = $(NSPR_LIBS)
|
||||
|
||||
# we don't want the shared lib, but we want to force the creation of a
|
||||
# static lib.
|
||||
override NO_SHARED_LIB=1
|
||||
override NO_STATIC_LIB=
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
44
mozilla/netwerk/cache/filecache/makefile.win
vendored
Normal file
44
mozilla/netwerk/cache/filecache/makefile.win
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
#!gmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
|
||||
DEPTH=..\..\..
|
||||
|
||||
include <$(DEPTH)/config/config.mak>
|
||||
|
||||
MODULE = nkcache
|
||||
|
||||
LIBRARY_NAME = nkfilecache_s
|
||||
|
||||
CPP_OBJS= \
|
||||
.\$(OBJDIR)\nsDBAccessor.obj \
|
||||
.\$(OBJDIR)\nsDBEnumerator.obj \
|
||||
.\$(OBJDIR)\nsNetDiskCache.obj \
|
||||
.\$(OBJDIR)\nsDiskCacheRecord.obj \
|
||||
.\$(OBJDIR)\nsDiskCacheRecordChannel.obj \
|
||||
$(NULL)
|
||||
|
||||
EXPORTS=nsNetDiskCacheCID.h
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
install:: $(LIBRARY)
|
||||
$(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib
|
||||
|
||||
clobber::
|
||||
rm -rf $(OBJDIR)
|
||||
rm -f $(DIST)\lib\$(LIBRARY_NAME).lib
|
||||
|
||||
416
mozilla/netwerk/cache/filecache/nsDBAccessor.cpp
vendored
Normal file
416
mozilla/netwerk/cache/filecache/nsDBAccessor.cpp
vendored
Normal file
@@ -0,0 +1,416 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Intel Corp.
|
||||
* Portions created by Intel Corp. are
|
||||
* Copyright (C) 1999, 1999 Intel Corp. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Yixiong Zou <yixiong.zou@intel.com>
|
||||
* Carl Wong <carl.wong@intel.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file is part of filecache implementation.
|
||||
*
|
||||
* nsIDBAccessor is a interface that shields all the direct database access
|
||||
* method from nsNetDiskCache.
|
||||
*
|
||||
* nsDBAccessor is a implementation of the nsIDBAccessor interface. It
|
||||
* uses dbm(Berkely) as the database.
|
||||
*
|
||||
* a nsDiskCacheRecord is mapped into two entries in the database,
|
||||
* key->recordID
|
||||
* recordID->metadata
|
||||
*/
|
||||
|
||||
#include "nsDBAccessor.h"
|
||||
#include "nscore.h"
|
||||
|
||||
#include "prtypes.h"
|
||||
#include "plhash.h"
|
||||
#include "nsCRT.h"
|
||||
|
||||
nsDBAccessor::nsDBAccessor() :
|
||||
mDB(0) ,
|
||||
mDBFile(0) ,
|
||||
mSessionID(0) ,
|
||||
mSessionCntr(0) ,
|
||||
mDBFilesize(0)
|
||||
{
|
||||
mLastSyncTime = PR_IntervalNow() ;
|
||||
|
||||
NS_INIT_REFCNT();
|
||||
}
|
||||
|
||||
nsDBAccessor::~nsDBAccessor()
|
||||
{
|
||||
Shutdown() ;
|
||||
}
|
||||
|
||||
//
|
||||
// Implement nsISupports methods
|
||||
//
|
||||
NS_IMPL_ISUPPORTS(nsDBAccessor, NS_GET_IID(nsIDBAccessor))
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// nsIDBAccessor methods
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDBAccessor::Init(nsIFileSpec* dbfile)
|
||||
{
|
||||
char* dbname ;
|
||||
|
||||
// this should cover all platforms.
|
||||
dbfile->GetNativePath(&dbname) ;
|
||||
|
||||
mDBFile = dbfile ;
|
||||
|
||||
// FUR - how is page size chosen ? It's worth putting a comment
|
||||
// in here about the possible usefulness of tuning these parameters
|
||||
HASHINFO hash_info = {
|
||||
16*1024 , /* bucket size */
|
||||
0 , /* fill factor */
|
||||
0 , /* number of elements */
|
||||
0 , /* bytes to cache */
|
||||
0 , /* hash function */
|
||||
0} ; /* byte order */
|
||||
|
||||
mDB = dbopen(dbname,
|
||||
O_RDWR | O_CREAT ,
|
||||
0600 ,
|
||||
DB_HASH ,
|
||||
& hash_info) ;
|
||||
|
||||
nsCRT::free(dbname) ;
|
||||
|
||||
if(!mDB)
|
||||
return NS_ERROR_FAILURE ;
|
||||
|
||||
// set mSessionID
|
||||
DBT db_key, db_data ;
|
||||
|
||||
db_key.data = NS_CONST_CAST(char*, SessionKey) ;
|
||||
db_key.size = PL_strlen(SessionKey) ;
|
||||
|
||||
int status = (*mDB->get)(mDB, &db_key, &db_data, 0) ;
|
||||
if(status == -1) {
|
||||
NS_ERROR("ERROR: failed get session id in database.") ;
|
||||
return NS_ERROR_FAILURE ;
|
||||
}
|
||||
|
||||
if(status == 0) {
|
||||
// get the last session id
|
||||
PRInt16 *old_ID = NS_STATIC_CAST(PRInt16*, db_data.data) ;
|
||||
if(*old_ID < ini_sessionID) {
|
||||
NS_ERROR("ERROR: Bad Session ID in database, corrupted db.") ;
|
||||
return NS_ERROR_FAILURE ;
|
||||
}
|
||||
|
||||
mSessionID = *old_ID + 1 ;
|
||||
}
|
||||
else if(status == 1) {
|
||||
// must be a new db
|
||||
mSessionID = ini_sessionID ;
|
||||
}
|
||||
db_data.data = NS_REINTERPRET_CAST(void*, &mSessionID) ;
|
||||
db_data.size = sizeof(PRInt16) ;
|
||||
|
||||
// store the new session id
|
||||
status = (*mDB->put)(mDB, &db_key, &db_data, 0) ;
|
||||
|
||||
if(status == 0) {
|
||||
(*mDB->sync)(mDB, 0) ;
|
||||
|
||||
// initialize database filesize
|
||||
return mDBFile->GetFileSize(&mDBFilesize) ;
|
||||
}
|
||||
else {
|
||||
NS_ERROR("reset session ID failure.") ;
|
||||
return NS_ERROR_FAILURE ;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDBAccessor::Shutdown(void)
|
||||
{
|
||||
if(mDB) {
|
||||
(*mDB->sync)(mDB, 0) ;
|
||||
(*mDB->close)(mDB) ;
|
||||
mDB = nsnull ;
|
||||
}
|
||||
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDBAccessor::Get(PRInt32 aID, void** anEntry, PRUint32 *aLength)
|
||||
{
|
||||
if(!anEntry)
|
||||
return NS_ERROR_NULL_POINTER ;
|
||||
|
||||
*anEntry = nsnull ;
|
||||
*aLength = 0 ;
|
||||
|
||||
NS_ASSERTION(mDB, "no database") ;
|
||||
|
||||
DBT db_key, db_data ;
|
||||
|
||||
db_key.data = NS_REINTERPRET_CAST(void*, &aID) ;
|
||||
db_key.size = sizeof(PRInt32) ;
|
||||
|
||||
int status = 0 ;
|
||||
status = (*mDB->get)(mDB, &db_key, &db_data, 0) ;
|
||||
|
||||
if(status == 0) {
|
||||
*anEntry = db_data.data ;
|
||||
*aLength = db_data.size ;
|
||||
return NS_OK ;
|
||||
}
|
||||
else if(status == 1)
|
||||
return NS_OK ;
|
||||
else
|
||||
return NS_ERROR_FAILURE ;
|
||||
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDBAccessor::Put(PRInt32 aID, void* anEntry, PRUint32 aLength)
|
||||
{
|
||||
NS_ASSERTION(mDB, "no database") ;
|
||||
|
||||
DBT db_key, db_data ;
|
||||
|
||||
db_key.data = NS_REINTERPRET_CAST(void*, &aID) ;
|
||||
db_key.size = sizeof(PRInt32) ;
|
||||
|
||||
db_data.data = anEntry ;
|
||||
db_data.size = aLength ;
|
||||
|
||||
if(0 == (*mDB->put)(mDB, &db_key, &db_data, 0)) {
|
||||
return Sync() ;
|
||||
}
|
||||
else {
|
||||
return NS_ERROR_FAILURE ;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* It's more important to remove the id->metadata entry first since
|
||||
* key->id mapping is just a reference
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
nsDBAccessor::Del(PRInt32 aID, void* anEntry, PRUint32 aLength)
|
||||
{
|
||||
NS_ASSERTION(mDB, "no database") ;
|
||||
|
||||
DBT db_key ;
|
||||
|
||||
// delete recordID->metadata
|
||||
db_key.data = NS_REINTERPRET_CAST(void*, &aID) ;
|
||||
db_key.size = sizeof(PRInt32) ;
|
||||
|
||||
PRInt32 status = -1 ;
|
||||
status = (*mDB->del)(mDB, &db_key, 0) ;
|
||||
|
||||
if(-1 == status) {
|
||||
return NS_ERROR_FAILURE ;
|
||||
}
|
||||
|
||||
// delete key->recordID
|
||||
db_key.data = anEntry ;
|
||||
db_key.size = aLength ;
|
||||
status = (*mDB->del)(mDB, &db_key, 0) ;
|
||||
if(-1 == status) {
|
||||
return NS_ERROR_FAILURE ;
|
||||
}
|
||||
|
||||
return Sync() ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDBAccessor::GetID(const char* key, PRUint32 length, PRInt32* aID)
|
||||
{
|
||||
NS_ASSERTION(mDB, "no database") ;
|
||||
|
||||
DBT db_key, db_data ;
|
||||
|
||||
db_key.data = NS_CONST_CAST(char*, key) ;
|
||||
db_key.size = length ;
|
||||
|
||||
int status = (*mDB->get)(mDB, &db_key, &db_data, 0) ;
|
||||
if(status == 0) {
|
||||
// found recordID
|
||||
*aID = *(NS_REINTERPRET_CAST(PRInt32*, db_data.data)) ;
|
||||
return NS_OK ;
|
||||
}
|
||||
else if(status == 1) {
|
||||
// create a new one
|
||||
PRInt32 id = 0 ;
|
||||
id = mSessionID << 16 | mSessionCntr++ ;
|
||||
|
||||
// add new id into mDB
|
||||
db_data.data = NS_REINTERPRET_CAST(void*, &id) ;
|
||||
db_data.size = sizeof(PRInt32) ;
|
||||
|
||||
status = (*mDB->put)(mDB, &db_key, &db_data, 0) ;
|
||||
if(status != 0) {
|
||||
NS_ERROR("updating db failure.") ;
|
||||
return NS_ERROR_FAILURE ;
|
||||
}
|
||||
*aID = id ;
|
||||
return Sync() ;
|
||||
}
|
||||
else {
|
||||
NS_ERROR("ERROR: keydb failure.") ;
|
||||
return NS_ERROR_FAILURE ;
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDBAccessor::EnumEntry(void** anEntry, PRUint32* aLength, PRBool bReset)
|
||||
{
|
||||
if(!anEntry)
|
||||
return NS_ERROR_NULL_POINTER ;
|
||||
|
||||
*anEntry = nsnull ;
|
||||
*aLength = 0 ;
|
||||
|
||||
NS_ASSERTION(mDB, "no database") ;
|
||||
|
||||
PRUint32 flag ;
|
||||
|
||||
if(bReset)
|
||||
flag = R_FIRST ;
|
||||
else
|
||||
flag = R_NEXT ;
|
||||
|
||||
DBT db_key, db_data ;
|
||||
|
||||
PRUint32 len = PL_strlen(SessionKey) ;
|
||||
|
||||
int status ;
|
||||
|
||||
do {
|
||||
status = (*mDB->seq)(mDB, &db_key, &db_data, flag) ;
|
||||
flag = R_NEXT ;
|
||||
if(status == -1)
|
||||
return NS_ERROR_FAILURE ;
|
||||
// get next if it's a key->recordID
|
||||
if(db_key.size > sizeof(PRInt32) && db_data.size == sizeof(PRInt32))
|
||||
continue ;
|
||||
// get next if it's a sessionID entry
|
||||
if(db_key.size == len && db_data.size == sizeof(PRInt16))
|
||||
continue ;
|
||||
// recordID is always 32 bits long
|
||||
if(db_key.size == sizeof(PRInt32))
|
||||
break ;
|
||||
} while(!status) ;
|
||||
|
||||
if (0 == status) {
|
||||
*anEntry = db_data.data ;
|
||||
*aLength = db_data.size ;
|
||||
}
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
/*
|
||||
* returns the cached database file size.
|
||||
* mDBFilesize will be updated during Sync().
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
nsDBAccessor::GetDBFilesize(PRUint32* aSize)
|
||||
{
|
||||
*aSize = mDBFilesize ;
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDBAccessor::GetSpecialEntry(void** anEntry, PRUint32* aLength)
|
||||
{
|
||||
if(!anEntry)
|
||||
return NS_ERROR_NULL_POINTER ;
|
||||
|
||||
*anEntry = nsnull ;
|
||||
*aLength = 0 ;
|
||||
|
||||
DBT db_key, db_data ;
|
||||
|
||||
db_key.data = NS_CONST_CAST(char*, SpecialEntry) ;
|
||||
db_key.size = PL_strlen(SpecialEntry) ;
|
||||
|
||||
int status = (*mDB->get)(mDB, &db_key, &db_data, 0) ;
|
||||
|
||||
if(status == -1) {
|
||||
NS_ERROR("ERROR: failed get special entry in database.") ;
|
||||
return NS_ERROR_FAILURE ;
|
||||
}
|
||||
|
||||
if(status == 0) {
|
||||
*anEntry = db_data.data ;
|
||||
*aLength = db_data.size ;
|
||||
}
|
||||
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDBAccessor::SetSpecialEntry(void* anEntry, PRUint32 aLength)
|
||||
{
|
||||
DBT db_key, db_data ;
|
||||
|
||||
db_key.data = NS_CONST_CAST(char*, SpecialEntry) ;
|
||||
db_key.size = PL_strlen(SpecialEntry) ;
|
||||
|
||||
db_data.data = anEntry ;
|
||||
db_data.size = aLength ;
|
||||
|
||||
if(0 == (*mDB->put)(mDB, &db_key, &db_data, 0)) {
|
||||
(*mDB->sync)(mDB, 0) ;
|
||||
return NS_OK ;
|
||||
}
|
||||
else {
|
||||
return NS_ERROR_FAILURE ;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* sync routine is only called when the SyncInterval is reached. Otherwise
|
||||
* it just returns. If db synced, the filesize will be updated at the
|
||||
* same time.
|
||||
*/
|
||||
nsresult
|
||||
nsDBAccessor::Sync(void)
|
||||
{
|
||||
PRIntervalTime time = PR_IntervalNow() ;
|
||||
PRIntervalTime duration = time - mLastSyncTime ;
|
||||
|
||||
if (PR_IntervalToMilliseconds(duration) > SyncInterval) {
|
||||
int status = (*mDB->sync)(mDB, 0) ;
|
||||
if(status == 0) {
|
||||
// printf("\tsynced\n") ;
|
||||
mLastSyncTime = time ;
|
||||
|
||||
// update db filesize here
|
||||
return mDBFile->GetFileSize(&mDBFilesize) ;
|
||||
|
||||
} else
|
||||
return NS_ERROR_FAILURE ;
|
||||
} else {
|
||||
// printf("\tnot synced\n") ;
|
||||
return NS_OK ;
|
||||
}
|
||||
}
|
||||
93
mozilla/netwerk/cache/filecache/nsDBAccessor.h
vendored
Normal file
93
mozilla/netwerk/cache/filecache/nsDBAccessor.h
vendored
Normal file
@@ -0,0 +1,93 @@
|
||||
/*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Intel Corp.
|
||||
* Portions created by Intel Corp. are
|
||||
* Copyright (C) 1999, 1999 Intel Corp. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Yixiong Zou <yixiong.zou@intel.com>
|
||||
* Carl Wong <carl.wong@intel.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file is part of filecache implementation.
|
||||
*
|
||||
* nsIDBAccessor is a interface that shields all the direct database access
|
||||
* method from nsNetDiskCache.
|
||||
*
|
||||
* nsDBAccessor is a implementation of the nsIDBAccessor interface. It
|
||||
* uses dbm(Berkely) as the database.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _NSIDBACCESSOR_H_
|
||||
#define _NSIDBACCESSOR_H_
|
||||
|
||||
#include "nsIDBAccessor.h"
|
||||
#include "mcom_db.h"
|
||||
#include "prinrval.h"
|
||||
#include "nsCOMPtr.h"
|
||||
|
||||
// bogus string for the key of session id
|
||||
static const char * const SessionKey = "SK" ;
|
||||
|
||||
// bogus string for the size
|
||||
static const char * const SpecialEntry = "SE" ;
|
||||
|
||||
// initial session id number
|
||||
static const PRInt16 ini_sessionID = 0xff ;
|
||||
|
||||
static const PRUint16 SyncInterval = 1000 ;
|
||||
|
||||
class nsDBAccessor : public nsIDBAccessor
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
nsDBAccessor() ;
|
||||
virtual ~nsDBAccessor() ;
|
||||
|
||||
NS_IMETHOD Init(nsIFileSpec* dbfile) ;
|
||||
NS_IMETHOD Shutdown(void) ;
|
||||
|
||||
NS_IMETHOD Put(PRInt32 aID, void* anEntry, PRUint32 aLength) ;
|
||||
|
||||
NS_IMETHOD Get(PRInt32 aID, void** anEntry, PRUint32 *aLength) ;
|
||||
|
||||
NS_IMETHOD Del(PRInt32 aID, void* anEntry, PRUint32 aLength) ;
|
||||
|
||||
NS_IMETHOD GetID(const char* key, PRUint32 length, PRInt32* aID) ;
|
||||
|
||||
NS_IMETHOD EnumEntry(void* *anEntry, PRUint32* aLength, PRBool bReset) ;
|
||||
|
||||
NS_IMETHOD GetDBFilesize(PRUint32* aSize) ;
|
||||
|
||||
NS_IMETHOD GetSpecialEntry(void** anEntry, PRUint32 *aLength) ;
|
||||
NS_IMETHOD SetSpecialEntry(void* anEntry, PRUint32 aLength) ;
|
||||
|
||||
protected:
|
||||
nsresult Sync(void) ;
|
||||
|
||||
private:
|
||||
DB * mDB ;
|
||||
nsCOMPtr<nsIFileSpec> mDBFile ;
|
||||
PRInt16 mSessionID ;
|
||||
PRInt16 mSessionCntr ;
|
||||
PRIntervalTime mLastSyncTime ;
|
||||
PRUint32 mDBFilesize ; // cached DB filesize,
|
||||
// updated on every sync for now
|
||||
} ;
|
||||
|
||||
#endif // _NSIDBACCESSOR_H_
|
||||
108
mozilla/netwerk/cache/filecache/nsDBEnumerator.cpp
vendored
Normal file
108
mozilla/netwerk/cache/filecache/nsDBEnumerator.cpp
vendored
Normal file
@@ -0,0 +1,108 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Intel Corp.
|
||||
* Portions created by Intel Corp. are
|
||||
* Copyright (C) 1999, 1999 Intel Corp. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Yixiong Zou <yixiong.zou@intel.com>
|
||||
* Carl Wong <carl.wong@intel.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file is part of filecache implementation.
|
||||
*
|
||||
* It implements a simple iterator for the database, see nsDBAccessor.
|
||||
*/
|
||||
|
||||
#include "nsDBEnumerator.h"
|
||||
#include "nsDiskCacheRecord.h"
|
||||
|
||||
nsDBEnumerator::nsDBEnumerator(nsIDBAccessor* aDB, nsNetDiskCache* aCache) :
|
||||
m_DB(aDB) ,
|
||||
m_DiskCache(aCache) ,
|
||||
m_tempEntry(0) ,
|
||||
m_tempEntry_length(0) ,
|
||||
m_CacheEntry(0) ,
|
||||
m_bReset(PR_TRUE)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
|
||||
}
|
||||
|
||||
nsDBEnumerator::~nsDBEnumerator()
|
||||
{
|
||||
NS_IF_RELEASE(m_CacheEntry) ;
|
||||
}
|
||||
|
||||
//
|
||||
// Implement nsISupports methods
|
||||
//
|
||||
NS_IMPL_ISUPPORTS(nsDBEnumerator, NS_GET_IID(nsIEnumerator))
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// nsISimpleEnumerator methods
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDBEnumerator::HasMoreElements(PRBool *_retval)
|
||||
{
|
||||
*_retval = PR_FALSE ;
|
||||
|
||||
nsresult rv = m_DB->EnumEntry(&m_tempEntry, &m_tempEntry_length, m_bReset) ;
|
||||
|
||||
if(NS_FAILED(rv)) {
|
||||
// do some error recovery
|
||||
m_DiskCache->DBRecovery() ;
|
||||
return rv ;
|
||||
}
|
||||
|
||||
m_bReset = PR_FALSE ;
|
||||
|
||||
if(m_tempEntry && m_tempEntry_length != 0)
|
||||
*_retval = PR_TRUE ;
|
||||
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
// this routine does not create a new item by itself
|
||||
// Rather it reuses the item inside the object. So if you need to use the
|
||||
// item later, you have to
|
||||
// create a new item specifically, using copy constructor or some other dup
|
||||
// function. And don't forget to release it after you're done
|
||||
//
|
||||
NS_IMETHODIMP
|
||||
nsDBEnumerator::GetNext(nsISupports **_retval)
|
||||
{
|
||||
if(!m_CacheEntry) {
|
||||
m_CacheEntry = new nsDiskCacheRecord(m_DB, m_DiskCache) ;
|
||||
if(m_CacheEntry)
|
||||
NS_ADDREF(m_CacheEntry) ;
|
||||
else
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
}
|
||||
|
||||
if(!_retval)
|
||||
return NS_ERROR_NULL_POINTER ;
|
||||
*_retval = nsnull ;
|
||||
|
||||
nsresult rv = m_CacheEntry->RetrieveInfo(m_tempEntry, m_tempEntry_length) ;
|
||||
if(NS_FAILED(rv))
|
||||
return rv ;
|
||||
|
||||
*_retval = NS_STATIC_CAST(nsISupports*, m_CacheEntry) ;
|
||||
NS_ADDREF(*_retval) ; // all good getter addref
|
||||
|
||||
return NS_OK ;
|
||||
}
|
||||
60
mozilla/netwerk/cache/filecache/nsDBEnumerator.h
vendored
Normal file
60
mozilla/netwerk/cache/filecache/nsDBEnumerator.h
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Intel Corp.
|
||||
* Portions created by Intel Corp. are
|
||||
* Copyright (C) 1999, 1999 Intel Corp. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Yixiong Zou <yixiong.zou@intel.com>
|
||||
* Carl Wong <carl.wong@intel.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file is part of filecache implementation.
|
||||
*
|
||||
* It implements a simple iterator for the database, see nsDBAccessor.
|
||||
*/
|
||||
|
||||
#ifndef _NS_DBENUMERATOR_H_
|
||||
#define _NS_DBENUMERATOR_H_
|
||||
|
||||
#include "nsISimpleEnumerator.h"
|
||||
#include "nsINetDataCacheRecord.h"
|
||||
#include "nsIDBAccessor.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsNetDiskCache.h"
|
||||
#include "nsDiskCacheRecord.h"
|
||||
|
||||
class nsCachedDiskData ; /* forward decl */
|
||||
|
||||
class nsDBEnumerator : public nsISimpleEnumerator {
|
||||
public:
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_DECL_NSISIMPLEENUMERATOR
|
||||
|
||||
nsDBEnumerator(nsIDBAccessor* aDB, nsNetDiskCache* aCache) ;
|
||||
virtual ~nsDBEnumerator() ;
|
||||
|
||||
private:
|
||||
nsCOMPtr<nsIDBAccessor> m_DB ;
|
||||
nsCOMPtr<nsNetDiskCache> m_DiskCache ;
|
||||
void * m_tempEntry ;
|
||||
PRUint32 m_tempEntry_length ;
|
||||
nsDiskCacheRecord* m_CacheEntry ;
|
||||
PRBool m_bReset ;
|
||||
};
|
||||
|
||||
#endif // _NS_DBENUMERATOR_H_
|
||||
456
mozilla/netwerk/cache/filecache/nsDiskCacheRecord.cpp
vendored
Normal file
456
mozilla/netwerk/cache/filecache/nsDiskCacheRecord.cpp
vendored
Normal file
@@ -0,0 +1,456 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Intel Corp.
|
||||
* Portions created by Intel Corp. are
|
||||
* Copyright (C) 1999, 1999 Intel Corp. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Yixiong Zou <yixiong.zou@intel.com>
|
||||
* Carl Wong <carl.wong@intel.com>
|
||||
*/
|
||||
|
||||
#include "nsDiskCacheRecord.h"
|
||||
#include "nsINetDataDiskCache.h"
|
||||
#include "nsNetDiskCacheCID.h"
|
||||
#include "nsDiskCacheRecordChannel.h"
|
||||
#include "nsFileStream.h"
|
||||
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIProtocolHandler.h"
|
||||
#include "nsIIOService.h"
|
||||
#include "nsIAllocator.h"
|
||||
|
||||
#include "plstr.h"
|
||||
#include "prprf.h"
|
||||
#include "prmem.h"
|
||||
#include "prlog.h"
|
||||
#include "prtypes.h"
|
||||
#include "netCore.h"
|
||||
|
||||
#include "nsDBAccessor.h"
|
||||
|
||||
#if !defined(IS_LITTLE_ENDIAN) && !defined(IS_BIG_ENDIAN)
|
||||
ERROR! Must have a byte order
|
||||
#endif
|
||||
|
||||
#ifdef IS_LITTLE_ENDIAN
|
||||
#define COPY_INT32(_a,_b) memcpy(_a, _b, sizeof(int32))
|
||||
#else
|
||||
#define COPY_INT32(_a,_b) /* swap */ \
|
||||
do { \
|
||||
((char *)(_a))[0] = ((char *)(_b))[3]; \
|
||||
((char *)(_a))[1] = ((char *)(_b))[2]; \
|
||||
((char *)(_a))[2] = ((char *)(_b))[1]; \
|
||||
((char *)(_a))[3] = ((char *)(_b))[0]; \
|
||||
} while(0)
|
||||
#endif
|
||||
|
||||
nsDiskCacheRecord::nsDiskCacheRecord(nsIDBAccessor* db, nsNetDiskCache* aCache) :
|
||||
mKey(0) ,
|
||||
mKeyLength(0) ,
|
||||
mRecordID(0) ,
|
||||
mMetaData(0) ,
|
||||
mMetaDataLength(0) ,
|
||||
mDB(db) ,
|
||||
mInfo(0) ,
|
||||
mInfoSize(0) ,
|
||||
mNumChannels(0) ,
|
||||
mDiskCache(aCache)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
NS_ASSERTION(mDiskCache, "Must have an nsNetDiskCache");
|
||||
NS_ADDREF(mDiskCache);
|
||||
}
|
||||
|
||||
// mem alloced. so caller should do free() on key.
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecord::Init(const char* key, PRUint32 length, PRInt32 ID)
|
||||
{
|
||||
NS_NewFileSpec(getter_AddRefs(mFile));
|
||||
if(!mFile)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
|
||||
// copy key
|
||||
mKeyLength = length ;
|
||||
mKey = NS_STATIC_CAST(char*, nsAllocator::Alloc(mKeyLength*sizeof(char))) ;
|
||||
if(!mKey)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
|
||||
memcpy(mKey, key, length) ;
|
||||
|
||||
// get RecordID
|
||||
mRecordID = ID ;
|
||||
|
||||
// setup the file name
|
||||
nsCOMPtr<nsIFileSpec> dbFolder ;
|
||||
mDiskCache->GetDiskCacheFolder(getter_AddRefs(dbFolder)) ;
|
||||
|
||||
nsresult rv = mFile->FromFileSpec(dbFolder) ;
|
||||
if(NS_FAILED(rv))
|
||||
return NS_ERROR_FAILURE ;
|
||||
|
||||
// dir is a hash result of mRecordID%32, hope it's enough
|
||||
char filename[9], dirName[3] ;
|
||||
|
||||
PR_snprintf(dirName, 3, "%02x", (((PRUint32)mRecordID) % 32)) ;
|
||||
mFile->AppendRelativeUnixPath(dirName) ;
|
||||
|
||||
PR_snprintf(filename, 9, "%08x", mRecordID) ;
|
||||
mFile->AppendRelativeUnixPath(filename) ;
|
||||
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
nsDiskCacheRecord::~nsDiskCacheRecord()
|
||||
{
|
||||
if(mKey)
|
||||
nsAllocator::Free(mKey) ;
|
||||
if(mMetaData)
|
||||
nsAllocator::Free(mMetaData) ;
|
||||
if(mInfo)
|
||||
nsAllocator::Free(mInfo) ;
|
||||
|
||||
NS_IF_RELEASE(mDiskCache);
|
||||
}
|
||||
|
||||
//
|
||||
// Implement nsISupports methods
|
||||
//
|
||||
NS_IMPL_ISUPPORTS(nsDiskCacheRecord, NS_GET_IID(nsINetDataCacheRecord))
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
// nsINetDataCacheRecord methods
|
||||
|
||||
// yes, mem alloced on *_retval.
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecord::GetKey(PRUint32 *length, char** _retval)
|
||||
{
|
||||
if(!_retval)
|
||||
return NS_ERROR_NULL_POINTER ;
|
||||
|
||||
*length = mKeyLength ;
|
||||
*_retval = NS_STATIC_CAST(char*, nsAllocator::Alloc(mKeyLength*sizeof(char))) ;
|
||||
if(!*_retval)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
|
||||
memcpy(*_retval, mKey, mKeyLength) ;
|
||||
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecord::GetRecordID(PRInt32* aRecordID)
|
||||
{
|
||||
*aRecordID = mRecordID ;
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
// yes, mem alloced on *_retval.
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecord::GetMetaData(PRUint32 *length, char **_retval)
|
||||
{
|
||||
if(!_retval)
|
||||
return NS_ERROR_NULL_POINTER ;
|
||||
|
||||
// always null the return value first.
|
||||
*_retval = nsnull ;
|
||||
|
||||
*length = mMetaDataLength ;
|
||||
|
||||
if(mMetaDataLength) {
|
||||
*_retval = NS_STATIC_CAST(char*, nsAllocator::Alloc(mMetaDataLength*sizeof(char))) ;
|
||||
if(!*_retval)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
|
||||
memcpy(*_retval, mMetaData, mMetaDataLength) ;
|
||||
}
|
||||
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecord::SetMetaData(PRUint32 length, const char* data)
|
||||
{
|
||||
// set the mMetaData
|
||||
mMetaDataLength = length ;
|
||||
if(mMetaData)
|
||||
nsAllocator::Free(mMetaData) ;
|
||||
mMetaData = NS_STATIC_CAST(char*, nsAllocator::Alloc(mMetaDataLength*sizeof(char))) ;
|
||||
if(!mMetaData) {
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
}
|
||||
memcpy(mMetaData, data, length) ;
|
||||
|
||||
// Generate mInfo
|
||||
nsresult rv = GenInfo() ;
|
||||
if(NS_FAILED(rv))
|
||||
return rv ;
|
||||
|
||||
// write through into mDB
|
||||
rv = mDB->Put(mRecordID, mInfo, mInfoSize) ;
|
||||
|
||||
return rv ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecord::GetStoredContentLength(PRUint32 *aStoredContentLength)
|
||||
{
|
||||
return mFile->GetFileSize(aStoredContentLength) ;
|
||||
}
|
||||
|
||||
// untill nsIFileSpec::Truncate() is in, we have to do all this ugly stuff
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecord::SetStoredContentLength(PRUint32 aStoredContentLength)
|
||||
{
|
||||
PRUint32 len = 0 ;
|
||||
nsresult rv = mFile->GetFileSize(&len) ;
|
||||
if(NS_FAILED(rv))
|
||||
return rv ;
|
||||
|
||||
if(len < aStoredContentLength)
|
||||
{
|
||||
NS_ERROR("Error: can not set filesize to something bigger than itself.\n") ;
|
||||
return NS_ERROR_FAILURE ;
|
||||
}
|
||||
else {
|
||||
rv = mFile->Truncate(aStoredContentLength) ;
|
||||
if(NS_FAILED(rv))
|
||||
return rv ;
|
||||
|
||||
mDiskCache->m_StorageInUse -= (len - aStoredContentLength) ;
|
||||
return NS_OK ;
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecord::Delete(void)
|
||||
{
|
||||
if(mNumChannels)
|
||||
return NS_ERROR_NOT_AVAILABLE ;
|
||||
|
||||
PRUint32 len ;
|
||||
mFile->GetFileSize(&len) ;
|
||||
|
||||
nsFileSpec cache_file ;
|
||||
nsresult rv = mFile->GetFileSpec(&cache_file) ;
|
||||
|
||||
if(NS_FAILED(rv))
|
||||
return NS_ERROR_FAILURE ;
|
||||
|
||||
cache_file.Delete(PR_TRUE) ;
|
||||
|
||||
// updata the storage size
|
||||
mDiskCache->m_StorageInUse -= len ;
|
||||
|
||||
rv = mDB->Del(mRecordID, mKey, mKeyLength) ;
|
||||
if(NS_FAILED(rv))
|
||||
return NS_ERROR_FAILURE ;
|
||||
else
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecord::GetFilename(nsIFileSpec * *aFilename)
|
||||
{
|
||||
if(!aFilename)
|
||||
return NS_ERROR_NULL_POINTER ;
|
||||
|
||||
*aFilename = mFile ;
|
||||
NS_ADDREF(*aFilename) ;
|
||||
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecord::NewChannel(nsILoadGroup *loadGroup, nsIChannel **_retval)
|
||||
{
|
||||
nsDiskCacheRecordChannel* channel = new nsDiskCacheRecordChannel(this, loadGroup) ;
|
||||
if(!channel)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
|
||||
nsresult rv = channel->Init() ;
|
||||
if(NS_FAILED(rv))
|
||||
return rv ;
|
||||
|
||||
NS_ADDREF(channel) ;
|
||||
*_retval = NS_STATIC_CAST(nsIChannel*, channel) ;
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// nsDiskCacheRecord methods
|
||||
|
||||
// file name is represented by a url string. I hope this would be more
|
||||
// generic
|
||||
nsresult
|
||||
nsDiskCacheRecord::GenInfo()
|
||||
{
|
||||
if(mInfo)
|
||||
nsAllocator::Free(mInfo) ;
|
||||
|
||||
char* file_url=nsnull ;
|
||||
PRUint32 name_len ;
|
||||
mFile->GetURLString(&file_url) ;
|
||||
name_len = PL_strlen(file_url)+1 ;
|
||||
|
||||
mInfoSize = sizeof(PRUint32) ; // checksum for mInfoSize
|
||||
mInfoSize += sizeof(PRInt32) ; // RecordID
|
||||
mInfoSize += sizeof(PRUint32) ; // key length
|
||||
mInfoSize += mKeyLength ; // key
|
||||
mInfoSize += sizeof(PRUint32) ; // metadata length
|
||||
mInfoSize += mMetaDataLength ; // metadata
|
||||
mInfoSize += sizeof(PRUint32) ; // filename length
|
||||
mInfoSize += name_len ; // filename
|
||||
|
||||
void* newInfo = nsAllocator::Alloc(mInfoSize*sizeof(char)) ;
|
||||
if(!newInfo) {
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
}
|
||||
|
||||
// copy the checksum mInfoSize
|
||||
char* cur_ptr = NS_STATIC_CAST(char*, newInfo) ;
|
||||
COPY_INT32(cur_ptr, &mInfoSize) ;
|
||||
cur_ptr += sizeof(PRUint32) ;
|
||||
|
||||
// copy RecordID
|
||||
COPY_INT32(cur_ptr, &mRecordID) ;
|
||||
cur_ptr += sizeof(PRInt32) ;
|
||||
|
||||
// copy key length
|
||||
COPY_INT32(cur_ptr, &mKeyLength) ;
|
||||
cur_ptr += sizeof(PRUint32) ;
|
||||
|
||||
// copy key
|
||||
memcpy(cur_ptr, mKey, mKeyLength) ;
|
||||
cur_ptr += mKeyLength ;
|
||||
|
||||
// copy metadata length
|
||||
COPY_INT32(cur_ptr, &mMetaDataLength) ;
|
||||
cur_ptr += sizeof(PRUint32) ;
|
||||
|
||||
// copy metadata
|
||||
memcpy(cur_ptr, mMetaData, mMetaDataLength) ;
|
||||
cur_ptr += mMetaDataLength ;
|
||||
|
||||
// copy file name length
|
||||
COPY_INT32(cur_ptr, &name_len) ;
|
||||
cur_ptr += sizeof(PRUint32) ;
|
||||
|
||||
// copy file name
|
||||
memcpy(cur_ptr, file_url, name_len) ;
|
||||
cur_ptr += name_len ;
|
||||
|
||||
PR_ASSERT(cur_ptr == NS_STATIC_CAST(char*, newInfo) + mInfoSize);
|
||||
mInfo = newInfo ;
|
||||
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
/*
|
||||
* This Method suppose to get all the info from the db record
|
||||
* and set them to accroding members. the original values
|
||||
* will all be overwritten. only minimal error checking is performed.
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecord::RetrieveInfo(void* aInfo, PRUint32 aInfoLength)
|
||||
{
|
||||
// reset everything
|
||||
if(mInfo) {
|
||||
nsAllocator::Free(mInfo) ;
|
||||
mInfo = nsnull ;
|
||||
}
|
||||
|
||||
if(mKey) {
|
||||
nsAllocator::Free(mKey) ;
|
||||
mKey = nsnull ;
|
||||
}
|
||||
if(mMetaData) {
|
||||
nsAllocator::Free(mMetaData) ;
|
||||
mMetaData = nsnull ;
|
||||
}
|
||||
|
||||
char * cur_ptr = NS_STATIC_CAST(char*, aInfo) ;
|
||||
|
||||
char* file_url ;
|
||||
PRUint32 name_len ;
|
||||
|
||||
// set mInfoSize
|
||||
COPY_INT32(&mInfoSize, cur_ptr) ;
|
||||
cur_ptr += sizeof(PRUint32) ;
|
||||
|
||||
// check this at least
|
||||
if(mInfoSize != aInfoLength)
|
||||
return NS_ERROR_FAILURE ;
|
||||
|
||||
// set mRecordID
|
||||
COPY_INT32(&mRecordID, cur_ptr) ;
|
||||
cur_ptr += sizeof(PRInt32) ;
|
||||
|
||||
// set mKeyLength
|
||||
COPY_INT32(&mKeyLength, cur_ptr) ;
|
||||
cur_ptr += sizeof(PRUint32) ;
|
||||
|
||||
// set mKey
|
||||
mKey = NS_STATIC_CAST(char*, nsAllocator::Alloc(mKeyLength*sizeof(char))) ;
|
||||
if(!mKey)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
|
||||
memcpy(mKey, cur_ptr, mKeyLength) ;
|
||||
cur_ptr += mKeyLength ;
|
||||
|
||||
PRInt32 id ;
|
||||
mDB->GetID(mKey, mKeyLength, &id) ;
|
||||
NS_ASSERTION(id==mRecordID, "\t ++++++ bad record, somethings wrong\n") ;
|
||||
|
||||
// set mMetaDataLength
|
||||
COPY_INT32(&mMetaDataLength, cur_ptr) ;
|
||||
cur_ptr += sizeof(PRUint32) ;
|
||||
|
||||
// set mMetaData
|
||||
mMetaData = NS_STATIC_CAST(char*, nsAllocator::Alloc(mMetaDataLength*sizeof(char))) ;
|
||||
if(!mMetaData)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
|
||||
memcpy(mMetaData, cur_ptr, mMetaDataLength) ;
|
||||
cur_ptr += mMetaDataLength ;
|
||||
|
||||
// get mFile name length
|
||||
COPY_INT32(&name_len, cur_ptr) ;
|
||||
cur_ptr += sizeof(PRUint32) ;
|
||||
|
||||
// get mFile native name
|
||||
file_url = NS_STATIC_CAST(char*, nsAllocator::Alloc(name_len*sizeof(char))) ;
|
||||
if(!file_url)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
|
||||
memcpy(file_url, cur_ptr, name_len) ;
|
||||
cur_ptr += name_len ;
|
||||
|
||||
PR_ASSERT(cur_ptr == NS_STATIC_CAST(char*, aInfo) + mInfoSize);
|
||||
|
||||
// create mFile if Init() isn't called
|
||||
if(!mFile) {
|
||||
NS_NewFileSpec(getter_AddRefs(mFile));
|
||||
if(!mFile)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
}
|
||||
|
||||
// setup mFile
|
||||
mFile->SetURLString(file_url) ;
|
||||
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
71
mozilla/netwerk/cache/filecache/nsDiskCacheRecord.h
vendored
Normal file
71
mozilla/netwerk/cache/filecache/nsDiskCacheRecord.h
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Intel Corp.
|
||||
* Portions created by Intel Corp. are
|
||||
* Copyright (C) 1999, 1999 Intel Corp. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Yixiong Zou <yixiong.zou@intel.com>
|
||||
* Carl Wong <carl.wong@intel.com>
|
||||
*/
|
||||
|
||||
#ifndef _NET_CACHEDDISKDATA_H_
|
||||
#define _NET_CACHEDDISKDATA_H_
|
||||
|
||||
#include "nsINetDataCacheRecord.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsIDBAccessor.h"
|
||||
#include "prtypes.h"
|
||||
#include "nsILoadGroup.h"
|
||||
#include "nsIFileChannel.h"
|
||||
#include "nsNetDiskCache.h"
|
||||
|
||||
class nsDiskCacheRecord : public nsINetDataCacheRecord
|
||||
{
|
||||
public:
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSINETDATACACHERECORD
|
||||
|
||||
protected:
|
||||
|
||||
nsDiskCacheRecord(nsIDBAccessor* db, nsNetDiskCache* aCache) ;
|
||||
virtual ~nsDiskCacheRecord() ;
|
||||
|
||||
NS_IMETHOD RetrieveInfo(void* aInfo, PRUint32 aInfoLength) ;
|
||||
NS_IMETHOD Init(const char* key, PRUint32 length, PRInt32 ID) ;
|
||||
|
||||
nsresult GenInfo(void) ;
|
||||
|
||||
private:
|
||||
|
||||
char* mKey ;
|
||||
PRUint32 mKeyLength ;
|
||||
PRInt32 mRecordID ;
|
||||
char* mMetaData ;
|
||||
PRUint32 mMetaDataLength ;
|
||||
nsCOMPtr<nsIFileSpec> mFile ;
|
||||
nsCOMPtr<nsIDBAccessor> mDB ;
|
||||
void* mInfo ;
|
||||
PRUint32 mInfoSize ;
|
||||
PRUint32 mNumChannels ;
|
||||
nsNetDiskCache* mDiskCache ;
|
||||
|
||||
friend class nsDiskCacheRecordChannel ;
|
||||
friend class nsDBEnumerator ;
|
||||
friend class nsNetDiskCache ;
|
||||
} ;
|
||||
|
||||
#endif // _NET_CACHEDDISKDATA_H_
|
||||
552
mozilla/netwerk/cache/filecache/nsDiskCacheRecordChannel.cpp
vendored
Normal file
552
mozilla/netwerk/cache/filecache/nsDiskCacheRecordChannel.cpp
vendored
Normal file
@@ -0,0 +1,552 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Intel Corp.
|
||||
* Portions created by Intel Corp. are
|
||||
* Copyright (C) 1999, 1999 Intel Corp. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Yixiong Zou <yixiong.zou@intel.com>
|
||||
* Carl Wong <carl.wong@intel.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Most of the code are taken from nsFileChannel.
|
||||
*/
|
||||
|
||||
#include "nsDiskCacheRecordChannel.h"
|
||||
#include "nsIFileTransportService.h"
|
||||
//#include "nsIIOService.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIURL.h"
|
||||
#include "nsIOutputStream.h"
|
||||
#include "netCore.h"
|
||||
#include "nsIMIMEService.h"
|
||||
#include "nsISupportsUtils.h"
|
||||
|
||||
//static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
|
||||
static NS_DEFINE_CID(kFileTransportServiceCID, NS_FILETRANSPORTSERVICE_CID);
|
||||
static NS_DEFINE_CID(kStandardURLCID, NS_STANDARDURL_CID);
|
||||
static NS_DEFINE_CID(kMIMEServiceCID, NS_MIMESERVICE_CID);
|
||||
|
||||
// This is copied from nsMemCacheChannel, We should consolidate these two.
|
||||
class WriteStreamWrapper : public nsIOutputStream
|
||||
{
|
||||
public:
|
||||
WriteStreamWrapper(nsDiskCacheRecordChannel* aChannel,
|
||||
nsIOutputStream *aBaseStream) ;
|
||||
|
||||
virtual ~WriteStreamWrapper() ;
|
||||
|
||||
static nsresult
|
||||
Create(nsDiskCacheRecordChannel* aChannel, nsIOutputStream *aBaseStream, nsIOutputStream* *aWrapper) ;
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSIBASESTREAM
|
||||
NS_DECL_NSIOUTPUTSTREAM
|
||||
|
||||
private:
|
||||
nsDiskCacheRecordChannel* mChannel;
|
||||
nsCOMPtr<nsIOutputStream> mBaseStream;
|
||||
} ;
|
||||
|
||||
// implement nsISupports
|
||||
NS_IMPL_ISUPPORTS(WriteStreamWrapper, NS_GET_IID(nsIOutputStream))
|
||||
|
||||
WriteStreamWrapper::WriteStreamWrapper(nsDiskCacheRecordChannel* aChannel,
|
||||
nsIOutputStream *aBaseStream)
|
||||
: mChannel(aChannel), mBaseStream(aBaseStream)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
NS_ADDREF(mChannel);
|
||||
}
|
||||
|
||||
WriteStreamWrapper::~WriteStreamWrapper()
|
||||
{
|
||||
NS_RELEASE(mChannel);
|
||||
}
|
||||
|
||||
nsresult
|
||||
WriteStreamWrapper::Create(nsDiskCacheRecordChannel*aChannel, nsIOutputStream *aBaseStream, nsIOutputStream* * aWrapper)
|
||||
{
|
||||
WriteStreamWrapper *wrapper = new WriteStreamWrapper(aChannel, aBaseStream);
|
||||
if (!wrapper) return NS_ERROR_OUT_OF_MEMORY;
|
||||
NS_ADDREF(wrapper);
|
||||
*aWrapper = wrapper;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
WriteStreamWrapper::Write(const char *aBuffer, PRUint32 aCount, PRUint32 *aNumWritten)
|
||||
{
|
||||
*aNumWritten = 0;
|
||||
nsresult rv = mBaseStream->Write(aBuffer, aCount, aNumWritten);
|
||||
mChannel->NotifyStorageInUse(*aNumWritten);
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
WriteStreamWrapper::Flush()
|
||||
{
|
||||
return mBaseStream->Flush();
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
WriteStreamWrapper::Close()
|
||||
{
|
||||
return mBaseStream->Close();
|
||||
}
|
||||
|
||||
nsDiskCacheRecordChannel::nsDiskCacheRecordChannel(nsDiskCacheRecord *aRecord,
|
||||
nsILoadGroup *aLoadGroup)
|
||||
: mRecord(aRecord) ,
|
||||
mLoadGroup(aLoadGroup)
|
||||
{
|
||||
NS_INIT_REFCNT() ;
|
||||
NS_ADDREF(mRecord);
|
||||
mRecord->mNumChannels++ ;
|
||||
}
|
||||
|
||||
nsDiskCacheRecordChannel::~nsDiskCacheRecordChannel()
|
||||
{
|
||||
mRecord->mNumChannels-- ;
|
||||
NS_RELEASE(mRecord);
|
||||
}
|
||||
|
||||
// I know that I gave conflicting advice on the issue of file
|
||||
// transport versus file protocol handler, but I thought that the
|
||||
// last word was that we would use the raw transport, when I wrote:
|
||||
//
|
||||
// > I just thought of an argument for the other side of the coin, i.e. the
|
||||
// > benefit of *not* reusing the file protocol handler: On the Mac, it's
|
||||
// > expensive to convert from a string URL to an nsFileSpec, because the Mac
|
||||
// > is brain-dead and scans every directory on the path to the file. It's
|
||||
// > cheaper to create a nsFileSpec for a cache file by combining a single,
|
||||
// > static nsFileSpec that corresponds to the cache directory with the
|
||||
// > relative path to the cache file (using nsFileSpec's operator +). This
|
||||
// > operation is optimized on the Mac to avoid the scanning operation.
|
||||
//
|
||||
// The Mac guys will eat us alive if we do path string to nsFileSpec
|
||||
// conversions for every cache file we open.
|
||||
|
||||
nsresult
|
||||
nsDiskCacheRecordChannel::Init(void)
|
||||
{
|
||||
nsresult rv = mRecord->mFile->GetFileSpec(&mSpec) ;
|
||||
|
||||
#ifdef XP_MAC
|
||||
|
||||
// Don't assume we actually created a good file spec
|
||||
FSSpec theSpec = mSpec.GetFSSpec();
|
||||
if (!theSpec.name[0]) {
|
||||
NS_ERROR("failed to create a file spec");
|
||||
|
||||
// Since we didn't actually create the file spec
|
||||
// we return an error
|
||||
return NS_ERROR_MALFORMED_URI;
|
||||
}
|
||||
#endif
|
||||
|
||||
return rv ;
|
||||
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsDiskCacheRecordChannel::NotifyStorageInUse(PRInt32 aBytesUsed)
|
||||
{
|
||||
return mRecord->mDiskCache->m_StorageInUse += aBytesUsed ;
|
||||
}
|
||||
|
||||
// implement nsISupports
|
||||
NS_IMPL_ISUPPORTS4(nsDiskCacheRecordChannel,
|
||||
nsIChannel,
|
||||
nsIRequest,
|
||||
nsIStreamListener,
|
||||
nsIStreamObserver)
|
||||
|
||||
// implement nsIRequest
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::IsPending(PRBool *aIsPending)
|
||||
{
|
||||
*aIsPending = PR_FALSE ;
|
||||
if(!mFileTransport)
|
||||
return NS_OK ;
|
||||
|
||||
return mFileTransport->IsPending(aIsPending) ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::Cancel(void)
|
||||
{
|
||||
if(!mFileTransport)
|
||||
return NS_ERROR_FAILURE ;
|
||||
|
||||
return mFileTransport->Cancel() ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::Suspend(void)
|
||||
{
|
||||
if(!mFileTransport)
|
||||
return NS_ERROR_FAILURE ;
|
||||
|
||||
return mFileTransport->Suspend() ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::Resume(void)
|
||||
{
|
||||
if(!mFileTransport)
|
||||
return NS_ERROR_FAILURE ;
|
||||
|
||||
return mFileTransport->Resume() ;
|
||||
}
|
||||
|
||||
// implement nsIChannel
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::GetOriginalURI(nsIURI* *aURI)
|
||||
{
|
||||
// FUR - might need to implement this - not sure
|
||||
return NS_ERROR_NOT_IMPLEMENTED ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::GetURI(nsIURI * *aURI)
|
||||
{
|
||||
if(!mFileTransport)
|
||||
return NS_ERROR_FAILURE ;
|
||||
|
||||
return mFileTransport->GetURI(aURI) ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::OpenInputStream(PRUint32 aStartPosition,
|
||||
PRInt32 aReadCount,
|
||||
nsIInputStream* *aResult)
|
||||
{
|
||||
nsresult rv ;
|
||||
|
||||
if(mFileTransport)
|
||||
return NS_ERROR_IN_PROGRESS ;
|
||||
|
||||
NS_WITH_SERVICE(nsIFileTransportService, fts, kFileTransportServiceCID, &rv) ;
|
||||
if(NS_FAILED(rv)) return rv ;
|
||||
|
||||
rv = fts->CreateTransport(mSpec, "load", 0, 0, getter_AddRefs(mFileTransport)) ;
|
||||
if(NS_FAILED(rv))
|
||||
return rv ;
|
||||
|
||||
// we don't need to worry about notification callbacks
|
||||
|
||||
rv = mFileTransport->OpenInputStream(aStartPosition, aReadCount, aResult) ;
|
||||
if(NS_FAILED(rv))
|
||||
mFileTransport = nsnull ;
|
||||
|
||||
return rv ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::OpenOutputStream(PRUint32 startPosition,
|
||||
nsIOutputStream* *aResult)
|
||||
{
|
||||
nsresult rv ;
|
||||
NS_ENSURE_ARG(aResult) ;
|
||||
|
||||
if(mFileTransport)
|
||||
return NS_ERROR_IN_PROGRESS ;
|
||||
|
||||
nsCOMPtr<nsIOutputStream> outputStream ;
|
||||
|
||||
NS_WITH_SERVICE(nsIFileTransportService, fts, kFileTransportServiceCID, &rv) ;
|
||||
if(NS_FAILED(rv)) return rv ;
|
||||
|
||||
rv = fts->CreateTransport(mSpec, "load", 0, 0, getter_AddRefs(mFileTransport)) ;
|
||||
if(NS_FAILED(rv))
|
||||
return rv ;
|
||||
|
||||
// we don't need to worry about notification callbacks
|
||||
|
||||
rv = mFileTransport->OpenOutputStream(startPosition, getter_AddRefs(outputStream)) ;
|
||||
if(NS_FAILED(rv)) {
|
||||
mFileTransport = nsnull ;
|
||||
return rv ;
|
||||
}
|
||||
|
||||
return WriteStreamWrapper::Create(this, outputStream, aResult) ;
|
||||
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::AsyncOpen(nsIStreamObserver *observer,
|
||||
nsISupports *ctxt)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::AsyncRead(PRUint32 aStartPosition,
|
||||
PRInt32 aReadCount,
|
||||
nsISupports *aContext,
|
||||
nsIStreamListener *aListener)
|
||||
{
|
||||
nsresult rv ;
|
||||
|
||||
if(mFileTransport)
|
||||
return NS_ERROR_IN_PROGRESS ;
|
||||
|
||||
mRealListener = aListener;
|
||||
nsCOMPtr<nsIStreamListener> tempListener = this;
|
||||
|
||||
if (mLoadGroup) {
|
||||
nsCOMPtr<nsILoadGroupListenerFactory> factory;
|
||||
//
|
||||
// Create a load group "proxy" listener...
|
||||
//
|
||||
rv = mLoadGroup->GetGroupListenerFactory(getter_AddRefs(factory));
|
||||
if (factory) {
|
||||
nsIStreamListener *newListener;
|
||||
rv = factory->CreateLoadGroupListener(mRealListener, &newListener);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
mRealListener = 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->CreateTransport(mSpec, "load", 0, 0, getter_AddRefs(mFileTransport));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
// no callbacks
|
||||
|
||||
rv = mFileTransport->AsyncRead(aStartPosition,
|
||||
aReadCount,
|
||||
aContext,
|
||||
tempListener);
|
||||
|
||||
if (NS_FAILED(rv)) {
|
||||
// release the transport so that we don't think we're in progress
|
||||
mFileTransport = nsnull;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::AsyncWrite(nsIInputStream *fromStream,
|
||||
PRUint32 startPosition,
|
||||
PRInt32 writeCount,
|
||||
nsISupports *ctxt,
|
||||
nsIStreamObserver *observer)
|
||||
|
||||
{
|
||||
/*
|
||||
if(!mFileTransport)
|
||||
return NS_ERROR_FAILURE ;
|
||||
|
||||
return mFileTransport->AsyncWrite(fromStream,
|
||||
startPosition,
|
||||
writeCount,
|
||||
ctxt,
|
||||
observer) ;
|
||||
*/
|
||||
|
||||
// I can't do this since the write is not monitored, and I won't be
|
||||
// able to updata the storage.
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::GetLoadAttributes(nsLoadFlags *aLoadAttributes)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
NS_ASSERTION(0, "nsDiskCacheRecordChannel method unexpectedly called");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::SetLoadAttributes(nsLoadFlags aLoadAttributes)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
NS_ASSERTION(0, "nsDiskCacheRecordChannel method unexpectedly called");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
#define DUMMY_TYPE "text/html"
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::GetContentType(char * *aContentType)
|
||||
{
|
||||
nsresult rv ;
|
||||
|
||||
if (mSpec.IsDirectory()) {
|
||||
*aContentType = nsCRT::strdup("application/http-index-format");
|
||||
return *aContentType ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
else {
|
||||
// I wish I can make this simplier
|
||||
|
||||
char* urlStr ;
|
||||
mRecord->mFile->GetURLString(&urlStr) ;
|
||||
|
||||
// file: URLs (currently) have no additional structure beyond that provided by standard
|
||||
// URLs, so there is no "outer" given to CreateInstance
|
||||
|
||||
nsCOMPtr<nsIURI> url;
|
||||
rv = nsComponentManager::CreateInstance(kStandardURLCID, nsnull,
|
||||
NS_GET_IID(nsIURI),
|
||||
//(void**)&url);
|
||||
getter_AddRefs(url)) ;
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = url->SetSpec((char*)urlStr);
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
NS_WITH_SERVICE(nsIMIMEService, MIMEService, kMIMEServiceCID, &rv);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = MIMEService->GetTypeFromURI(url, aContentType);
|
||||
if (NS_SUCCEEDED(rv)) return rv;
|
||||
}
|
||||
|
||||
// if all else fails treat it as text/html?
|
||||
*aContentType = nsCRT::strdup(DUMMY_TYPE);
|
||||
if (!*aContentType) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
} else {
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::GetContentLength(PRInt32 *aContentLength)
|
||||
{
|
||||
nsresult rv;
|
||||
PRUint32 length;
|
||||
|
||||
rv = mRecord->mFile->GetFileSize(&length);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
*aContentLength = (PRInt32)length;
|
||||
} else {
|
||||
*aContentLength = -1;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::GetOwner(nsISupports* *aOwner)
|
||||
{
|
||||
*aOwner = mOwner.get() ;
|
||||
NS_IF_ADDREF(*aOwner) ;
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::SetOwner(nsISupports* aOwner)
|
||||
{
|
||||
mOwner = aOwner ;
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::GetLoadGroup(nsILoadGroup* *aLoadGroup)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
NS_ASSERTION(0, "nsDiskCacheRecordChannel method unexpectedly called");
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::SetLoadGroup(nsILoadGroup* aLoadGroup)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
NS_ASSERTION(0, "nsDiskCacheRecordChannel method unexpectedly called");
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::GetNotificationCallbacks(nsIInterfaceRequestor* *aNotificationCallbacks)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
NS_ASSERTION(0, "nsDiskCacheRecordChannel method unexpectedly called");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::SetNotificationCallbacks(nsIInterfaceRequestor* aNotificationCallbacks)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
NS_ASSERTION(0, "nsDiskCacheRecordChannel method unexpectedly called");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// nsIStreamListener methods:
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::OnStartRequest(nsIChannel* transportChannel, nsISupports* context)
|
||||
{
|
||||
NS_ASSERTION(mRealListener, "No listener...");
|
||||
return mRealListener->OnStartRequest(this, context);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::OnStopRequest(nsIChannel* transportChannel, nsISupports* context,
|
||||
nsresult aStatus, const PRUnichar* aMsg)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
rv = mRealListener->OnStopRequest(this, context, aStatus, aMsg);
|
||||
|
||||
if (mLoadGroup) {
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
mLoadGroup->RemoveChannel(this, context, aStatus, aMsg);
|
||||
}
|
||||
}
|
||||
|
||||
// Release the reference to the consumer stream listener...
|
||||
mRealListener = null_nsCOMPtr();
|
||||
mFileTransport = null_nsCOMPtr();
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsDiskCacheRecordChannel::OnDataAvailable(nsIChannel* transportChannel, nsISupports* context,
|
||||
nsIInputStream *aIStream, PRUint32 aSourceOffset,
|
||||
PRUint32 aLength)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
rv = mRealListener->OnDataAvailable(this, context, aIStream,
|
||||
aSourceOffset, aLength);
|
||||
|
||||
//
|
||||
// If the connection is being aborted cancel the transport. This will
|
||||
// insure that the transport will go away even if it is blocked waiting
|
||||
// for the consumer to empty the pipe...
|
||||
//
|
||||
if (NS_FAILED(rv)) {
|
||||
mFileTransport->Cancel();
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
76
mozilla/netwerk/cache/filecache/nsDiskCacheRecordChannel.h
vendored
Normal file
76
mozilla/netwerk/cache/filecache/nsDiskCacheRecordChannel.h
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Intel Corp.
|
||||
* Portions created by Intel Corp. are
|
||||
* Copyright (C) 1999, 1999 Intel Corp. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Yixiong Zou <yixiong.zou@intel.com>
|
||||
* Carl Wong <carl.wong@intel.com>
|
||||
*/
|
||||
|
||||
#ifndef _ns_DiskCacheRecordChannel_h_
|
||||
#define _ns_DiskCacheRecordChannel_h_
|
||||
|
||||
#include "nsIChannel.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsDiskCacheRecord.h"
|
||||
#include "nsIStreamListener.h"
|
||||
|
||||
/*
|
||||
* This class is plagiarized from nsMemCacheChannel
|
||||
*/
|
||||
|
||||
class nsDiskCacheRecordChannel : public nsIChannel,
|
||||
public nsIStreamListener
|
||||
{
|
||||
public:
|
||||
|
||||
nsDiskCacheRecordChannel(nsDiskCacheRecord *aRecord, nsILoadGroup *aLoadGroup);
|
||||
virtual ~nsDiskCacheRecordChannel() ;
|
||||
|
||||
// Declare nsISupports methods
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
// Declare nsIRequest methods
|
||||
NS_DECL_NSIREQUEST
|
||||
|
||||
// Declare nsIChannel methods
|
||||
NS_DECL_NSICHANNEL
|
||||
|
||||
// Declare nsIStreamObserver methods
|
||||
NS_DECL_NSISTREAMOBSERVER
|
||||
|
||||
// Declare nsIStreamListener methods
|
||||
NS_DECL_NSISTREAMLISTENER
|
||||
|
||||
nsresult Init(void) ;
|
||||
|
||||
private:
|
||||
|
||||
nsresult NotifyStorageInUse(PRInt32 aBytesUsed) ;
|
||||
|
||||
nsDiskCacheRecord* mRecord ;
|
||||
nsCOMPtr<nsILoadGroup> mLoadGroup ;
|
||||
nsCOMPtr<nsISupports> mOwner ;
|
||||
nsCOMPtr<nsIChannel> mFileTransport ;
|
||||
nsFileSpec mSpec ;
|
||||
nsCOMPtr<nsIStreamListener> mRealListener;
|
||||
|
||||
friend class WriteStreamWrapper ;
|
||||
} ;
|
||||
|
||||
#endif // _ns_DiskCacheRecordChannel_h_
|
||||
|
||||
66
mozilla/netwerk/cache/filecache/nsIDBAccessor.h
vendored
Normal file
66
mozilla/netwerk/cache/filecache/nsIDBAccessor.h
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Intel Corp.
|
||||
* Portions created by Intel Corp. are
|
||||
* Copyright (C) 1999, 1999 Intel Corp. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Yixiong Zou <yixiong.zou@intel.com>
|
||||
* Carl Wong <carl.wong@intel.com>
|
||||
*/
|
||||
|
||||
#ifndef _NS_IDBACCESSOR_H_
|
||||
#define _NS_IDBACCESSOR_H_
|
||||
|
||||
#include "nsISupports.h"
|
||||
#include "nsIFileSpec.h"
|
||||
|
||||
// nsIDBAccessorIID {6AADD4D0-7785-11d3-87FE-000629D01344}
|
||||
#define NS_IDBACCESSOR_IID \
|
||||
{ 0x6aadd4d0, 0x7785, 0x11d3, \
|
||||
{0x87, 0xfe, 0x0, 0x6, 0x29, 0xd0, 0x13, 0x44}}
|
||||
|
||||
// nsDBAccessorCID {6AADD4D1-7785-11d3-87FE-000629D01344}
|
||||
#define NS_DBACCESSOR_CID \
|
||||
{ 0x6aadd4d1, 0x7785, 0x11d3, \
|
||||
{ 0x87, 0xfe, 0x0, 0x6, 0x29, 0xd0, 0x13, 0x44 }}
|
||||
|
||||
class nsIDBAccessor : public nsISupports
|
||||
{
|
||||
public:
|
||||
NS_DEFINE_STATIC_IID_ACCESSOR(NS_IDBACCESSOR_IID)
|
||||
|
||||
NS_IMETHOD Init(nsIFileSpec* DBFile) = 0 ;
|
||||
NS_IMETHOD Shutdown(void) = 0 ;
|
||||
|
||||
NS_IMETHOD Put(PRInt32 aID, void* anEntry, PRUint32 aLength) = 0 ;
|
||||
|
||||
NS_IMETHOD Get(PRInt32 aID, void** anEntry, PRUint32 *aLength) = 0 ;
|
||||
|
||||
NS_IMETHOD Del(PRInt32 aID, void* anEntry, PRUint32 aLength) = 0 ;
|
||||
|
||||
NS_IMETHOD GetID(const char* key, PRUint32 length, PRInt32* aID) = 0 ;
|
||||
|
||||
NS_IMETHOD EnumEntry(void* *anEntry, PRUint32* aLength, PRBool bReset) = 0 ;
|
||||
|
||||
NS_IMETHOD GetDBFilesize(PRUint32* aSize) = 0 ;
|
||||
|
||||
NS_IMETHOD GetSpecialEntry(void** anEntry, PRUint32 *aLength) = 0 ;
|
||||
NS_IMETHOD SetSpecialEntry(void* anEntry, PRUint32 aLength) = 0 ;
|
||||
|
||||
} ;
|
||||
|
||||
#endif // _NS_IDBACCESSOR_H_
|
||||
|
||||
704
mozilla/netwerk/cache/filecache/nsNetDiskCache.cpp
vendored
Normal file
704
mozilla/netwerk/cache/filecache/nsNetDiskCache.cpp
vendored
Normal file
@@ -0,0 +1,704 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Intel Corp.
|
||||
* Portions created by Intel Corp. are
|
||||
* Copyright (C) 1999, 1999 Intel Corp. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Yixiong Zou <yixiong.zou@intel.com>
|
||||
* Carl Wong <carl.wong@intel.com>
|
||||
*/
|
||||
|
||||
#include "nsNetDiskCache.h"
|
||||
#include "nscore.h"
|
||||
|
||||
#include "plstr.h"
|
||||
#include "prprf.h"
|
||||
#include "prtypes.h"
|
||||
#include "prio.h"
|
||||
#include "prsystem.h" // Directory Seperator
|
||||
#include "plhash.h"
|
||||
#include "prclist.h"
|
||||
#include "prmem.h"
|
||||
#include "prlog.h"
|
||||
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsIServiceManager.h"
|
||||
|
||||
#include "nsIPref.h"
|
||||
#include "mcom_db.h"
|
||||
#include "nsDBEnumerator.h"
|
||||
|
||||
#include "nsDiskCacheRecord.h"
|
||||
#include "netCore.h"
|
||||
|
||||
#if !defined(IS_LITTLE_ENDIAN) && !defined(IS_BIG_ENDIAN)
|
||||
ERROR! Must have a byte order
|
||||
#endif
|
||||
|
||||
#ifdef IS_LITTLE_ENDIAN
|
||||
#define COPY_INT32(_a,_b) memcpy(_a, _b, sizeof(int32))
|
||||
#else
|
||||
#define COPY_INT32(_a,_b) /* swap */ \
|
||||
do { \
|
||||
((char *)(_a))[0] = ((char *)(_b))[3]; \
|
||||
((char *)(_a))[1] = ((char *)(_b))[2]; \
|
||||
((char *)(_a))[2] = ((char *)(_b))[1]; \
|
||||
((char *)(_a))[3] = ((char *)(_b))[0]; \
|
||||
} while(0)
|
||||
#endif
|
||||
|
||||
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID) ;
|
||||
static NS_DEFINE_CID(kDBAccessorCID, NS_DBACCESSOR_CID) ;
|
||||
|
||||
static const PRUint32 DISK_CACHE_SIZE_DEFAULT = 5*1024*1024 ; // 5MB
|
||||
static const char * const DISK_CACHE_PREF = "browser.cache.disk_cache_size";
|
||||
static const char * const CACHE_DIR_PREF = "browser.cache.directory";
|
||||
|
||||
class nsDiskCacheRecord ;
|
||||
|
||||
nsNetDiskCache::nsNetDiskCache() :
|
||||
m_Enabled(PR_TRUE) ,
|
||||
m_NumEntries(0) ,
|
||||
m_pNextCache(0) ,
|
||||
m_pDiskCacheFolder(0) ,
|
||||
m_StorageInUse(0) ,
|
||||
m_DB(0) ,
|
||||
m_DBCorrupted(PR_FALSE)
|
||||
{
|
||||
// set it to INF for now
|
||||
m_MaxEntries = (PRUint32)-1 ;
|
||||
|
||||
NS_INIT_REFCNT();
|
||||
|
||||
}
|
||||
|
||||
nsNetDiskCache::~nsNetDiskCache()
|
||||
{
|
||||
SetSpecialEntry() ;
|
||||
|
||||
NS_IF_RELEASE(m_DB) ;
|
||||
|
||||
|
||||
// FUR
|
||||
// I think that, eventually, we also want a distinguished key in the DB which
|
||||
// means "clean cache shutdown". You clear this flag when the db is first
|
||||
// opened and set it just before the db is closed. If the db wasn't shutdown
|
||||
// cleanly in a prior session, i.e. because the app crashed, on startup you
|
||||
// scan all the individual files in directories and look for "orphans",
|
||||
// i.e. cache files which don't have corresponding entries in the db. That's
|
||||
// also when storage-in-use and number of entries would be recomputed.
|
||||
//
|
||||
// We don't necessarily need all this functionality immediately, though.
|
||||
|
||||
|
||||
if(m_DBCorrupted) {
|
||||
|
||||
nsFileSpec cacheFolder ;
|
||||
m_pDiskCacheFolder->GetFileSpec(&cacheFolder) ;
|
||||
|
||||
char nameInt[6] ;
|
||||
|
||||
for(nsDirectoryIterator di(cacheFolder, PR_FALSE); di.Exists(); di++) {
|
||||
char* filename = di.Spec().GetLeafName() ;
|
||||
char* pname = nameInt ;
|
||||
pname = PL_strncpyz(pname, filename, 6) ;
|
||||
|
||||
if(PL_strcmp(pname, "trash") == 0)
|
||||
RemoveFolder(di.Spec()) ;
|
||||
|
||||
nsCRT::free(filename) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::Init(void)
|
||||
{
|
||||
nsresult rv ;
|
||||
|
||||
// don't initialize if no cache folder is set.
|
||||
if(!m_pDiskCacheFolder) return NS_OK ;
|
||||
|
||||
if(!m_DB) {
|
||||
m_DB = new nsDBAccessor() ;
|
||||
if(!m_DB)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
else
|
||||
NS_ADDREF(m_DB) ;
|
||||
}
|
||||
|
||||
// create cache sub directories
|
||||
nsCOMPtr<nsIFileSpec> cacheSubDir;
|
||||
rv = NS_NewFileSpec(getter_AddRefs(cacheSubDir));
|
||||
|
||||
for (int i=0; i < 32; i++) {
|
||||
rv = cacheSubDir->FromFileSpec(m_pDiskCacheFolder) ;
|
||||
if(NS_FAILED(rv))
|
||||
return rv ;
|
||||
|
||||
char dirName[3];
|
||||
PR_snprintf (dirName, 3, "%0.2x", i);
|
||||
cacheSubDir->AppendRelativeUnixPath (dirName) ;
|
||||
CreateDir(cacheSubDir);
|
||||
}
|
||||
|
||||
return InitDB() ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::InitDB(void)
|
||||
{
|
||||
nsresult rv ;
|
||||
|
||||
if(!m_DBFile) {
|
||||
NS_NewFileSpec(getter_AddRefs(m_DBFile)) ;
|
||||
if(!m_DBFile)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
}
|
||||
|
||||
rv = m_DBFile->FromFileSpec(m_pDiskCacheFolder) ;
|
||||
if(NS_FAILED(rv))
|
||||
return rv ;
|
||||
|
||||
m_DBFile->AppendRelativeUnixPath("cache.db") ;
|
||||
|
||||
rv = m_DB->Init(m_DBFile) ;
|
||||
|
||||
if(rv == NS_ERROR_FAILURE) {
|
||||
// try recovery if error
|
||||
DBRecovery() ;
|
||||
}
|
||||
|
||||
rv = GetSpecialEntry() ;
|
||||
if(rv == NS_ERROR_FAILURE) {
|
||||
// try recovery if error
|
||||
DBRecovery() ;
|
||||
}
|
||||
|
||||
return rv ;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// nsISupports methods
|
||||
|
||||
NS_IMPL_ISUPPORTS3(nsNetDiskCache,
|
||||
nsINetDataDiskCache,
|
||||
nsINetDataCache,
|
||||
nsISupports)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// nsINetDataCache Method
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::GetDescription(PRUnichar* *aDescription)
|
||||
{
|
||||
nsAutoString description("Disk Cache") ;
|
||||
*aDescription = description.ToNewUnicode() ;
|
||||
if(!*aDescription)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
/* don't alloc mem for nsICachedNetData.
|
||||
* RecordID is generated using the same scheme in nsCacheDiskData,
|
||||
* see GetCachedNetData() for detail.
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::Contains(const char* key, PRUint32 length, PRBool *_retval)
|
||||
{
|
||||
*_retval = PR_FALSE ;
|
||||
|
||||
NS_ASSERTION(m_DB, "no db.") ;
|
||||
|
||||
PRInt32 id = 0 ;
|
||||
nsresult rv = m_DB->GetID(key, length, &id) ;
|
||||
|
||||
if(NS_FAILED(rv)) {
|
||||
// try recovery if error
|
||||
DBRecovery() ;
|
||||
return rv ;
|
||||
}
|
||||
|
||||
void* info = 0 ;
|
||||
PRUint32 info_size = 0 ;
|
||||
|
||||
rv = m_DB->Get(id, &info, &info_size) ;
|
||||
if(NS_SUCCEEDED(rv) && info)
|
||||
*_retval = PR_TRUE ;
|
||||
|
||||
if(NS_FAILED(rv)) {
|
||||
// try recovery if error
|
||||
DBRecovery() ;
|
||||
}
|
||||
|
||||
return rv ;
|
||||
}
|
||||
|
||||
/* regardless if it's cached or not, a copy of nsNetDiskCache would
|
||||
* always be returned. so release it appropriately.
|
||||
* if mem alloced, updata m_NumEntries also.
|
||||
* for now, the new nsCachedNetData is not written into db yet since
|
||||
* we have nothing to write.
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::GetCachedNetData(const char* key, PRUint32 length, nsINetDataCacheRecord **_retval)
|
||||
{
|
||||
NS_ASSERTION(m_DB, "no db.") ;
|
||||
|
||||
nsresult rv = 0 ;
|
||||
if (!_retval)
|
||||
return NS_ERROR_NULL_POINTER ;
|
||||
|
||||
*_retval = nsnull ;
|
||||
|
||||
PRInt32 id = 0 ;
|
||||
rv = m_DB->GetID(key, length, &id) ;
|
||||
if(NS_FAILED(rv)) {
|
||||
// try recovery if error
|
||||
DBRecovery() ;
|
||||
return rv ;
|
||||
}
|
||||
|
||||
// construct an empty record
|
||||
nsDiskCacheRecord* newRecord = new nsDiskCacheRecord(m_DB, this) ;
|
||||
if(!newRecord)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
|
||||
rv = newRecord->Init(key, length, id) ;
|
||||
if(NS_FAILED(rv)) {
|
||||
delete newRecord ;
|
||||
return rv ;
|
||||
}
|
||||
|
||||
NS_ADDREF(newRecord) ; // addref for _retval
|
||||
*_retval = (nsINetDataCacheRecord*) newRecord ;
|
||||
|
||||
void* info = 0 ;
|
||||
PRUint32 info_size = 0 ;
|
||||
|
||||
rv = m_DB->Get(id, &info, &info_size) ;
|
||||
if(NS_SUCCEEDED(rv) && info) {
|
||||
|
||||
// this is a previously cached record
|
||||
nsresult r1 ;
|
||||
r1 = newRecord->RetrieveInfo(info, info_size) ;
|
||||
|
||||
if(NS_SUCCEEDED(rv))
|
||||
return NS_OK ;
|
||||
else {
|
||||
// probably a bad one
|
||||
NS_RELEASE(newRecord) ;
|
||||
*_retval = nsnull ;
|
||||
return r1;
|
||||
}
|
||||
|
||||
} else if (NS_SUCCEEDED(rv) && !info) {
|
||||
// this is a new record.
|
||||
m_NumEntries ++ ;
|
||||
return NS_OK ;
|
||||
} else {
|
||||
// database error.
|
||||
DBRecovery() ;
|
||||
return rv ;
|
||||
}
|
||||
}
|
||||
|
||||
/* get an nsICachedNetData, mem needs to be de-alloced if not found. */
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::GetCachedNetDataByID(PRInt32 RecordID, nsINetDataCacheRecord **_retval)
|
||||
{
|
||||
NS_ASSERTION(m_DB, "no db.") ;
|
||||
|
||||
if (!_retval)
|
||||
return NS_ERROR_NULL_POINTER ;
|
||||
|
||||
*_retval = nsnull ;
|
||||
|
||||
nsresult rv ;
|
||||
|
||||
void* info = 0 ;
|
||||
PRUint32 info_size = 0 ;
|
||||
|
||||
rv = m_DB->Get(RecordID, &info, &info_size) ;
|
||||
if(NS_SUCCEEDED(rv) && info) {
|
||||
|
||||
// construct an empty record if only found in db
|
||||
nsDiskCacheRecord* newRecord = new nsDiskCacheRecord(m_DB, this) ;
|
||||
if(!newRecord)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
|
||||
NS_ADDREF(newRecord) ; // addref for _retval
|
||||
rv = newRecord->RetrieveInfo(info, info_size) ;
|
||||
|
||||
if(NS_SUCCEEDED(rv)) {
|
||||
*_retval = (nsINetDataCacheRecord*) newRecord ;
|
||||
return NS_OK ;
|
||||
}
|
||||
else {
|
||||
// bad record, I guess
|
||||
NS_RELEASE(newRecord) ; // release if bad things happen
|
||||
return rv ;
|
||||
}
|
||||
} else {
|
||||
NS_ERROR("Error: RecordID not in DB\n") ;
|
||||
DBRecovery() ;
|
||||
return rv ;
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::GetEnabled(PRBool *aEnabled)
|
||||
{
|
||||
*aEnabled = m_Enabled ;
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::SetEnabled(PRBool aEnabled)
|
||||
{
|
||||
m_Enabled = aEnabled ;
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::GetFlags(PRUint32 *aFlags)
|
||||
{
|
||||
*aFlags = FILE_PER_URL_CACHE;
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::GetNumEntries(PRUint32 *aNumEntries)
|
||||
{
|
||||
*aNumEntries = m_NumEntries ;
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::GetMaxEntries(PRUint32 *aMaxEntries)
|
||||
{
|
||||
*aMaxEntries = m_MaxEntries ;
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::NewCacheEntryIterator(nsISimpleEnumerator **_retval)
|
||||
{
|
||||
NS_ASSERTION(m_DB, "no db.") ;
|
||||
|
||||
if(!_retval)
|
||||
return NS_ERROR_NULL_POINTER ;
|
||||
|
||||
*_retval = nsnull ;
|
||||
|
||||
nsISimpleEnumerator* enumerator = new nsDBEnumerator(m_DB, this) ;
|
||||
if(enumerator) {
|
||||
NS_ADDREF(enumerator) ;
|
||||
*_retval = enumerator ;
|
||||
return NS_OK ;
|
||||
}
|
||||
else
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::GetNextCache(nsINetDataCache * *aNextCache)
|
||||
{
|
||||
if(!aNextCache)
|
||||
return NS_ERROR_NULL_POINTER ;
|
||||
|
||||
*aNextCache = m_pNextCache ;
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::SetNextCache(nsINetDataCache *aNextCache)
|
||||
{
|
||||
m_pNextCache = aNextCache ;
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
// db size can always be measured at the last minute. Since it's hard
|
||||
// to know before hand.
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::GetStorageInUse(PRUint32 *aStorageInUse)
|
||||
{
|
||||
NS_ASSERTION(m_DB, "no db.") ;
|
||||
|
||||
PRUint32 total_size = m_StorageInUse ;
|
||||
|
||||
/*
|
||||
PRUint32 len = 0 ;
|
||||
// add the size of the db.
|
||||
m_DB->GetDBFilesize(&len) ;
|
||||
total_size += len ;
|
||||
*/
|
||||
|
||||
// we need size in kB
|
||||
total_size = total_size >> 10 ;
|
||||
|
||||
*aStorageInUse = total_size ;
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
/*
|
||||
* The whole cache dirs can be whiped clean since all the cache
|
||||
* files are resides in seperate hashed dirs. It's safe to do so.
|
||||
*/
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::RemoveAll(void)
|
||||
{
|
||||
NS_ASSERTION(m_DB, "no db.") ;
|
||||
NS_ASSERTION(m_pDiskCacheFolder, "no cache folder.") ;
|
||||
|
||||
// remove all the sub folders
|
||||
nsFileSpec cacheSubDir;
|
||||
|
||||
for (int i=0; i < 32; i++) {
|
||||
m_pDiskCacheFolder->GetFileSpec(&cacheSubDir) ;
|
||||
|
||||
char dirName[3];
|
||||
PR_snprintf (dirName, 3, "%0.2x", i);
|
||||
cacheSubDir += dirName ;
|
||||
RemoveFolder(cacheSubDir) ;
|
||||
}
|
||||
|
||||
// don't forget the db file itself
|
||||
m_DB->Shutdown() ;
|
||||
nsFileSpec dbfile ;
|
||||
m_DBFile->GetFileSpec(&dbfile) ;
|
||||
dbfile.Delete(PR_TRUE) ;
|
||||
|
||||
// reinitilize
|
||||
return Init() ;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// nsINetDataDiskCache methods
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::GetDiskCacheFolder(nsIFileSpec * *aDiskCacheFolder)
|
||||
{
|
||||
*aDiskCacheFolder = nsnull ;
|
||||
NS_ASSERTION(m_pDiskCacheFolder, "no cache folder.") ;
|
||||
|
||||
*aDiskCacheFolder = m_pDiskCacheFolder ;
|
||||
NS_ADDREF(*aDiskCacheFolder) ;
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::SetDiskCacheFolder(nsIFileSpec * aDiskCacheFolder)
|
||||
{
|
||||
if(!m_pDiskCacheFolder) {
|
||||
NS_NewFileSpec(getter_AddRefs(m_pDiskCacheFolder));
|
||||
if(!m_pDiskCacheFolder)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
|
||||
m_pDiskCacheFolder = aDiskCacheFolder ;
|
||||
return Init() ;
|
||||
}
|
||||
else {
|
||||
char *newfolder, *oldfolder ;
|
||||
m_pDiskCacheFolder->GetNativePath(&oldfolder) ;
|
||||
aDiskCacheFolder->GetNativePath(&newfolder) ;
|
||||
|
||||
if(PL_strcmp(newfolder, oldfolder) != 0) {
|
||||
m_pDiskCacheFolder = aDiskCacheFolder ;
|
||||
|
||||
// do we need to blow away old cache before building a new one?
|
||||
// return RemoveAll() ;
|
||||
|
||||
m_DB->Shutdown() ;
|
||||
return Init() ;
|
||||
|
||||
} else
|
||||
return NS_OK ;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// nsNetDiskCache methods
|
||||
|
||||
// create a directory (recursively)
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::CreateDir(nsIFileSpec* dir_spec)
|
||||
{
|
||||
PRBool does_exist ;
|
||||
nsCOMPtr<nsIFileSpec> p_spec ;
|
||||
|
||||
dir_spec->Exists(&does_exist) ;
|
||||
if(does_exist)
|
||||
return NS_OK ;
|
||||
|
||||
nsresult rv = dir_spec->GetParent(getter_AddRefs(p_spec)) ;
|
||||
if(NS_FAILED(rv))
|
||||
return rv ;
|
||||
|
||||
p_spec->Exists(&does_exist) ;
|
||||
if(!does_exist) {
|
||||
CreateDir(p_spec) ;
|
||||
rv = dir_spec->CreateDir() ;
|
||||
if(NS_FAILED(rv))
|
||||
return rv ;
|
||||
}
|
||||
else {
|
||||
rv = dir_spec->CreateDir() ;
|
||||
if(NS_FAILED(rv))
|
||||
return rv ;
|
||||
}
|
||||
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
// We can't afford to make a *separate* pass over the whole db on every
|
||||
// startup, just to figure out m_NumEntries and m_StorageInUse. (This is a
|
||||
// several second operation on a large db). We'll likely need to store
|
||||
// distinguished keys in the db that contain these values and update them
|
||||
// incrementally, except when failure to shut down the db cleanly is detected.
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::GetSpecialEntry(void)
|
||||
{
|
||||
void* pInfo ;
|
||||
PRUint32 InfoSize ;
|
||||
|
||||
nsresult rv = m_DB->GetSpecialEntry(&pInfo, &InfoSize) ;
|
||||
if(NS_FAILED(rv))
|
||||
return rv ;
|
||||
|
||||
if(!pInfo && InfoSize == 0) {
|
||||
// must be a new DB
|
||||
m_NumEntries = 0 ;
|
||||
m_StorageInUse = 0 ;
|
||||
}
|
||||
else {
|
||||
char * cur_ptr = NS_STATIC_CAST(char*, pInfo) ;
|
||||
|
||||
// get m_NumEntries
|
||||
COPY_INT32(&m_NumEntries, cur_ptr) ;
|
||||
cur_ptr += sizeof(PRUint32) ;
|
||||
|
||||
// get m_StorageInUse
|
||||
COPY_INT32(&m_StorageInUse, cur_ptr) ;
|
||||
cur_ptr += sizeof(PRUint32) ;
|
||||
|
||||
PR_ASSERT(cur_ptr == NS_STATIC_CAST(char*, pInfo) + InfoSize);
|
||||
}
|
||||
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::SetSpecialEntry(void)
|
||||
{
|
||||
PRUint32 InfoSize ;
|
||||
|
||||
InfoSize = sizeof m_NumEntries ;
|
||||
InfoSize += sizeof m_StorageInUse ;
|
||||
|
||||
void* pInfo = nsAllocator::Alloc(InfoSize*sizeof(char)) ;
|
||||
if(!pInfo)
|
||||
return NS_ERROR_OUT_OF_MEMORY ;
|
||||
|
||||
char* cur_ptr = NS_STATIC_CAST(char*, pInfo) ;
|
||||
|
||||
COPY_INT32(cur_ptr, &m_NumEntries) ;
|
||||
cur_ptr += sizeof(PRUint32) ;
|
||||
|
||||
COPY_INT32(cur_ptr, &m_StorageInUse) ;
|
||||
cur_ptr += sizeof(PRUint32) ;
|
||||
|
||||
PR_ASSERT(cur_ptr == NS_STATIC_CAST(char*, pInfo) + InfoSize);
|
||||
|
||||
return m_DB->SetSpecialEntry(pInfo, InfoSize) ;
|
||||
}
|
||||
|
||||
// this routine will be called everytime we have a db corruption.
|
||||
// m_DB will be re-initialized, m_StorageInUse and m_NumEntries will
|
||||
// be reset.
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::DBRecovery(void)
|
||||
{
|
||||
// rename all the sub cache dirs and remove them later during dtor.
|
||||
nsresult rv = RenameCacheSubDirs() ;
|
||||
if(NS_FAILED(rv))
|
||||
return rv ;
|
||||
|
||||
// remove corrupted db file, don't care if db->shutdown fails or not.
|
||||
m_DB->Shutdown() ;
|
||||
|
||||
nsFileSpec dbfile ;
|
||||
m_DBFile->GetFileSpec(&dbfile) ;
|
||||
dbfile.Delete(PR_TRUE) ;
|
||||
|
||||
// make sure it's not there any more
|
||||
PRBool exists = dbfile.Exists() ;
|
||||
if(exists) {
|
||||
NS_ERROR("can't remove old db.") ;
|
||||
return NS_ERROR_FAILURE ;
|
||||
}
|
||||
|
||||
// reinitilize DB
|
||||
return InitDB() ;
|
||||
}
|
||||
|
||||
// this routine will add string "trash" to current CacheSubDir names.
|
||||
// e.g. 00->trash00, 1f->trash1f. and update the m_DBCorrupted.
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::RenameCacheSubDirs(void)
|
||||
{
|
||||
nsCOMPtr<nsIFileSpec> cacheSubDir;
|
||||
nsresult rv = NS_NewFileSpec(getter_AddRefs(cacheSubDir)) ;
|
||||
|
||||
for (int i=0; i < 32; i++) {
|
||||
rv = cacheSubDir->FromFileSpec(m_pDiskCacheFolder) ;
|
||||
if(NS_FAILED(rv))
|
||||
return rv ;
|
||||
|
||||
char oldName[3], newName[8];
|
||||
PR_snprintf(oldName, 3, "%0.2x", i) ;
|
||||
cacheSubDir->AppendRelativeUnixPath(oldName) ;
|
||||
|
||||
// re-name the directory
|
||||
PR_snprintf(newName, 8, "trash%0.2x", i) ;
|
||||
rv = cacheSubDir->Rename(newName) ;
|
||||
if(NS_FAILED(rv))
|
||||
// TODO, error checking
|
||||
return NS_ERROR_FAILURE ;
|
||||
}
|
||||
|
||||
// update m_DBCorrupted
|
||||
m_DBCorrupted = PR_TRUE ;
|
||||
|
||||
return NS_OK ;
|
||||
}
|
||||
|
||||
// this routine is used by dtor and RemoveAll() to clean up dirs.
|
||||
NS_IMETHODIMP
|
||||
nsNetDiskCache::RemoveFolder(nsFileSpec aFolder)
|
||||
{
|
||||
for(nsDirectoryIterator di(aFolder, PR_FALSE); di.Exists(); di++) {
|
||||
di.Spec().Delete(PR_TRUE) ;
|
||||
}
|
||||
|
||||
aFolder.Delete(PR_FALSE) ; // recursive delete
|
||||
|
||||
return NS_OK ;
|
||||
}
|
||||
91
mozilla/netwerk/cache/filecache/nsNetDiskCache.h
vendored
Normal file
91
mozilla/netwerk/cache/filecache/nsNetDiskCache.h
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is Mozilla Communicator.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Intel Corp.
|
||||
* Portions created by Intel Corp. are
|
||||
* Copyright (C) 1999, 1999 Intel Corp. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Yixiong Zou <yixiong.zou@intel.com>
|
||||
* Carl Wong <carl.wong@intel.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file is part of filecache implementation.
|
||||
*
|
||||
* nsNetDiskCache is the main disk cache module that will create
|
||||
* the cache database, and then store and retrieve nsDiskCacheRecord
|
||||
* objects from it. It also contains some basic error recovery procedure.
|
||||
*/
|
||||
|
||||
#ifndef __gen_nsNetDiskCache_h__
|
||||
#define __gen_nsNetDiskCache_h__
|
||||
|
||||
#include "nsINetDataDiskCache.h"
|
||||
#include "nsNetDiskCacheCID.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsIPref.h"
|
||||
#include "nsDBAccessor.h"
|
||||
|
||||
class nsIURI; /* forward decl */
|
||||
class nsICachedNetData; /* forward decl */
|
||||
class nsISimpleEnumerator; /* forward decl */
|
||||
class nsIFileSpec; /* forward decl */
|
||||
|
||||
/* starting interface: nsNetDiskCache */
|
||||
|
||||
class nsNetDiskCache : public nsINetDataDiskCache {
|
||||
public:
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSINETDATACACHE
|
||||
NS_DECL_NSINETDATADISKCACHE
|
||||
|
||||
NS_IMETHOD Init(void) ;
|
||||
|
||||
nsNetDiskCache() ;
|
||||
virtual ~nsNetDiskCache() ;
|
||||
|
||||
protected:
|
||||
|
||||
NS_IMETHOD InitDB(void) ;
|
||||
NS_IMETHOD CreateDir(nsIFileSpec* dir_spec) ;
|
||||
NS_IMETHOD GetSpecialEntry(void) ;
|
||||
NS_IMETHOD SetSpecialEntry(void) ;
|
||||
|
||||
NS_IMETHOD RenameCacheSubDirs(void) ;
|
||||
NS_IMETHOD DBRecovery(void) ;
|
||||
NS_IMETHOD RemoveFolder(nsFileSpec aFolder) ;
|
||||
|
||||
private:
|
||||
|
||||
PRBool m_Enabled ;
|
||||
PRUint32 m_NumEntries ;
|
||||
nsCOMPtr<nsINetDataCache> m_pNextCache ;
|
||||
nsCOMPtr<nsIFileSpec> m_pDiskCacheFolder ;
|
||||
nsCOMPtr<nsIFileSpec> m_DBFile ;
|
||||
|
||||
PRUint32 m_MaxEntries ;
|
||||
PRUint32 m_StorageInUse ;
|
||||
nsIDBAccessor* m_DB ;
|
||||
|
||||
// this is used to indicate a db corruption
|
||||
PRBool m_DBCorrupted ;
|
||||
|
||||
friend class nsDiskCacheRecord ;
|
||||
friend class nsDiskCacheRecordChannel ;
|
||||
friend class nsDBEnumerator ;
|
||||
} ;
|
||||
|
||||
#endif /* __gen_nsNetDiskCache_h__ */
|
||||
32
mozilla/netwerk/cache/filecache/nsNetDiskCacheCID.h
vendored
Normal file
32
mozilla/netwerk/cache/filecache/nsNetDiskCacheCID.h
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* 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 Communicator.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Intel Corp.
|
||||
* Portions created by Intel Corp. are
|
||||
* Copyright (C) 1999, 1999 Intel Corp. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Yixiong Zou <yixiong.zou@intel.com>
|
||||
* Carl Wong <carl.wong@intel.com>
|
||||
*/
|
||||
|
||||
#ifndef _nsNetDiskCacheCID_h_
|
||||
#define _nsNetDiskCacheCID_h_
|
||||
|
||||
#define NS_NETDISKCACHE_CID_STR "ECFEEA00-7201-11d3-87FE-000629D01344"
|
||||
|
||||
#define NS_NETDISKCACHE_CID \
|
||||
{ 0xecfeea00, 0x7201, 0x11d3, \
|
||||
{ 0x87, 0xfe, 0x0, 0x6, 0x29, 0xd0, 0x13, 0x44 }}
|
||||
|
||||
#endif /* _nsNetDiskCacheCID_h_ */
|
||||
50
mozilla/netwerk/cache/filecache/test/Makefile.in
vendored
Normal file
50
mozilla/netwerk/cache/filecache/test/Makefile.in
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
#
|
||||
|
||||
DEPTH = ../../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
REQUIRES = libreg xpcom
|
||||
|
||||
CPPSRCS = \
|
||||
diskcache.cpp \
|
||||
$(NULL)
|
||||
|
||||
SIMPLE_PROGRAMS = $(CPPSRCS:.cpp=)
|
||||
|
||||
ifdef NO_LD_ARCHIVE_FLAGS
|
||||
LOST_SYM_LIBS = -lxpcomds_s -lxptinfo -lmozreg_s
|
||||
endif
|
||||
|
||||
LIBS = \
|
||||
-lmozjs \
|
||||
-lxpcom \
|
||||
-lmozdbm_s \
|
||||
$(MOZ_NECKO_UTIL_LIBS) \
|
||||
$(LOST_SYM_LIBS) \
|
||||
$(NSPR_LIBS) \
|
||||
$(NULL)
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
LOCAL_INCLUDES = -I$(srcdir)/..
|
||||
|
||||
DEFINES += -DUSE_NSREG -DCACHE
|
||||
836
mozilla/netwerk/cache/filecache/test/diskcache.cpp
vendored
Normal file
836
mozilla/netwerk/cache/filecache/test/diskcache.cpp
vendored
Normal file
@@ -0,0 +1,836 @@
|
||||
/* -*- 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.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 "nsIStreamListener.h"
|
||||
#include "nsIStreamObserver.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIInputStream.h"
|
||||
#include "nsIOutputStream.h"
|
||||
#include "nsIEventQueue.h"
|
||||
#include "nsIEventQueueService.h"
|
||||
#include "nsIChannel.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsString.h"
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "nsINetDataCache.h"
|
||||
#include "nsINetDataCacheRecord.h"
|
||||
//#include "nsMemCacheCID.h"
|
||||
#include "nsNetDiskCache.h"
|
||||
#include "nsIPref.h"
|
||||
#include "prenv.h"
|
||||
#include "nsIFileStream.h"
|
||||
|
||||
// Number of test entries to be placed in the cache
|
||||
#define NUM_CACHE_ENTRIES 250
|
||||
|
||||
// Cache content stream length will have random length between zero and
|
||||
// MAX_CONTENT_LENGTH bytes
|
||||
#define MAX_CONTENT_LENGTH 20000
|
||||
|
||||
// Length of random-data cache entry key
|
||||
#define CACHE_KEY_LENGTH 15
|
||||
|
||||
// Length of random-data cache entry meta-data
|
||||
#define CACHE_METADATA_LENGTH 100
|
||||
|
||||
//static NS_DEFINE_CID(kMemCacheCID, NS_MEM_CACHE_FACTORY_CID);
|
||||
static NS_DEFINE_CID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID);
|
||||
static NS_DEFINE_CID(kDiskCacheCID, NS_NETDISKCACHE_CID) ;
|
||||
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);
|
||||
static NS_DEFINE_IID(kIPrefIID, NS_IPREF_IID);
|
||||
|
||||
// Mapping from test case number to RecordID
|
||||
static PRInt32 recordID[NUM_CACHE_ENTRIES];
|
||||
|
||||
static PRInt32
|
||||
mapRecordIdToTestNum(PRInt32 aRecordID)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < NUM_CACHE_ENTRIES; i++) {
|
||||
if (recordID[i] == aRecordID)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// A supply of stream data to either store or compare with
|
||||
class nsITestDataStream {
|
||||
public:
|
||||
virtual ~nsITestDataStream() {};
|
||||
virtual PRUint32 Next() = 0;
|
||||
virtual void Read(char* aBuf, PRUint32 aCount) = 0;
|
||||
|
||||
virtual PRBool Match(char* aBuf, PRUint32 aCount) = 0;
|
||||
virtual void Skip(PRUint32 aCount) = 0;
|
||||
};
|
||||
|
||||
// A reproducible stream of random data.
|
||||
class RandomStream : public nsITestDataStream {
|
||||
public:
|
||||
RandomStream(PRUint32 aSeed) {
|
||||
mStartSeed = mState = aSeed;
|
||||
}
|
||||
|
||||
PRUint32 GetStartSeed() {
|
||||
return mStartSeed;
|
||||
}
|
||||
|
||||
PRUint32 Next() {
|
||||
mState = 1103515245 * mState + 12345;
|
||||
return mState;
|
||||
}
|
||||
|
||||
void Read(char* aBuf, PRUint32 aCount) {
|
||||
PRUint32 i;
|
||||
for (i = 0; i < aCount; i++) {
|
||||
*aBuf++ = Next();
|
||||
}
|
||||
}
|
||||
|
||||
PRBool
|
||||
Match(char* aBuf, PRUint32 aCount) {
|
||||
PRUint32 i;
|
||||
for (i = 0; i < aCount; i++) {
|
||||
if (*aBuf++ != (char)(Next() & 0xff))
|
||||
return PR_FALSE;
|
||||
}
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
Skip(PRUint32 aCount) {
|
||||
while (aCount--)
|
||||
Next();
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
PRUint32 mState;
|
||||
PRUint32 mStartSeed;
|
||||
};
|
||||
|
||||
// A stream of data that increments on each byte that is read, modulo 256
|
||||
class CounterStream : public nsITestDataStream {
|
||||
public:
|
||||
CounterStream(PRUint32 aSeed) {
|
||||
mStartSeed = mState = aSeed;
|
||||
}
|
||||
|
||||
PRUint32 GetStartSeed() {
|
||||
return mStartSeed;
|
||||
}
|
||||
|
||||
PRUint32 Next() {
|
||||
mState += 1;
|
||||
mState &= 0xff;
|
||||
return mState;
|
||||
}
|
||||
|
||||
void Read(char* aBuf, PRUint32 aCount) {
|
||||
PRUint32 i;
|
||||
for (i = 0; i < aCount; i++) {
|
||||
*aBuf++ = Next();
|
||||
}
|
||||
}
|
||||
|
||||
PRBool
|
||||
Match(char* aBuf, PRUint32 aCount) {
|
||||
PRUint32 i;
|
||||
for (i = 0; i < aCount; i++) {
|
||||
if (*aBuf++ != (char)Next())
|
||||
return PR_FALSE;
|
||||
}
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
Skip(PRUint32 aCount) {
|
||||
mState += aCount;
|
||||
mState &= 0xff;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
PRUint32 mState;
|
||||
PRUint32 mStartSeed;
|
||||
};
|
||||
|
||||
static int gNumReaders = 0;
|
||||
static PRUint32 gTotalBytesRead = 0;
|
||||
static PRUint32 gTotalDuration = 0;
|
||||
|
||||
class nsReader : public nsIStreamListener {
|
||||
public:
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
nsReader()
|
||||
: mStartTime(0), mBytesRead(0)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
gNumReaders++;
|
||||
}
|
||||
|
||||
virtual ~nsReader() {
|
||||
delete mTestDataStream;
|
||||
gNumReaders--;
|
||||
}
|
||||
|
||||
nsresult
|
||||
Init(nsIChannel *aChannel, nsITestDataStream* aRandomStream, PRUint32 aExpectedStreamLength) {
|
||||
mChannel = aChannel;
|
||||
mTestDataStream = aRandomStream;
|
||||
mExpectedStreamLength = aExpectedStreamLength;
|
||||
mRefCnt = 1;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHOD OnStartRequest(nsIChannel* channel,
|
||||
nsISupports* context) {
|
||||
mStartTime = PR_IntervalNow();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHOD OnDataAvailable(nsIChannel* channel,
|
||||
nsISupports* context,
|
||||
nsIInputStream *aIStream,
|
||||
PRUint32 aSourceOffset,
|
||||
PRUint32 aLength) {
|
||||
char buf[1025];
|
||||
while (aLength > 0) {
|
||||
PRUint32 amt;
|
||||
PRBool match;
|
||||
aIStream->Read(buf, sizeof buf, &amt);
|
||||
if (amt == 0) break;
|
||||
aLength -= amt;
|
||||
mBytesRead += amt;
|
||||
match = mTestDataStream->Match(buf, amt);
|
||||
NS_ASSERTION(match, "Stored data was corrupted on read");
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHOD OnStopRequest(nsIChannel* channel,
|
||||
nsISupports* context,
|
||||
nsresult aStatus,
|
||||
const PRUnichar* aMsg) {
|
||||
PRIntervalTime endTime;
|
||||
PRIntervalTime duration;
|
||||
|
||||
endTime = PR_IntervalNow();
|
||||
duration = (endTime - mStartTime);
|
||||
|
||||
if (NS_FAILED(aStatus)) printf("channel failed.\n");
|
||||
// printf("read %d bytes\n", mBytesRead);
|
||||
|
||||
NS_ASSERTION(mBytesRead == mExpectedStreamLength,
|
||||
"Stream in cache is wrong length");
|
||||
|
||||
gTotalBytesRead += mBytesRead;
|
||||
gTotalDuration += duration;
|
||||
|
||||
// Release channel
|
||||
mChannel = 0;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
protected:
|
||||
PRIntervalTime mStartTime;
|
||||
PRUint32 mBytesRead;
|
||||
nsITestDataStream* mTestDataStream;
|
||||
PRUint32 mExpectedStreamLength;
|
||||
nsCOMPtr<nsIChannel> mChannel;
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS2(nsReader, nsIStreamListener, nsIStreamObserver)
|
||||
|
||||
static nsIEventQueue* eventQueue;
|
||||
|
||||
nsresult
|
||||
InitQueue() {
|
||||
nsresult rv;
|
||||
|
||||
NS_WITH_SERVICE(nsIEventQueueService, eventQService, kEventQueueServiceCID, &rv);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't get event queue service");
|
||||
|
||||
rv = eventQService->CreateThreadEventQueue();
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't create event queue");
|
||||
|
||||
rv = eventQService->GetThreadEventQueue(PR_CurrentThread(), &eventQueue);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't get event queue for main thread");
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Process events until all streams are OnStopRequest'ed
|
||||
nsresult
|
||||
WaitForEvents() {
|
||||
while (gNumReaders) {
|
||||
eventQueue->ProcessPendingEvents();
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Read data for a single cache record and compare against testDataStream
|
||||
nsresult
|
||||
TestReadStream(nsINetDataCacheRecord *record, nsITestDataStream *testDataStream,
|
||||
PRUint32 expectedStreamLength)
|
||||
{
|
||||
nsCOMPtr<nsIChannel> channel;
|
||||
nsresult rv;
|
||||
PRUint32 actualContentLength;
|
||||
|
||||
rv = record->NewChannel(0, getter_AddRefs(channel));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
|
||||
rv = record->GetStoredContentLength(&actualContentLength);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
NS_ASSERTION(actualContentLength == expectedStreamLength,
|
||||
"nsINetDataCacheRecord::GetContentLength() busted ?");
|
||||
|
||||
nsReader *reader = new nsReader;
|
||||
reader->AddRef();
|
||||
rv = reader->Init(channel, testDataStream, expectedStreamLength);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
|
||||
rv = channel->AsyncRead(0, -1, 0, reader);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
reader->Release();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Check that records can be retrieved using their record-ID, in addition
|
||||
// to using the opaque key.
|
||||
nsresult
|
||||
TestRecordID(nsINetDataCache *cache)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsINetDataCacheRecord> record;
|
||||
RandomStream *randomStream;
|
||||
PRUint32 metaDataLength;
|
||||
char cacheKey[CACHE_KEY_LENGTH];
|
||||
char *metaData;
|
||||
PRUint32 testNum;
|
||||
PRBool match;
|
||||
|
||||
for (testNum = 0; testNum < NUM_CACHE_ENTRIES; testNum++) {
|
||||
randomStream = new RandomStream(testNum);
|
||||
randomStream->Read(cacheKey, sizeof cacheKey);
|
||||
|
||||
rv = cache->GetCachedNetDataByID(recordID[testNum], getter_AddRefs(record));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't obtain record using record ID");
|
||||
|
||||
// Match against previously stored meta-data
|
||||
rv = record->GetMetaData(&metaDataLength, &metaData);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't get record meta-data");
|
||||
match = randomStream->Match(metaData, metaDataLength);
|
||||
NS_ASSERTION(match, "Meta-data corrupted or incorrect");
|
||||
|
||||
nsAllocator::Free(metaData);
|
||||
delete randomStream;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Check that all cache entries in the database are enumerated and that
|
||||
// no duplicates appear.
|
||||
nsresult
|
||||
TestEnumeration(nsINetDataCache *cache)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsINetDataCacheRecord> record;
|
||||
nsCOMPtr<nsISupports> tempISupports;
|
||||
nsCOMPtr<nsISimpleEnumerator> iterator;
|
||||
RandomStream *randomStream;
|
||||
PRUint32 metaDataLength;
|
||||
char cacheKey[CACHE_KEY_LENGTH];
|
||||
char *metaData;
|
||||
PRUint32 testNum;
|
||||
PRBool match;
|
||||
PRInt32 recID;
|
||||
|
||||
int numRecords = 0;
|
||||
|
||||
// Iterate over all records in the cache
|
||||
rv = cache->NewCacheEntryIterator(getter_AddRefs(iterator));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't create new cache entry iterator");
|
||||
|
||||
PRBool notDone;
|
||||
while (1) {
|
||||
|
||||
// Done iterating ?
|
||||
rv = iterator->HasMoreElements(¬Done);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
if (!notDone)
|
||||
break;
|
||||
|
||||
// Get next record in iteration
|
||||
rv = iterator->GetNext(getter_AddRefs(tempISupports));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "iterator bustage");
|
||||
record = do_QueryInterface(tempISupports);
|
||||
|
||||
numRecords++;
|
||||
|
||||
// Get record ID
|
||||
rv = record->GetRecordID(&recID);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't get Record ID");
|
||||
testNum = mapRecordIdToTestNum(recID);
|
||||
NS_ASSERTION(testNum != -1, "Corrupted Record ID ?");
|
||||
|
||||
// Erase mapping from table, so that duplicate enumerations are detected
|
||||
recordID[testNum] = -1;
|
||||
|
||||
// Make sure stream matches test data
|
||||
randomStream = new RandomStream(testNum);
|
||||
randomStream->Read(cacheKey, sizeof cacheKey);
|
||||
|
||||
// Match against previously stored meta-data
|
||||
rv = record->GetMetaData(&metaDataLength, &metaData);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't get record meta-data");
|
||||
match = randomStream->Match(metaData, metaDataLength);
|
||||
NS_ASSERTION(match, "Meta-data corrupted or incorrect");
|
||||
nsAllocator::Free(metaData);
|
||||
|
||||
delete randomStream;
|
||||
}
|
||||
|
||||
NS_ASSERTION(numRecords == NUM_CACHE_ENTRIES, "Iteration bug");
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Read the test data that was written in FillCache(), checking for
|
||||
// corruption, truncation.
|
||||
nsresult
|
||||
TestRead(nsINetDataCache *cache)
|
||||
{
|
||||
nsresult rv;
|
||||
PRBool inCache;
|
||||
nsCOMPtr<nsINetDataCacheRecord> record;
|
||||
RandomStream *randomStream;
|
||||
PRUint32 metaDataLength;
|
||||
char cacheKey[CACHE_KEY_LENGTH];
|
||||
char *metaData, *storedCacheKey;
|
||||
PRUint32 testNum, storedCacheKeyLength;
|
||||
PRBool match;
|
||||
|
||||
for (testNum = 0; testNum < NUM_CACHE_ENTRIES; testNum++) {
|
||||
randomStream = new RandomStream(testNum);
|
||||
randomStream->Read(cacheKey, sizeof cacheKey);
|
||||
|
||||
// Ensure that entry is in the cache
|
||||
rv = cache->Contains(cacheKey, sizeof cacheKey, &inCache);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
NS_ASSERTION(inCache, "nsINetDataCache::Contains error");
|
||||
|
||||
rv = cache->GetCachedNetData(cacheKey, sizeof cacheKey, getter_AddRefs(record));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
|
||||
// Match against previously stored meta-data
|
||||
match = record->GetMetaData(&metaDataLength, &metaData);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
match = randomStream->Match(metaData, metaDataLength);
|
||||
NS_ASSERTION(match, "Meta-data corrupted or incorrect");
|
||||
nsAllocator::Free(metaData);
|
||||
|
||||
// Test GetKey() method
|
||||
rv = record->GetKey(&storedCacheKeyLength, &storedCacheKey);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv) &&
|
||||
(storedCacheKeyLength == sizeof cacheKey) &&
|
||||
!memcmp(storedCacheKey, &cacheKey[0], sizeof cacheKey),
|
||||
"nsINetDataCacheRecord::GetKey failed");
|
||||
nsAllocator::Free(storedCacheKey);
|
||||
|
||||
PRUint32 expectedStreamLength = randomStream->Next() & 0xffff;
|
||||
|
||||
TestReadStream(record, randomStream, expectedStreamLength);
|
||||
}
|
||||
|
||||
WaitForEvents();
|
||||
|
||||
// Compute rate in MB/s
|
||||
double rate = gTotalBytesRead / PR_IntervalToMilliseconds(gTotalDuration);
|
||||
rate *= NUM_CACHE_ENTRIES;
|
||||
rate *= 1000;
|
||||
rate /= (1024 * 1024);
|
||||
printf("Read %d bytes at a rate of %5.1f MB per second \n",
|
||||
gTotalBytesRead, rate);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Repeatedly call SetStoredContentLength() on a cache entry and make
|
||||
// read the stream's data to ensure that it's not corrupted by the effect
|
||||
nsresult
|
||||
TestTruncation(nsINetDataCache *cache)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsINetDataCacheRecord> record;
|
||||
RandomStream *randomStream;
|
||||
char cacheKey[CACHE_KEY_LENGTH];
|
||||
|
||||
randomStream = new RandomStream(0);
|
||||
randomStream->Read(cacheKey, sizeof cacheKey);
|
||||
|
||||
rv = cache->GetCachedNetData(cacheKey, sizeof cacheKey, getter_AddRefs(record));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
|
||||
randomStream->Skip(CACHE_METADATA_LENGTH);
|
||||
PRUint32 initialStreamLength = randomStream->Next() & 0xffff;
|
||||
delete randomStream;
|
||||
|
||||
PRUint32 i;
|
||||
PRUint32 delta = initialStreamLength / 64;
|
||||
for (i = initialStreamLength; i >= delta; i -= delta) {
|
||||
PRUint32 expectedStreamLength = i;
|
||||
|
||||
// Do the truncation
|
||||
record->SetStoredContentLength(expectedStreamLength);
|
||||
randomStream = new RandomStream(0);
|
||||
randomStream->Skip(CACHE_KEY_LENGTH + CACHE_METADATA_LENGTH + 1);
|
||||
|
||||
TestReadStream(record, randomStream, expectedStreamLength);
|
||||
WaitForEvents();
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Write known data to random offsets in a single cache entry and test
|
||||
// resulting stream for correctness.
|
||||
nsresult
|
||||
TestOffsetWrites(nsINetDataCache *cache)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsINetDataCacheRecord> record;
|
||||
nsCOMPtr<nsIChannel> channel;
|
||||
nsCOMPtr<nsIOutputStream> outStream;
|
||||
char buf[512];
|
||||
char cacheKey[CACHE_KEY_LENGTH];
|
||||
RandomStream *randomStream;
|
||||
|
||||
randomStream = new RandomStream(0);
|
||||
randomStream->Read(cacheKey, sizeof cacheKey);
|
||||
|
||||
rv = cache->GetCachedNetData(cacheKey, sizeof cacheKey, getter_AddRefs(record));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't access record via opaque cache key");
|
||||
|
||||
|
||||
nsCOMPtr<nsIFileSpec> file ;
|
||||
record->GetFilename(getter_AddRefs(file)) ;
|
||||
char* name ;
|
||||
file->GetUnixStyleFilePath(&name) ;
|
||||
printf(" file name is %s \n", name) ;
|
||||
|
||||
// Write buffer-fulls of data at random offsets into the cache entry.
|
||||
// Data written is (offset % 0xff)
|
||||
PRUint32 startingOffset;
|
||||
PRUint32 streamLength = 0;
|
||||
PRUint32 len = 0 ;
|
||||
CounterStream *counterStream;
|
||||
|
||||
int i = 0;
|
||||
for (i = 0; i < 257; i++) {
|
||||
rv = record->NewChannel(0, getter_AddRefs(channel));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
|
||||
startingOffset = streamLength ? streamLength - (randomStream->Next() % sizeof buf): 0;
|
||||
rv = channel->OpenOutputStream(startingOffset, getter_AddRefs(outStream));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
|
||||
truncate(name, startingOffset) ;
|
||||
|
||||
counterStream = new CounterStream(startingOffset);
|
||||
counterStream->Read(buf, sizeof buf);
|
||||
|
||||
nsresult status ;
|
||||
nsCOMPtr<nsIRandomAccessStore> ras = do_QueryInterface(outStream, &status);
|
||||
if (NS_FAILED(status)) {
|
||||
// mState = END_WRITE;
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
PRIntn offset ;
|
||||
ras->Tell(&offset) ;
|
||||
// printf(" offset is %d \n", offset) ;
|
||||
|
||||
PRUint32 numWritten;
|
||||
rv = outStream->Write(buf, sizeof buf, &numWritten);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
NS_ASSERTION(numWritten == sizeof buf, "Write() bug?");
|
||||
streamLength = startingOffset + sizeof buf;
|
||||
|
||||
rv = outStream->Close();
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't close channel");
|
||||
delete counterStream;
|
||||
|
||||
record->GetStoredContentLength(&len) ;
|
||||
if(len != streamLength)
|
||||
printf(" offset = %d is wrong, filesize = %d\n", startingOffset, len) ;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
rv = record->NewChannel(0, getter_AddRefs(channel));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
|
||||
startingOffset = 208;
|
||||
rv = channel->OpenOutputStream(startingOffset, getter_AddRefs(outStream));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
|
||||
counterStream = new CounterStream(startingOffset);
|
||||
counterStream->Read(buf, sizeof buf);
|
||||
|
||||
nsresult status ;
|
||||
nsCOMPtr<nsIRandomAccessStore> ras = do_QueryInterface(outStream, &status);
|
||||
if (NS_FAILED(status)) {
|
||||
// mState = END_WRITE;
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
PRIntn offset = 0 ;
|
||||
ras->Tell(&offset) ;
|
||||
printf(" offset is %d \n", offset) ;
|
||||
|
||||
PRUint32 numWritten;
|
||||
rv = outStream->Write(buf, sizeof buf, &numWritten);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
NS_ASSERTION(numWritten == sizeof buf, "Write() bug?");
|
||||
streamLength = startingOffset + sizeof buf;
|
||||
|
||||
rv = outStream->Close();
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't close channel");
|
||||
delete counterStream;
|
||||
|
||||
record->GetStoredContentLength(&len) ;
|
||||
if(len != streamLength)
|
||||
printf(" offset = %d is wrong, filesize = %d\n", startingOffset, len) ;
|
||||
*/
|
||||
|
||||
delete randomStream;
|
||||
|
||||
counterStream = new CounterStream(0);
|
||||
TestReadStream(record, counterStream, streamLength);
|
||||
WaitForEvents();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Create entries in the network data cache, using random data for the
|
||||
// key, the meta-data and the stored content data.
|
||||
nsresult
|
||||
FillCache(nsINetDataCache *cache)
|
||||
{
|
||||
nsresult rv;
|
||||
PRBool inCache;
|
||||
nsCOMPtr<nsINetDataCacheRecord> record;
|
||||
nsCOMPtr<nsIChannel> channel;
|
||||
nsCOMPtr<nsIOutputStream> outStream;
|
||||
char buf[1000];
|
||||
PRUint32 metaDataLength;
|
||||
char cacheKey[CACHE_KEY_LENGTH];
|
||||
char metaData[CACHE_METADATA_LENGTH];
|
||||
PRUint32 testNum;
|
||||
char *data;
|
||||
RandomStream *randomStream;
|
||||
|
||||
PRIntervalTime startTime = PR_IntervalNow();
|
||||
|
||||
for (testNum = 0; testNum < NUM_CACHE_ENTRIES; testNum++) {
|
||||
randomStream = new RandomStream(testNum);
|
||||
randomStream->Read(cacheKey, sizeof cacheKey);
|
||||
|
||||
// No entry should be in cache until we add it
|
||||
rv = cache->Contains(cacheKey, sizeof cacheKey, &inCache);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
NS_ASSERTION(!inCache, "nsINetDataCache::Contains error");
|
||||
|
||||
rv = cache->GetCachedNetData(cacheKey, sizeof cacheKey, getter_AddRefs(record));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't access record via opaque cache key");
|
||||
|
||||
// Test nsINetDataCacheRecord::GetRecordID()
|
||||
rv = record->GetRecordID(&recordID[testNum]);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't get Record ID");
|
||||
|
||||
// Test nsINetDataCache::GetNumEntries()
|
||||
PRUint32 numEntries = (PRUint32)-1;
|
||||
rv = cache->GetNumEntries(&numEntries);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't get number of cache entries");
|
||||
NS_ASSERTION(numEntries == testNum + 1, "GetNumEntries failure");
|
||||
|
||||
// Record meta-data should be initially empty
|
||||
rv = record->GetMetaData(&metaDataLength, &data);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
if ((metaDataLength != 0) || (data != 0))
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
// Store random data as meta-data
|
||||
randomStream->Read(metaData, sizeof metaData);
|
||||
record->SetMetaData(sizeof metaData, metaData);
|
||||
|
||||
rv = record->NewChannel(0, getter_AddRefs(channel));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
|
||||
rv = channel->OpenOutputStream(0, getter_AddRefs(outStream));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
|
||||
PRUint32 beforeOccupancy;
|
||||
rv = cache->GetStorageInUse(&beforeOccupancy);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't get cache occupancy");
|
||||
|
||||
int streamLength = randomStream->Next() & 0xffff;
|
||||
int remaining = streamLength;
|
||||
while (remaining) {
|
||||
PRUint32 numWritten;
|
||||
int amount = PR_MIN(sizeof buf, remaining);
|
||||
randomStream->Read(buf, amount);
|
||||
|
||||
rv = outStream->Write(buf, amount, &numWritten);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
NS_ASSERTION(numWritten == (PRUint32)amount, "Write() bug?");
|
||||
|
||||
remaining -= amount;
|
||||
}
|
||||
outStream->Close();
|
||||
|
||||
PRUint32 afterOccupancy;
|
||||
rv = cache->GetStorageInUse(&afterOccupancy);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't get cache occupancy");
|
||||
PRUint32 streamLengthInKB = streamLength >> 10;
|
||||
NS_ASSERTION((afterOccupancy - beforeOccupancy) >= streamLengthInKB,
|
||||
"nsINetDataCache::GetStorageInUse() is busted");
|
||||
|
||||
|
||||
// *Now* there should be an entry in the cache
|
||||
rv = cache->Contains(cacheKey, sizeof cacheKey, &inCache);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), " ");
|
||||
NS_ASSERTION(inCache, "nsINetDataCache::Contains error");
|
||||
|
||||
delete randomStream;
|
||||
}
|
||||
|
||||
PRIntervalTime endTime = PR_IntervalNow();
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult NS_AutoregisterComponents()
|
||||
{
|
||||
nsresult rv = nsComponentManager::AutoRegister(nsIComponentManager::NS_Startup,
|
||||
NULL /* default */);
|
||||
return rv;
|
||||
}
|
||||
|
||||
PRBool initPref ()
|
||||
{
|
||||
nsresult rv;
|
||||
NS_WITH_SERVICE(nsIPref, prefPtr, kPrefCID, &rv);
|
||||
if (NS_FAILED(rv))
|
||||
return false;
|
||||
|
||||
nsCOMPtr<nsIFileSpec> fileSpec;
|
||||
rv = NS_NewFileSpec (getter_AddRefs(fileSpec));
|
||||
if (NS_FAILED(rv))
|
||||
return false;
|
||||
|
||||
nsCString defaultPrefFile = PR_GetEnv ("MOZILLA_FIVE_HOME");
|
||||
if (defaultPrefFile.Length())
|
||||
defaultPrefFile += "/";
|
||||
else
|
||||
defaultPrefFile = "./";
|
||||
defaultPrefFile += "default_prefs.js";
|
||||
|
||||
fileSpec->SetUnixStyleFilePath (defaultPrefFile.GetBuffer());
|
||||
|
||||
PRBool exists = false;
|
||||
fileSpec->Exists(&exists);
|
||||
if (exists)
|
||||
prefPtr->ReadUserPrefsFrom(fileSpec);
|
||||
else
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char* argv[])
|
||||
{
|
||||
initPref() ;
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsINetDataCache> cache;
|
||||
|
||||
rv = NS_AutoregisterComponents();
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't register XPCOM components");
|
||||
|
||||
rv = nsComponentManager::CreateInstance(kDiskCacheCID, nsnull,
|
||||
NS_GET_IID(nsINetDataCache),
|
||||
getter_AddRefs(cache));
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't create memory cache factory");
|
||||
|
||||
InitQueue();
|
||||
|
||||
PRUnichar* description;
|
||||
rv = cache->GetDescription(&description);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't get cache description");
|
||||
nsCAutoString descStr(description);
|
||||
printf("Testing: %s\n", descStr.GetBuffer());
|
||||
|
||||
rv = cache->RemoveAll();
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't clear cache");
|
||||
|
||||
PRUint32 startOccupancy;
|
||||
rv = cache->GetStorageInUse(&startOccupancy);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't get cache occupancy");
|
||||
|
||||
PRUint32 numEntries = (PRUint32)-1;
|
||||
rv = cache->GetNumEntries(&numEntries);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't get number of cache entries");
|
||||
NS_ASSERTION(numEntries == 0, "Couldn't clear cache");
|
||||
|
||||
rv = FillCache(cache);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't fill cache with random test data");
|
||||
|
||||
rv = TestRead(cache);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't read random test data from cache");
|
||||
|
||||
rv = TestRecordID(cache);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't index records using record ID");
|
||||
|
||||
rv = TestEnumeration(cache);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't successfully enumerate records");
|
||||
|
||||
rv = TestTruncation(cache);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't successfully truncate records");
|
||||
|
||||
rv = TestOffsetWrites(cache);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't successfully write to records using non-zero offsets");
|
||||
|
||||
rv = cache->RemoveAll();
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't clear cache");
|
||||
rv = cache->GetNumEntries(&numEntries);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't get number of cache entries");
|
||||
NS_ASSERTION(numEntries == 0, "Couldn't clear cache");
|
||||
|
||||
PRUint32 endOccupancy;
|
||||
rv = cache->GetStorageInUse(&endOccupancy);
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv), "Couldn't get cache occupancy");
|
||||
|
||||
NS_ASSERTION(startOccupancy == endOccupancy, "Cache occupancy not correctly computed ?");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
48
mozilla/netwerk/cache/memcache/Makefile.in
vendored
Normal file
48
mozilla/netwerk/cache/memcache/Makefile.in
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
# Generated automatically from Makefile.in by configure.
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
#
|
||||
|
||||
DEPTH = ../../..
|
||||
topsrcdir = @top_srcdir@
|
||||
VPATH = @srcdir@
|
||||
srcdir = @srcdir@
|
||||
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
MODULE = nkcache
|
||||
|
||||
LIBRARY_NAME = nkmemcache_s
|
||||
|
||||
REQUIRES = nspr dbm
|
||||
|
||||
EXPORTS=nsMemCacheCID.h \
|
||||
nsMemCache.h \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = \
|
||||
nsMemCache.cpp \
|
||||
nsMemCacheRecord.cpp \
|
||||
nsMemCacheChannel.cpp \
|
||||
$(NULL)
|
||||
|
||||
# we don't want the shared lib, but we want to force the creation of a
|
||||
# static lib.
|
||||
override NO_SHARED_LIB=1
|
||||
override NO_STATIC_LIB=
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
42
mozilla/netwerk/cache/memcache/makefile.win
vendored
Normal file
42
mozilla/netwerk/cache/memcache/makefile.win
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
#!nmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public License
|
||||
# Version 1.0 (the "NPL"); you may not use this file except in
|
||||
# compliance with the NPL. You may obtain a copy of the NPL at
|
||||
# http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
# for the specific language governing rights and limitations under the
|
||||
# NPL.
|
||||
#
|
||||
# The Initial Developer of this code under the NPL is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||||
# Reserved.
|
||||
|
||||
DEPTH=..\..\..
|
||||
|
||||
include <$(DEPTH)/config/config.mak>
|
||||
|
||||
MODULE = nkcache
|
||||
|
||||
LIBRARY_NAME = nkmemcache_s
|
||||
|
||||
CPP_OBJS = \
|
||||
.\$(OBJDIR)\nsMemCache.obj \
|
||||
.\$(OBJDIR)\nsMemCacheRecord.obj \
|
||||
.\$(OBJDIR)\nsMemCacheChannel.obj \
|
||||
$(NULL)
|
||||
|
||||
EXPORTS=nsMemCacheCID.h
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
install:: $(LIBRARY)
|
||||
$(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib
|
||||
|
||||
clobber::
|
||||
rm -rf $(OBJDIR)
|
||||
rm -f $(DIST)\lib\$(LIBRARY_NAME).lib
|
||||
|
||||
334
mozilla/netwerk/cache/memcache/nsMemCache.cpp
vendored
Normal file
334
mozilla/netwerk/cache/memcache/nsMemCache.cpp
vendored
Normal file
@@ -0,0 +1,334 @@
|
||||
/* -*- 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 Communicator client code, released
|
||||
* March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* nsMemCache is the implementation of an in-memory network-data
|
||||
* cache, used to cache the responses to network retrieval commands.
|
||||
* Each cache entry may contain both content, e.g. GIF image data, and
|
||||
* associated metadata, e.g. HTTP headers. Each entry is indexed by
|
||||
* two different keys: a record id number and an opaque key, which is
|
||||
* created by the cache manager by combining the URI with a "secondary
|
||||
* key", e.g. HTTP post data.
|
||||
*/
|
||||
|
||||
#include "nsMemCache.h"
|
||||
#include "nsMemCacheRecord.h"
|
||||
#include "nsIGenericFactory.h"
|
||||
#include "nsString.h"
|
||||
#include "nsHashtable.h"
|
||||
#include "nsHashtableEnumerator.h"
|
||||
#include "nsEnumeratorUtils.h"
|
||||
|
||||
PRInt32 nsMemCache::gRecordSerialNumber = 0;
|
||||
|
||||
nsMemCache::nsMemCache()
|
||||
: mNumEntries(0), mOccupancy(0), mEnabled(PR_TRUE),
|
||||
mHashTable(0)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
}
|
||||
|
||||
nsMemCache::~nsMemCache()
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
rv = RemoveAll();
|
||||
NS_ASSERTION(NS_SUCCEEDED(rv) && (mNumEntries == 0),
|
||||
"Failure to shut down memory cache. "
|
||||
"Somewhere, someone is holding references to at least one cache record");
|
||||
delete mHashTable;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsMemCache::Init()
|
||||
{
|
||||
mHashTable = new nsHashtable(256);
|
||||
if (!mHashTable)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMPL_ISUPPORTS(nsMemCache, NS_GET_IID(nsINetDataCache))
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCache::GetDescription(PRUnichar * *aDescription)
|
||||
{
|
||||
nsAutoString description("Memory Cache");
|
||||
*aDescription = description.ToNewUnicode();
|
||||
if (!*aDescription)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCache::Contains(const char *aKey, PRUint32 aKeyLength, PRBool *aFound)
|
||||
{
|
||||
nsOpaqueKey *opaqueKey = new nsOpaqueKey(aKey, aKeyLength);
|
||||
if (!opaqueKey)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
*aFound = mHashTable->Exists(opaqueKey);
|
||||
delete opaqueKey;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCache::GetCachedNetData(const char *aKey, PRUint32 aKeyLength,
|
||||
nsINetDataCacheRecord* *aRecord)
|
||||
{
|
||||
nsresult rv;
|
||||
nsMemCacheRecord* record = 0;
|
||||
nsOpaqueKey *opaqueKey2 = 0;
|
||||
nsOpaqueKey *opaqueKey3 = 0;
|
||||
nsOpaqueKey *opaqueKey;
|
||||
|
||||
opaqueKey = new nsOpaqueKey(aKey, aKeyLength);
|
||||
if (!opaqueKey)
|
||||
goto out_of_memory;
|
||||
record = (nsMemCacheRecord*)mHashTable->Get(opaqueKey);
|
||||
delete opaqueKey;
|
||||
|
||||
// No existing cache database entry was found. Create a new one.
|
||||
// This requires two mappings in the hash table:
|
||||
// Record ID ==> record
|
||||
// Opaque key ==> record
|
||||
if (!record) {
|
||||
record = new nsMemCacheRecord;
|
||||
if (!record)
|
||||
goto out_of_memory;
|
||||
rv = record->Init(aKey, aKeyLength, ++gRecordSerialNumber, this);
|
||||
if (NS_FAILED(rv)) goto out_of_memory;
|
||||
|
||||
// Index the record by opaque key
|
||||
opaqueKey2 = new nsOpaqueKey(record->mKey, record->mKeyLength);
|
||||
if (!opaqueKey2) goto out_of_memory;
|
||||
mHashTable->Put(opaqueKey2, record);
|
||||
|
||||
// Index the record by it's record ID
|
||||
char *recordIDbytes = NS_REINTERPRET_CAST(char *, &record->mRecordID);
|
||||
opaqueKey3 = new nsOpaqueKey(recordIDbytes,
|
||||
sizeof record->mRecordID);
|
||||
if (!opaqueKey3) {
|
||||
// Clean up the first record from the hash table
|
||||
mHashTable->Remove(opaqueKey);
|
||||
goto out_of_memory;
|
||||
}
|
||||
mHashTable->Put(opaqueKey3, record);
|
||||
|
||||
// The hash table holds on to the record
|
||||
record->AddRef();
|
||||
|
||||
delete opaqueKey2;
|
||||
delete opaqueKey3;
|
||||
mNumEntries++;
|
||||
}
|
||||
|
||||
record->AddRef();
|
||||
*aRecord = record;
|
||||
return NS_OK;
|
||||
|
||||
out_of_memory:
|
||||
delete opaqueKey2;
|
||||
delete opaqueKey3;
|
||||
delete record;
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCache::GetCachedNetDataByID(PRInt32 RecordID,
|
||||
nsINetDataCacheRecord* *aRecord)
|
||||
{
|
||||
nsOpaqueKey opaqueKey(NS_REINTERPRET_CAST(const char *, &RecordID),
|
||||
sizeof RecordID);
|
||||
*aRecord = (nsINetDataCacheRecord*)mHashTable->Get(&opaqueKey);
|
||||
if (*aRecord) {
|
||||
NS_ADDREF(*aRecord);
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
NS_METHOD
|
||||
nsMemCache::Delete(nsMemCacheRecord* aRecord)
|
||||
{
|
||||
nsMemCacheRecord *removedRecord;
|
||||
|
||||
char *recordIDbytes = NS_REINTERPRET_CAST(char *, &aRecord->mRecordID);
|
||||
nsOpaqueKey opaqueRecordIDKey(recordIDbytes,
|
||||
sizeof aRecord->mRecordID);
|
||||
removedRecord = (nsMemCacheRecord*)mHashTable->Remove(&opaqueRecordIDKey);
|
||||
NS_ASSERTION(removedRecord == aRecord, "memory cache database inconsistent");
|
||||
|
||||
nsOpaqueKey opaqueKey(aRecord->mKey, aRecord->mKeyLength);
|
||||
removedRecord = (nsMemCacheRecord*)mHashTable->Remove(&opaqueKey);
|
||||
NS_ASSERTION(removedRecord == aRecord, "memory cache database inconsistent");
|
||||
|
||||
aRecord->Release();
|
||||
|
||||
mNumEntries--;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCache::GetEnabled(PRBool *aEnabled)
|
||||
{
|
||||
NS_ENSURE_ARG(aEnabled);
|
||||
*aEnabled = mEnabled;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCache::SetEnabled(PRBool aEnabled)
|
||||
{
|
||||
mEnabled = aEnabled;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCache::GetFlags(PRUint32 *aFlags)
|
||||
{
|
||||
NS_ENSURE_ARG(aFlags);
|
||||
*aFlags = MEMORY_CACHE;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCache::GetNumEntries(PRUint32 *aNumEntries)
|
||||
{
|
||||
NS_ENSURE_ARG(aNumEntries);
|
||||
*aNumEntries = mNumEntries;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCache::GetMaxEntries(PRUint32 *aMaxEntries)
|
||||
{
|
||||
NS_ENSURE_ARG(aMaxEntries);
|
||||
*aMaxEntries = MEM_CACHE_MAX_ENTRIES;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
static NS_METHOD
|
||||
HashEntryConverter(nsHashKey *aKey, void *aValue,
|
||||
void *unused, nsISupports **retval)
|
||||
{
|
||||
nsMemCacheRecord *record;
|
||||
nsOpaqueKey *opaqueKey;
|
||||
|
||||
record = (nsMemCacheRecord*)aValue;
|
||||
opaqueKey = (nsOpaqueKey*)aKey;
|
||||
|
||||
// Hash table keys that index cache entries by their record ID
|
||||
// shouldn't be enumerated.
|
||||
if ((opaqueKey->GetKeyLength() == sizeof(PRInt32))) {
|
||||
|
||||
#ifdef DEBUG
|
||||
PRInt32 recordID;
|
||||
record->GetRecordID(&recordID);
|
||||
NS_ASSERTION(*((PRInt32*)opaqueKey->GetKey()) == recordID,
|
||||
"Key has incorrect key length");
|
||||
#endif
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
NS_IF_ADDREF(record);
|
||||
*retval = NS_STATIC_CAST(nsISupports*, record);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCache::NewCacheEntryIterator(nsISimpleEnumerator* *aIterator)
|
||||
{
|
||||
nsCOMPtr<nsIEnumerator> iterator;
|
||||
|
||||
NS_ENSURE_ARG(aIterator);
|
||||
NS_NewHashtableEnumerator(mHashTable, HashEntryConverter,
|
||||
mHashTable, getter_AddRefs(iterator));
|
||||
return NS_NewAdapterEnumerator(aIterator, iterator);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCache::GetNextCache(nsINetDataCache* *aNextCache)
|
||||
{
|
||||
NS_ENSURE_ARG(aNextCache);
|
||||
*aNextCache = mNextCache;
|
||||
NS_ADDREF(*aNextCache);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCache::SetNextCache(nsINetDataCache* aNextCache)
|
||||
{
|
||||
mNextCache = aNextCache;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCache::GetStorageInUse(PRUint32 *aStorageInUse)
|
||||
{
|
||||
NS_ENSURE_ARG(aStorageInUse);
|
||||
|
||||
// Convert from bytes to KB
|
||||
*aStorageInUse = (mOccupancy >> 10);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCache::RemoveAll(void)
|
||||
{
|
||||
PRBool failed;
|
||||
|
||||
nsCOMPtr<nsISimpleEnumerator> iterator;
|
||||
nsCOMPtr<nsISupports> recordSupports;
|
||||
nsCOMPtr<nsINetDataCacheRecord> record;
|
||||
nsresult rv;
|
||||
|
||||
failed = PR_FALSE;
|
||||
rv = NewCacheEntryIterator(getter_AddRefs(iterator));
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
PRBool notDone;
|
||||
while (1) {
|
||||
rv = iterator->HasMoreElements(¬Done);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
if (!notDone)
|
||||
break;
|
||||
|
||||
iterator->GetNext(getter_AddRefs(recordSupports));
|
||||
record = do_QueryInterface(recordSupports);
|
||||
recordSupports = 0;
|
||||
|
||||
PRUint32 bytesUsed;
|
||||
record->GetStoredContentLength(&bytesUsed);
|
||||
rv = record->Delete();
|
||||
if (NS_FAILED(rv)) {
|
||||
failed = PR_TRUE;
|
||||
continue;
|
||||
}
|
||||
mOccupancy -= bytesUsed;
|
||||
}
|
||||
|
||||
if (failed)
|
||||
return NS_ERROR_FAILURE;
|
||||
return NS_OK;
|
||||
}
|
||||
83
mozilla/netwerk/cache/memcache/nsMemCache.h
vendored
Normal file
83
mozilla/netwerk/cache/memcache/nsMemCache.h
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
/* -*- 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 Communicator client code, released
|
||||
* March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* nsMemCache is the implementation of an in-memory network-data
|
||||
* cache, used to cache the responses to network retrieval commands.
|
||||
* Each cache entry may contain both content, e.g. GIF image data, and
|
||||
* associated metadata, e.g. HTTP headers. Each entry is indexed by
|
||||
* two different keys: a record id number and an opaque key, which is
|
||||
* created by the cache manager by combining the URI with a "secondary
|
||||
* key", e.g. HTTP post data.
|
||||
*/
|
||||
|
||||
#ifndef _nsMemCache_h_
|
||||
#define _nsMemCache_h_
|
||||
|
||||
#include "nsINetDataCache.h"
|
||||
|
||||
// Maximum number of URIs that may be resident in the cache
|
||||
#define MEM_CACHE_MAX_ENTRIES 1000
|
||||
|
||||
#define MEM_CACHE_SEGMENT_SIZE (1 << 12)
|
||||
#define MEM_CACHE_MAX_ENTRY_SIZE (1 << 20)
|
||||
|
||||
class nsHashtable;
|
||||
class nsMemCacheRecord;
|
||||
|
||||
class nsMemCache : public nsINetDataCache
|
||||
{
|
||||
public:
|
||||
nsMemCache();
|
||||
virtual ~nsMemCache();
|
||||
nsresult Init();
|
||||
|
||||
// nsISupports methods
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
// nsINetDataCache methods
|
||||
NS_DECL_NSINETDATACACHE
|
||||
|
||||
// Factory
|
||||
static NS_METHOD nsMemCacheConstructor(nsISupports *aOuter, REFNSIID aIID,
|
||||
void **aResult);
|
||||
|
||||
protected:
|
||||
|
||||
PRUint32 mNumEntries;
|
||||
PRUint32 mOccupancy; // Memory used, in bytes
|
||||
PRBool mEnabled; // If false, bypass mem cache
|
||||
|
||||
nsINetDataCache* mNextCache;
|
||||
|
||||
// Mapping from either opaque key or record ID to nsMemCacheRecord
|
||||
nsHashtable* mHashTable;
|
||||
|
||||
// Used to assign record ID's
|
||||
static PRInt32 gRecordSerialNumber;
|
||||
|
||||
NS_METHOD Delete(nsMemCacheRecord* aRecord);
|
||||
|
||||
friend class nsMemCacheRecord;
|
||||
friend class nsMemCacheChannel;
|
||||
};
|
||||
|
||||
#endif // _nsMemCache_h_
|
||||
36
mozilla/netwerk/cache/memcache/nsMemCacheCID.h
vendored
Normal file
36
mozilla/netwerk/cache/memcache/nsMemCacheCID.h
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
/* -*- 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 Communicator client code, released
|
||||
* March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
// XPCOM Class ID for the network data in-memory cache
|
||||
|
||||
#ifndef nsMEMCACHECID_h__
|
||||
#define nsMEMCACHECID_h__
|
||||
|
||||
// {e4710560-7de2-11d3-90cb-0040056a906e}
|
||||
#define NS_MEM_CACHE_FACTORY_CID \
|
||||
{ \
|
||||
0xe4710560, \
|
||||
0x7de2, \
|
||||
0x11d3, \
|
||||
{0x90, 0xcb, 0x00, 0x40, 0x05, 0x6a, 0x90, 0x6e} \
|
||||
}
|
||||
|
||||
#endif // nsMEMCACHECID_h__
|
||||
462
mozilla/netwerk/cache/memcache/nsMemCacheChannel.cpp
vendored
Normal file
462
mozilla/netwerk/cache/memcache/nsMemCacheChannel.cpp
vendored
Normal file
@@ -0,0 +1,462 @@
|
||||
/* -*- 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 Communicator client code, released
|
||||
* March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "nsMemCache.h"
|
||||
#include "nsMemCacheChannel.h"
|
||||
#include "nsIStreamListener.h"
|
||||
#include "nsIChannel.h"
|
||||
#include "nsIStorageStream.h"
|
||||
#include "nsIOutputStream.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIEventQueueService.h"
|
||||
#include "nsNetUtil.h"
|
||||
#include "nsILoadGroup.h"
|
||||
|
||||
static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
|
||||
static NS_DEFINE_CID(kEventQueueService, NS_EVENTQUEUESERVICE_CID);
|
||||
|
||||
NS_IMPL_ISUPPORTS(nsMemCacheChannel, NS_GET_IID(nsIChannel))
|
||||
|
||||
void
|
||||
nsMemCacheChannel::NotifyStorageInUse(PRInt32 aBytesUsed)
|
||||
{
|
||||
mRecord->mCache->mOccupancy += aBytesUsed;
|
||||
}
|
||||
|
||||
/**
|
||||
* This class acts as an adaptor around a synchronous input stream to add async
|
||||
* read capabilities. It adds methods for initiating, suspending, resuming and
|
||||
* cancelling async reads.
|
||||
*/
|
||||
class AsyncReadStreamAdaptor : public nsIInputStream {
|
||||
public:
|
||||
AsyncReadStreamAdaptor(nsMemCacheChannel* aChannel, nsIInputStream *aSyncStream):
|
||||
mSyncStream(aSyncStream), mDataAvailCursor(0),
|
||||
mRemaining(0), mAvailable(0), mChannel(aChannel), mAborted(PR_FALSE), mSuspended(PR_FALSE)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
NS_ADDREF(mChannel);
|
||||
}
|
||||
|
||||
virtual ~AsyncReadStreamAdaptor() {
|
||||
mChannel->mAsyncReadStream = 0;
|
||||
NS_RELEASE(mChannel);
|
||||
}
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
nsresult
|
||||
IsPending(PRBool* aIsPending) {
|
||||
*aIsPending = (mRemaining != 0) && !mAborted;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
Cancel(void) {
|
||||
mAborted = PR_TRUE;
|
||||
return mStreamListener->OnStopRequest(mChannel, mContext, NS_BINDING_ABORTED, nsnull);
|
||||
}
|
||||
|
||||
nsresult
|
||||
Suspend(void) { mSuspended = PR_TRUE; return NS_OK; }
|
||||
|
||||
nsresult
|
||||
Resume(void) {
|
||||
if (!mSuspended)
|
||||
return NS_ERROR_FAILURE;
|
||||
mSuspended = PR_FALSE;
|
||||
return NextListenerEvent();
|
||||
}
|
||||
|
||||
NS_IMETHOD
|
||||
Available(PRUint32 *aNumBytes) { return mAvailable; }
|
||||
|
||||
NS_IMETHOD
|
||||
Read(char* aBuf, PRUint32 aCount, PRUint32 *aBytesRead) {
|
||||
if (mAborted)
|
||||
return NS_ERROR_ABORT;
|
||||
|
||||
*aBytesRead = 0;
|
||||
aCount = PR_MIN(aCount, mAvailable);
|
||||
nsresult rv = mSyncStream->Read(aBuf, aCount, aBytesRead);
|
||||
mAvailable -= *aBytesRead;
|
||||
|
||||
if (NS_FAILED(rv) && (rv != NS_BASE_STREAM_WOULD_BLOCK)) {
|
||||
Fail();
|
||||
return rv;
|
||||
}
|
||||
|
||||
if (!mSuspended && !mAvailable) {
|
||||
rv = NextListenerEvent();
|
||||
if (NS_FAILED(rv)) {
|
||||
Fail();
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHOD
|
||||
Close() {
|
||||
nsresult rv = mSyncStream->Close();
|
||||
mSyncStream = 0;
|
||||
mContext = 0;
|
||||
mStreamListener = 0;
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult
|
||||
AsyncRead(PRUint32 aStartPosition, PRInt32 aReadCount,
|
||||
nsISupports* aContext, nsIStreamListener* aListener) {
|
||||
|
||||
nsresult rv;
|
||||
nsIEventQueue *eventQ;
|
||||
|
||||
mContext = aContext;
|
||||
mStreamListener = aListener;
|
||||
mRemaining = aReadCount;
|
||||
|
||||
NS_WITH_SERVICE(nsIIOService, serv, kIOServiceCID, &rv);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
NS_WITH_SERVICE(nsIEventQueueService, eventQService, kEventQueueService, &rv);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = eventQService->GetThreadEventQueue(PR_CurrentThread(), &eventQ);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = NS_NewAsyncStreamListener(aListener, eventQ,
|
||||
getter_AddRefs(mStreamListener));
|
||||
NS_RELEASE(eventQ);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = mStreamListener->OnStartRequest(mChannel, aContext);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
return NextListenerEvent();
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
nsresult
|
||||
Fail(void) {
|
||||
mAborted = PR_TRUE;
|
||||
return mStreamListener->OnStopRequest(mChannel, mContext, NS_BINDING_FAILED, nsnull);
|
||||
}
|
||||
|
||||
nsresult
|
||||
NextListenerEvent() {
|
||||
PRUint32 available;
|
||||
nsresult rv = mSyncStream->Available(&available);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
available -= mAvailable;
|
||||
available = PR_MIN(available, mRemaining);
|
||||
|
||||
if (available) {
|
||||
PRUint32 size = PR_MIN(available, MEM_CACHE_SEGMENT_SIZE);
|
||||
rv = mStreamListener->OnDataAvailable(mChannel, mContext, this,
|
||||
mDataAvailCursor, size);
|
||||
mDataAvailCursor += size;
|
||||
mRemaining -= size;
|
||||
mAvailable += size;
|
||||
return rv;
|
||||
} else {
|
||||
rv = mStreamListener->OnStopRequest(mChannel, mContext, NS_OK, nsnull);
|
||||
AsyncReadStreamAdaptor* thisAlias = this;
|
||||
NS_RELEASE(thisAlias);
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
nsCOMPtr<nsISupports> mContext; // Opaque context passed to AsyncRead()
|
||||
nsCOMPtr<nsIStreamListener> mStreamListener; // Stream listener that has been proxied
|
||||
nsCOMPtr<nsIInputStream> mSyncStream; // Underlying synchronous stream that is
|
||||
// being converted to an async stream
|
||||
PRUint32 mDataAvailCursor;
|
||||
PRUint32 mRemaining; // Size of AsyncRead request less bytes for
|
||||
// consumer OnDataAvailable's that were fired
|
||||
PRUint32 mAvailable; // Number of bytes for which OnDataAvailable fired
|
||||
nsMemCacheChannel* mChannel; // Associated memory cache channel, strong link
|
||||
// but can not use nsCOMPtr
|
||||
PRBool mAborted; // Abort() has been called
|
||||
PRBool mSuspended; // Suspend() has been called
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS(AsyncReadStreamAdaptor, NS_GET_IID(nsIInputStream))
|
||||
|
||||
// The only purpose of this output stream wrapper is to adjust the cache's
|
||||
// overall occupancy as new data flows into the cache entry.
|
||||
class MemCacheWriteStreamWrapper : public nsIOutputStream {
|
||||
public:
|
||||
MemCacheWriteStreamWrapper(nsMemCacheChannel* aChannel, nsIOutputStream *aBaseStream):
|
||||
mBaseStream(aBaseStream), mChannel(aChannel)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
NS_ADDREF(mChannel);
|
||||
}
|
||||
|
||||
virtual ~MemCacheWriteStreamWrapper() { NS_RELEASE(mChannel); };
|
||||
|
||||
static nsresult
|
||||
Create(nsMemCacheChannel* aChannel, nsIOutputStream *aBaseStream, nsIOutputStream* *aWrapper) {
|
||||
MemCacheWriteStreamWrapper *wrapper =
|
||||
new MemCacheWriteStreamWrapper(aChannel, aBaseStream);
|
||||
if (!wrapper) return NS_ERROR_OUT_OF_MEMORY;
|
||||
NS_ADDREF(wrapper);
|
||||
*aWrapper = wrapper;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD
|
||||
Write(const char *aBuffer, PRUint32 aCount, PRUint32 *aNumWritten) {
|
||||
*aNumWritten = 0;
|
||||
nsresult rv = mBaseStream->Write(aBuffer, aCount, aNumWritten);
|
||||
mChannel->NotifyStorageInUse(*aNumWritten);
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHOD
|
||||
Flush() { return mBaseStream->Flush(); }
|
||||
|
||||
NS_IMETHOD
|
||||
Close() { return mBaseStream->Close(); }
|
||||
|
||||
private:
|
||||
nsCOMPtr<nsIOutputStream> mBaseStream;
|
||||
nsMemCacheChannel* mChannel;
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS(MemCacheWriteStreamWrapper, NS_GET_IID(nsIOutputStream))
|
||||
|
||||
nsMemCacheChannel::nsMemCacheChannel(nsMemCacheRecord *aRecord, nsILoadGroup *aLoadGroup)
|
||||
: mRecord(aRecord)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
mRecord->mNumChannels++;
|
||||
}
|
||||
|
||||
nsMemCacheChannel::~nsMemCacheChannel()
|
||||
{
|
||||
mRecord->mNumChannels--;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::IsPending(PRBool* aIsPending)
|
||||
{
|
||||
*aIsPending = PR_FALSE;
|
||||
if (!mAsyncReadStream)
|
||||
return NS_OK;
|
||||
return mAsyncReadStream->IsPending(aIsPending);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::Cancel(void)
|
||||
{
|
||||
if (!mAsyncReadStream)
|
||||
return NS_ERROR_FAILURE;
|
||||
return mAsyncReadStream->Cancel();
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::Suspend(void)
|
||||
{
|
||||
if (!mAsyncReadStream)
|
||||
return NS_ERROR_FAILURE;
|
||||
return mAsyncReadStream->Suspend();
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::Resume(void)
|
||||
{
|
||||
if (!mAsyncReadStream)
|
||||
return NS_ERROR_FAILURE;
|
||||
return mAsyncReadStream->Resume();
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::GetOriginalURI(nsIURI * *aURI)
|
||||
{
|
||||
// Not required
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::GetURI(nsIURI * *aURI)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
NS_ASSERTION(0, "nsMemCacheChannel method unexpectedly called");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::OpenInputStream(PRUint32 aStartPosition, PRInt32 aReadCount,
|
||||
nsIInputStream* *aResult)
|
||||
{
|
||||
nsresult rv;
|
||||
NS_ENSURE_ARG(aResult);
|
||||
if (mInputStream)
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
|
||||
rv = mRecord->mStorageStream->NewInputStream(aStartPosition, getter_AddRefs(mInputStream));
|
||||
*aResult = mInputStream;
|
||||
NS_ADDREF(*aResult);
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::OpenOutputStream(PRUint32 startPosition, nsIOutputStream* *aResult)
|
||||
{
|
||||
nsresult rv;
|
||||
NS_ENSURE_ARG(aResult);
|
||||
|
||||
nsCOMPtr<nsIOutputStream> outputStream;
|
||||
|
||||
PRUint32 oldLength;
|
||||
mRecord->mStorageStream->GetLength(&oldLength);
|
||||
rv = mRecord->mStorageStream->GetOutputStream(startPosition, getter_AddRefs(outputStream));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
if (startPosition < oldLength)
|
||||
NotifyStorageInUse(startPosition - oldLength);
|
||||
|
||||
return MemCacheWriteStreamWrapper::Create(this, outputStream, aResult);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::AsyncOpen(nsIStreamObserver *observer, nsISupports *ctxt)
|
||||
{
|
||||
// Not required
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::AsyncRead(PRUint32 aStartPosition, PRInt32 aReadCount,
|
||||
nsISupports *aContext, nsIStreamListener *aListener)
|
||||
{
|
||||
nsCOMPtr<nsIInputStream> inputStream;
|
||||
nsresult rv = OpenInputStream(aStartPosition, aReadCount, getter_AddRefs(inputStream));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
AsyncReadStreamAdaptor *asyncReadStreamAdaptor;
|
||||
asyncReadStreamAdaptor = new AsyncReadStreamAdaptor(this, inputStream);
|
||||
if (!asyncReadStreamAdaptor)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
NS_ADDREF(asyncReadStreamAdaptor);
|
||||
mAsyncReadStream = asyncReadStreamAdaptor;
|
||||
|
||||
rv = asyncReadStreamAdaptor->AsyncRead(aStartPosition, aReadCount, aContext, aListener);
|
||||
if (NS_FAILED(rv))
|
||||
delete asyncReadStreamAdaptor;
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::AsyncWrite(nsIInputStream *fromStream, PRUint32 startPosition,
|
||||
PRInt32 writeCount, nsISupports *ctxt,
|
||||
nsIStreamObserver *observer)
|
||||
{
|
||||
// Not required to be implemented
|
||||
NS_ASSERTION(0, "nsMemCacheChannel method unexpectedly called");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::GetLoadAttributes(nsLoadFlags *aLoadAttributes)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
NS_ASSERTION(0, "nsMemCacheChannel method unexpectedly called");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::SetLoadAttributes(nsLoadFlags aLoadAttributes)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
NS_ASSERTION(0, "nsMemCacheChannel method unexpectedly called");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::GetContentType(char* *aContentType)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
NS_ASSERTION(0, "nsMemCacheChannel method unexpectedly called");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::GetContentLength(PRInt32 *aContentLength)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
NS_ASSERTION(0, "nsMemCacheChannel method unexpectedly called");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::GetOwner(nsISupports* *aOwner)
|
||||
{
|
||||
*aOwner = mOwner.get();
|
||||
NS_IF_ADDREF(*aOwner);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::SetOwner(nsISupports* aOwner)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
mOwner = aOwner;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::GetLoadGroup(nsILoadGroup* *aLoadGroup)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
NS_ASSERTION(0, "nsMemCacheChannel method unexpectedly called");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::SetLoadGroup(nsILoadGroup* aLoadGroup)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
NS_ASSERTION(0, "nsMemCacheChannel method unexpectedly called");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::GetNotificationCallbacks(nsIInterfaceRequestor* *aNotificationCallbacks)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
NS_ASSERTION(0, "nsMemCacheChannel method unexpectedly called");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheChannel::SetNotificationCallbacks(nsIInterfaceRequestor* aNotificationCallbacks)
|
||||
{
|
||||
// Not required to be implemented, since it is implemented by cache manager
|
||||
NS_ASSERTION(0, "nsMemCacheChannel method unexpectedly called");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
61
mozilla/netwerk/cache/memcache/nsMemCacheChannel.h
vendored
Normal file
61
mozilla/netwerk/cache/memcache/nsMemCacheChannel.h
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
/* -*- 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 Communicator client code, released
|
||||
* March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _nsMemCacheChannel_h_
|
||||
#define _nsMemCacheChannel_h_
|
||||
|
||||
#include "nsMemCacheRecord.h"
|
||||
#include "nsIChannel.h"
|
||||
#include "nsIInputStream.h"
|
||||
#include "nsCOMPtr.h"
|
||||
|
||||
|
||||
class AsyncReadStreamAdaptor;
|
||||
|
||||
class nsMemCacheChannel : public nsIChannel
|
||||
{
|
||||
public:
|
||||
// Constructors and Destructor
|
||||
nsMemCacheChannel(nsMemCacheRecord *aRecord, nsILoadGroup *aLoadGroup);
|
||||
virtual ~nsMemCacheChannel();
|
||||
|
||||
// Declare nsISupports methods
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
// Declare nsIRequest methods
|
||||
NS_DECL_NSIREQUEST
|
||||
|
||||
// Declare nsIChannel methods
|
||||
NS_DECL_NSICHANNEL
|
||||
|
||||
protected:
|
||||
void NotifyStorageInUse(PRInt32 aBytesUsed);
|
||||
|
||||
nsCOMPtr<nsMemCacheRecord> mRecord;
|
||||
nsCOMPtr<nsIInputStream> mInputStream;
|
||||
nsCOMPtr<nsISupports> mOwner;
|
||||
AsyncReadStreamAdaptor* mAsyncReadStream; // non-owning pointer
|
||||
|
||||
friend class MemCacheWriteStreamWrapper;
|
||||
friend class AsyncReadStreamAdaptor;
|
||||
};
|
||||
|
||||
#endif // _nsMemCacheChannel_h_
|
||||
164
mozilla/netwerk/cache/memcache/nsMemCacheRecord.cpp
vendored
Normal file
164
mozilla/netwerk/cache/memcache/nsMemCacheRecord.cpp
vendored
Normal file
@@ -0,0 +1,164 @@
|
||||
/* -*- 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 Communicator client code, released
|
||||
* March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "nsMemCache.h"
|
||||
#include "nsMemCacheRecord.h"
|
||||
#include "nsMemCacheChannel.h"
|
||||
#include "nsIAllocator.h"
|
||||
#include "nsStorageStream.h"
|
||||
|
||||
static NS_DEFINE_IID(kINetDataCacheRecord, NS_INETDATACACHERECORD_IID);
|
||||
|
||||
nsMemCacheRecord::nsMemCacheRecord()
|
||||
: mKey(0), mKeyLength(0), mMetaData(0), mMetaDataLength(0), mNumChannels(0)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
}
|
||||
|
||||
nsMemCacheRecord::~nsMemCacheRecord()
|
||||
{
|
||||
if (mMetaData)
|
||||
delete[] mMetaData;
|
||||
if (mKey)
|
||||
delete[] mKey;
|
||||
}
|
||||
|
||||
NS_IMPL_ISUPPORTS(nsMemCacheRecord, NS_GET_IID(nsINetDataCacheRecord))
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheRecord::GetKey(PRUint32 *aLength, char **aResult)
|
||||
{
|
||||
NS_ENSURE_ARG(aResult);
|
||||
*aResult = (char *)nsAllocator::Alloc(mKeyLength);
|
||||
if (!*aResult)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
memcpy(*aResult, mKey, mKeyLength);
|
||||
*aLength = mKeyLength;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsMemCacheRecord::Init(const char *aKey, PRUint32 aKeyLength,
|
||||
PRUint32 aRecordID, nsMemCache *aCache)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
NS_ASSERTION(!mKey, "Memory cache record key set multiple times");
|
||||
|
||||
rv = NS_NewStorageStream(MEM_CACHE_SEGMENT_SIZE, MEM_CACHE_MAX_ENTRY_SIZE,
|
||||
getter_AddRefs(mStorageStream));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
mKey = new char[aKeyLength];
|
||||
if (!mKey)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
memcpy(mKey, aKey, aKeyLength);
|
||||
mKeyLength = aKeyLength;
|
||||
mRecordID = aRecordID;
|
||||
mCache = aCache;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheRecord::GetRecordID(PRInt32 *aRecordID)
|
||||
{
|
||||
NS_ENSURE_ARG(aRecordID);
|
||||
*aRecordID = mRecordID;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheRecord::GetMetaData(PRUint32 *aLength, char **aResult)
|
||||
{
|
||||
NS_ENSURE_ARG(aResult);
|
||||
|
||||
*aResult = 0;
|
||||
if (mMetaDataLength) {
|
||||
*aResult = (char*)nsAllocator::Alloc(mMetaDataLength);
|
||||
if (!*aResult)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
memcpy(*aResult, mMetaData, mMetaDataLength);
|
||||
}
|
||||
*aLength = mMetaDataLength;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheRecord::SetMetaData(PRUint32 aLength, const char *aData)
|
||||
{
|
||||
if (mMetaData)
|
||||
delete[] mMetaData;
|
||||
mMetaData = new char[aLength];
|
||||
if (!mMetaData)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
memcpy(mMetaData, aData, aLength);
|
||||
mMetaDataLength = aLength;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheRecord::GetStoredContentLength(PRUint32 *aStoredContentLength)
|
||||
{
|
||||
NS_ENSURE_ARG(aStoredContentLength);
|
||||
return mStorageStream->GetLength(aStoredContentLength);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheRecord::SetStoredContentLength(PRUint32 aStoredContentLength)
|
||||
{
|
||||
PRUint32 before, after;
|
||||
mStorageStream->GetLength(&before);
|
||||
nsresult rv = mStorageStream->SetLength(aStoredContentLength);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
mStorageStream->GetLength(&after);
|
||||
mCache->mOccupancy -= (before - after);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheRecord::Delete(void)
|
||||
{
|
||||
if (mNumChannels)
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
|
||||
return mCache->Delete(this);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheRecord::GetFilename(nsIFileSpec* *aFilename)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsMemCacheRecord::NewChannel(nsILoadGroup *aLoadGroup, nsIChannel* *aResult)
|
||||
{
|
||||
NS_ENSURE_ARG(aResult);
|
||||
|
||||
nsMemCacheChannel* channel = new nsMemCacheChannel(this, aLoadGroup);
|
||||
if (!channel)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
NS_ADDREF(channel);
|
||||
*aResult = NS_STATIC_CAST(nsIChannel*, channel);
|
||||
return NS_OK;
|
||||
|
||||
}
|
||||
65
mozilla/netwerk/cache/memcache/nsMemCacheRecord.h
vendored
Normal file
65
mozilla/netwerk/cache/memcache/nsMemCacheRecord.h
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
/* -*- 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 Communicator client code, released
|
||||
* March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _nsMemCacheRecord_h_
|
||||
#define _nsMemCacheRecord_h_
|
||||
|
||||
#include "nsINetDataCacheRecord.h"
|
||||
#include "nsIStorageStream.h"
|
||||
#include "nsCOMPtr.h"
|
||||
|
||||
class nsMemCache;
|
||||
|
||||
class nsMemCacheRecord : public nsINetDataCacheRecord
|
||||
{
|
||||
|
||||
public:
|
||||
// Declare interface methods
|
||||
NS_DECL_ISUPPORTS
|
||||
NS_DECL_NSINETDATACACHERECORD
|
||||
|
||||
protected:
|
||||
// Constructors and Destructor
|
||||
nsMemCacheRecord();
|
||||
virtual ~nsMemCacheRecord();
|
||||
|
||||
nsresult Init(const char *aKey, PRUint32 aKeyLength,
|
||||
PRUint32 aRecordID, nsMemCache *aCache);
|
||||
|
||||
char* mKey; // opaque database key for this record
|
||||
PRUint32 mKeyLength; // length, in bytes, of mKey
|
||||
|
||||
PRInt32 mRecordID; // An alternate key for this record
|
||||
|
||||
char* mMetaData; // opaque URI metadata
|
||||
PRUint32 mMetaDataLength; // length, in bytes, of mMetaData
|
||||
|
||||
nsMemCache* mCache; // weak pointer to the cache database
|
||||
// that this record inhabits
|
||||
|
||||
nsCOMPtr<nsIStorageStream> mStorageStream;
|
||||
PRUint32 mNumChannels; // Count un-Release'ed nsIChannels
|
||||
|
||||
friend class nsMemCache;
|
||||
friend class nsMemCacheChannel;
|
||||
};
|
||||
|
||||
#endif // _nsMemCacheRecord_h_
|
||||
55
mozilla/netwerk/cache/mgr/Makefile.in
vendored
Normal file
55
mozilla/netwerk/cache/mgr/Makefile.in
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
#
|
||||
# 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 = nkcache
|
||||
LIBRARY_NAME = nkcachemgr_s
|
||||
|
||||
REQUIRES = nspr
|
||||
|
||||
EXPORTS = \
|
||||
nsCacheManager.h \
|
||||
$(NULL)
|
||||
|
||||
CPPSRCS = \
|
||||
nsCacheManager.cpp \
|
||||
nsCachedNetData.cpp \
|
||||
nsReplacementPolicy.cpp \
|
||||
nsCacheEntryChannel.cpp \
|
||||
$(NULL)
|
||||
|
||||
LOCAL_INCLUDES = -I$(srcdir)/../public -I$(srcdir)/../include
|
||||
|
||||
EXTRA_LIBS = $(NSPR_LIBS)
|
||||
|
||||
# we don't want the shared lib, but we want to force the creation of a
|
||||
# static lib.
|
||||
override NO_SHARED_LIB=1
|
||||
override NO_STATIC_LIB=
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
33
mozilla/mailnews/mapi/old/lib/Makefile.win → mozilla/netwerk/cache/mgr/Makefile.win
vendored
Normal file → Executable file
33
mozilla/mailnews/mapi/old/lib/Makefile.win → mozilla/netwerk/cache/mgr/Makefile.win
vendored
Normal file → Executable file
@@ -1,4 +1,4 @@
|
||||
#!nmake
|
||||
#!gmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
@@ -20,31 +20,26 @@
|
||||
# Contributor(s):
|
||||
|
||||
DEPTH=..\..\..
|
||||
MODULE=mapiutils
|
||||
|
||||
include <$(DEPTH)\config\config.mak>
|
||||
include <$(DEPTH)/config/config.mak>
|
||||
|
||||
################################################################################
|
||||
## exports
|
||||
MODULE = nkcache
|
||||
|
||||
EXPORTS= mapismem.h \
|
||||
nsstrseq.h \
|
||||
$(NULL)
|
||||
LIBRARY_NAME = nkcachemgr_s
|
||||
|
||||
################################################################################
|
||||
## library
|
||||
CPP_OBJS = \
|
||||
.\$(OBJDIR)\nsCacheManager.obj \
|
||||
.\$(OBJDIR)\nsCachedNetData.obj \
|
||||
.\$(OBJDIR)\nsReplacementPolicy.obj \
|
||||
.\$(OBJDIR)\nsCacheEntryChannel.obj \
|
||||
$(NULL)
|
||||
|
||||
LIBRARY_NAME=mapiutils_s
|
||||
|
||||
|
||||
CPP_OBJS= .\$(OBJDIR)\mapismem.obj \
|
||||
.\$(OBJDIR)\nsstrseq.obj \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
||||
install:: $(LIBRARY)
|
||||
$(MAKE_INSTALL) $(LIBRARY) $(DIST)\lib
|
||||
|
||||
clobber::
|
||||
rm -f $(DIST)\lib\$(LIBRARY_NAME).lib
|
||||
rm -rf $(OBJDIR)
|
||||
rm -f $(DIST)\lib\$(LIBRARY_NAME).lib
|
||||
|
||||
261
mozilla/netwerk/cache/mgr/nsCacheEntryChannel.cpp
vendored
Normal file
261
mozilla/netwerk/cache/mgr/nsCacheEntryChannel.cpp
vendored
Normal file
@@ -0,0 +1,261 @@
|
||||
/* -*- 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 Communicator client code, released
|
||||
* March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Scott Furman, fur@netscape.com
|
||||
*/
|
||||
|
||||
#include "nsCacheManager.h"
|
||||
#include "nsCacheEntryChannel.h"
|
||||
#include "nsIOutputStream.h"
|
||||
#include "nsIIOService.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIStreamListener.h"
|
||||
|
||||
nsCacheEntryChannel::nsCacheEntryChannel(nsCachedNetData* aCacheEntry, nsIChannel* aChannel,
|
||||
nsILoadGroup* aLoadGroup):
|
||||
nsChannelProxy(aChannel), mCacheEntry(aCacheEntry), mLoadGroup(aLoadGroup), mLoadAttributes(0)
|
||||
{
|
||||
NS_ASSERTION(aCacheEntry->mChannelCount < 0xFF, "Overflowed channel counter");
|
||||
mCacheEntry->mChannelCount++;
|
||||
NS_INIT_REFCNT();
|
||||
}
|
||||
|
||||
nsCacheEntryChannel::~nsCacheEntryChannel()
|
||||
{
|
||||
mCacheEntry->mChannelCount--;
|
||||
}
|
||||
|
||||
NS_IMPL_ISUPPORTS3(nsCacheEntryChannel, nsISupports, nsIChannel, nsIRequest)
|
||||
|
||||
// A proxy for nsIOutputStream
|
||||
class CacheOutputStream : public nsIOutputStream {
|
||||
|
||||
public:
|
||||
CacheOutputStream(nsIOutputStream *aOutputStream, nsCachedNetData *aCacheEntry):
|
||||
mOutputStream(aOutputStream), mCacheEntry(aCacheEntry), mStartTime(PR_Now())
|
||||
{ NS_INIT_REFCNT(); }
|
||||
|
||||
virtual ~CacheOutputStream() {
|
||||
mCacheEntry->NoteDownloadTime(mStartTime, PR_Now());
|
||||
mCacheEntry->ClearFlag(nsCachedNetData::UPDATE_IN_PROGRESS);
|
||||
}
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD Close() {
|
||||
return mOutputStream->Close();
|
||||
}
|
||||
|
||||
NS_IMETHOD Flush() { return mOutputStream->Flush(); }
|
||||
|
||||
NS_IMETHOD
|
||||
Write(const char *aBuf, PRUint32 aCount, PRUint32 *aActualBytes) {
|
||||
nsresult rv;
|
||||
|
||||
*aActualBytes = 0;
|
||||
rv = mOutputStream->Write(aBuf, aCount, aActualBytes);
|
||||
mCacheEntry->mLogicalLength += *aActualBytes;
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
nsCacheManager::LimitCacheSize();
|
||||
return rv;
|
||||
}
|
||||
|
||||
protected:
|
||||
nsCOMPtr<nsIOutputStream> mOutputStream;
|
||||
nsCOMPtr<nsCachedNetData> mCacheEntry;
|
||||
|
||||
// Time at which stream was opened
|
||||
PRTime mStartTime;
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS(CacheOutputStream, NS_GET_IID(nsIOutputStream))
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheEntryChannel::OpenOutputStream(PRUint32 aStartPosition, nsIOutputStream* *aOutputStream)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIOutputStream> baseOutputStream;
|
||||
|
||||
rv = mChannel->OpenOutputStream(aStartPosition, getter_AddRefs(baseOutputStream));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
mCacheEntry->NoteUpdate();
|
||||
mCacheEntry->NoteAccess();
|
||||
mCacheEntry->mLogicalLength = aStartPosition;
|
||||
|
||||
*aOutputStream = new CacheOutputStream(baseOutputStream, mCacheEntry);
|
||||
if (!*aOutputStream)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
NS_ADDREF(*aOutputStream);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheEntryChannel::OpenInputStream(PRUint32 aStartPosition, PRInt32 aReadCount,
|
||||
nsIInputStream* *aInputStream)
|
||||
{
|
||||
mCacheEntry->NoteAccess();
|
||||
return mChannel->OpenInputStream(aStartPosition, aReadCount, aInputStream);
|
||||
}
|
||||
|
||||
class CacheManagerStreamListener: public nsIStreamListener {
|
||||
|
||||
public:
|
||||
|
||||
CacheManagerStreamListener(nsIStreamListener *aListener,
|
||||
nsILoadGroup *aLoadGroup, nsIChannel *aChannel):
|
||||
mListener(aListener), mLoadGroup(aLoadGroup), mChannel(aChannel)
|
||||
{ NS_INIT_REFCNT(); }
|
||||
|
||||
virtual ~CacheManagerStreamListener() {}
|
||||
|
||||
private:
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD
|
||||
OnDataAvailable(nsIChannel *channel, nsISupports *aContext,
|
||||
nsIInputStream *inStr, PRUint32 sourceOffset, PRUint32 count) {
|
||||
return mListener->OnDataAvailable(mChannel, aContext, inStr, sourceOffset, count);
|
||||
}
|
||||
|
||||
NS_IMETHOD
|
||||
OnStartRequest(nsIChannel *channel, nsISupports *aContext) {
|
||||
if (mLoadGroup)
|
||||
mLoadGroup->AddChannel(mChannel, aContext);
|
||||
return mListener->OnStartRequest(mChannel, aContext);
|
||||
}
|
||||
|
||||
NS_IMETHOD
|
||||
OnStopRequest(nsIChannel *channel, nsISupports *aContext,
|
||||
nsresult status, const PRUnichar *errorMsg) {
|
||||
nsresult rv;
|
||||
rv = mListener->OnStopRequest(mChannel, aContext, status, errorMsg);
|
||||
if (mLoadGroup)
|
||||
mLoadGroup->RemoveChannel(mChannel, aContext, status, errorMsg);
|
||||
return rv;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
nsCOMPtr<nsIStreamListener> mListener;
|
||||
nsCOMPtr<nsILoadGroup> mLoadGroup;
|
||||
nsCOMPtr<nsIChannel> mChannel;
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS2(CacheManagerStreamListener, nsIStreamListener, nsIStreamObserver)
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheEntryChannel::AsyncRead(PRUint32 aStartPosition, PRInt32 aReadCount,
|
||||
nsISupports *aContext, nsIStreamListener *aListener)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
mCacheEntry->NoteAccess();
|
||||
|
||||
nsCOMPtr<nsIStreamListener> headListener;
|
||||
if (mLoadGroup) {
|
||||
mLoadGroup->GetDefaultLoadAttributes(&mLoadAttributes);
|
||||
|
||||
// Create a load group "proxy" listener...
|
||||
nsCOMPtr<nsILoadGroupListenerFactory> factory;
|
||||
rv = mLoadGroup->GetGroupListenerFactory(getter_AddRefs(factory));
|
||||
if (NS_SUCCEEDED(rv) && factory) {
|
||||
rv = factory->CreateLoadGroupListener(aListener,
|
||||
getter_AddRefs(headListener));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
}
|
||||
|
||||
} else {
|
||||
headListener = aListener;
|
||||
}
|
||||
|
||||
CacheManagerStreamListener* cacheManagerStreamListener;
|
||||
nsIChannel *channelForListener;
|
||||
|
||||
channelForListener = mProxyChannel ? mProxyChannel.get() : NS_STATIC_CAST(nsIChannel*, this);
|
||||
cacheManagerStreamListener =
|
||||
new CacheManagerStreamListener(headListener, mLoadGroup, channelForListener);
|
||||
if (!cacheManagerStreamListener) return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
NS_ADDREF(cacheManagerStreamListener);
|
||||
rv = mChannel->AsyncRead(aStartPosition, aReadCount, aContext,
|
||||
cacheManagerStreamListener);
|
||||
NS_RELEASE(cacheManagerStreamListener);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
// No async writes allowed to the cache yet
|
||||
NS_IMETHODIMP
|
||||
nsCacheEntryChannel::AsyncWrite(nsIInputStream *aFromStream, PRUint32 aStartPosition,
|
||||
PRInt32 aWriteCount, nsISupports *aContext,
|
||||
nsIStreamObserver *aObserver)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheEntryChannel::GetLoadGroup(nsILoadGroup* *aLoadGroup)
|
||||
{
|
||||
*aLoadGroup = mLoadGroup;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheEntryChannel::GetLoadAttributes(nsLoadFlags *aLoadAttributes)
|
||||
{
|
||||
*aLoadAttributes = mLoadAttributes;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheEntryChannel::SetLoadAttributes(nsLoadFlags aLoadAttributes)
|
||||
{
|
||||
mLoadAttributes = aLoadAttributes;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheEntryChannel::GetURI(nsIURI * *aURI)
|
||||
{
|
||||
char* spec;
|
||||
nsresult rv;
|
||||
|
||||
rv = mCacheEntry->GetUriSpec(&spec);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
NS_WITH_SERVICE(nsIIOService, serv, kIOServiceCID, &rv);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = serv->NewURI(spec, 0, aURI);
|
||||
nsAllocator::Free(spec);
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheEntryChannel::GetOriginalURI(nsIURI * *aURI)
|
||||
{
|
||||
// FIXME - should return original URI passed into NewChannel() ?
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
82
mozilla/netwerk/cache/mgr/nsCacheEntryChannel.h
vendored
Normal file
82
mozilla/netwerk/cache/mgr/nsCacheEntryChannel.h
vendored
Normal file
@@ -0,0 +1,82 @@
|
||||
/* -*- 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 Communicator client code, released
|
||||
* March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Scott Furman, fur@netscape.com
|
||||
*/
|
||||
|
||||
#ifndef _nsCacheEntryChannel_h_
|
||||
#define _nsCacheEntryChannel_h_
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsIChannel.h"
|
||||
#include "nsCachedNetData.h"
|
||||
#include "nsILoadGroup.h"
|
||||
|
||||
class nsIStreamListener;
|
||||
|
||||
// A proxy for an nsIChannel, useful when only a few nsIChannel
|
||||
// methods must be overridden
|
||||
class nsChannelProxy : public nsIChannel {
|
||||
|
||||
public:
|
||||
NS_FORWARD_NSICHANNEL(mChannel->)
|
||||
NS_FORWARD_NSIREQUEST(mChannel->)
|
||||
|
||||
protected:
|
||||
nsChannelProxy(nsIChannel* aChannel):mChannel(aChannel) {};
|
||||
virtual ~nsChannelProxy() {};
|
||||
nsCOMPtr<nsIChannel> mChannel;
|
||||
};
|
||||
|
||||
// Override several nsIChannel methods so that they interact with the cache manager
|
||||
class nsCacheEntryChannel : public nsChannelProxy {
|
||||
|
||||
public:
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD OpenOutputStream(PRUint32 aStartPosition, nsIOutputStream* *aOutputStream);
|
||||
NS_IMETHOD OpenInputStream(PRUint32 aStartPosition, PRInt32 aReadCount,
|
||||
nsIInputStream* *aInputStream);
|
||||
NS_IMETHOD AsyncRead(PRUint32 aStartPosition, PRInt32 aReadCount,
|
||||
nsISupports *aContext, nsIStreamListener *aListener);
|
||||
NS_IMETHOD AsyncWrite(nsIInputStream *aFromStream, PRUint32 aStartPosition,
|
||||
PRInt32 aWriteCount, nsISupports *aContext,
|
||||
nsIStreamObserver *aObserver);
|
||||
NS_IMETHOD GetLoadAttributes(nsLoadFlags *aLoadAttributes);
|
||||
NS_IMETHOD SetLoadAttributes(nsLoadFlags aLoadAttributes);
|
||||
NS_IMETHOD GetLoadGroup(nsILoadGroup* *aLoadGroup);
|
||||
NS_IMETHOD GetURI(nsIURI * *aURI);
|
||||
NS_IMETHOD GetOriginalURI(nsIURI * *aURI);
|
||||
|
||||
protected:
|
||||
nsCacheEntryChannel(nsCachedNetData* aCacheEntry, nsIChannel* aChannel, nsILoadGroup* aLoadGroup);
|
||||
virtual ~nsCacheEntryChannel();
|
||||
|
||||
friend class nsCachedNetData;
|
||||
|
||||
private:
|
||||
nsCOMPtr<nsCachedNetData> mCacheEntry;
|
||||
nsCOMPtr<nsILoadGroup> mLoadGroup;
|
||||
nsCOMPtr<nsIChannel> mProxyChannel;
|
||||
nsLoadFlags mLoadAttributes;
|
||||
};
|
||||
|
||||
#endif // _nsCacheEntryChannel_h_
|
||||
497
mozilla/netwerk/cache/mgr/nsCacheManager.cpp
vendored
Normal file
497
mozilla/netwerk/cache/mgr/nsCacheManager.cpp
vendored
Normal file
@@ -0,0 +1,497 @@
|
||||
/* -*- 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 Communicator client code, released
|
||||
* March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Scott Furman, fur@netscape.com
|
||||
*/
|
||||
|
||||
#include "nsINetDataCache.h"
|
||||
#include "nsCacheManager.h"
|
||||
#include "nsCachedNetData.h"
|
||||
#include "nsReplacementPolicy.h"
|
||||
#include "nsString.h"
|
||||
#include "nsIURI.h"
|
||||
#include "nsHashtable.h"
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsINetDataDiskCache.h"
|
||||
|
||||
// Limit the number of entries in the cache to conserve memory space
|
||||
// in the nsReplacementPolicy code
|
||||
#define MAX_MEM_CACHE_ENTRIES 800
|
||||
#define MAX_DISK_CACHE_ENTRIES 3200
|
||||
|
||||
// Cache capacities in MB, overridable via APIs
|
||||
#define DEFAULT_MEMORY_CACHE_CAPACITY 1024
|
||||
#define DEFAULT_DISK_CACHE_CAPACITY 10000
|
||||
|
||||
#define CACHE_HIGH_WATER_MARK(capacity) ((PRUint32)(0.98 * (capacity)))
|
||||
#define CACHE_LOW_WATER_MARK(capacity) ((PRUint32)(0.97 * (capacity)))
|
||||
|
||||
nsCacheManager* gCacheManager = 0;
|
||||
|
||||
NS_IMPL_ISUPPORTS(nsCacheManager, NS_GET_IID(nsINetDataCacheManager))
|
||||
|
||||
nsCacheManager::nsCacheManager()
|
||||
: mActiveCacheRecords(0),
|
||||
mDiskCacheCapacity(DEFAULT_DISK_CACHE_CAPACITY),
|
||||
mMemCacheCapacity(DEFAULT_MEMORY_CACHE_CAPACITY)
|
||||
{
|
||||
NS_ASSERTION(!gCacheManager, "Multiple cache managers created");
|
||||
gCacheManager = this;
|
||||
NS_INIT_REFCNT();
|
||||
}
|
||||
|
||||
nsCacheManager::~nsCacheManager()
|
||||
{
|
||||
gCacheManager = 0;
|
||||
delete mActiveCacheRecords;
|
||||
delete mMemSpaceManager;
|
||||
delete mDiskSpaceManager;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsCacheManager::Init()
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
mActiveCacheRecords = new nsHashtable(64);
|
||||
if (!mActiveCacheRecords)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
// Instantiate the memory cache component
|
||||
rv = nsComponentManager::CreateInstance(NS_NETWORK_MEMORY_CACHE_PROGID,
|
||||
nsnull,
|
||||
NS_GET_IID(nsINetDataCache),
|
||||
getter_AddRefs(mMemCache));
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
|
||||
rv = nsComponentManager::CreateInstance(NS_NETWORK_FLAT_CACHE_PROGID,
|
||||
nsnull,
|
||||
NS_GET_IID(nsINetDataCache),
|
||||
|
||||
getter_AddRefs(mFlatCache));
|
||||
|
||||
if (NS_FAILED(rv)) {
|
||||
// For now, we don't require a flat cache module to be present
|
||||
if (rv != NS_ERROR_FACTORY_NOT_REGISTERED)
|
||||
return rv;
|
||||
}
|
||||
|
||||
#ifdef FILE_CACHE_IS_READY
|
||||
// Instantiate the file cache component
|
||||
rv = nsComponentManager::CreateInstance(NS_NETWORK_FILE_CACHE_PROGID,
|
||||
nsnull,
|
||||
NS_GET_IID(nsINetDataCache),
|
||||
getter_AddRefs(mFileCache));
|
||||
if (NS_FAILED(rv)) {
|
||||
NS_WARNING("No disk cache present");
|
||||
}
|
||||
#endif
|
||||
|
||||
// Set up linked list of caches in search order
|
||||
mCacheSearchChain = mMemCache;
|
||||
if (mFlatCache) {
|
||||
mMemCache->SetNextCache(mFlatCache);
|
||||
mFlatCache->SetNextCache(mFileCache);
|
||||
} else {
|
||||
mMemCache->SetNextCache(mFileCache);
|
||||
}
|
||||
|
||||
// TODO - Load any extension caches here
|
||||
|
||||
// Initialize replacement policy for memory cache module
|
||||
mMemSpaceManager = new nsReplacementPolicy;
|
||||
if (!mMemSpaceManager)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
rv = mMemSpaceManager->Init(MAX_MEM_CACHE_ENTRIES);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
rv = mMemSpaceManager->AddCache(mMemCache);
|
||||
|
||||
// Initialize replacement policy for disk cache modules (file
|
||||
// cache and flat cache)
|
||||
mDiskSpaceManager = new nsReplacementPolicy;
|
||||
if (!mDiskSpaceManager)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
rv = mDiskSpaceManager->Init(MAX_DISK_CACHE_ENTRIES);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
if (mFileCache) {
|
||||
rv = mDiskSpaceManager->AddCache(mFileCache);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
}
|
||||
if (mFlatCache) {
|
||||
rv = mDiskSpaceManager->AddCache(mFlatCache);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheManager::GetCachedNetData(const char *aUriSpec, const char *aSecondaryKey,
|
||||
PRUint32 aSecondaryKeyLength,
|
||||
PRUint32 aFlags, nsICachedNetData* *aResult)
|
||||
{
|
||||
nsCachedNetData *cachedData;
|
||||
nsresult rv;
|
||||
nsINetDataCache *cache;
|
||||
nsReplacementPolicy *spaceManager;
|
||||
|
||||
if (aFlags & CACHE_AS_FILE) {
|
||||
cache = mFileCache;
|
||||
spaceManager = mDiskSpaceManager;
|
||||
|
||||
// Ensure that cache is initialized
|
||||
if (mDiskCacheCapacity == (PRUint32)-1)
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
|
||||
} else if ((aFlags & BYPASS_PERSISTENT_CACHE) ||
|
||||
(!mFileCache && !mFlatCache) || !mDiskCacheCapacity) {
|
||||
cache = mMemCache;
|
||||
spaceManager = mMemSpaceManager;
|
||||
} else {
|
||||
cache = mFlatCache ? mFlatCache : mFileCache;
|
||||
spaceManager = mDiskSpaceManager;
|
||||
}
|
||||
|
||||
// Construct the cache key by appending the secondary key to the URI spec
|
||||
nsCAutoString cacheKey(aUriSpec);
|
||||
|
||||
// Insert NUL at end of URI spec
|
||||
cacheKey += '\0';
|
||||
if (aSecondaryKey)
|
||||
cacheKey.Append(aSecondaryKey, aSecondaryKeyLength);
|
||||
|
||||
nsStringKey key(cacheKey);
|
||||
cachedData = (nsCachedNetData*)mActiveCacheRecords->Get(&key);
|
||||
|
||||
// There is no existing instance of nsCachedNetData for this URL.
|
||||
// Make one from the corresponding record in the cache module.
|
||||
if (cachedData) {
|
||||
NS_ASSERTION(cache == cachedData->mCache,
|
||||
"Cannot yet handle simultaneously active requests for the "
|
||||
"same URL using different caches");
|
||||
NS_ADDREF(cachedData);
|
||||
} else {
|
||||
rv = spaceManager->GetCachedNetData(cacheKey.GetBuffer(), cacheKey.Length(),
|
||||
cache, &cachedData);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
mActiveCacheRecords->Put(&key, cachedData);
|
||||
}
|
||||
|
||||
*aResult = cachedData;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Remove this cache entry from the list of active ones
|
||||
nsresult
|
||||
nsCacheManager::NoteDormant(nsCachedNetData* aEntry)
|
||||
{
|
||||
nsresult rv;
|
||||
PRUint32 keyLength;
|
||||
char* key;
|
||||
nsCOMPtr<nsINetDataCacheRecord> record;
|
||||
nsCachedNetData* deletedEntry;
|
||||
|
||||
rv = aEntry->GetRecord(getter_AddRefs(record));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = record->GetKey(&keyLength, &key);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
nsStringKey hashTableKey(nsCString(key, keyLength));
|
||||
deletedEntry = (nsCachedNetData*)gCacheManager->mActiveCacheRecords->Remove(&hashTableKey);
|
||||
// NS_ASSERTION(deletedEntry == aEntry, "Hash table inconsistency");
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheManager::Contains(const char *aUriSpec, const char *aSecondaryKey,
|
||||
PRUint32 aSecondaryKeyLength,
|
||||
PRUint32 aFlags, PRBool *aResult)
|
||||
{
|
||||
nsINetDataCache *cache;
|
||||
nsReplacementPolicy *spaceManager;
|
||||
nsCachedNetData *cachedData;
|
||||
|
||||
if (aFlags & CACHE_AS_FILE) {
|
||||
cache = mFileCache;
|
||||
spaceManager = mDiskSpaceManager;
|
||||
} else if ((aFlags & BYPASS_PERSISTENT_CACHE) ||
|
||||
(!mFileCache && !mFlatCache) || !mDiskCacheCapacity) {
|
||||
cache = mMemCache;
|
||||
spaceManager = mMemSpaceManager;
|
||||
} else {
|
||||
cache = mFlatCache ? mFlatCache : mFileCache;
|
||||
spaceManager = mDiskSpaceManager;
|
||||
}
|
||||
|
||||
// Construct the cache key by appending the secondary key to the URI spec
|
||||
nsCAutoString cacheKey(aUriSpec);
|
||||
|
||||
// Insert NUL between URI spec and secondary key
|
||||
cacheKey += '\0';
|
||||
cacheKey.Append(aSecondaryKey, aSecondaryKeyLength);
|
||||
|
||||
// Locate the record using (URI + secondary key)
|
||||
nsStringKey key(cacheKey);
|
||||
cachedData = (nsCachedNetData*)mActiveCacheRecords->Get(&key);
|
||||
|
||||
if (cachedData && (cache == cachedData->mCache)) {
|
||||
*aResult = PR_TRUE;
|
||||
return NS_OK;
|
||||
} else {
|
||||
// No active cache entry, see if there is a dormant one
|
||||
return cache->Contains(cacheKey.GetBuffer(), cacheKey.Length(), aResult);
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheManager::GetNumEntries(PRUint32 *aNumEntries)
|
||||
{
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsISimpleEnumerator> iterator;
|
||||
nsCOMPtr<nsISupports> cacheSupports;
|
||||
nsCOMPtr<nsINetDataCache> cache;
|
||||
|
||||
PRUint32 totalEntries = 0;
|
||||
|
||||
rv = NewCacheModuleIterator(getter_AddRefs(iterator));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
while (1) {
|
||||
PRBool notDone;
|
||||
rv = iterator->HasMoreElements(¬Done);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
if (!notDone)
|
||||
break;
|
||||
|
||||
iterator->GetNext(getter_AddRefs(cacheSupports));
|
||||
cache = do_QueryInterface(cacheSupports);
|
||||
|
||||
PRUint32 numEntries;
|
||||
rv = cache->GetNumEntries(&numEntries);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
totalEntries += numEntries;
|
||||
}
|
||||
|
||||
*aNumEntries = totalEntries;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheManager::NewCacheEntryIterator(nsISimpleEnumerator* *aResult)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
class CacheEnumerator : public nsISimpleEnumerator
|
||||
{
|
||||
public:
|
||||
CacheEnumerator(nsINetDataCache* aFirstCache):mCache(aFirstCache)
|
||||
{ NS_INIT_REFCNT(); }
|
||||
|
||||
virtual ~CacheEnumerator() {};
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHODIMP
|
||||
HasMoreElements(PRBool* aMoreElements) {
|
||||
*aMoreElements = (mCache != 0);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
GetNext(nsISupports* *aSupports) {
|
||||
*aSupports = mCache;
|
||||
if (!mCache)
|
||||
return NS_ERROR_FAILURE;
|
||||
NS_ADDREF(*aSupports);
|
||||
|
||||
nsCOMPtr<nsINetDataCache> nextCache;
|
||||
nsresult rv = mCache->GetNextCache(getter_AddRefs(nextCache));
|
||||
mCache = nextCache;
|
||||
return rv;
|
||||
}
|
||||
|
||||
private:
|
||||
nsCOMPtr<nsINetDataCache> mCache;
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS(CacheEnumerator, NS_GET_IID(nsISimpleEnumerator))
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheManager::NewCacheModuleIterator(nsISimpleEnumerator* *aResult)
|
||||
{
|
||||
*aResult = new CacheEnumerator(mCacheSearchChain);
|
||||
if (!*aResult)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
NS_ADDREF(*aResult);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheManager::RemoveAll(void)
|
||||
{
|
||||
nsresult rv, result;
|
||||
nsCOMPtr<nsISimpleEnumerator> iterator;
|
||||
nsCOMPtr<nsINetDataCache> cache;
|
||||
nsCOMPtr<nsISupports> iSupports;
|
||||
|
||||
result = NS_OK;
|
||||
rv = NewCacheModuleIterator(getter_AddRefs(iterator));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
while (1) {
|
||||
PRBool notDone;
|
||||
rv = iterator->HasMoreElements(¬Done);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
if (!notDone)
|
||||
break;
|
||||
|
||||
iterator->GetNext(getter_AddRefs(iSupports));
|
||||
cache = do_QueryInterface(iSupports);
|
||||
|
||||
PRUint32 cacheFlags;
|
||||
rv = cache->GetFlags(&cacheFlags);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
if ((cacheFlags & nsINetDataCache::READ_ONLY) == 0) {
|
||||
rv = cache->RemoveAll();
|
||||
if (NS_FAILED(rv))
|
||||
result = rv;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsCacheManager::LimitMemCacheSize()
|
||||
{
|
||||
nsresult rv;
|
||||
nsReplacementPolicy* spaceManager;
|
||||
|
||||
NS_ASSERTION(gCacheManager, "No cache manager");
|
||||
|
||||
spaceManager = gCacheManager->mMemSpaceManager;
|
||||
|
||||
PRUint32 occupancy;
|
||||
rv = spaceManager->GetStorageInUse(&occupancy);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
PRUint32 memCacheCapacity = gCacheManager->mMemCacheCapacity;
|
||||
if (occupancy > CACHE_HIGH_WATER_MARK(memCacheCapacity))
|
||||
return spaceManager->Evict(CACHE_LOW_WATER_MARK(memCacheCapacity));
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsCacheManager::LimitDiskCacheSize()
|
||||
{
|
||||
nsresult rv;
|
||||
nsReplacementPolicy* spaceManager;
|
||||
|
||||
NS_ASSERTION(gCacheManager, "No cache manager");
|
||||
|
||||
spaceManager = gCacheManager->mDiskSpaceManager;
|
||||
|
||||
PRUint32 occupancy;
|
||||
rv = spaceManager->GetStorageInUse(&occupancy);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
PRUint32 diskCacheCapacity = gCacheManager->mDiskCacheCapacity;
|
||||
if (occupancy > CACHE_HIGH_WATER_MARK(diskCacheCapacity))
|
||||
return spaceManager->Evict(CACHE_LOW_WATER_MARK(diskCacheCapacity));
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsCacheManager::LimitCacheSize()
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
rv = LimitDiskCacheSize();
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
rv = LimitMemCacheSize();
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheManager::SetMemCacheCapacity(PRUint32 aCapacity)
|
||||
{
|
||||
mMemCacheCapacity = aCapacity;
|
||||
LimitCacheSize();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheManager::GetMemCacheCapacity(PRUint32* aCapacity)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aCapacity);
|
||||
*aCapacity = mMemCacheCapacity;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheManager::SetDiskCacheCapacity(PRUint32 aCapacity)
|
||||
{
|
||||
mDiskCacheCapacity = aCapacity;
|
||||
LimitCacheSize();
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheManager::GetDiskCacheCapacity(PRUint32* aCapacity)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aCapacity);
|
||||
*aCapacity = mDiskCacheCapacity;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheManager::SetDiskCacheFolder(nsIFileSpec* aFolder)
|
||||
{
|
||||
NS_ENSURE_ARG(aFolder);
|
||||
|
||||
if (!mFileCache)
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
|
||||
nsCOMPtr<nsINetDataDiskCache> fileCache;
|
||||
fileCache = do_QueryInterface(mFileCache);
|
||||
return fileCache->SetDiskCacheFolder(aFolder);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsCacheManager::GetDiskCacheFolder(nsIFileSpec* *aFolder)
|
||||
{
|
||||
NS_ENSURE_ARG(aFolder);
|
||||
|
||||
if (!mFileCache)
|
||||
return NS_ERROR_NOT_AVAILABLE;
|
||||
|
||||
nsCOMPtr<nsINetDataDiskCache> fileCache;
|
||||
fileCache = do_QueryInterface(mFileCache);
|
||||
return fileCache->GetDiskCacheFolder(aFolder);
|
||||
}
|
||||
100
mozilla/netwerk/cache/mgr/nsCacheManager.h
vendored
Normal file
100
mozilla/netwerk/cache/mgr/nsCacheManager.h
vendored
Normal file
@@ -0,0 +1,100 @@
|
||||
/* -*- 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 Communicator client code, released
|
||||
* March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998-1999 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Scott Furman, fur@netscape.com
|
||||
*/
|
||||
|
||||
#ifndef _nsCacheManager_h_
|
||||
#define _nsCacheManager_h_
|
||||
|
||||
// 2030f0b0-9567-11d3-90d3-0040056a906e
|
||||
#define NS_CACHE_MANAGER_CID \
|
||||
{ \
|
||||
0x2030f0b0, \
|
||||
0x9567, \
|
||||
0x11d3, \
|
||||
{0x90, 0xd3, 0x00, 0x40, 0x05, 0x6a, 0x90, 0x6e} \
|
||||
}
|
||||
|
||||
#include "nsINetDataCacheManager.h"
|
||||
#include "nsINetDataCache.h"
|
||||
#include "nsCOMPtr.h"
|
||||
|
||||
class nsHashtable;
|
||||
class nsReplacementPolicy;
|
||||
class nsCachedNetData;
|
||||
|
||||
class nsCacheManager : public nsINetDataCacheManager {
|
||||
|
||||
public:
|
||||
nsCacheManager();
|
||||
virtual ~nsCacheManager();
|
||||
|
||||
NS_METHOD Init();
|
||||
|
||||
// nsISupports methods
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
// nsINetDataCacheManager methods
|
||||
NS_DECL_NSINETDATACACHEMANAGER
|
||||
|
||||
private:
|
||||
|
||||
// Mapping from cache key to nsCachedNetData, but only for those cache
|
||||
// entries with external references, i.e. those referred to outside the
|
||||
// cache manager
|
||||
nsHashtable* mActiveCacheRecords;
|
||||
|
||||
// Memory cache
|
||||
nsCOMPtr<nsINetDataCache> mMemCache;
|
||||
|
||||
// Flat-file database cache; All content aggregated into single disk file
|
||||
nsCOMPtr<nsINetDataCache> mFlatCache;
|
||||
|
||||
// stream-as-file cache
|
||||
nsCOMPtr<nsINetDataCache> mFileCache;
|
||||
|
||||
// Unified replacement policy for flat-cache and file-cache
|
||||
nsReplacementPolicy* mDiskSpaceManager;
|
||||
|
||||
// Replacement policy for memory cache
|
||||
nsReplacementPolicy* mMemSpaceManager;
|
||||
|
||||
// List of caches in search order
|
||||
nsINetDataCache* mCacheSearchChain;
|
||||
|
||||
// Combined file/flat cache capacity, in KB
|
||||
PRUint32 mDiskCacheCapacity;
|
||||
|
||||
// Memory cache capacity, in KB
|
||||
PRUint32 mMemCacheCapacity;
|
||||
|
||||
protected:
|
||||
static nsresult NoteDormant(nsCachedNetData* aEntry);
|
||||
static nsresult LimitCacheSize();
|
||||
static nsresult LimitMemCacheSize();
|
||||
static nsresult LimitDiskCacheSize();
|
||||
|
||||
friend class nsCachedNetData;
|
||||
friend class CacheOutputStream;
|
||||
};
|
||||
|
||||
#endif // _nsCacheManager_h_
|
||||
1155
mozilla/netwerk/cache/mgr/nsCachedNetData.cpp
vendored
Normal file
1155
mozilla/netwerk/cache/mgr/nsCachedNetData.cpp
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user