215 lines
5.0 KiB
C++
215 lines
5.0 KiB
C++
#include "mbftpch.h"
|
|
#include "ftldr.h"
|
|
#include "ftui.h"
|
|
// #include "SDKInternal.h"
|
|
|
|
CFtLoader *g_pFtLoader = NULL;
|
|
BOOL g_fNoUI = FALSE;
|
|
|
|
extern void ReadSettingsFromRegistry(void);
|
|
extern void LoadDefaultStrings(void);
|
|
extern DWORD __stdcall FTWorkThreadProc(LPVOID lpv);
|
|
extern HANDLE g_hWorkThread;
|
|
extern BOOL g_fShutdownByT120;
|
|
|
|
T120Error WINAPI CreateAppletLoaderInterface
|
|
(
|
|
IAppletLoader **ppOutIntf
|
|
)
|
|
{
|
|
if (NULL != ppOutIntf)
|
|
{
|
|
*ppOutIntf = NULL;
|
|
if (NULL == g_pFtLoader)
|
|
{
|
|
::ReadSettingsFromRegistry();
|
|
::LoadDefaultStrings();
|
|
if (g_fSendAllowed || g_fRecvAllowed)
|
|
{
|
|
DBG_SAVE_FILE_LINE
|
|
*ppOutIntf = (IAppletLoader *) new CFtLoader();
|
|
return ((NULL != *ppOutIntf) ? T120_NO_ERROR : T120_ALLOCATION_FAILURE);
|
|
}
|
|
return T120_POLICY_PROHIBIT;
|
|
}
|
|
return T120_ALREADY_INITIALIZED;
|
|
}
|
|
return T120_INVALID_PARAMETER;
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// FT Applet Loader
|
|
//
|
|
|
|
CFtLoader::CFtLoader(void)
|
|
:
|
|
CRefCount(MAKE_STAMP_ID('F','T','L','D'))
|
|
{
|
|
ASSERT(NULL == g_pFtLoader);
|
|
|
|
g_pFtLoader = this;
|
|
}
|
|
|
|
|
|
CFtLoader::~CFtLoader(void)
|
|
{
|
|
ASSERT(this == g_pFtLoader);
|
|
|
|
g_pFtLoader = NULL;
|
|
}
|
|
|
|
|
|
//
|
|
// Create the work thread and wait for its being started.
|
|
//
|
|
APPLDR_RESULT CFtLoader::AppletStartup
|
|
(
|
|
BOOL fNoUI
|
|
)
|
|
{
|
|
|
|
APPLDR_RESULT eRet = APPLDR_FAIL;
|
|
if (0 == g_dwWorkThreadID)
|
|
{
|
|
g_fNoUI = fNoUI;
|
|
|
|
ASSERT(NULL == g_pFileXferApplet);
|
|
HANDLE hSync = ::CreateEvent(NULL, FALSE, FALSE, NULL);
|
|
if (NULL != hSync)
|
|
{
|
|
g_hWorkThread = ::CreateThread(NULL, 0, FTWorkThreadProc, hSync, 0, &g_dwWorkThreadID);
|
|
if (NULL != g_hWorkThread)
|
|
{
|
|
DWORD dwRet = ::WaitForSingleObject(hSync, FT_STARTUP_TIMEOUT);
|
|
// ASSERT(NULL != g_pFileXferApplet);
|
|
eRet = APPLDR_NO_ERROR;
|
|
}
|
|
::CloseHandle(hSync);
|
|
}
|
|
}
|
|
|
|
TCHAR szRecvFolder[MAX_PATH];
|
|
::GetRecvFolder(NULL, szRecvFolder);
|
|
|
|
return eRet;
|
|
}
|
|
|
|
|
|
|
|
APPLDR_RESULT CFtLoader::AppletCleanup
|
|
(
|
|
DWORD dwTimeout
|
|
)
|
|
{
|
|
::EnterCriticalSection(&g_csWorkThread);
|
|
if (NULL != g_pFileXferApplet)
|
|
{
|
|
if (! g_pFileXferApplet->QueryShutdown(TRUE))
|
|
{
|
|
::LeaveCriticalSection(&g_csWorkThread);
|
|
return APPLDR_CANCEL_EXIT;
|
|
}
|
|
}
|
|
::LeaveCriticalSection(&g_csWorkThread);
|
|
|
|
//
|
|
// shut down the worker thread now
|
|
//
|
|
g_fShutdownByT120 = TRUE;
|
|
|
|
T120_AppletStatus(APPLET_ID_FT, APPLET_CLOSING);
|
|
|
|
// shuting down the work thread
|
|
ASSERT(::GetCurrentThreadId() != g_dwWorkThreadID);
|
|
|
|
if (NULL != g_pFileXferApplet)
|
|
{ // Shutdown MBFTInterface ourself to make things simpler
|
|
MSG msg;
|
|
MBFTEngine *pEngine = g_pFileXferApplet->FindEngineWithIntf();
|
|
if (pEngine)
|
|
{
|
|
DBG_SAVE_FILE_LINE
|
|
InitUnInitNotifyMsg *pMsg = new InitUnInitNotifyMsg(EnumInvoluntaryUnInit);
|
|
pEngine->GetInterfacePointer()->HandleInitUninitNotification(pMsg);
|
|
delete pMsg;
|
|
}
|
|
}
|
|
|
|
// shut down by T.120
|
|
::EnterCriticalSection(&g_csWorkThread);
|
|
|
|
// remember the event such that the work thread can access it
|
|
if (NULL != g_pFileXferApplet)
|
|
{
|
|
CAppletWindow *pWindow;
|
|
CWindowList *pList = g_pFileXferApplet->GetWindowList();
|
|
pList->Reset();
|
|
while (NULL != (pWindow = pList->Iterate()))
|
|
{
|
|
BOOL fRet = ::PostMessage(pWindow->GetHwnd(), WM_CLOSE, 0, 0);
|
|
ASSERT(fRet);
|
|
}
|
|
} // if applet ptr
|
|
|
|
::LeaveCriticalSection(&g_csWorkThread);
|
|
|
|
// wait for the worker thread's going down
|
|
DWORD dwRet = ::WaitForSingleObject(g_hWorkThread, dwTimeout);
|
|
|
|
return APPLDR_NO_ERROR;
|
|
}
|
|
|
|
|
|
APPLDR_RESULT CFtLoader::AppletQuery(APPLET_QUERY_ID eQueryId)
|
|
{
|
|
::EnterCriticalSection(&g_csWorkThread);
|
|
if (NULL != g_pFileXferApplet)
|
|
{
|
|
switch (eQueryId)
|
|
{
|
|
case APPLET_QUERY_SHUTDOWN:
|
|
// Don't really shuts down
|
|
if (! g_pFileXferApplet->QueryShutdown(FALSE))
|
|
{
|
|
::LeaveCriticalSection(&g_csWorkThread);
|
|
return APPLDR_CANCEL_EXIT;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
::LeaveCriticalSection(&g_csWorkThread);
|
|
|
|
return APPLDR_NO_ERROR;
|
|
}
|
|
|
|
APPLDR_RESULT CFtLoader::OnNM2xNodeJoin(void)
|
|
{
|
|
// Do nothing here
|
|
return APPLDR_NO_ERROR;
|
|
}
|
|
|
|
APPLDR_RESULT CFtLoader::AppletInvoke
|
|
(
|
|
BOOL fLocal,
|
|
T120ConfID nConfID,
|
|
LPSTR pszCmdLine
|
|
)
|
|
{
|
|
// fLocal == TRUE ==> local invoke
|
|
if (fLocal && g_pFileXferApplet) // Only bring UI to front for local invoke
|
|
{
|
|
::PostMessage(g_pFileXferApplet->GetHiddenWnd(), WM_BRING_TO_FRONT, 0, 0);
|
|
}
|
|
return APPLDR_NO_ERROR;
|
|
}
|
|
|
|
|
|
void CFtLoader::ReleaseInterface(void)
|
|
{
|
|
Release();
|
|
}
|
|
|
|
|