You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
4.4 KiB
234 lines
4.4 KiB
#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;
|
|
}
|
|
|
|
|
|
|
|
|