Missed the pipe-files in -r465
This commit is contained in:
parent
cbf50dd00c
commit
d7358c528e
2 changed files with 164 additions and 0 deletions
30
telldus-core/telldus-service/service/Pipe.h
Normal file
30
telldus-core/telldus-service/service/Pipe.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#ifndef PIPE_H
|
||||||
|
#define PIPE_H
|
||||||
|
|
||||||
|
#include <QThread>
|
||||||
|
class PipePrivate;
|
||||||
|
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
#include <windows.h>
|
||||||
|
typedef HANDLE SOCKET_T;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class Pipe : public QThread {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
Pipe(QObject *parent = 0);
|
||||||
|
~Pipe(void);
|
||||||
|
|
||||||
|
void listen(const QString &name);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void newConnection(SOCKET_T socket);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void run();
|
||||||
|
|
||||||
|
private:
|
||||||
|
PipePrivate *d;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //PIPE_H
|
134
telldus-core/telldus-service/service/Pipe_win.cpp
Normal file
134
telldus-core/telldus-service/service/Pipe_win.cpp
Normal file
|
@ -0,0 +1,134 @@
|
||||||
|
#include "Pipe.h"
|
||||||
|
#include "TelldusCore.h"
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <AccCtrl.h>
|
||||||
|
#include <Aclapi.h>
|
||||||
|
|
||||||
|
//using namespace TelldusService;
|
||||||
|
#define BUFSIZE 512
|
||||||
|
|
||||||
|
|
||||||
|
class PipePrivate {
|
||||||
|
public:
|
||||||
|
QString name;
|
||||||
|
HANDLE hPipe;
|
||||||
|
bool closing;
|
||||||
|
};
|
||||||
|
|
||||||
|
Pipe::Pipe(QObject *parent)
|
||||||
|
:QThread(parent)
|
||||||
|
{
|
||||||
|
d = new PipePrivate;
|
||||||
|
d->hPipe = INVALID_HANDLE_VALUE;
|
||||||
|
d->closing = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Pipe::~Pipe(void) {
|
||||||
|
TelldusCore::logMessage(QString("Stopping pipe %1").arg(d->name));
|
||||||
|
d->closing = true;
|
||||||
|
if (d->hPipe != INVALID_HANDLE_VALUE) {
|
||||||
|
TelldusCore::logMessage("Pipe is connected, try to close it");
|
||||||
|
HANDLE hPipe = CreateFile(
|
||||||
|
(const wchar_t *)d->name.utf16(),
|
||||||
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
|
0, NULL, OPEN_EXISTING, 0, NULL);
|
||||||
|
TelldusCore::logMessage("New file created");
|
||||||
|
if (hPipe != INVALID_HANDLE_VALUE) {
|
||||||
|
TelldusCore::logMessage("Close it");
|
||||||
|
CloseHandle(hPipe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TelldusCore::logMessage("Waiting for thread to close");
|
||||||
|
this->wait();
|
||||||
|
delete d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Pipe::listen(const QString &name) {
|
||||||
|
d->name = QString("\\\\.\\pipe\\%1").arg(name);
|
||||||
|
this->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Pipe::run() {
|
||||||
|
SECURITY_ATTRIBUTES sa;
|
||||||
|
PSECURITY_DESCRIPTOR pSD = NULL;
|
||||||
|
PACL pACL = NULL;
|
||||||
|
EXPLICIT_ACCESS ea;
|
||||||
|
PSID pEveryoneSID = NULL;
|
||||||
|
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
|
||||||
|
|
||||||
|
|
||||||
|
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
|
||||||
|
if (pSD == NULL) {
|
||||||
|
TelldusCore::logMessage("LocalAlloc Error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) {
|
||||||
|
TelldusCore::logMessage("InitializeSecurityDescriptor Error");
|
||||||
|
LocalFree(pSD);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pEveryoneSID)) {
|
||||||
|
TelldusCore::logMessage("AllocateAndInitializeSid Error");
|
||||||
|
LocalFree(pSD);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
|
||||||
|
ea.grfAccessPermissions = STANDARD_RIGHTS_ALL;
|
||||||
|
ea.grfAccessMode = SET_ACCESS;
|
||||||
|
ea.grfInheritance= NO_INHERITANCE;
|
||||||
|
ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
|
||||||
|
ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
|
||||||
|
ea.Trustee.ptstrName = (LPTSTR) pEveryoneSID;
|
||||||
|
|
||||||
|
|
||||||
|
// Add the ACL to the security descriptor.
|
||||||
|
if (!SetSecurityDescriptorDacl(pSD,
|
||||||
|
TRUE, // bDaclPresent flag
|
||||||
|
pACL,
|
||||||
|
FALSE)) // not a default DACL
|
||||||
|
{
|
||||||
|
TelldusCore::logMessage("SetSecurityDescriptorDacl Error");
|
||||||
|
LocalFree(pSD);
|
||||||
|
FreeSid(pEveryoneSID);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
|
||||||
|
sa.lpSecurityDescriptor = pSD;
|
||||||
|
sa.bInheritHandle = false;
|
||||||
|
|
||||||
|
while(!d->closing) {
|
||||||
|
TelldusCore::logMessage(QString("Starting listening in pipe %1").arg(d->name));
|
||||||
|
d->hPipe = CreateNamedPipe(
|
||||||
|
(const wchar_t *)d->name.utf16(), // pipe name
|
||||||
|
PIPE_ACCESS_DUPLEX, // read/write access
|
||||||
|
PIPE_TYPE_MESSAGE | // message type pipe
|
||||||
|
PIPE_READMODE_MESSAGE | // message-read mode
|
||||||
|
PIPE_WAIT, // blocking mode
|
||||||
|
PIPE_UNLIMITED_INSTANCES, // max. instances
|
||||||
|
BUFSIZE, // output buffer size
|
||||||
|
BUFSIZE, // input buffer size
|
||||||
|
0, // client time-out
|
||||||
|
&sa); // default security attribute
|
||||||
|
|
||||||
|
if (d->hPipe == INVALID_HANDLE_VALUE) {
|
||||||
|
TelldusCore::logMessage("Could not create named pipe");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool connected = ConnectNamedPipe(d->hPipe, NULL);
|
||||||
|
if (d->closing || !connected) {
|
||||||
|
CloseHandle(d->hPipe);
|
||||||
|
TelldusCore::logMessage("Closing or no connection, restart");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
TelldusCore::logMessage("Connected");
|
||||||
|
emit newConnection(d->hPipe);
|
||||||
|
}
|
||||||
|
LocalFree(pSD);
|
||||||
|
FreeSid(pEveryoneSID);
|
||||||
|
LocalFree(pACL);
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue