gecko-dev/cmd/winfe/femess.cpp
1998-06-22 21:19:46 +00:00

899 lines
23 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "stdafx.h"
#include "mmsystem.h"
#include "apiapi.h"
#ifdef MOZ_MAIL_NEWS
#include "msgcom.h"
#include "apimsg.h"
#endif
#ifdef MOZ_MAIL_NEWS
#include "msgcom.h"
#endif
#include "fe_proto.h"
#include "hiddenfr.h"
#ifdef MOZ_MAIL_NEWS
#include "mailfrm.h"
#include "mailmisc.h"
#include "mnprefs.h"
#include "compfrm.h"
#endif
#include "template.h"
#include "prefapi.h"
#ifdef MOZ_MAIL_NEWS
#include "winbif.h"
#endif
/* This function is defined in msgfrm.cpp
Declare here to avoid including the whole header file */
#ifdef MOZ_MAIL_NEWS
MSG_Master *WFE_MSGGetMaster();
#endif
extern "C" MSG_Master* FE_GetMaster(){
#ifdef MOZ_MAIL_NEWS
return WFE_MSGGetMaster();
#else
return(NULL);
#endif /* MOZ_MAIL_NEWS */
}
// prototypes
BOOL SetBiffInfoNum(LPCSTR pKey, uint32 num);
//
// I'm sure this already exists...
//
CGenericFrame *wfe_FrameFromXPContext(MWContext * pXPCX)
{
if(!pXPCX)
return(NULL);
CFrameGlue * pFrameGlue = GetFrame(pXPCX);
if(pFrameGlue) {
CFrameWnd * pFrame = pFrameGlue->GetFrameWnd();
if(pFrame && pFrame->IsKindOf(RUNTIME_CLASS(CGenericFrame)))
return((CGenericFrame*)pFrame);
}
return(NULL);
}
extern "C" int FE_GetURL(MWContext *pContext, URL_Struct *pUrl)
{
if(!pContext || !ABSTRACTCX(pContext))
return(-1);
#ifdef EDITOR
// The only circumstance in which we load a URL
// into Editor when called from XP code is during
// Publishing: we have "files to post"
if( EDT_IS_EDITOR(pContext) && pUrl->files_to_post == NULL ){
// So switch to or create a Browser frame/context
// TODO: A possibly bad side effect is that changing
// frames will obscure the last active frame
// (and possibly a preference dialog)
CGenericFrame* pFrame = (CGenericFrame*)FEU_GetLastActiveFrame(MWContextBrowser);
pContext = NULL;
if( pFrame && pFrame->GetMainContext() ){
pContext = pFrame->GetMainContext()->GetContext();
if( pContext ){
// Find previously-active Browser frame
if ( pFrame->IsIconic() ){
pFrame->ShowWindow(SW_RESTORE);
}
pFrame->SetActiveWindow();
}
} else {
// Create a new Browser frame
pContext = CFE_CreateNewDocWindow(NULL, NULL);
}
if( !pContext ){
return -1;
}
}
#endif
return(ABSTRACTCX(pContext)->GetUrl(pUrl, FO_CACHE_AND_PRESENT));
}
//
// The must return a unix style path.
// We'll have to figure out how to convert Win9x "\\fuzzhead\d-drive\span\mail"
// into a unix path at some point.
//
extern "C" const char* FE_GetFolderDirectory(MWContext *pContext)
{
#ifdef MOZ_MAIL_NEWS
static char pStr[_MAX_PATH];
pStr[0] = '\0';
if (!g_MsgPrefs.m_csMailDir.IsEmpty())
{
sprintf(pStr, "/%s", (LPCTSTR) g_MsgPrefs.m_csMailDir);
for(char * p = pStr; p && *p; p++)
if(*p == '\\')
*p = '/';
else if(*p == ':')
*p = '|';
}
return(pStr);
#else // MOZ_MAIL_NEWS
return("");
#endif // MOZ_MAIL_NEWS
}
extern "C" uint32
FE_DiskSpaceAvailable (MWContext *context, const char *lpszPath )
{
char aDrive[_MAX_DRIVE];
_splitpath( lpszPath, aDrive, NULL, NULL, NULL);
if(aDrive[0] == '\0') {
// The back end is always trying to pass us paths that look
// like /c|/netscape/mail. See if we've got one of them
if(strlen(lpszPath) > 2 && lpszPath[0] == '/' && lpszPath[2] == '|') {
aDrive[0] = lpszPath[1];
aDrive[1] = ':';
aDrive[2] = '\0';
}
else {
// Return bogus large number and hope for the best
TRACE("Unable to determine drive, can't check free disk space.\n");
return 1L<<30;
}
}
CString csDrive = aDrive;
csDrive += '\\';
TRACE("Checking drive %s disk space\n", (const char *)csDrive);
DWORD dwSectorsPerCluster = 0;
DWORD dwBytesPerSector = 0;
DWORD dwFreeClusters = 0;
DWORD dwTotalClusters = 0;
if(GetDiskFreeSpace(csDrive,
&dwSectorsPerCluster,
&dwBytesPerSector,
&dwFreeClusters,
&dwTotalClusters) == FALSE) {
TRACE("Couldn't get free disk space...\n");
return 1L<<30; // Return bogus large number and hope for the best
}
// We can now figure free disk space.
DWORD dwFreeSpace = dwFreeClusters * dwSectorsPerCluster * dwBytesPerSector;
TRACE("%lu free bytes\n", dwFreeSpace);
return dwFreeSpace;
}
//
// Generate a temp file name for a file that can eventually maybe be renamed
// to pFileName. We could do something more intelligent
// about putting it in the right directory and all that but not today
//
extern "C" char *FE_GetTempFileFor(MWContext *pContext, const char *pFileName, XP_FileType ftype, XP_FileType *rettype)
{
char * pString = WH_TempFileName(ftype, NULL, NULL);
if(!pString)
return(NULL);
if(rettype)
*rettype = xpTemporary;
return(pString);
}
#ifdef MOZ_MAIL_NEWS
extern "C" void FE_MsgShowHeaders(MSG_Pane *pPane, MSG_HEADER_SET mhsHeaders)
{
}
extern "C" void FE_UpdateCompToolbar(MSG_Pane *pPane)
{
CComposeFrame * pCompose = (CComposeFrame *) MSG_GetFEData(pPane);
if ( pCompose && pCompose->GetMainContext() && !MSG_DeliveryInProgress(pPane))
{
// Stop animation in corner and (more importantly) kill the progress bar.
MWContext *pContext = pCompose->GetMainContext()->GetContext();
if (pContext && !XP_IsContextBusy(pContext))
{
pCompose->GetChrome()->StopAnimation();
pCompose->UpdateComposeWindowForMAPI(); // rhp - for MAPI operations
}
}
}
#endif /* MOZ_MAIL_NEWS */
//
// Prompt the user for a local file name
//
extern "C" int FE_PromptForFileName(MWContext *context,
const char *prompt_string,
const char *default_path,
XP_Bool file_must_exist_p,
XP_Bool directories_allowed_p,
ReadFileNameCallbackFunction fn,
void *closure)
{
HWND hWnd = NULL;
CGenericFrame * pWnd = wfe_FrameFromXPContext(context);
if(pWnd)
hWnd = pWnd->m_hWnd;
else if (context) { // XXX WHS Do what we really should have done
CWnd *pWnd2 = (ABSTRACTCX(context))->GetDialogOwner();
ASSERT(pWnd2 != CWnd::GetDesktopWindow());
if (pWnd2 && pWnd2 != CWnd::GetDesktopWindow())
hWnd = pWnd2->m_hWnd;
}
ASSERT(hWnd); // Bad!
char * pFile = NULL;
if (file_must_exist_p)
{
// Doing a file open
// check for PKCS 12 files
if(default_path && !strcmp(default_path, "*.p12")) {
default_path = NULL;
pFile = wfe_GetExistingFileName(hWnd, (char *)prompt_string, P12,
file_must_exist_p, FALSE);
} else {
// Changed to prompt for ALL, instead defaulting to first filter.
pFile = wfe_GetExistingFileName(hWnd , (char *)prompt_string, ALL,
file_must_exist_p, FALSE);
}
} /* end if */
else if (context->type == MWContextRDFSlave)
{
CString cs;
cs.LoadString(IDS_UNTITLED);
// Since someone undid my work for untyped title strings.
cs += ".rdf";
pFile = wfe_GetSaveFileName(hWnd, (char *)prompt_string, (char *) (LPCTSTR) cs, 0);
}
#ifdef MOZ_MAIL_NEWS
else if (directories_allowed_p) {
CDirDialog directory(ABSTRACTCX(context)->GetDialogOwner(), default_path);
if (IDOK == directory.DoModal())
{
CString fileName = directory.GetPathName();
/* There is a reason for this k5bg bogusness */
/* Whatever well-meaning person coded CDirPicker in mnprefs.cpp did it wrong */
/* this is a hidden string we are getting rid of */
int nPos = fileName.GetLength() - strlen("\\k5bg");
CString pathName(fileName.Left(nPos));
pFile = XP_STRDUP(pathName);
}
}
else
{
CString cs;
// Doing a file save
if ((context->type == MWContextMail) ||
(context->type == MWContextNews) ||
(context->type == MWContextMailMsg) ||
(context->type == MWContextNewsMsg) ) {
// Suggest an untyped file name
cs.LoadString(IDS_UNTITLED);
// Since someone undid my work for untyped title strings.
cs += ".txt";
pFile = wfe_GetSaveFileName(hWnd, (char *)prompt_string, (char *) (LPCTSTR) cs, 0);
} else if (context->type == MWContextBookmarks) {
// Suggest the default bookmarks file
pFile = wfe_GetSaveFileName(hWnd, (char *)prompt_string, (char *)(const char *)theApp.m_pBookmarkFile, 0);
} else if((default_path != NULL) && !strcmp(default_path, "*.p12")) {
int p12type = P12;
default_path = NULL;
pFile = wfe_GetSaveFileName(hWnd, (char *)prompt_string, (char *)default_path, &p12type);
} else {
pFile = wfe_GetSaveFileName(hWnd, (char *)prompt_string, (char *)default_path, 0);
}
} /* end else */
#endif
if(!pFile)
return(-1);
fn(context, pFile, closure);
return(0);
}
extern "C" int FE_PromptForNewsHost (MWContext *context,
const char *prompt_string,
ReadFileNameCallbackFunction fn,
void *closure)
{
char * pString = FE_Prompt(context, prompt_string, "");
if(pString) {
// make sure we have a correct looking news URL
if(strncmp(pString, "news://", 7) && strncmp(pString, "snews://", 8)) {
char * pNewString = (char *) XP_ALLOC(10 + XP_STRLEN(pString));
sprintf(pNewString, "news://%s", pString);
XP_FREE(pString);
pString = pNewString;
}
fn(context, pString, closure);
}
return(0);
}
#ifdef MOZ_MAIL_NEWS
extern "C" ABook * FE_GetAddressBook ( MSG_Pane *pPane)
{
return theApp.m_pABook;
}
extern "C" XP_List * FE_GetDirServers ()
{
return theApp.m_directories;
}
extern "C" MWContext * FE_GetAddressBookContext ( MSG_Pane *pPane, XP_Bool viewnow )
{
return theApp.m_pAddressContext;
}
#endif
//
// Send back the current user's email address
//
extern "C" const char *FE_UsersMailAddress()
{
#ifdef MOZ_MAIL_NEWS
const char * addr = g_MsgPrefs.m_csUsersEmailAddr;
if(addr && *addr)
return(addr);
#else
static char * prefStr = NULL;
XP_FREEIF(prefStr);
PREF_CopyCharPref("mail.identity.useremail",&prefStr);
return(prefStr);
#endif // MOZ_MAIL_NEWS
return("");
}
//
// Send back the fullname of the current user
//
extern "C" const char *FE_UsersFullName()
{
#ifdef MOZ_MAIL_NEWS
const char * name = g_MsgPrefs.m_csUsersFullName;
if(name && *name)
return(name);
else
return(NULL);
#else
static char * prefStr = NULL;
XP_FREEIF(prefStr);
PREF_CopyCharPref("mail.identity.username", &prefStr);
return(prefStr);
#endif
}
//
// Return the uesr's organization (if specified)
//
extern "C" const char *FE_UsersOrganization (void)
{
#ifdef MOZ_MAIL_NEWS
const char * org = g_MsgPrefs.m_csUsersOrganization;
if(org && *org)
return(org);
else
return(NULL);
#else
static char * prefStr = NULL;
XP_FREEIF(prefStr);
PREF_CopyCharPref("mail.identity.organization", &prefStr);
return(prefStr);
#endif // MOZ_MAIL_NEWS
}
extern "C" const char *FE_UsersSignature(void)
{
#ifdef MOZ_MAIL_NEWS
// Just return the sig file that we read in on startup.
char * pszPref;
PREF_CopyCharPref("mail.signature_file", &pszPref);
if (pszPref) {
XP_FREEIF(g_MsgPrefs.m_pszUserSig);
g_MsgPrefs.m_pszUserSig = wfe_ReadUserSig(pszPref);
}
XP_FREEIF(pszPref);
return(g_MsgPrefs.m_pszUserSig);
#else
return("");
#endif // MOZ_MAIL_NEWS
}
// Read in a user's sig file
// Return NULL on error
// The string should be freed by the caller
MODULE_PRIVATE char *wfe_ReadUserSig(const char * msg)
{
#ifdef MOZ_MAIL_NEWS
FILE * fp;
char * buffer;
if(!msg || !msg[0])
return(NULL);
#ifdef XP_WIN32
fp = fopen(msg, "rb");
#else
// Windows uses ANSI codepage, DOS uses OEM codepage, fopen takes OEM codepage
// That's why we need to do conversion here.
CString oembuff = msg;
oembuff.AnsiToOem();
fp = fopen(oembuff, "rb");
#endif
if(!fp)
return(NULL);
// go to the end
fseek(fp, 0L, SEEK_END);
int32 len = ftell(fp);
if(len < 1)
return(NULL);
buffer = (char *) XP_ALLOC(len + 5);
if(!buffer)
return(NULL);
fseek(fp, 0L, SEEK_SET);
len = fread(buffer, 1, CASTINT(len), fp);
buffer[len] = '\0';
// Strip whitespace from the end of the buffer.
len--;
while(len > 0 && (isspace(buffer[len])||buffer[len]==26)) {
buffer[len] = '\0';
len--;
}
// Add a new line to the end.
if(len > 0) {
strcat(buffer, "\r\n");
}
fclose(fp);
return(buffer);
#else // MOZ_MAIL_NEWS
return("");
#endif // MOZ_MAIL_NEWS
}
#ifdef MOZ_MAIL_NEWS
// FE function that the back-end calls when it gets a new
// IMAP highwater mark that needs to be communicated/stored
// for the stand-alone biff
#ifdef _WIN32
extern "C" uint32 FE_SetBiffInfo(MSG_BiffInfoType type, uint32 data)
{
switch(type)
{
case MSG_IMAPHighWaterMark:
{
static const char szHighWaterKey[] = "IMAPHighWaterUID";
SetBiffInfoNum(szHighWaterKey, data);
break;
}
default:
{
break;
}
}
return(0);
}
#endif
#endif
#ifdef MOZ_MAIL_NEWS
//
// A biff operation has just completed.
//
extern "C" void FE_UpdateBiff(MSG_BIFF_STATE state)
{
#ifdef _WIN32
const char szNSNotifyWindowClassName[] = NSNotifyWindowClassName; // do not localize this string
const char szNSNotifyRegisterMsgStr[] = NSMailNotifyMsg; // do not localize this string
HWND nsNotifyHwnd = FindWindow(szNSNotifyWindowClassName, NULL);
static UINT WM_NSMailMsg = 0;
if (WM_NSMailMsg == 0)
{
WM_NSMailMsg = RegisterWindowMessage(szNSNotifyRegisterMsgStr);
}
NOTIFYICONDATA nid;
if (sysInfo.m_bWin4) {
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = theApp.m_pHiddenFrame->GetSafeHwnd();
nid.uID = ID_TOOLS_INBOX;
nid.uFlags = 0;
}
if (state == MSG_BIFF_NoMail) {
// tell the stand-alone biff there is no new mail anymore
// always do this, even if this is the same as the last state
if (nsNotifyHwnd)
PostMessage(nsNotifyHwnd, WM_NSMailMsg, NSMAIL_GetMailCompleted, 0);
}
#endif
static MSG_BIFF_STATE stateOld = MSG_BIFF_Unknown;
if ( stateOld != state ) {
switch ( state ) {
case MSG_BIFF_NoMail:
#ifdef _WIN32
if (sysInfo.m_bWin4) {
Shell_NotifyIcon( NIM_DELETE, &nid );
}
#endif
theApp.GetTaskBarMgr().ReplaceTaskIcon( ID_TOOLS_INBOX, IDB_TASKBARL, IDB_TASKBARS, INBOX_ICON_INDEX);
break;
case MSG_BIFF_Unknown:
theApp.GetTaskBarMgr().ReplaceTaskIcon( ID_TOOLS_INBOX, IDB_TASKBARL, IDB_TASKBARS, UNKNOWN_MAIL_ICON_INDEX);
break;
case MSG_BIFF_NewMail:
XP_Bool prefBool = TRUE;
PREF_GetBoolPref("mail.play_sound",&prefBool);
#ifdef _WIN32
if (sysInfo.m_bWin4) {
if (prefBool) {
PlaySound( _T("MailBeep"), NULL, SND_ASYNC );
}
// Add the biff icon only if we don't find a standalone biff
if (!nsNotifyHwnd) {
nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
nid.uCallbackMessage = MSG_TASK_NOTIFY;
nid.hIcon = ::LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE( IDI_MAIL ));
strcpy(nid.szTip, szLoadString(IDS_YOUHAVENEWMAIL));
Shell_NotifyIcon( NIM_ADD, &nid );
if (nid.hIcon)
DestroyIcon(nid.hIcon);
}
else {
if (sysInfo.m_bWin4) {
Shell_NotifyIcon( NIM_DELETE, &nid );
}
}
}
else
#endif
{
if (prefBool) {
sndPlaySound( "MailBeep", SND_ASYNC );
}
}
theApp.GetTaskBarMgr().ReplaceTaskIcon( ID_TOOLS_INBOX, IDB_TASKBARL, IDB_TASKBARS, NEW_MAIL_ICON_INDEX);
break;
}
stateOld = state;
}
}
#endif
//
// Save the POP3 password in the encrypted form it was handed to us
//
extern "C" void FE_RememberPopPassword(MWContext * context, const char * password)
{
#ifdef MOZ_MAIL_NEWS
// if we aren't supposed to remember clear anything in the registry
XP_Bool prefBool;
XP_Bool passwordProtectLocalCache;
PREF_GetBoolPref("mail.remember_password",&prefBool);
PREF_GetBoolPref("mail.password_protect_local_cache", &passwordProtectLocalCache);
if(prefBool || passwordProtectLocalCache)
PREF_SetCharPref("mail.pop_password",(char *)password);
else
PREF_SetCharPref("mail.pop_password","");
#endif /* MOZ_MAIL_NEWS */
}
#ifdef MOZ_MAIL_NEWS
/////////////////////////////////////////////////////////////////////
//
// CNewsDownloadDialog
//
class CNewsDownloadDialog: public CDialog {
protected:
enum { IDD = IDD_NEWSMAXHEADERS };
virtual BOOL OnInitDialog( );
virtual void DoDataExchange(CDataExchange* pDX);
public:
int32 m_iNumMsg;
int m_iDownloadSome;
int32 m_iDownloadMax;
int m_iMarkRead;
CNewsDownloadDialog( MWContext *pXPCX, int32 iNumMsg);
protected:
afx_msg void OnRadioClicked();
afx_msg void OnEditFocus();
DECLARE_MESSAGE_MAP();
};
void CNewsDownloadDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Radio(pDX, IDC_RADIO1, m_iDownloadSome);
DDX_Text(pDX, IDC_EDIT1, m_iDownloadMax);
DDX_Check(pDX, IDC_CHECK1, m_iMarkRead);
}
BOOL CNewsDownloadDialog::OnInitDialog()
{
CDialog::OnInitDialog();
CWnd *widget = GetDlgItem(IDC_STATIC1);
CString cs;
cs.Format(szLoadString(IDS_MSGSTODOWNLOAD),
(long int) m_iNumMsg );
widget->SetWindowText(cs);
widget = GetDlgItem( IDC_CHECK1 );
widget->EnableWindow( m_iDownloadSome );
return TRUE;
}
CNewsDownloadDialog::CNewsDownloadDialog( MWContext *pXPCX, int32 iNumMsg ):
CDialog( IDD, ABSTRACTCX(pXPCX)->GetDialogOwner() )
{
m_iNumMsg = iNumMsg;
m_iDownloadMax = 0;
PREF_GetIntPref("news.max_articles", &m_iDownloadMax);
m_iDownloadSome = 0;
XP_Bool bMarkRead = FALSE;
PREF_GetBoolPref( "news.mark_old_read", &bMarkRead );
m_iMarkRead = bMarkRead ? 1 : 0;
}
BEGIN_MESSAGE_MAP(CNewsDownloadDialog, CDialog)
ON_BN_CLICKED(IDC_RADIO1, OnRadioClicked)
ON_BN_CLICKED(IDC_RADIO2, OnRadioClicked)
ON_EN_SETFOCUS(IDC_EDIT1, OnEditFocus)
END_MESSAGE_MAP()
void CNewsDownloadDialog::OnRadioClicked()
{
UpdateData(TRUE);
CWnd *widget = GetDlgItem( IDC_CHECK1 );
widget->EnableWindow( m_iDownloadSome );
}
void CNewsDownloadDialog::OnEditFocus()
{
CheckRadioButton(IDC_RADIO1, IDC_RADIO2, IDC_RADIO2);
OnRadioClicked();
}
extern "C" XP_Bool FE_NewsDownloadPrompt( MWContext *context,
int32 numMessagesToDownload,
XP_Bool *downloadAll)
{
CNewsDownloadDialog dlg(context, numMessagesToDownload);
if (dlg.DoModal() == IDOK ) {
if (dlg.m_iDownloadSome) {
*downloadAll = FALSE;
PREF_SetIntPref("news.max_articles", dlg.m_iDownloadMax);
PREF_SetBoolPref("news.mark_old_read", dlg.m_iMarkRead ? TRUE : FALSE);
} else {
*downloadAll = TRUE;
}
return TRUE;
} else {
return FALSE;
}
}
extern "C" void FE_ListChangeStarting(MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
LPUNKNOWN pUnk = (LPUNKNOWN) MSG_GetFEData( pane );
if (pUnk) {
LPMSGLIST pInterface = NULL;
pUnk->QueryInterface( IID_IMsgList, (LPVOID *) &pInterface );
if ( pInterface ) {
pInterface->ListChangeStarting( pane, asynchronous, notify, where, num );
pInterface->Release();
}
}
}
extern "C" void FE_ListChangeFinished(MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
LPUNKNOWN pUnk = (LPUNKNOWN) MSG_GetFEData( pane );
if (pUnk) {
LPMSGLIST pInterface = NULL;
pUnk->QueryInterface( IID_IMsgList, (LPVOID *) &pInterface );
if ( pInterface ) {
pInterface->ListChangeFinished( pane, asynchronous, notify, where, num );
pInterface->Release();
}
}
}
extern "C" void FE_PaneChanged( MSG_Pane *pane, XP_Bool asynchronous,
MSG_PANE_CHANGED_NOTIFY_CODE notify, int32 value)
{
LPUNKNOWN pUnk = (LPUNKNOWN) MSG_GetFEData( pane );
if (pUnk) {
LPMAILFRAME pInterface = NULL;
pUnk->QueryInterface( IID_IMailFrame, (LPVOID *) &pInterface );
if ( pInterface ) {
pInterface->PaneChanged( pane, asynchronous, notify, value );
pInterface->Release();
}
}
}
extern "C" XP_Bool FE_IsAltMailUsed(MWContext *pContext)
{
return theApp.m_hPostalLib ? TRUE : FALSE;
}
#endif // MOZ_MAIL_NEWS
#ifdef _WIN32
// these are the registry functions that are used to communicate and store
// stuff in the registry for the stand-alone biff
static const char szMasterKey[] = "Software\\Netscape\\Netscape Navigator\\%s";
static const char szMasterKeyBiff[] = "Software\\Netscape\\Netscape Navigator\\biff";
static const char szUserKey[] = "Software\\Netscape\\Netscape Navigator\\Users";
static const char szCurrentUser[] = "CurrentUser";
BOOL GetConfigInfoStr(LPCSTR pSection, LPCSTR pKey, LPSTR pBuf, int lenBuf, HKEY hMasterKey);
HKEY RegCreateParent(LPCSTR pSection, HKEY hMasterKey);
BOOL SetConfigInfoNum(LPCSTR pSection, LPCSTR pKey, uint32 num, HKEY hMasterKey);
HKEY RegOpenParent(LPCSTR pSection, HKEY hRootKey)
{
char buf[128];
HKEY hKey;
if (strchr(pSection, '\\'))
{
lstrcpy(buf, pSection);
}
else
{
wsprintf(buf, szMasterKey, pSection);
}
if (RegOpenKeyEx(hRootKey, buf, 0, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS)
{
return(NULL);
}
return(hKey);
}
BOOL SetBiffInfoNum(LPCSTR pKey, uint32 num)
{
char userName[512];
char temp[512];
if (GetConfigInfoStr(szUserKey, szCurrentUser, userName, sizeof(userName), HKEY_LOCAL_MACHINE))
{
wsprintf(temp, "%s\\%s\\biff", szUserKey, userName);
return(SetConfigInfoNum(temp, pKey, num, HKEY_LOCAL_MACHINE));
}
// if the user isn't there, then store it in the global biff location
return(SetConfigInfoNum(szMasterKeyBiff, pKey, num, HKEY_CURRENT_USER));
}
BOOL GetConfigInfoStr(LPCSTR pSection, LPCSTR pKey, LPSTR pBuf, int lenBuf, HKEY hMasterKey)
{
HKEY hKey;
hKey = RegOpenParent(pSection, hMasterKey);
if (!hKey)
{
return(FALSE);
}
uint32 len = (uint32)lenBuf;
BOOL retVal = (RegQueryValueEx(hKey, pKey, NULL, NULL, (LPBYTE)pBuf, &len) == ERROR_SUCCESS);
RegCloseKey(hKey);
return(retVal);
}
HKEY RegCreateParent(LPCSTR pSection, HKEY hMasterKey)
{
char buf[128];
HKEY hKey;
if (strchr(pSection, '\\'))
{
lstrcpy(buf, pSection);
}
else
{
wsprintf(buf, szMasterKey, pSection);
}
if (RegCreateKey(hMasterKey, buf, &hKey) != ERROR_SUCCESS)
{
return(NULL);
}
return(hKey);
}
BOOL SetConfigInfoNum(LPCSTR pSection, LPCSTR pKey, uint32 num, HKEY hMasterKey)
{
HKEY hKey;
hKey = RegCreateParent(pSection, hMasterKey);
if (!hKey)
{
return(FALSE);
}
BOOL retVal = (RegSetValueEx(hKey, pKey, 0, REG_DWORD, (LPBYTE)&num, sizeof(num)) == ERROR_SUCCESS);
RegCloseKey(hKey);
return(retVal);
}
#endif // _WIN32