Rev 484 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*
* Copyright (C) 2022, 2023 by Andreas Theofilu <andreas@theosys.at>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <iostream>
#include "QASettings.h"
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <OSLog/OSLog.h>
#include <QtCore>
#include "tconfig.h"
#include "terror.h"
@interface SetupController : NSObject
@property(getter=isInitialized) BOOL Initialized;
- (void)fetchSettingBundleData:(NSNotification *)notification;
@end
@implementation SetupController
- (id)init
{
std::cout << "[SetupController init]" << std::endl;
[self setInitialized:NO];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fetchSettingBundleData:) name:NSUserDefaultsDidChangeNotification object:nil];
return self;
}
- (void)fetchSettingBundleData:(NSNotification *)notification
{
if ([self isInitialized] == NO)
{
std::cout << "[SetupController fetchSettingBundleData]: Registering defaults." << std::endl;
[self registerDefaults];
return;
}
// Check here for all potential changed values who could be executed on the fly
std::cout << "[SetupController fetchSettingBundleData]: Checking for changed values." << std::endl;
unsigned int logLevel = 0;
bool logInfo = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_info"];
bool logWarn = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_warning"];
bool logError = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_error"];
bool logTrace = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_trace"];
bool logDebug = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_debug"];
if (logInfo)
logLevel |= HLOG_INFO;
if (logWarn)
logLevel |= HLOG_WARNING;
if (logError)
logLevel |= HLOG_ERROR;
if (logTrace)
logLevel |= HLOG_TRACE;
if (logDebug)
logLevel |= HLOG_DEBUG;
if (logLevel != TConfig::getLogLevelBits())
{
TConfig::saveLogLevel(logLevel);
TStreamError::setLogLevel(logLevel);
}
TConfig::saveProfiling([[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_profile"]);
TConfig::saveFormat([[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_long_format"]);
NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sound_system"];
TConfig::saveSystemSoundFile(QString::fromNSString(str).toStdString());
str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sound_single"];
TConfig::saveSingleBeepFile(QString::fromNSString(str).toStdString());
str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sound_double"];
TConfig::saveDoubleBeepFile(QString::fromNSString(str).toStdString());
TConfig::saveSystemSoundState([[ NSUserDefaults standardUserDefaults] boolForKey:@"sound_enable"]);
TConfig::saveSystemVolume((int)[[ NSUserDefaults standardUserDefaults] integerForKey:@"sound_volume"]);
TConfig::saveSystemGain((int)[[ NSUserDefaults standardUserDefaults] integerForKey:@"sound_gain"]);
str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_1"];
TConfig::savePassword1(QString::fromNSString(str).toStdString());
str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_2"];
TConfig::savePassword2(QString::fromNSString(str).toStdString());
str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_3"];
TConfig::savePassword3(QString::fromNSString(str).toStdString());
str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_4"];
TConfig::savePassword4(QString::fromNSString(str).toStdString());
}
- (void)registerDefaults
{
if ([self isInitialized] == YES)
return;
[self setInitialized:YES];
std::cout << "[SetupController registerDefaults]" << std::endl;
NSDictionary* appDefaultsRoot = [NSDictionary dictionaryWithObject:@"Root" forKey:@"StringsTable"];
NSDictionary* appDefaultsSip = [NSDictionary dictionaryWithObject:@"SIP" forKey:@"StringsTable"];
NSDictionary* appDefaultsView = [NSDictionary dictionaryWithObject:@"View" forKey:@"StringsTable"];
NSDictionary* appDefaultsSound = [NSDictionary dictionaryWithObject:@"Sound" forKey:@"StringsTable"];
NSDictionary* appDefaultsLog = [NSDictionary dictionaryWithObject:@"Logging" forKey:@"StringsTable"];
NSDictionary* appDefaultsPasswd = [NSDictionary dictionaryWithObject:@"Passwords" forKey:@"StringsTable"];
if (appDefaultsRoot)
{
// the default value was found in the dictionary. Register it.
// wrapping this in an if.. clause prevents overwriting a user entered
// value with the default value
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaultsRoot];
}
if (appDefaultsSip)
{
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaultsSip];
}
if (appDefaultsView)
{
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaultsView];
}
if (appDefaultsSound)
{
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaultsSound];
}
if (appDefaultsLog)
{
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaultsLog];
}
if (appDefaultsPasswd)
{
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaultsPasswd];
}
}
@end
// -----------------------------------------------------------------------------
// ---- C++ part starts here
// -----------------------------------------------------------------------------
std::string QASettings::oldNetlinx;
int QASettings::oldPort{0};
int QASettings::oldChannelID{0};
std::string QASettings::oldSurface;
bool QASettings::oldToolbarSuppress{false};
bool QASettings::oldToolbarForce{false};
SetupController *mSetup = nil;
os_log_t TPANEL_LOG = nil;
QASettings::QASettings()
{
mSetup = [[SetupController alloc] init];
}
QASettings::~QASettings()
{
if (TPANEL_LOG != nil)
[TPANEL_LOG release];
}
void QASettings::registerDefaultPrefs()
{
if (mSetup)
[mSetup registerDefaults];
}
void QASettings::unregisterPrefs()
{
if (mSetup)
[mSetup release];
mSetup = nil;
}
QString QASettings::getNetlinxIP()
{
NSString* netlinx_ip = [[NSUserDefaults standardUserDefaults] stringForKey:@"netlinx_ip"];
if (!netlinx_ip)
netlinx_ip = @"0.0.0.0";
return QString::fromNSString(netlinx_ip);
}
int QASettings::getNetlinxPort()
{
return getDefaultNumber((char *)"netlinx_port", 1319);
}
int QASettings::getNetlinxChannel()
{
return getDefaultNumber((char *)"netlinx_channel", 10001);
}
QString QASettings::getNetlinxPanelType()
{
NSString *netlinx_type = [[ NSUserDefaults standardUserDefaults] stringForKey:@"netlinx_type"];
if (!netlinx_type)
netlinx_type = @"MVP-5200i";
return QString::fromNSString(netlinx_type);
}
QString QASettings::getFTPUser()
{
NSString *netlinx_ftp_user = [[ NSUserDefaults standardUserDefaults] stringForKey:@"netlinx_ftp_user"];
if (!netlinx_ftp_user)
netlinx_ftp_user = @"administrator";
return QString::fromNSString(netlinx_ftp_user);
}
QString QASettings::getFTPPassword()
{
NSString *netlinx_ftp_password = [[ NSUserDefaults standardUserDefaults] stringForKey:@"netlinx_ftp_password"];
if (!netlinx_ftp_password)
netlinx_ftp_password = @"password";
return QString::fromNSString(netlinx_ftp_password);
}
QString QASettings::getNetlinxSurface()
{
NSString *netlinx_surface = [[ NSUserDefaults standardUserDefaults] stringForKey:@"netlinx_surface"];
if (!netlinx_surface)
netlinx_surface = @"tpanel.TP4";
return QString::fromNSString(netlinx_surface);
}
bool QASettings::getFTPPassive()
{
return getDefaultBool((char *)"netlinx_ftp_passive", true);
}
// Settings for SIP
QString QASettings::getSipProxy(void)
{
NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sip_proxy"];
return QString::fromNSString(str);
}
int QASettings::getSipNetworkPort(void)
{
return getDefaultNumber((char *)"sip_port", 5060);
}
int QASettings::getSipNetworkTlsPort(void)
{
NSInteger number = [[ NSUserDefaults standardUserDefaults] integerForKey:@"sip_tsl_port"];
return (int)number;
}
QString QASettings::getSipStun(void)
{
NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sip_stun"];
return QString::fromNSString(str);
}
QString QASettings::getSipDomain(void)
{
NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sip_domain"];
return QString::fromNSString(str);
}
QString QASettings::getSipUser(void)
{
NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sip_user"];
return QString::fromNSString(str);
}
QString QASettings::getSipPassword(void)
{
NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sip_password"];
return QString::fromNSString(str);
}
bool QASettings::getSipNetworkIpv4(void)
{
NSInteger boolean = [[ NSUserDefaults standardUserDefaults] boolForKey:@"sip_ipv4"];
return boolean;
}
bool QASettings::getSipNetworkIpv6(void)
{
NSInteger boolean = [[ NSUserDefaults standardUserDefaults] boolForKey:@"sip_ipv6"];
return boolean;
}
bool QASettings::getSipEnabled(void)
{
NSInteger boolean = [[ NSUserDefaults standardUserDefaults] boolForKey:@"sip_enabled"];
return boolean;
}
bool QASettings::getSipIntegratedPhone(void)
{
return getDefaultBool((char *)"sip_internal_phone", true);
}
// Settings for View
bool QASettings::getViewScale(void)
{
return getDefaultBool((char *)"view_scale", true);
}
bool QASettings::getViewToolbarVisible(void)
{
return getDefaultBool((char *)"view_toolbar", true);
}
bool QASettings::getViewToolbarForce(void)
{
return getDefaultBool((char *)"view_toolbar_force", true);
}
bool QASettings::getViewRotation(void)
{
NSInteger boolean = [[ NSUserDefaults standardUserDefaults] boolForKey:@"view_rotation"];
return boolean;
}
// Settings for sound
QString QASettings::getSoundSystem(void)
{
NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sound_system"];
if (!str)
return "singleBeep.wav";
return QString::fromNSString(str);
}
QString QASettings::getSoundSingleBeep(void)
{
NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sound_single"];
if (!str)
return "singleBeep.wav";
return QString::fromNSString(str);
}
QString QASettings::getSoundDoubleBeep(void)
{
NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sound_double"];
if (!str)
return "doubleBeep.wav";
return QString::fromNSString(str);
}
bool QASettings::getSoundEnabled(void)
{
return getDefaultBool((char *)"sound_enable", true);
}
int QASettings::getSoundVolume(void)
{
return getDefaultNumber((char *)"sound_volume", 100);
}
int QASettings::getSoundGain(void)
{
return getDefaultNumber((char *)"sound_gain", 100);
}
// Settings for logging
bool QASettings::getLoggingInfo()
{
NSInteger log_info = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_info"];
return log_info;
}
bool QASettings::getLoggingWarning()
{
NSInteger log_warning = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_warning"];
return log_warning;
}
bool QASettings::getLoggingError()
{
NSInteger log_error = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_error"];
return log_error;
}
bool QASettings::getLoggingTrace()
{
NSInteger log_trace = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_trace"];
return log_trace;
}
bool QASettings::getLoggingDebug()
{
NSInteger log_debug = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_debug"];
return log_debug;
}
bool QASettings::getLoggingProfile()
{
NSInteger log_profile = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_profile"];
return log_profile;
}
bool QASettings::getLoggingLogFormat()
{
NSInteger log_format = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_long_format"];
return log_format;
}
bool QASettings::getLoggingLogfileEnabled()
{
NSInteger boolean = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_logfile_enabled"];
return boolean;
}
QString QASettings::getLoggingLogfile()
{
NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"logging_logfile"];
if (!str)
return "tpanel.log";
return QString::fromNSString(str);
}
QString QASettings::getPassword1()
{
NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_1"];
if (!str)
return "1988";
return QString::fromNSString(str);
}
QString QASettings::getPassword2()
{
NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_2"];
if (!str)
return "1988";
return QString::fromNSString(str);
}
QString QASettings::getPassword3()
{
NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_3"];
if (!str)
return "1988";
return QString::fromNSString(str);
}
QString QASettings::getPassword4()
{
NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_4"];
if (!str)
return "1988";
return QString::fromNSString(str);
}
// Static methods
QString QASettings::getLibraryPath()
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryDirectory = [paths objectAtIndex:0];
return QString::fromNSString(libraryDirectory);
}
QString QASettings::getDocumentPath()
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
return QString::fromNSString(documentDirectory);
}
QMargins QASettings::getNotchSize()
{
NSArray<UIWindow *> *windows = [[UIApplication sharedApplication] windows];
UIWindow* window = nil;
for (UIWindow *w in windows)
{
if (w.isKeyWindow)
{
window = w;
break;
}
}
if (window == nil)
return QMargins();
// UIWindow* window = [[UIApplication sharedApplication] keyWindow];
QMargins rect;
float reservedTop = window.safeAreaInsets.top;
float reservedBottom = window.safeAreaInsets.bottom;
float reservedLeft = window.safeAreaInsets.left;
float reservedRight = window.safeAreaInsets.right;
rect.setLeft(reservedLeft);
rect.setTop(reservedTop);
rect.setBottom(reservedBottom);
rect.setRight(reservedRight);
return rect;
}
bool QASettings::getDefaultBool(char *key, bool def)
{
NSString *nsKey = [[NSString alloc] initWithUTF8String: key];
if (!nsKey)
return def;
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
id dataExists = [userDefaults objectForKey:nsKey];
if (dataExists != nil)
{
bool ret = [[NSUserDefaults standardUserDefaults] boolForKey:nsKey];
[nsKey release];
return ret;
}
[nsKey release];
return def;
}
int QASettings::getDefaultNumber(char *key, int def)
{
NSString *nsKey = [[NSString alloc] initWithUTF8String: key];
if (!nsKey)
return def;
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
id dataExists = [userDefaults objectForKey:nsKey];
if (dataExists != nil)
{
long ret = [[NSUserDefaults standardUserDefaults] integerForKey:nsKey];
[nsKey release];
return (int)ret;
}
[nsKey release];
return def;
}
void QASettings::openSettings()
{
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if (!url)
return;
// Save current settings
oldNetlinx = TConfig::getController();
oldPort = TConfig::getPort();
oldChannelID = TConfig::getChannel();
oldSurface = TConfig::getFtpSurface();
oldToolbarSuppress = TConfig::getToolbarSuppress();
oldToolbarForce = TConfig::getToolbarForce();
// Launch the setup
UIApplication *application = [UIApplication sharedApplication];
[application openURL:url options:@{} completionHandler:nil];
}
void QASettings::writeLog(int type, const std::string& msg)
{
os_log_type_t dbType = OS_LOG_TYPE_DEBUG;
switch (type)
{
case TERRINFO: dbType = OS_LOG_TYPE_INFO; break;
case TERRWARNING: dbType = OS_LOG_TYPE_FAULT; break;
case TERRERROR: dbType = OS_LOG_TYPE_ERROR; break;
case TERRDEBUG: dbType = OS_LOG_TYPE_DEBUG; break;
default:
dbType = OS_LOG_TYPE_DEFAULT;
}
if (TPANEL_LOG == nil)
TPANEL_LOG = os_log_create("at.theosys.tpanel", "tpanel");
if (os_log_type_enabled(TPANEL_LOG, dbType))
os_log_with_type(TPANEL_LOG, dbType, "%{public}s", msg.c_str());
else
NSLog(@"(tpanel) %s", msg.c_str());
}