234 lines
4.2 KiB
C++
234 lines
4.2 KiB
C++
#include "precomp.h"
|
||
#include "wbloader.h"
|
||
#include "nmwbobj.h"
|
||
|
||
WBLoader *g_pWBLoader = NULL;
|
||
HANDLE g_hWorkThread = NULL;
|
||
BOOL g_fShutdownByT120 = FALSE;
|
||
|
||
DWORD __stdcall WBWorkThreadProc(LPVOID lpv);
|
||
|
||
TCHAR g_PassedFileName [MAX_PATH * 2];
|
||
|
||
T120Error CALLBACK CreateAppletLoaderInterface
|
||
(
|
||
IAppletLoader **ppOutIntf
|
||
)
|
||
{
|
||
if (NULL != ppOutIntf)
|
||
{
|
||
if (NULL == g_pWBLoader)
|
||
{
|
||
DBG_SAVE_FILE_LINE
|
||
*ppOutIntf = (IAppletLoader *) new WBLoader();
|
||
return ((NULL != *ppOutIntf) ? T120_NO_ERROR : T120_ALLOCATION_FAILURE);
|
||
}
|
||
return T120_ALREADY_INITIALIZED;
|
||
}
|
||
return T120_INVALID_PARAMETER;
|
||
}
|
||
|
||
|
||
|
||
//
|
||
// FT Applet Loader
|
||
//
|
||
|
||
WBLoader::WBLoader(void)
|
||
:
|
||
CRefCount(MAKE_STAMP_ID('W','B','L','D'))
|
||
{
|
||
|
||
ASSERT(NULL == g_pWBLoader);
|
||
|
||
g_pWBLoader = this;
|
||
}
|
||
|
||
|
||
WBLoader::~WBLoader(void)
|
||
{
|
||
ASSERT(this == g_pWBLoader);
|
||
|
||
g_pWBLoader = NULL;
|
||
}
|
||
|
||
|
||
//
|
||
// Create the work thread and wait for its being started.
|
||
//
|
||
APPLDR_RESULT WBLoader::AppletStartup
|
||
(
|
||
BOOL fNoUI
|
||
)
|
||
{
|
||
APPLDR_RESULT eRet = APPLDR_FAIL;
|
||
if (0 == g_dwWorkThreadID)
|
||
{
|
||
HANDLE hSync = ::CreateEvent(NULL, FALSE, FALSE, NULL);
|
||
if (NULL != hSync)
|
||
{
|
||
g_hWorkThread = ::CreateThread(NULL, 0, WBWorkThreadProc, hSync, 0, &g_dwWorkThreadID);
|
||
if (NULL != g_hWorkThread)
|
||
{
|
||
::WaitForSingleObject(hSync, 5000); // 5 seconds
|
||
// ASSERT(g_pNMWBOBJ);
|
||
eRet = APPLDR_NO_ERROR;
|
||
}
|
||
::CloseHandle(hSync);
|
||
}
|
||
}
|
||
return eRet;
|
||
}
|
||
|
||
//
|
||
APPLDR_RESULT WBLoader::AppletCleanup
|
||
(
|
||
DWORD dwTimeout
|
||
)
|
||
{
|
||
if (g_pMain)
|
||
{
|
||
//
|
||
// Last change to save
|
||
//
|
||
int rc = g_pMain->QuerySaveRequired(TRUE);
|
||
if (rc == IDYES)
|
||
{
|
||
rc = (int)g_pMain->OnSave(FALSE);
|
||
}
|
||
|
||
if (rc == IDCANCEL)
|
||
{
|
||
return APPLDR_CANCEL_EXIT;
|
||
}
|
||
}
|
||
|
||
g_fShutdownByT120 = TRUE;
|
||
|
||
::T120_AppletStatus(APPLET_ID_WB, APPLET_CLOSING);
|
||
|
||
// notify the work thread to exit
|
||
::PostThreadMessage(g_dwWorkThreadID, WM_QUIT, 0, 0);
|
||
|
||
// wait for the worker thread's going down
|
||
::WaitForSingleObject(g_hWorkThread, dwTimeout);
|
||
|
||
return APPLDR_NO_ERROR;
|
||
}
|
||
|
||
|
||
APPLDR_RESULT WBLoader::AppletQuery(APPLET_QUERY_ID eQueryId)
|
||
{
|
||
// Do nothing now
|
||
return APPLDR_NO_ERROR;
|
||
}
|
||
|
||
APPLDR_RESULT WBLoader::OnNM2xNodeJoin(void)
|
||
{
|
||
// Do nothing now
|
||
return APPLDR_NO_ERROR;
|
||
}
|
||
|
||
APPLDR_RESULT WBLoader::AppletInvoke
|
||
(
|
||
BOOL fRemote,
|
||
T120ConfID nConfID,
|
||
LPSTR pszCmdLine
|
||
)
|
||
{
|
||
::ZeroMemory(&g_PassedFileName, sizeof(g_PassedFileName));
|
||
if(pszCmdLine)
|
||
{
|
||
lstrcpy(g_PassedFileName, pszCmdLine);
|
||
if(g_pMain)
|
||
{
|
||
PostMessage(g_pMain->m_hwnd, WM_USER_LOAD_FILE, 0, 0);
|
||
}
|
||
}
|
||
|
||
TRACE_MSG((">>>>AppletInvoke g_pMain = %x",g_pMain));
|
||
|
||
if(g_pMain)
|
||
{
|
||
PostMessage(g_pMain->m_hwnd, WM_USER_BRING_TO_FRONT_WINDOW, 0, 0);
|
||
}
|
||
|
||
return APPLDR_NO_ERROR;
|
||
}
|
||
|
||
|
||
void WBLoader::ReleaseInterface(void)
|
||
{
|
||
Release();
|
||
}
|
||
|
||
|
||
DWORD __stdcall WBWorkThreadProc(LPVOID lpv)
|
||
{
|
||
|
||
HRESULT hr = S_OK;
|
||
|
||
::SetEvent((HANDLE) lpv);
|
||
|
||
DBG_SAVE_FILE_LINE
|
||
g_pNMWBOBJ = new CNMWbObj();
|
||
if (NULL == g_pNMWBOBJ || NULL == g_pMain)
|
||
{
|
||
ERROR_OUT(("WB_Startup: cannot create CNMWbObj"));
|
||
hr = E_OUTOFMEMORY;
|
||
}
|
||
|
||
if(*g_PassedFileName)
|
||
{
|
||
PostMessage(g_pMain->m_hwnd, WM_USER_LOAD_FILE, 0, 0);
|
||
}
|
||
|
||
::T120_AppletStatus(APPLET_ID_WB, APPLET_WORK_THREAD_STARTED);
|
||
TRACE_MSG((">>>>WBWorkThreadProc APPLET_WORK_THREAD_STARTED"));
|
||
|
||
if(g_pMain)
|
||
{
|
||
PostMessage(g_pMain->m_hwnd, WM_USER_BRING_TO_FRONT_WINDOW, 0, 0);
|
||
}
|
||
|
||
//
|
||
// MESSAGE LOOP
|
||
//
|
||
if (S_OK == hr)
|
||
{
|
||
MSG msg;
|
||
|
||
while (::GetMessage(&msg, NULL, NULL, NULL))
|
||
{
|
||
if (!g_pMain->FilterMessage(&msg))
|
||
{
|
||
|
||
::TranslateMessage(&msg);
|
||
::DispatchMessage(&msg);
|
||
}
|
||
}
|
||
}
|
||
|
||
if(g_pNMWBOBJ)
|
||
{
|
||
delete g_pNMWBOBJ;
|
||
g_pNMWBOBJ = NULL;
|
||
}
|
||
|
||
::T120_AppletStatus(APPLET_ID_WB, APPLET_WORK_THREAD_EXITED);
|
||
|
||
g_dwWorkThreadID = 0;
|
||
|
||
TRACE_MSG((">>>>WBWorkThreadProc APPLET_WORK_THREAD_EXITED"));
|
||
|
||
if (! g_fShutdownByT120)
|
||
{
|
||
FreeLibraryAndExitThread(g_hInstance, 0);
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
|
||
|