blob: dc7312722bc8e43cce479f7ef219e4b8ba75c1bf [file] [log] [blame]
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "xp.h"
#include "windowsx.h"
#include "resource.h"
#include "loggerw.h"
#include "profilew.h"
#include "actionnames.h"
extern HINSTANCE hInst;
static char szClassName[] = "NPSpyWindowClass";
BOOL CALLBACK MainDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK PauseDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
LoggerWin::LoggerWin() : Logger(),
hWnd(NULL),
width(0),
height(0),
x(0),
y(0),
bSaveSettings(FALSE)
{
}
LoggerWin::~LoggerWin()
{
}
BOOL LoggerWin::platformInit()
{
WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = DefDlgProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = DLGWINDOWEXTRA;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_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;
// restore prefs
ProfileWin profile;
profile.getBool(NPSPY_REG_KEY_ONTOP, &bOnTop);
bOnTop = false; // XXXMB
profile.getBool(NPSPY_REG_KEY_LOGTOWINDOW, &bToWindow);
profile.getBool(NPSPY_REG_KEY_LOGTOCONSOLE, &bToConsole);
profile.getBool(NPSPY_REG_KEY_LOGTOFILE, &bToFile);
profile.getBool(NPSPY_REG_KEY_SPALID, &bSPALID);
profile.getString(NPSPY_REG_KEY_LOGFILENAME, szFile, strlen(szFile));
for(int i = 1; i < TOTAL_NUMBER_OF_API_CALLS; i++)
{
BOOL selected = TRUE;
if(profile.getBool(ActionName[i], &selected))
bMutedCalls[i] = !selected;
}
if(!profile.getSizeAndPosition(&width, &height, &x, &y))
{
width = 0;
height = 0;
x = 0;
y = 0;
}
hWnd = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_DIALOG_MAIN), GetDesktopWindow(), (DLGPROC)MainDlgProc, (LPARAM)this);
if(hWnd == NULL)
{
UnregisterClass(szClassName, hInst);
return FALSE;
}
if(bOnTop)
SetWindowPos(hWnd, bOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);
return TRUE;
}
void LoggerWin::platformShut()
{
if(hWnd != NULL)
{
char szLog[] = "--- GOING AWAY... PRESS SPACE BAR TO CONTINUE ---";
HWND hWndOutput = GetDlgItem(hWnd, IDC_MAIN_OUTPUT);
ListBox_AddString(hWndOutput, "");
ListBox_AddString(hWndOutput, szLog);
int count = ListBox_GetCount(hWndOutput);
ListBox_SetCaretIndex(hWndOutput, count - 1);
UpdateWindow(hWndOutput);
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG_PAUSE), hWnd, (DLGPROC)PauseDlgProc);
ProfileWin profile;
RECT rc;
if(GetWindowRect(hWnd, &rc))
profile.setSizeAndPosition(rc.right - rc.left, rc.bottom - rc.top, rc.left, rc.top);
DestroyWindow(hWnd);
hWnd = NULL;
}
UnregisterClass(szClassName, hInst);
}
void LoggerWin::onDestroyWindow()
{
hWnd = NULL;
}
void LoggerWin::dumpStringToMainWindow(const std::string& string)
{
const char* output = string.c_str();
std::string temp_string;
// listboxes don't want <CR> and <LF> so cut them off if any. The order is important.
size_t newline = string.find('\n');
if(newline != std::string::npos) {
// make copy of string since it might be a constant
temp_string = string;
char* p = strrchr(const_cast<char*>(temp_string.c_str()), '\n');
*p = '\0';
p = strrchr(const_cast<char*>(temp_string.c_str()), '\r');
if(p)
*p = '\0';
output = temp_string.c_str();
}
HWND hWndOutput = GetDlgItem(hWnd, IDC_MAIN_OUTPUT);
ListBox_AddString(hWndOutput, output);
int count = ListBox_GetCount(hWndOutput);
if(count == 32767)
ListBox_ResetContent(hWndOutput);
ListBox_SetCaretIndex(hWndOutput, count - 1);
UpdateWindow(hWndOutput);
}
void LoggerWin::onClear()
{
HWND hWndOutput = GetDlgItem(hWnd, IDC_MAIN_OUTPUT);
ListBox_ResetContent(hWndOutput);
UpdateWindow(hWndOutput);
}
Logger * NewLogger()
{
LoggerWin * res = new LoggerWin();
return res;
}
void DeleteLogger(Logger * logger)
{
if(logger)
delete logger;
}