//#######################################################################################
// Copyright(c) Vision Technologies 2002 All Rights Reserved.
//
// Project Name: FileInspector RT
// Software Version 1.0
//
// ----------------------------------------------------------
//
// File Name: FileInspector.h
// Function: Define of Classes
// Created Time: 28th Dec, 2002
// Author: HighTech Young
//
// ----------------------------------------------------------
//
// Revidion Time:
// Revision By:
// Revision Contents:
//
//#######################################################################################
#include "resource.h"
#include "stdafx.h"
#include "afxmt.h"
//---------------------------------------------------------------------------------------
//
// COMMENTS: Define of applacation class
//
//---------------------------------------------------------------------------------------
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance ();
};
//---------------------------------------------------------------------------------------
//
// COMMENTS: Define of mainwindow class
//
//---------------------------------------------------------------------------------------
class CMainWindow : public CWnd
{
//
// Declare all objects of interface
//
private:
CStatic m_FiTip;
CButton m_GroupBoxFI;
CEdit m_ObjectPath;
CButton m_Browse;
CButton m_GroupBoxFS;
CStatic m_FsTip;
CEdit m_ObjectSize;
CButton m_GB;
CButton m_MB;
CButton m_KB;
CButton m_Byte;
CButton m_OK;
CButton m_Cancel;
CButton m_Exit;
public:
CMainWindow ();
BOOL boolWndHadShow; // Window display indicator
protected:
CEvent m_eventStopWatch;// CEvent object for synchonize thread
virtual void PostNcDestroy();
//
// Message handler declare
//
afx_msg int OnCreate(LPCREATESTRUCT lpcs);
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg LRESULT OnMyIconNotify(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnShowAppIconic(WPARAM wParam, LPARAM lParam);
afx_msg void OnClose();
afx_msg void OnBrowseButonClicked();
afx_msg void OnObjectPathChanged();
afx_msg void OnOkButtonClicked();
afx_msg void OnCancelButtonClicked();
afx_msg void OnExitButtonClicked();
afx_msg LONG OnFileChanged(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP ()
};
//##################################### End of File #######################################
//#######################################################################################
// Copyright(c) Vision Technologies 2002 All Rights Reserved.
//
// Project Name: FileInspector RT
// Software Version 1.0
//
// ----------------------------------------------------------
//
// File Name: FileInspector.cpp
// Function: Implementation of the class
// Created Time: 28th Dec, 2002
// Created by: HighTech Young
//
// ----------------------------------------------------------
//
// Revidion Time:
// Revision By:
// Revision Contents:
//
//#######################################################################################
#include "FileInspector.h"
//---------------------------------------------------------------------------------------
//
// COMMENTS: GLOBE DEFINATION AREA
//
//---------------------------------------------------------------------------------------
//
// User defined message for callback function
//
#define USER_WM_NOTIFYICON WM_USER + 0x001
//
// User defined message for display icon on statue bar of windows
//
#define USER_WM_SHOWAPPICONIC WM_USER + 0x002
//
// User defined message for file change notification
//
#define WM_USER_THREAD_FILE_CHANGED WM_USER + 0x003
//
// The structure was defined for the input of thread function parameters
//
typedef struct tagTHREADPARAM
{
HWND hWnd;
CEvent *pEvent;
}THREADPARAM;
//
// Worker thread function declare
//
UINT ThreadFunction(LPVOID pParam);
//---------------------------------------------------------------------------------------
//
// COMMENTS: MESSAGE MAP of CMainWindow class
//
//---------------------------------------------------------------------------------------
BEGIN_MESSAGE_MAP (CMainWindow, CWnd)
ON_WM_CREATE()
ON_MESSAGE(USER_WM_NOTIFYICON,OnMyIconNotify)
ON_MESSAGE(USER_WM_SHOWAPPICONIC,OnShowAppIconic)
ON_WM_SYSCOMMAND()
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BROWSE,OnBrowseButonClicked)
ON_EN_CHANGE(IDE_OBJ_PATH,OnObjectPathChanged)
ON_BN_CLICKED(IDC_OK,OnOkButtonClicked)
ON_BN_CLICKED(IDE_OBJ_PATH,OnObjectPathChanged)
ON_BN_CLICKED(IDC_EXIT_FI,OnExitButtonClicked)
ON_MESSAGE(WM_USER_THREAD_FILE_CHANGED,OnFileChanged)
END_MESSAGE_MAP ()
//
// defination of application object
//
CMyApp myApp;
//---------------------------------------------------------------------------------------
//
// FUNCTION: BOOL CMyApp::InitInstance ()
// PURPOSE: CMyApp member functions
// COMMENTS:
//
//---------------------------------------------------------------------------------------
BOOL CMyApp::InitInstance ()
{
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow (m_nCmdShow);
m_pMainWnd->UpdateWindow ();
//
// Send MYWM_SHOWAPPICONIC so that the window can be
// hide after programe runed and the icon should be
// displayed on the statue area of task bar
//
m_pMainWnd -> PostMessage( USER_WM_SHOWAPPICONIC );
return TRUE;
}
//---------------------------------------------------------------------------------------
//
// FUNCTION: CMainWindow::CMainWindow ()
// PURPOSE: The constructor of the CMainWindow class
// COMMENTS:
//
//---------------------------------------------------------------------------------------
CMainWindow::CMainWindow ():
m_eventStopWatch(FALSE,TRUE)
{
//
// Register a WNDCLASS.
//
CString strWndClass = AfxRegisterWndClass (
CS_DBLCLKS, // Class style
AfxGetApp ()->LoadStandardCursor (IDC_ARROW), // Class cursor
(HBRUSH) (COLOR_3DFACE + 1), // Background brush
AfxGetApp ()->LoadIcon( IDR_FILE_INSPECTOR) // Class icon
);
//
// Create a window.
//
CreateEx (0, strWndClass, _T ("File/Folder Supervisor"),
WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL);
//
// Size the window.
//
CRect rect (80,70, 452, 400);
CalcWindowRect (&rect);
SetWindowPos (NULL, 0, 0, rect.Width (), rect.Height (),
SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW);
}
//---------------------------------------------------------------------------------------
//
// FUNCTION: int CMainWindow::OnCreate(LPCREATESTRUCT lpcs)
// PURPOSE: Create GUI of Programe
// COMMENTS:
//
//---------------------------------------------------------------------------------------
int CMainWindow::OnCreate(LPCREATESTRUCT lpcs)
{
if(CWnd::OnCreate(lpcs) == -1)
return -1;
//
// Object selected groupe box
//
m_GroupBoxFI.Create (_T (" Supervised Target:"),
WS_CHILD|BS_GROUPBOX| WS_VISIBLE,
CRect(10,10,360,115),
this,
IDC_GROUPBOX_FI);
m_FiTip.Create(_T("Please select the file or folder which you want to ask the File/Folder Supervisor supervise."),
WS_CHILD|WS_VISIBLE,
CRect(25,35,350,75),
this,
IDS_FI_TIP);
m_ObjectPath.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,
CRect(25,80,260,100),
this,
IDE_OBJ_PATH);
m_Browse.Create(_T("Browse.."),
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
CRect(265,80,350,100),
this,
IDC_BROWSE);
//
// File size limitation config box
//
m_GroupBoxFS.Create (_T ("File Size Limitation:"),
WS_CHILD |BS_GROUPBOX| WS_VISIBLE,
CRect(10,120,360,280),
this,
IDC_GROUPBOX_FS);
m_FsTip.Create( _T("The Folder or File size must be less than:"),
WS_CHILD|WS_VISIBLE,
CRect(25,145,350,165),
this,
IDS_FS_TIP);
m_ObjectSize.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOHSCROLL,
CRect(30,170,100,190),
this,
IDE_OBJ_SIZE);
m_GB.Create (_T("GB"),
WS_CHILD|WS_GROUP|WS_VISIBLE|BS_AUTORADIOBUTTON,
CRect(110,170,150,190),
this,
IDC_GB);
m_MB.Create (_T("MB"),
WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,
CRect(155,170,195,190),
this,
IDC_MB);
m_KB.Create (_T("KB"),
WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,
CRect(200,170,240,190),
this,
IDC_GB);
m_Byte.Create (_T("Byte"),
WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,
CRect(245,170,325,190),
this,
IDC_BYTE);
m_KB.SetCheck (BST_CHECKED);
//
// Buttons
//
m_OK.Create(_T("Start"),
WS_CHILD|WS_GROUP|BS_DEFPUSHBUTTON| WS_VISIBLE,
CRect(50,290,150,315),
this,
IDC_OK);
m_Cancel.Create(_T("Cancel"),
WS_CHILD|BS_PUSHBUTTON| WS_VISIBLE,
CRect(155,290,255,315),
this,
IDC_CANCEL);
m_Cancel.EnableWindow(FALSE);
m_Exit.Create(_T("Stop"),
WS_CHILD|BS_PUSHBUTTON| WS_VISIBLE,
CRect(260,290,360,315),
this,
IDC_EXIT_FI);
return 0;
}
//---------------------------------------------------------------------------------------
//
// FUNCTION: void CMainWindow::PostNcDestroy()
// PURPOSE: PostNcDestroy will be used for delete the window
// COMMENTS:
//
//---------------------------------------------------------------------------------------
void CMainWindow::PostNcDestroy()
{
delete this;
}
//---------------------------------------------------------------------------------------
//
// FUNCTION: BOOL MyTaskBarAddIcon(HWND hwnd,UINT uID, HICON hicon, LPSTR lpszTip)
// PURPOSE: Add icon in the statu area on the task bar
// COMMENTS:
//
//---------------------------------------------------------------------------------------
BOOL MyTaskBarAddIcon(HWND hwnd,UINT uID, HICON hicon, LPSTR lpszTip)
{
BOOL bResult;
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = uID;
tnid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
tnid.uCallbackMessage = USER_WM_NOTIFYICON; // Callback message
tnid.hIcon = hicon; // Icon used
if (lpszTip)
lstrcpyn(tnid.szTip, lpszTip, sizeof(tnid.szTip));
else
tnid.szTip[0] = '\0';
//
// Send NIM_ADD to create icon
//
bResult = Shell_NotifyIcon(NIM_ADD, &tnid);
if (hicon) DestroyIcon(hicon);
return bResult;
}
//---------------------------------------------------------------------------------------
//
// FUNCTION: BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID)
// PURPOSE: DELETE icon in the statu area on the task bar
// COMMENTS:
//
//---------------------------------------------------------------------------------------
BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID)
{
BOOL bResult;
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = uID;
//
//Send NIM_DELETE to create icon
//
bResult = Shell_NotifyIcon(NIM_DELETE, &tnid);
return bResult;
}
//---------------------------------------------------------------------------------------
//
// FUNCTION: LRESULT CMainWindow::OnMyIconNotify( WPARAM wParam, LPARAM lParam )
// PURPOSE: Call back function of message MYWM_NOTIFYICON
// COMMENTS:
//
//---------------------------------------------------------------------------------------
LRESULT CMainWindow::OnMyIconNotify( WPARAM wParam, LPARAM lParam )
{
UINT nID;
UINT uMouseMsg;
nID = (UINT)wParam;
uMouseMsg = (UINT) lParam;
//
// Show or hide window
//
if (uMouseMsg == WM_LBUTTONDOWN) // Click on icon
{
if ( boolWndHadShow )
ShowWindow( SW_HIDE );
else
ShowWindow( SW_SHOWNORMAL );
boolWndHadShow = ~boolWndHadShow;
}
return TRUE;
}
//---------------------------------------------------------------------------------------
//
// FUNCTION:
// LRESULT CMainWindow::OnShowAppIconic( WPARAM wParam, LPARAM lParam )
// PURPOSE:
// Message handler of show icon on statu bar
// and hide the window when programe run
// COMMENTS:
// Call back function of message MYWM_SHOWAPPICONIC
//
//---------------------------------------------------------------------------------------
LRESULT CMainWindow::OnShowAppIconic( WPARAM wParam, LPARAM lParam )
{
HICON theIcon = LoadIcon(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDR_FILE_INSPECTOR) );
MyTaskBarAddIcon(GetSafeHwnd(),
100,
theIcon,
_T("File/Folder Supervisor"));
ShowWindow( SW_HIDE );
boolWndHadShow = FALSE;
return 1;
}
//---------------------------------------------------------------------------------------
//
// FUNCTION: void CMainWindow::OnClose()
// PURPOSE:
// When you want to close programe, the icon should
// be delete from statue area on task bar,
// We can use WM_CLOSE message and message handler to do this
// COMMENTS:
//
//---------------------------------------------------------------------------------------
void CMainWindow::OnClose()
{
//
// Add your message handler code here and/or call default
//
MyTaskBarDeleteIcon( GetSafeHwnd(), 100 );
CWnd::OnClose();
}
//---------------------------------------------------------------------------------------
//
// FUNCTION:
// void CMainWindow::OnSysCommand( UINT nID, LPARAM lParam )
// PURPOSE:
// When window were minimumized, the window should be hide,
// we use ON_SYSCOMMAND message and message handle to do this
// COMMENTS:
//
//---------------------------------------------------------------------------------------
void CMainWindow::OnSysCommand( UINT nID, LPARAM lParam )
{
if ( nID==SC_MINIMIZE )
{
ShowWindow( SW_HIDE );
boolWndHadShow = FALSE;
}
else
CWnd::OnSysCommand( nID, lParam );
}
//---------------------------------------------------------------------------------------
//
// FUNCTION: void CMainWindow::OnBrowseButonClicked ()
// PURPOSE: Message handler of OK button
// COMMENTS:
//
//---------------------------------------------------------------------------------------
void CMainWindow::OnBrowseButonClicked ()
{
//
// Must call IMalloc::Free to free the memory by this pointer
//
LPMALLOC pMalloc;
BROWSEINFO bi;
char pszDirName[MAX_PATH];// Save the directory name
LPITEMIDLIST pidl;
//
// If retrieve a handle to the Shell allocator's IMalloc interface sucessfuly
//
if (SUCCEEDED(SHGetMalloc(&pMalloc)))
{
ZeroMemory(&bi,sizeof(bi));
bi.hwndOwner = GetSafeHwnd();
bi.pidlRoot = NULL;
bi.pszDisplayName = pszDirName;
bi.lpszTitle = _T("Select the file or folder which will be Supervised:");
bi.ulFlags = BIF_BROWSEINCLUDEFILES;
bi.lpfn = NULL;
bi.lParam = 0;
if ((pidl = ::SHBrowseForFolder(&bi)) != NULL)
{
//
// Get full path user selected
//
if (::SHGetPathFromIDList(pidl, pszDirName))
m_ObjectPath.SetWindowText(pszDirName);
}
pMalloc->Free(pidl);
pMalloc->Release();
}
//
// Try to detect the inspect object is directory or file
// Can also use:
// DWORD GetFileAttributes(LPCTSTR lpFileName);
//
DWORD ObjectType;
ObjectType = GetFileAttributes(pszDirName);
if(ObjectType & FILE_ATTRIBUTE_DIRECTORY)
{
m_GroupBoxFI.SetWindowText (_T("Folder Supervised:"));
m_GroupBoxFS.SetWindowText (_T("Folder Size Limitation"));
}
else
{
m_GroupBoxFI.SetWindowText (_T("File Supervised:"));
m_GroupBoxFS.SetWindowText (_T("File Size Limitation"));
}
//
//Enable the Cancel button
//
m_Cancel.EnableWindow(TRUE);
}
//---------------------------------------------------------------------------------------
//
// FUNCTION: void CMainWindow::OnOkButtonClicked ()
// PURPOSE: Message handler of OK button
// COMMENTS:
// This function transfer a structure's pointer
// as a LPVOID parameter to worker thread. this is the normal way
// to handle the worker thread parameters. Besides, you can also
// input a address of an object directly.
//
//---------------------------------------------------------------------------------------
void CMainWindow::OnOkButtonClicked ()
{
m_Cancel.EnableWindow( FALSE );
ShowWindow( SW_HIDE );
boolWndHadShow = FALSE;
//
// Reset the manual event object before start worker thread
//
m_eventStopWatch.ResetEvent ();
//
// Prepare the parameter for worker thread
// sometimes if you only need m_hWnd, you can also
// input &m_hWnd directly there
//
THREADPARAM * pThreadParam=new THREADPARAM;
pThreadParam->hWnd= m_hWnd; // Message target
pThreadParam->pEvent = &m_eventStopWatch; // Event to stop thread
//
// Start File Inspector thread.
//
AfxBeginThread(ThreadFunction, pThreadParam);
}
//---------------------------------------------------------------------------------------
//
// FUNCTION: void CMainWindow::OnCancelButtonClicked ()
// PURPOSE: Message handler of Cancel button
// COMMENTS:
//
//---------------------------------------------------------------------------------------
void CMainWindow::OnCancelButtonClicked ()
{
ShowWindow( SW_HIDE );
boolWndHadShow = FALSE;
}
//---------------------------------------------------------------------------------------
//
// FUNCTION: void CMainWindow::OnExitButtonClicked ()
// PURPOSE: Message handler of Exit button
// COMMENTS:
//
//---------------------------------------------------------------------------------------
void CMainWindow::OnExitButtonClicked ()
{
ShowWindow( SW_HIDE );
boolWndHadShow = FALSE;
m_eventStopWatch.SetEvent();
//
// Close the window
//
PostMessage (WM_CLOSE,0,0);
}
//---------------------------------------------------------------------------------------
//
// FUNCTION: void CMainWindow::OnObjectPathChanged ()
// PURPOSE: Message handler of Object Path changed
// COMMENTS:
//
//---------------------------------------------------------------------------------------
void CMainWindow::OnObjectPathChanged ()
{
m_Cancel.EnableWindow(TRUE);
}
//---------------------------------------------------------------------------------------
//
// FUNCTION: UINT ThreadFunction(LPVOID pParam)
// PURPOSE: Worker thread Function
// COMMENTS:
//
//---------------------------------------------------------------------------------------
UINT ThreadFunction(LPVOID pParam)
{
//
// Unbound the parameters
//
THREADPARAM *pThreadParam = (THREADPARAM * ) pParam;
HWND hWnd = pThreadParam -> hWnd;
CEvent *pEvent = pThreadParam -> pEvent;
//delete pThreadParam;
delete pThreadParam;
DWORD dwWaitStatus;
HANDLE *dwChangeHandles=new HANDLE[3];
//
// Use this event handle to stop the thread
//
dwChangeHandles[2] = pEvent->m_hObject;
//
// Watch the C:\ directory for file creation and deletion.
//
dwChangeHandles[0] = FindFirstChangeNotification(
"C:\\", // directory to watch
FALSE, // do not watch the subtree
FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes
//
// Watch the D:\ subtree for directory creation and deletion.
//
dwChangeHandles[1] = FindFirstChangeNotification(
"D:\\", // directory to watch
TRUE, // watch the subtree
FILE_NOTIFY_CHANGE_DIR_NAME); // watch dir. name changes
while (TRUE)
{
/*--------------------------------------------------------------------------
Examples:
Here is the examples if you want to use WaitForSingleObject
to imply the function.
//
// Check if user want to Exit File Inspector.
// Please make sure that the second parameter of
// WaitForSingleObject is 0, and in this case the
// first parameter must be manual event.
// WaitForSingleObject will check the first parameter,
// if it is signaled,the loop will break.
//
if(WaitForSingleObject(pEvent->m_hObject,0)==WAIT_OBJECT_0)
return (UINT) -1;
WaitForSingleObject(dwChangeHandles[1],INFINITE);
PostMessage (hWnd,WM_USER_THREAD_FILE_CHANGED,0,0);
FindNextChangeNotification(dwChangeHandles);
---------------------------------------------------------------------------*/
//
// Wait for notification.
//
dwWaitStatus = WaitForMultipleObjects(3, dwChangeHandles,
FALSE, INFINITE);
if (dwWaitStatus == WAIT_OBJECT_0 + 2) return (UINT) -1;
switch (dwWaitStatus)
{
case WAIT_OBJECT_0:
//
// A file was created or deleted in C:\WINDOWS.
// Refresh this directory and restart the
// change notification. RefreshDirectory is an
// application-defined function.
//
PostMessage (hWnd,WM_USER_THREAD_FILE_CHANGED,0,0);
FindNextChangeNotification(dwChangeHandles[0]);
break;
case WAIT_OBJECT_0 + 1:
//
// A directory was created or deleted in C:\.
// Refresh the directory tree and restart the
// change notification. RefreshTree is an
// application-defined function.
//
PostMessage (hWnd,WM_USER_THREAD_FILE_CHANGED,0,0);
FindNextChangeNotification( dwChangeHandles[1]);
break;
}
}
delete[] dwChangeHandles;
return 0;
}
//---------------------------------------------------------------------------------------
//
// FUNCTION: LONG CMainWindow::OnFileChanged(WPARAM wParam, LPARAM lParam)
// PURPOSE:
// COMMENTS:
//---------------------------------------------------------------------------------------
LONG CMainWindow::OnFileChanged(WPARAM wParam, LPARAM lParam)
{
//
// Add process sentence if file changed here.
//
return 0;
}
//##################################### End of File #######################################