Добавлено: сохранение списка серверов
This commit is contained in:
parent
a36ac928a0
commit
f69847de79
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* address.c
|
||||
*
|
||||
* Created on: 15 июл. 2022 г.
|
||||
* Author: alexander
|
||||
*/
|
||||
|
||||
#include "address.h"
|
||||
|
||||
#include <netdb.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
char *getHostIP(char *dnsName)
|
||||
{
|
||||
char *result = NULL;
|
||||
struct hostent *he = gethostbyname(dnsName);
|
||||
if (he)
|
||||
{
|
||||
char *ip = inet_ntoa(*(struct in_addr*)he->h_addr);
|
||||
result = (char *)malloc(sizeof(char) * strlen(ip));
|
||||
strcpy(result, ip);
|
||||
}
|
||||
return result;
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
/*
|
||||
* address.h
|
||||
*
|
||||
* Created on: 15 июл. 2022 г.
|
||||
* Author: alexander
|
||||
*/
|
||||
|
||||
#ifndef ADDRESS_H_
|
||||
#define ADDRESS_H_
|
||||
|
||||
char *getHostIP(char *dnsName);
|
||||
|
||||
#endif /* ADDRESS_H_ */
|
|
@ -15,6 +15,7 @@
|
|||
|
||||
void settingsLoad()
|
||||
{
|
||||
dbGetHostsList();
|
||||
if (!dbLoadData())
|
||||
{
|
||||
addParameterKey(PARAMETER_XFREERDP, "xfreerdp", true, true, NULL, NULL);
|
||||
|
|
190
db.c
190
db.c
|
@ -63,6 +63,8 @@ static int dbLoad(void *NotUsed, int argc, char **argv, char **azColName)
|
|||
addParameterValue(atoi(parameters[0]), atoi(parameters[4]), parameters[5], atoi(parameters[6]));
|
||||
}
|
||||
|
||||
free(parameters);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -96,6 +98,75 @@ bool dbLoadData()
|
|||
return true;
|
||||
}
|
||||
|
||||
static int dbCreateHostsList(void *answer, int argc, char **argv, char **azColName)
|
||||
{
|
||||
Hosts *hosts = *(Hosts **)answer;
|
||||
Host *host = (Host*) malloc(sizeof(Host));
|
||||
host->data = (char **) malloc(sizeof(char*) * argc);
|
||||
host->size = argc;
|
||||
|
||||
for (int i = 0; i < argc; i++)
|
||||
{
|
||||
host->data[i] = (char *) malloc(sizeof(char) * strlen(argv[i]));
|
||||
strcpy(host->data[i], argv[i]);
|
||||
}
|
||||
|
||||
Host **tmp = hosts->host;
|
||||
hosts->host = (Host**) malloc(sizeof(Host*) * ++hosts->size);
|
||||
for (size_t i = 0; i < hosts->size - 1; ++i)
|
||||
{
|
||||
hosts->host[i] = tmp[i];
|
||||
}
|
||||
if (tmp)
|
||||
{
|
||||
free(tmp);
|
||||
}
|
||||
hosts->host[hosts->size - 1] = host;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Hosts *dbGetHostsList()
|
||||
{
|
||||
sqlite3 *db = dbGetBase("freerdp.db");
|
||||
if (!db)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
char *err_msg = 0;
|
||||
char *sql = "SELECT ROW_NUMBER () OVER (ORDER BY `hosts`.`ip`) `item`, `hosts`.`dns` as `dns`, `hosts`.`set` as `set` FROM `hosts` as `hosts`";
|
||||
|
||||
Hosts *hosts = (Hosts *) malloc(sizeof(Hosts));
|
||||
hosts->size = 0;
|
||||
hosts->host = NULL;
|
||||
|
||||
if (sqlite3_exec(db, sql, dbCreateHostsList, &hosts, &err_msg) != SQLITE_OK)
|
||||
{
|
||||
fprintf(stderr, "Ошибка выполнения запроса: %s\n", err_msg);
|
||||
sqlite3_free(err_msg);
|
||||
sqlite3_close(db);
|
||||
return false;
|
||||
}
|
||||
|
||||
sqlite3_close(db);
|
||||
|
||||
return hosts;
|
||||
}
|
||||
|
||||
void dbFreeHosts(Hosts *hosts)
|
||||
{
|
||||
for (size_t i = 0; i < hosts->size; ++i)
|
||||
{
|
||||
for (size_t j = 0; j < hosts->host[i]->size; ++j)
|
||||
{
|
||||
free(hosts->host[i]->data[j]);
|
||||
}
|
||||
free(hosts->host[i]);
|
||||
}
|
||||
free(hosts);
|
||||
}
|
||||
|
||||
bool dbWriteParameter(Parameter name, bool set)
|
||||
{
|
||||
sqlite3 *db = dbGetBase("freerdp.db");
|
||||
|
@ -169,7 +240,116 @@ bool dbWriteValue(Value name, bool set)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool dbSetValueCurrent(Value name, char *current)
|
||||
int dbAddServer(char *ip, char *dns)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
if (!(ip && strlen(ip) && dns && strlen(dns)))
|
||||
return -1;
|
||||
|
||||
sqlite3 *db = dbGetBase("freerdp.db");
|
||||
if (!db)
|
||||
{
|
||||
return -2;
|
||||
}
|
||||
|
||||
sqlite3_stmt *res;
|
||||
char *sql = "SELECT * FROM `hosts` WHERE `ip` = ?";
|
||||
if (sqlite3_prepare_v2(db, sql, -1, &res, 0) == SQLITE_OK)
|
||||
{
|
||||
sqlite3_bind_text(res, 1, ip, -1, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
sqlite3_finalize(res);
|
||||
sqlite3_close(db);
|
||||
return -3;
|
||||
}
|
||||
|
||||
if (sqlite3_step(res) == SQLITE_ROW)
|
||||
{
|
||||
int id = atoi((const char *)sqlite3_column_text(res, 0));
|
||||
sqlite3_finalize(res);
|
||||
|
||||
sql = "UPDATE `hosts` set `set` = 0";
|
||||
if (sqlite3_exec(db, sql, NULL, NULL, NULL) == SQLITE_OK)
|
||||
{
|
||||
sql = "UPDATE `hosts` set `dns` = ?, `set` = 1 where id = ?";
|
||||
|
||||
if (sqlite3_prepare_v2(db, sql, -1, &res, 0) == SQLITE_OK)
|
||||
{
|
||||
sqlite3_bind_text(res, 1, dns, -1, 0);
|
||||
sqlite3_bind_int(res, 2, id);
|
||||
}
|
||||
|
||||
if (sqlite3_step(res) == SQLITE_BUSY)
|
||||
{
|
||||
fprintf(stderr, "[ЗАНЯТО] %s - \"%s\"\n", dns ? "установлено" : "очищено", ip);
|
||||
result = 5;
|
||||
}
|
||||
if (sqlite3_step(res) == SQLITE_ERROR)
|
||||
{
|
||||
fprintf(stderr, "[ОШИБКА] %s - \"%s\"\n", dns ? "установлено" : "очищено", ip);
|
||||
result = 4;
|
||||
}
|
||||
if (sqlite3_step(res) == SQLITE_DONE)
|
||||
{
|
||||
fprintf(stdout, "[УСПЕШНО] %s - \"%s\"\n", dns ? "установлено" : "очищено", ip);
|
||||
result = 3;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
result = -5;
|
||||
}
|
||||
}
|
||||
else if(sqlite3_step(res) == SQLITE_DONE)
|
||||
{
|
||||
sqlite3_finalize(res);
|
||||
|
||||
sql = "UPDATE `hosts` set `set` = 0";
|
||||
if (sqlite3_exec(db, sql, NULL, NULL, NULL) == SQLITE_OK)
|
||||
{
|
||||
sql = "INSERT INTO `hosts` (`ip`, `dns`, `set`) VALUES (?, ?, 1)";
|
||||
if (sqlite3_prepare_v2(db, sql, -1, &res, 0) == SQLITE_OK)
|
||||
{
|
||||
sqlite3_bind_text(res, 1, ip, -1, 0);
|
||||
sqlite3_bind_text(res, 2, dns, -1, 0);
|
||||
}
|
||||
|
||||
if (sqlite3_step(res) == SQLITE_BUSY)
|
||||
{
|
||||
fprintf(stderr, "[ЗАНЯТО] %s - \"%s\"\n", dns ? "установлено" : "очищено", ip);
|
||||
result = 2;
|
||||
}
|
||||
if (sqlite3_step(res) == SQLITE_ERROR)
|
||||
{
|
||||
fprintf(stderr, "[ОШИБКА] %s - \"%s\"\n", dns ? "установлено" : "очищено", ip);
|
||||
result = 1;
|
||||
}
|
||||
if (sqlite3_step(res) == SQLITE_DONE)
|
||||
{
|
||||
fprintf(stdout, "[УСПЕШНО] %s - \"%s\"\n", dns ? "установлено" : "очищено", ip);
|
||||
result = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
result = -6;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
result = -4;
|
||||
}
|
||||
|
||||
sqlite3_finalize(res);
|
||||
sqlite3_close(db);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool dbSetUserNameCurrent(char *current)
|
||||
{
|
||||
sqlite3 *db = dbGetBase("freerdp.db");
|
||||
if (!db)
|
||||
|
@ -185,21 +365,21 @@ bool dbSetValueCurrent(Value name, char *current)
|
|||
{
|
||||
sqlite3_bind_text(res, 1, text, -1, 0);
|
||||
sqlite3_bind_int(res, 2, text ? true : false);
|
||||
sqlite3_bind_int(res, 3, name);
|
||||
sqlite3_bind_int(res, 3, VALUE_USERNAME);
|
||||
}
|
||||
|
||||
|
||||
if (sqlite3_step(res) == SQLITE_BUSY)
|
||||
{
|
||||
fprintf(stderr, "[ЗАНЯТО] %s - \"%s\"\n", text ? "установлено" : "очищено", getParameter(name)->key);
|
||||
fprintf(stderr, "[ЗАНЯТО] %s - \"%s\"\n", text ? "установлено" : "очищено", getParameter(VALUE_USERNAME)->key);
|
||||
}
|
||||
if (sqlite3_step(res) == SQLITE_ERROR)
|
||||
{
|
||||
fprintf(stderr, "[ОШИБКА] %s - \"%s\"\n", text ? "установлено" : "очищено", getParameter(name)->key);
|
||||
fprintf(stderr, "[ОШИБКА] %s - \"%s\"\n", text ? "установлено" : "очищено", getParameter(VALUE_USERNAME)->key);
|
||||
}
|
||||
if (sqlite3_step(res) == SQLITE_DONE)
|
||||
{
|
||||
fprintf(stdout, "[УСПЕШНО] %s - \"%s\"\n", text ? "установлено" : "очищено", getParameter(name)->key);
|
||||
fprintf(stdout, "[УСПЕШНО] %s - \"%s\"\n", text ? "установлено" : "очищено", getParameter(VALUE_USERNAME)->key);
|
||||
}
|
||||
|
||||
sqlite3_finalize(res);
|
||||
|
|
17
db.h
17
db.h
|
@ -11,9 +11,24 @@
|
|||
#include "parameter.h"
|
||||
#include "value.h"
|
||||
|
||||
typedef struct Host
|
||||
{
|
||||
char **data;
|
||||
size_t size;
|
||||
} Host;
|
||||
|
||||
typedef struct Hosts
|
||||
{
|
||||
Host **host;
|
||||
size_t size;
|
||||
} Hosts;
|
||||
|
||||
bool dbLoadData();
|
||||
Hosts *dbGetHostsList();
|
||||
void dbFreeHosts(Hosts *hosts);
|
||||
bool dbWriteParameter(Parameter name, bool set);
|
||||
bool dbWriteValue(Value name, bool set);
|
||||
bool dbSetValueCurrent(Value name, char *current);
|
||||
bool dbSetUserNameCurrent(char *current);
|
||||
int dbAddServer(char *ip, char *dns);
|
||||
|
||||
#endif /* DB_H_ */
|
||||
|
|
BIN
freerdp.db
BIN
freerdp.db
Binary file not shown.
53
gui.c
53
gui.c
|
@ -14,6 +14,7 @@
|
|||
#include "node_settings.h"
|
||||
#include "images.h"
|
||||
#include "arguments.h"
|
||||
#include "address.h"
|
||||
|
||||
#include "db.h"
|
||||
|
||||
|
@ -24,10 +25,13 @@ static int guiExit(Ihandle *self)
|
|||
|
||||
static int guiConnect(Ihandle *self)
|
||||
{
|
||||
setParameterValue(PARAMETER_SERVER, VALUE_SERVER, IupGetAttribute(IupGetDialogChild(self, "SERVER"), "LINEVALUE"));
|
||||
dbSetValueCurrent(VALUE_SERVER, IupGetAttribute(IupGetDialogChild(self, "SERVER"), "LINEVALUE"));
|
||||
char *result = getHostIP(IupGetAttribute(IupGetDialogChild(self, "SERVER"), "VALUE"));
|
||||
|
||||
if (!result)
|
||||
return IUP_DEFAULT;
|
||||
|
||||
setParameterValue(PARAMETER_SERVER, VALUE_SERVER, result);
|
||||
setParameterValue(PARAMETER_USERNAME, VALUE_USERNAME, IupGetAttribute(IupGetDialogChild(self, "USER"), "LINEVALUE"));
|
||||
dbSetValueCurrent(VALUE_USERNAME, IupGetAttribute(IupGetDialogChild(self, "USER"), "LINEVALUE"));
|
||||
setParameterValue(PARAMETER_PASSWORD, VALUE_PASSWORD, IupGetAttribute(IupGetDialogChild(self, "PASSWORD"), "LINEVALUE"));
|
||||
|
||||
Arguments args;
|
||||
|
@ -39,9 +43,40 @@ static int guiConnect(Ihandle *self)
|
|||
printf("\n");
|
||||
freeArguments(&args);
|
||||
|
||||
if (!dbAddServer(result, IupGetAttribute(IupGetDialogChild(self, "SERVER"), "VALUE")))
|
||||
{
|
||||
IupSetAttribute(IupGetDialogChild(self, "SERVER"), "APPENDITEM", IupGetAttribute(IupGetDialogChild(self, "SERVER"), "VALUE"));
|
||||
}
|
||||
// if (free_rdp_connect(args.argc, args.argv) != XF_EXIT_DNS_NAME_NOT_FOUND)
|
||||
// {
|
||||
// dbSetValueCurrent(VALUE_SERVER, IupGetAttribute(IupGetDialogChild(self, "SERVER"), "LINEVALUE"));
|
||||
dbSetUserNameCurrent(IupGetAttribute(IupGetDialogChild(self, "USER"), "LINEVALUE"));
|
||||
// }
|
||||
|
||||
return IUP_DEFAULT;
|
||||
}
|
||||
|
||||
static void createHostsList(Ihandle *iupList)
|
||||
{
|
||||
Hosts *hosts = dbGetHostsList();
|
||||
char *indexItem = NULL;
|
||||
char *serverName = NULL;
|
||||
|
||||
for (size_t i = 0; i < hosts->size; ++i)
|
||||
{
|
||||
Host *host = hosts->host[i];
|
||||
indexItem = (char *)malloc(sizeof(char) * strlen(host->data[0]));
|
||||
strcpy(indexItem, host->data[0]);
|
||||
serverName = (char *)malloc(sizeof(char) * strlen(host->data[1]));
|
||||
strcpy(serverName, host->data[1]);
|
||||
|
||||
IupSetAttribute(iupList, indexItem, serverName);
|
||||
if (atoi(host->data[2]))
|
||||
IupSetAttribute(iupList, "VALUE", serverName);
|
||||
}
|
||||
dbFreeHosts(hosts);
|
||||
}
|
||||
|
||||
Ihandle* guiStart()
|
||||
{
|
||||
Ihandle *dlg;
|
||||
|
@ -63,16 +98,16 @@ Ihandle* guiStart()
|
|||
|
||||
labelServer = IupLabel("Компьютер:");
|
||||
IupSetAttribute(labelServer, "SIZE", "80x16");
|
||||
// IupSetAttribute(labelServer, "FONT", "Helvetica, 14");
|
||||
IupSetAttribute(labelServer, "ALIGNMENT", "ARIGHT:ACENTER");
|
||||
IupSetAttribute(labelServer, "PADDING", "5");
|
||||
inputServer = IupText(NULL);
|
||||
|
||||
inputServer = IupList(NULL);
|
||||
IupSetAttribute(inputServer, "NAME", "SERVER");
|
||||
IupSetAttribute(inputServer, "TIP", "IP-адрес или имя удаленного сервера (обязательно)");
|
||||
IupSetAttribute(inputServer, "VALUE", getSetValueCurrent(PARAMETER_SERVER));
|
||||
// IupSetAttribute(inputServer, "BORDER", "NO");
|
||||
createHostsList(inputServer);
|
||||
IupSetAttribute(inputServer, "SIZE", "100");
|
||||
// IupSetAttribute(inputServer, "PADDING", "10x");
|
||||
IupSetAttribute(inputServer, "EDITBOX", "YES");
|
||||
IupSetAttribute(inputServer, "DROPDOWN", "YES");
|
||||
hBoxServer = IupHbox(labelServer, inputServer, NULL);
|
||||
IupSetAttribute(hBoxServer, "MARGIN", "10x10");
|
||||
|
||||
|
@ -85,7 +120,6 @@ Ihandle* guiStart()
|
|||
IupSetAttribute(inputUser, "TIP", "<домен>\\<имя пользователя> (обязательно)");
|
||||
IupSetAttribute(inputUser, "VALUE", getSetValueCurrent(PARAMETER_USERNAME));
|
||||
IupSetAttribute(inputUser, "SIZE", "100");
|
||||
// IupSetAttribute(inputUser, "PADDING", "10x10");
|
||||
hBoxUser = IupHbox(labelUser, inputUser, NULL);
|
||||
IupSetAttribute(hBoxUser, "MARGIN", "10x0");
|
||||
|
||||
|
@ -95,7 +129,6 @@ Ihandle* guiStart()
|
|||
IupSetAttribute(labelPassword, "PADDING", "5");
|
||||
inputPassword = IupText(NULL);
|
||||
IupSetAttribute(inputPassword, "SIZE", "100");
|
||||
// IupSetAttribute(inputPassword, "PADDING", "10x10");
|
||||
IupSetAttribute(inputPassword, "NAME", "PASSWORD");
|
||||
IupSetAttribute(inputPassword, "TIP", "Пароль пользователя (необязательно)");
|
||||
IupSetAttribute(inputPassword, "VALUE", getSetValueCurrent(PARAMETER_PASSWORD));
|
||||
|
|
Loading…
Reference in New Issue