mirror of
https://github.com/nextcloud/desktop.git
synced 2024-12-17 11:21:51 +03:00
4b001a77b3
Squashed commit of the following: commit 4d9b072f560fa171a1390b7c74425614aa20e955 Author: Olivier Goffart <ogoffart@woboq.com> Date: Tue Oct 14 16:04:02 2014 +0200 Remove useless variable commit 8e85de0307ec5f31bf3f92a7de793fed7d41c2ea Author: Daniel Molkentin <danimo@owncloud.com> Date: Tue Oct 14 16:01:52 2014 +0200 Make Windows Explorer Extension build commit 8e2942cd9fd32e3af72d60cba0d06bd9d6222a45 Author: Daniel Molkentin <danimo@owncloud.com> Date: Tue Oct 14 11:39:37 2014 +0200 Fix compilation commit 0fc0c0e0e0c7e58ad97f62700256c7d1f8c0670b Author: Olivier Goffart <ogoffart@woboq.com> Date: Tue Oct 14 11:48:32 2014 +0200 Windows Shell Integration: Try to let the thread notify about changes when there are changes commit 4a1712b7c03269ca3007f167b8f313ea47655967 Author: Olivier Goffart <ogoffart@woboq.com> Date: Tue Oct 14 11:35:20 2014 +0200 Windows Shell Integration: Share the RemotePathChecker amongst all the OCOverlay instances commit 2d87408e9af5a4d7ab71c460ce606ba1f367c09f Author: Olivier Goffart <ogoffart@woboq.com> Date: Mon Oct 13 18:55:15 2014 +0200 Windows Shell Integration: Attempts to wait on multiple objects (WIP) commit e448e427b6d1561ad7a40d08fc6632f4d2b4ef44 Author: Daniel Molkentin <danimo@owncloud.com> Date: Mon Oct 13 17:58:02 2014 +0200 Introduce a worker thread commit 2344407ec0bc1ce173ebbacadcf3992d62d94078 Author: Olivier Goffart <ogoffart@woboq.com> Date: Mon Oct 13 17:03:47 2014 +0200 Windows Shell Integration: try to keep the socket open using a thread (WIP) commit ea6d5273ed60d8bc3f1c5d5c6936364d783a1c0f Author: Daniel Molkentin <danimo@owncloud.com> Date: Mon Oct 13 15:27:46 2014 +0200 Make Explorer plugin work again with named pipes This is a temporary hack, which needs more refactoring. commit 44a3437a44082379efa0078c9afd7b8bbde930de Author: Daniel Molkentin <danimo@owncloud.com> Date: Sat Oct 11 07:31:24 2014 +0200 Fix code commit 123390a0f3516c0078309d7048c6d2acb9293676 Author: Olivier Goffart <ogoffart@woboq.com> Date: Fri Oct 10 16:29:35 2014 +0200 Windows shell integration: Use named pipe (WIP) commit 9eea7e2321abeac6b8db0bd85bfce612dbf6bb20 Author: Olivier Goffart <ogoffart@woboq.com> Date: Wed Oct 1 12:04:13 2014 +0200 Windows Shell Integration: Simplify StringUtil This fixes a memory leak in CommunicationSocket::ReadLine
123 lines
3 KiB
C++
123 lines
3 KiB
C++
/**
|
|
* Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
|
|
*
|
|
* This library is free software; you can redistribute it and/or modify it under
|
|
* the terms of the GNU Lesser General Public License as published by the Free
|
|
* Software Foundation; either version 2.1 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*/
|
|
|
|
#include "CommunicationSocket.h"
|
|
#include "UtilConstants.h"
|
|
#include "StringUtil.h"
|
|
|
|
#include <WinSock2.h>
|
|
#include <Ws2def.h>
|
|
#include <windows.h>
|
|
#include <iostream>
|
|
#include <vector>
|
|
#include <array>
|
|
|
|
#include <fstream>
|
|
|
|
#define BUFSIZE 1024
|
|
|
|
using namespace std;
|
|
|
|
#define DEFAULT_BUFLEN 4096
|
|
|
|
CommunicationSocket::CommunicationSocket()
|
|
: _pipe(INVALID_HANDLE_VALUE)
|
|
{
|
|
}
|
|
|
|
CommunicationSocket::~CommunicationSocket()
|
|
{
|
|
Close();
|
|
}
|
|
|
|
bool CommunicationSocket::Close()
|
|
{
|
|
WSACleanup();
|
|
if (_pipe == INVALID_HANDLE_VALUE) {
|
|
return false;
|
|
}
|
|
CloseHandle(_pipe);
|
|
_pipe = INVALID_HANDLE_VALUE;
|
|
return true;
|
|
}
|
|
|
|
|
|
bool CommunicationSocket::Connect()
|
|
{
|
|
auto pipename = std::wstring(L"\\\\.\\pipe\\");
|
|
pipename += L"ownCloud";
|
|
|
|
_pipe = CreateFile(pipename.data(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
|
|
|
|
if (_pipe == INVALID_HANDLE_VALUE) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool CommunicationSocket::SendMsg(const wchar_t* message)
|
|
{
|
|
auto utf8_msg = StringUtil::toUtf8(message);
|
|
|
|
DWORD numBytesWritten = 0;
|
|
auto result = WriteFile( _pipe, utf8_msg.c_str(), DWORD(utf8_msg.size()), &numBytesWritten, NULL);
|
|
|
|
if (result) {
|
|
return true;
|
|
} else {
|
|
// qWarning() << "Failed to send data." <<;
|
|
// look up error code here using GetLastError()
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool CommunicationSocket::ReadLine(wstring* response)
|
|
{
|
|
if (!response) {
|
|
return false;
|
|
}
|
|
|
|
response->clear();
|
|
|
|
Sleep(50);
|
|
|
|
while (true) {
|
|
int lbPos = 0;
|
|
auto it = std::find(_buffer.begin() + lbPos, _buffer.end(), '\n');
|
|
if (it != _buffer.end()) {
|
|
*response = StringUtil::toUtf16(_buffer.data(), DWORD(it - _buffer.begin()));
|
|
_buffer.erase(_buffer.begin(), it + 1);
|
|
return true;
|
|
}
|
|
|
|
std::array<char, 128> resp_utf8;
|
|
DWORD numBytesRead = 0;
|
|
DWORD totalBytesAvailable = 0;
|
|
PeekNamedPipe(_pipe, NULL, 0, 0, &totalBytesAvailable, 0);
|
|
if (totalBytesAvailable == 0) {
|
|
return false;
|
|
}
|
|
|
|
auto result = ReadFile(_pipe, resp_utf8.data(), DWORD(resp_utf8.size()), &numBytesRead, NULL);
|
|
if (!result) {
|
|
// qWarning() << "Failed to read data from the pipe";
|
|
return false;
|
|
}
|
|
if (numBytesRead <= 0) {
|
|
return false;
|
|
}
|
|
_buffer.insert(_buffer.end(), resp_utf8.begin(), resp_utf8.begin()+numBytesRead);
|
|
continue;
|
|
}
|
|
}
|