diff -r fb0e02cb252b -r c7f22cc57d44 connectivity/com.nokia.tcf/native/TCFNative/TCFClient/ClientManager.cpp --- a/connectivity/com.nokia.tcf/native/TCFNative/TCFClient/ClientManager.cpp Wed Jun 16 11:39:35 2010 -0500 +++ b/connectivity/com.nokia.tcf/native/TCFNative/TCFClient/ClientManager.cpp Wed Jun 16 17:27:41 2010 -0500 @@ -23,6 +23,9 @@ #include "TCErrorConstants.h" #include "resource.h" #include +#ifdef _PSAPI_PRESENT + #include +#endif #ifdef _DEBUG extern BOOL gDoLogging; @@ -201,6 +204,99 @@ m_DebugLog = NULL; } } + +#ifdef _PSAPI_PRESENT +void +CClientManager::FindOrCreateRunningServer() +{ + TCDEBUGOPEN(); + TCDEBUGLOGS("CClientManager::FindOrCreateRunningServer: searching for existing TCFServer.exe\n"); + + // Directory where TCFServer.exe lives + char exeDirectory[MAX_DLLPATHNAME] = {0}; + + BOOL foundRunningServer = FALSE; + + // Get the list of process identifiers. + + DWORD aProcesses[1024], cbNeeded, cProcesses; + unsigned int i; + + if ( EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) + { + // Calculate how many process identifiers were returned. + + cProcesses = cbNeeded / sizeof(DWORD); + + // Find existing TCFServer + for ( i = 0; i < cProcesses; i++ ) + { + if( aProcesses[i] != 0 ) + { + TCHAR szProcessName[MAX_PATH] = TEXT(""); + + // Get a handle to the process. + HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | + PROCESS_VM_READ, + FALSE, aProcesses[i] ); + + // Get the process name. + if (NULL != hProcess ) + { + HMODULE hMod; + DWORD cbNeeded; + + if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), + &cbNeeded) ) + { + if (GetModuleBaseNameA( hProcess, hMod, szProcessName, + sizeof(szProcessName)/sizeof(char) )) + { + if (strcmp(SERVER_PROCESS_NAME, szProcessName) == 0) + { + // get the full path + GetModuleFileNameExA(hProcess, hMod, exeDirectory, + sizeof(exeDirectory)/sizeof(char) ); + + TCDEBUGLOGA1("Found TCFServer at %s\n", exeDirectory); + CloseHandle( hProcess ); + foundRunningServer = TRUE; + break; + } + } + } + } + + CloseHandle( hProcess ); + } + } + } + + if (!foundRunningServer) + { + // start the one next to the DLL + strncpy(exeDirectory, m_DllLocation, strlen(m_DllLocation) + 1); + size_t len = strlen(exeDirectory); + // remove file + for (int i = len-1; i > 0; i--) + { + if (exeDirectory[i] == PATH_DELIMITER) + break; + } + exeDirectory[i] = NULL; + } + + m_ServerExeFile = new char[MAX_DLLPATHNAME]; + sprintf(m_ServerExeFile, "\"%s%c%s\"", exeDirectory, PATH_DELIMITER, SERVER_PROCESS_NAME); + + m_ServerLockFile = new char[MAX_DLLPATHNAME]; + sprintf(m_ServerLockFile, "%s%c%s", exeDirectory, PATH_DELIMITER, SERVER_LOCKFILE_NAME); + + TCDEBUGCLOSE(); + +} +#endif + CErrorMonitor* CClientManager::FindErrorMonitor(long inClientId) {