Merge branch 'settings'

* settings:
  Get/display a single preference
  Lighter msg for loading prefs, json will anyway always tell the filename
  Make sure colors and emoji are disabled when not on TTY
  Comment out file path code
  Pre Filepath cleanup
  Update preferences.c
  tuning
  streamline works
  Update fileutils.c
  updates
  clean up
  device debug and tweaks
This commit is contained in:
Philippe Teuwen
2020-04-26 11:16:29 +02:00
7 changed files with 615 additions and 124 deletions
+82 -1
View File
@@ -49,6 +49,7 @@
#include "util.h"
#ifdef _WIN32
#include "scandir.h"
#include <direct.h>
#endif
#define PATH_MAX_LENGTH 200
@@ -130,7 +131,87 @@ static bool is_directory(const char *filename) {
return S_ISDIR(st.st_mode) != 0;
}
/**
* @brief create a new directory.
* @param dirname
* @return
*/
// Not used...
/*
#ifdef _WIN32
#define make_dir(a) _mkdir(a)
#else
#define make_dir(a) mkdir(a,0755) //note 0755 MUST have leading 0 for octal linux file permissions
#endif
bool create_path(const char *dirname) {
if (dirname == NULL) // nothing to do
return false;
if ((strlen(dirname) == 1) && (dirname[0] == '/'))
return true;
if ((strlen(dirname) == 2) && (dirname[1] == ':'))
return true;
if (fileExists(dirname) == 0) {
char *bs = strrchr(dirname, '\\');
char *fs = strrchr(dirname, '/');
if ((bs == NULL) && (fs != NULL)) {
*fs = 0x00;
create_path (dirname);
*fs = '/';
}
if ((bs != NULL) && (fs == NULL)) {
*bs = 0x00;
create_path (dirname);
*bs = '\\';
}
if ((bs != NULL) && (fs != NULL)) {
if (strlen (bs) > strlen (fs)) {
*fs = 0x00; // No slash
create_path (dirname);
*fs = '/';
} else {
*bs = 0x00;
create_path (dirname);
*bs = '\\';
}
}
if (make_dir(dirname) != 0) {
PrintAndLogEx(ERR, "could not create directory.... "_RED_("%s"),dirname);
return false;
}
}
return true;
}
*/
/*
bool setDefaultPath (savePaths_t pathIndex,const char *Path) {
if (pathIndex < spItemCount) {
if ((Path == NULL) && (session.defaultPaths[pathIndex] != NULL)) {
free (session.defaultPaths[pathIndex]);
session.defaultPaths[pathIndex] = NULL;
}
if (Path != NULL) {
session.defaultPaths[pathIndex] = (char *)realloc(session.defaultPaths[pathIndex], strlen(Path) + 1);
strcpy(session.defaultPaths[pathIndex], Path);
}
} else {
return false;
}
return true;
}
*/
static char *filenamemcopy(const char *preferredName, const char *suffix) {
if (preferredName == NULL) return NULL;
if (suffix == NULL) return NULL;
@@ -905,10 +986,10 @@ int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_
}
*datalen = sptr;
}
PrintAndLogEx(SUCCESS, "loaded from JSON file " _YELLOW_("%s"), fileName);
if (!strcmp(ctype, "settings")) {
preferences_load_callback(root);
}
PrintAndLogEx(SUCCESS, "loaded from JSON file " _YELLOW_("%s"), fileName);
out:
json_decref(root);
free(fileName);
+3
View File
@@ -74,6 +74,9 @@ typedef enum {
} DumpFileType_t;
int fileExists(const char *filename);
//bool create_path(const char *dirname);
//bool setDefaultPath (savePaths_t pathIndex,const char *Path); // set a path in the path list session.defaultPaths
/**
* @brief Utility function to save data to a binary file. This method takes a preferred name, but if that
+455 -96
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -9,6 +9,7 @@
#define PREFERENCES_H_
#include "fileutils.h"
#include <errno.h>
// Current working directory will be prepended.
#define preferencesFilename "preferences.json"
+11 -11
View File
@@ -139,21 +139,21 @@ ProxGuiQT::~ProxGuiQT(void) {
SliderWidget::SliderWidget() {
// Set the initail postion and size from settings
if (session.preferences_loaded)
setGeometry(session.window_overlay_xpos, session.window_overlay_ypos, session.window_overlay_wsize, session.window_overlay_hsize);
setGeometry(session.overlay.x, session.overlay.y, session.overlay.w, session.overlay.h);
else
resize(800, 400);
}
void SliderWidget::resizeEvent(QResizeEvent *event) {
session.window_overlay_hsize = event->size().height();
session.window_overlay_wsize = event->size().width();
session.overlay.h = event->size().height();
session.overlay.w = event->size().width();
session.window_changed = true;
}
void SliderWidget::moveEvent(QMoveEvent *event) {
session.window_overlay_xpos = event->pos().x();
session.window_overlay_ypos = event->pos().y();
session.overlay.x = event->pos().x();
session.overlay.y = event->pos().y();
session.window_changed = true;
}
@@ -199,7 +199,7 @@ ProxWidget::ProxWidget(QWidget *parent, ProxGuiQT *master) : QWidget(parent) {
this->master = master;
// Set the initail postion and size from settings
if (session.preferences_loaded)
setGeometry(session.window_plot_xpos, session.window_plot_ypos, session.window_plot_wsize, session.window_plot_hsize);
setGeometry(session.plot.x, session.plot.y, session.plot.w, session.plot.h);
else
resize(800, 400);
@@ -224,7 +224,7 @@ ProxWidget::ProxWidget(QWidget *parent, ProxGuiQT *master) : QWidget(parent) {
QObject::connect(opsController->horizontalSlider_dirthr_down, SIGNAL(valueChanged(int)), this, SLOT(vchange_dthr_down(int)));
QObject::connect(opsController->horizontalSlider_askedge, SIGNAL(valueChanged(int)), this, SLOT(vchange_askedge(int)));
controlWidget->setGeometry(session.window_overlay_xpos, session.window_overlay_ypos, session.window_overlay_wsize, session.window_overlay_hsize);
controlWidget->setGeometry(session.overlay.x, session.overlay.y, session.overlay.w, session.overlay.h);
// Set up the plot widget, which does the actual plotting
plot = new Plot(this);
@@ -292,13 +292,13 @@ void ProxWidget::showEvent(QShowEvent *event) {
plot->show();
}
void ProxWidget::moveEvent(QMoveEvent *event) {
session.window_plot_xpos = event->pos().x();
session.window_plot_ypos = event->pos().y();
session.plot.x = event->pos().x();
session.plot.y = event->pos().y();
session.window_changed = true;
}
void ProxWidget::resizeEvent(QResizeEvent *event) {
session.window_plot_hsize = event->size().height();
session.window_plot_wsize = event->size().width();
session.plot.h = event->size().height();
session.plot.w = event->size().width();
session.window_changed = true;
}
+55 -7
View File
@@ -38,7 +38,7 @@
#endif
// Used to enable/disable use of preferences json file
// #define USE_PREFERENCE_FILE
#define USE_PREFERENCE_FILE
#ifdef _WIN32
@@ -412,13 +412,14 @@ static void set_my_executable_path(void) {
}
static const char *my_user_directory = NULL;
static char _cwd_Buffer [FILENAME_MAX] = {0};
// static char _cwd_Buffer [FILENAME_MAX] = {0};
const char *get_my_user_directory(void) {
return my_user_directory;
}
static void set_my_user_directory(void) {
my_user_directory = getenv("HOME");
/* my_user_directory = getenv("HOME");
// if not found, default to current directory
if (my_user_directory == NULL) {
@@ -428,6 +429,38 @@ static void set_my_user_directory(void) {
if (_cwd_Buffer[i] == '\\') _cwd_Buffer[i] = '/';
// my_user_directory = ".";
}
*/
my_user_directory = getenv("HOME");
// if not found, default to current directory
if (my_user_directory == NULL) {
char *cwd_Buffer = NULL;
uint16_t pathLen = FILENAME_MAX; // should be a good starting point
bool error = false;
cwd_Buffer = (char *)calloc(pathLen, sizeof(uint8_t));
while (!error && (GetCurrentDir (cwd_Buffer,pathLen) == NULL)) {
if (errno == ERANGE) { // Need bigger buffer
pathLen += 10; // if buffer was too small add 10 characters and try again
cwd_Buffer = realloc(cwd_Buffer, pathLen);
} else {
error = true;
free (cwd_Buffer);
cwd_Buffer = NULL;
}
printf ("Len... %d\n",pathLen);
}
if (!error) {
for (int i = 0; i < strlen(cwd_Buffer); i++)
if (cwd_Buffer[i] == '\\') cwd_Buffer[i] = '/';
my_user_directory = cwd_Buffer;
}
}
}
static void show_help(bool showFullHelp, char *exec_name) {
@@ -668,10 +701,6 @@ int main(int argc, char *argv[]) {
// Load Settings and assign
// This will allow the command line to override the settings.json values
preferences_load();
// Change height/width (Rows,Cols) - Testing
// printf ("\e[8;50;100t");
// printf ("\e[3;50;50t"); // x,y
//printf ("Path : %s \n",my_user_directory);
// quick patch for debug level
g_debugMode = session.client_debug_level;
// settings_save ();
@@ -877,6 +906,12 @@ int main(int argc, char *argv[]) {
session.supports_colors = true;
session.emoji_mode = EMOJI;
}
} else {
// even if prefs, we disable colors if stdin or stdout is not a TTY
if ((! session.stdinOnTTY) || (! session.stdoutOnTTY)) {
session.supports_colors = false;
session.emoji_mode = ALTTEXT;
}
}
#else
if (session.stdinOnTTY && session.stdoutOnTTY) {
@@ -945,9 +980,22 @@ int main(int argc, char *argv[]) {
// Doing this here will ensure other checks and updates are saved to over rule default
// e.g. Linux color use check
if (!session.preferences_loaded) {
PrintAndLogEx (INFO,"Creating initial preferences file"); // json save reports file name, so just info msg here
preferences_save(); // Save defaults
session.preferences_loaded = true;
} /* else {
// Set device debug level
PrintAndLogEx(INFO,"setting device debug loglevel");
if (session.pm3_present) {
SendCommandNG(CMD_SET_DBGMODE, &session.device_debug_level, 1);
PacketResponseNG resp;
if (WaitForResponseTimeout(CMD_SET_DBGMODE, &resp, 2000) == false)
PrintAndLogEx (INFO,"failed to set device debug loglevel");
}
else
PrintAndLogEx(WARNING,"Proxmark3 not ready to set debug level");
}
*/
#endif
#ifdef HAVE_GUI
+8 -9
View File
@@ -19,7 +19,10 @@
typedef enum logLevel {NORMAL, SUCCESS, INFO, FAILED, WARNING, ERR, DEBUG, INPLACE, HINT} logLevel_t;
typedef enum emojiMode {ALIAS, EMOJI, ALTTEXT, ERASE} emojiMode_t;
typedef enum clientdebugLevel {OFF, SIMPLE, FULL} clientdebugLevel_t;
typedef enum clientdebugLevel {cdbOFF, cdbSIMPLE, cdbFULL} clientdebugLevel_t;
// typedef enum devicedebugLevel {ddbOFF, ddbERROR, ddbINFO, ddbDEBUG, ddbEXTENDED} devicedebugLevel_t;
//typedef enum savePaths {spDefault, spDump, spTrace, spItemCount} savePaths_t; // last item spItemCount used to auto map to number of files
typedef struct {int x; int y; int h; int w;} qtWindow_t;
typedef struct {
bool preferences_loaded;
@@ -31,15 +34,11 @@ typedef struct {
bool help_dump_mode;
bool show_hints;
bool window_changed; // track if plot/overlay pos/size changed to save on exit
int window_plot_xpos;
int window_plot_ypos;
int window_plot_hsize;
int window_plot_wsize;
int window_overlay_xpos;
int window_overlay_ypos;
int window_overlay_hsize;
int window_overlay_wsize;
qtWindow_t plot;
qtWindow_t overlay;
// char *defaultPaths[spItemCount]; // Array should allow loop searching for files
clientdebugLevel_t client_debug_level;
// uint8_t device_debug_level;
} session_arg_t;
extern session_arg_t session;