diff --git a/src/lib/server/CServer.cpp b/src/lib/server/CServer.cpp index 6bb8845e..ab87fac9 100644 --- a/src/lib/server/CServer.cpp +++ b/src/lib/server/CServer.cpp @@ -1669,10 +1669,10 @@ CServer::onMouseUp(ButtonID id) } if (m_enableDragDrop && !m_screen->isOnScreen()) { - CString& dir = m_screen->getDraggingFilename(); - if (!dir.empty()) { - LOG((CLOG_DEBUG "send file to client: %s", dir.c_str())); - sendFileToClient(dir.c_str()); + CString& file = m_screen->getDraggingFilename(); + if (!file.empty()) { + LOG((CLOG_DEBUG "send file to client: %s", file.c_str())); + sendFileToClient(file.c_str()); } } } diff --git a/src/lib/synwinxt/CDataHandlerExtension.cpp b/src/lib/synwinxt/CDataHandlerExtension.cpp index 57ce01ff..e26dcbf1 100644 --- a/src/lib/synwinxt/CDataHandlerExtension.cpp +++ b/src/lib/synwinxt/CDataHandlerExtension.cpp @@ -85,11 +85,9 @@ CDataHandlerExtension::Release() HRESULT STDMETHODCALLTYPE CDataHandlerExtension::Load(__RPC__in LPCOLESTR pszFileName, DWORD dwMode) { - outputDebugStringF("synwinxt: > CDataHandlerExtension::Load\n"); - + outputDebugStringF("synwinxt: > CDataHandlerExtension::Load\n"); std::string fileName = _bstr_t(pszFileName); setDraggingFilename(fileName.c_str()); - outputDebugStringF("synwinxt: < CDataHandlerExtension::Load\n"); return S_OK; } diff --git a/src/lib/synwinxt/synwinxt.cpp b/src/lib/synwinxt/synwinxt.cpp index 8cea1974..87eb4a5a 100644 --- a/src/lib/synwinxt/synwinxt.cpp +++ b/src/lib/synwinxt/synwinxt.cpp @@ -281,11 +281,37 @@ unregisterShellExtDataHandler(CHAR* fileType, const CLSID& clsid) return hr; } +std::string +getFileExt(const char* filenameCStr) +{ + std::string filename = filenameCStr; + size_t findExt = filename.find_last_of(".", filename.size()); + if (findExt != std::string::npos) { + return filename.substr(findExt + 1, filename.size() - findExt - 1); + } + return ""; +} + void setDraggingFilename(const char* filename) { outputDebugStringF("synwinxt: > setDraggingFilename, filename=%s\n", filename); - memcpy(g_draggingFilename, filename, MAX_PATH); + + // HACK: only handle files that are not .exe or .lnk + // dragging anything, including a selection marquee, from a program + // (e.g. explorer.exe) will cause this function to be called with the + // path of that program. currently we don't know how to test for this + // situation, so just ignore exe and lnk files. + std::string ext = getFileExt(filename); + if ((ext != "exe") && (ext != "lnk")) { + memcpy(g_draggingFilename, filename, MAX_PATH); + } + else { + outputDebugStringF( + "synwinxt: ignoring filename=%s, ext=%s\n", + filename, ext.c_str()); + } + outputDebugStringF("synwinxt: < setDraggingFilename, g_draggingFilename=%s\n", g_draggingFilename); } @@ -294,5 +320,10 @@ getDraggingFilename(char* filename) { outputDebugStringF("synwinxt: > getDraggingFilename\n"); memcpy(filename, g_draggingFilename, MAX_PATH); + + // mark string as empty once used, so we can't accidentally copy + // the same file more than once unless the user does this on purpose. + g_draggingFilename[0] = NULL; + outputDebugStringF("synwinxt: < getDraggingFilename, filename=%s\n", filename); }