Subversion Repositories tpanel

Rev

Rev 484 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
446 andreas 1
/*
2
 * Copyright (C) 2022, 2023 by Andreas Theofilu <andreas@theosys.at>
3
 *
4
 * This program is free software; you can redistribute it and/or modify
5
 * it under the terms of the GNU General Public License as published by
6
 * the Free Software Foundation; either version 3 of the License, or
7
 * (at your option) any later version.
8
 *
9
 * This program is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * GNU General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU General Public License
15
 * along with this program; if not, write to the Free Software Foundation,
16
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
17
 */
18
 
19
#include <iostream>
20
 
21
#include "QASettings.h"
22
#import <Foundation/Foundation.h>
23
#import <UIKit/UIKit.h>
24
#import <CoreLocation/CoreLocation.h>
25
#import <OSLog/OSLog.h>
26
#include <QtCore>
27
 
28
#include "tconfig.h"
29
#include "terror.h"
30
 
31
@interface SetupController : NSObject
32
 
33
@property(getter=isInitialized) BOOL Initialized;
34
 
35
- (void)fetchSettingBundleData:(NSNotification *)notification;
36
 
37
@end
38
 
39
@implementation SetupController
40
 
41
- (id)init
42
{
43
    std::cout << "[SetupController init]" << std::endl;
44
    [self setInitialized:NO];
45
 
46
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fetchSettingBundleData:) name:NSUserDefaultsDidChangeNotification object:nil];
47
    return self;
48
}
49
 
50
- (void)fetchSettingBundleData:(NSNotification *)notification
51
{
52
    if ([self isInitialized] == NO)
53
    {
54
        std::cout << "[SetupController fetchSettingBundleData]: Registering defaults." << std::endl;
55
        [self registerDefaults];
56
        return;
57
    }
58
 
59
    // Check here for all potential changed values who could be executed on the fly
60
    std::cout << "[SetupController fetchSettingBundleData]: Checking for changed values." << std::endl;
61
    unsigned int logLevel = 0;
62
 
63
    bool logInfo = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_info"];
64
    bool logWarn = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_warning"];
65
    bool logError = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_error"];
66
    bool logTrace = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_trace"];
67
    bool logDebug = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_debug"];
68
 
69
    if (logInfo)
70
        logLevel |= HLOG_INFO;
71
 
72
    if (logWarn)
73
        logLevel |= HLOG_WARNING;
74
 
75
    if (logError)
76
        logLevel |= HLOG_ERROR;
77
 
78
    if (logTrace)
79
        logLevel |= HLOG_TRACE;
80
 
81
    if (logDebug)
82
        logLevel |= HLOG_DEBUG;
83
 
84
    if (logLevel != TConfig::getLogLevelBits())
85
    {
86
        TConfig::saveLogLevel(logLevel);
87
        TStreamError::setLogLevel(logLevel);
88
    }
89
 
90
    TConfig::saveProfiling([[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_profile"]);
91
    TConfig::saveFormat([[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_long_format"]);
92
    NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sound_system"];
93
    TConfig::saveSystemSoundFile(QString::fromNSString(str).toStdString());
94
    str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sound_single"];
95
    TConfig::saveSingleBeepFile(QString::fromNSString(str).toStdString());
96
    str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sound_double"];
97
    TConfig::saveDoubleBeepFile(QString::fromNSString(str).toStdString());
98
    TConfig::saveSystemSoundState([[ NSUserDefaults standardUserDefaults] boolForKey:@"sound_enable"]);
99
    TConfig::saveSystemVolume((int)[[ NSUserDefaults standardUserDefaults] integerForKey:@"sound_volume"]);
100
    TConfig::saveSystemGain((int)[[ NSUserDefaults standardUserDefaults] integerForKey:@"sound_gain"]);
101
    str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_1"];
102
    TConfig::savePassword1(QString::fromNSString(str).toStdString());
103
    str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_2"];
104
    TConfig::savePassword2(QString::fromNSString(str).toStdString());
105
    str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_3"];
106
    TConfig::savePassword3(QString::fromNSString(str).toStdString());
107
    str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_4"];
108
    TConfig::savePassword4(QString::fromNSString(str).toStdString());
109
}
110
 
111
- (void)registerDefaults
112
{
113
    if ([self isInitialized] == YES)
114
        return;
115
 
116
    [self setInitialized:YES];
117
 
118
    std::cout << "[SetupController registerDefaults]" << std::endl;
119
 
120
    NSDictionary* appDefaultsRoot = [NSDictionary dictionaryWithObject:@"Root" forKey:@"StringsTable"];
121
    NSDictionary* appDefaultsSip = [NSDictionary dictionaryWithObject:@"SIP" forKey:@"StringsTable"];
122
    NSDictionary* appDefaultsView = [NSDictionary dictionaryWithObject:@"View" forKey:@"StringsTable"];
123
    NSDictionary* appDefaultsSound = [NSDictionary dictionaryWithObject:@"Sound" forKey:@"StringsTable"];
124
    NSDictionary* appDefaultsLog = [NSDictionary dictionaryWithObject:@"Logging" forKey:@"StringsTable"];
125
    NSDictionary* appDefaultsPasswd = [NSDictionary dictionaryWithObject:@"Passwords" forKey:@"StringsTable"];
126
 
127
    if (appDefaultsRoot)
128
    {
129
        // the default value was found in the dictionary.  Register it.
130
        // wrapping this in an if.. clause prevents overwriting a user entered
131
        // value with the default value
132
        [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaultsRoot];
133
    }
134
 
135
    if (appDefaultsSip)
136
    {
137
        [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaultsSip];
138
    }
139
 
140
    if (appDefaultsView)
141
    {
142
        [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaultsView];
143
    }
144
 
145
    if (appDefaultsSound)
146
    {
147
        [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaultsSound];
148
    }
149
 
150
    if (appDefaultsLog)
151
    {
152
        [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaultsLog];
153
    }
154
 
155
    if (appDefaultsPasswd)
156
    {
157
        [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaultsPasswd];
158
    }
159
}
160
 
161
@end
162
 
163
// -----------------------------------------------------------------------------
164
// ---- C++ part starts here
165
// -----------------------------------------------------------------------------
166
 
167
std::string QASettings::oldNetlinx;
168
int QASettings::oldPort{0};
169
int QASettings::oldChannelID{0};
170
std::string QASettings::oldSurface;
171
bool QASettings::oldToolbarSuppress{false};
172
bool QASettings::oldToolbarForce{false};
173
 
174
SetupController *mSetup = nil;
175
os_log_t TPANEL_LOG = nil;
176
 
177
QASettings::QASettings()
178
{
179
    mSetup = [[SetupController alloc] init];
180
}
181
 
182
QASettings::~QASettings()
183
{
184
    if (TPANEL_LOG != nil)
185
        [TPANEL_LOG release];
186
}
187
 
188
void QASettings::registerDefaultPrefs()
189
{
190
    if (mSetup)
191
        [mSetup registerDefaults];
192
}
193
 
194
void QASettings::unregisterPrefs()
195
{
196
    if (mSetup)
197
        [mSetup release];
198
 
199
    mSetup = nil;
200
}
201
 
202
QString QASettings::getNetlinxIP()
203
{
204
    NSString* netlinx_ip = [[NSUserDefaults standardUserDefaults] stringForKey:@"netlinx_ip"];
205
 
206
    if (!netlinx_ip)
207
        netlinx_ip = @"0.0.0.0";
208
 
209
    return QString::fromNSString(netlinx_ip);
210
}
211
 
212
int QASettings::getNetlinxPort()
213
{
214
    return getDefaultNumber((char *)"netlinx_port", 1319);
215
}
216
 
217
int QASettings::getNetlinxChannel()
218
{
219
    return getDefaultNumber((char *)"netlinx_channel", 10001);
220
}
221
 
222
QString QASettings::getNetlinxPanelType()
223
{
224
    NSString *netlinx_type = [[ NSUserDefaults standardUserDefaults] stringForKey:@"netlinx_type"];
225
 
226
    if (!netlinx_type)
227
        netlinx_type = @"MVP-5200i";
228
 
229
    return QString::fromNSString(netlinx_type);
230
}
231
 
232
QString QASettings::getFTPUser()
233
{
234
    NSString *netlinx_ftp_user = [[ NSUserDefaults standardUserDefaults] stringForKey:@"netlinx_ftp_user"];
235
 
236
    if (!netlinx_ftp_user)
237
        netlinx_ftp_user = @"administrator";
238
 
239
    return QString::fromNSString(netlinx_ftp_user);
240
}
241
 
242
QString QASettings::getFTPPassword()
243
{
244
    NSString *netlinx_ftp_password = [[ NSUserDefaults standardUserDefaults] stringForKey:@"netlinx_ftp_password"];
245
 
246
    if (!netlinx_ftp_password)
247
        netlinx_ftp_password = @"password";
248
 
249
    return QString::fromNSString(netlinx_ftp_password);
250
}
251
 
252
QString QASettings::getNetlinxSurface()
253
{
254
    NSString *netlinx_surface = [[ NSUserDefaults standardUserDefaults] stringForKey:@"netlinx_surface"];
255
 
256
    if (!netlinx_surface)
257
        netlinx_surface = @"tpanel.TP4";
258
 
259
    return QString::fromNSString(netlinx_surface);
260
}
261
 
262
bool QASettings::getFTPPassive()
263
{
264
    return getDefaultBool((char *)"netlinx_ftp_passive", true);
265
}
266
 
267
// Settings for SIP
268
 
269
QString QASettings::getSipProxy(void)
270
{
271
    NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sip_proxy"];
272
    return QString::fromNSString(str);
273
}
274
 
275
int QASettings::getSipNetworkPort(void)
276
{
277
    return getDefaultNumber((char *)"sip_port", 5060);
278
}
279
 
280
int QASettings::getSipNetworkTlsPort(void)
281
{
282
    NSInteger number = [[ NSUserDefaults standardUserDefaults] integerForKey:@"sip_tsl_port"];
283
    return (int)number;
284
}
285
 
286
QString QASettings::getSipStun(void)
287
{
288
    NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sip_stun"];
289
    return QString::fromNSString(str);
290
}
291
 
292
QString QASettings::getSipDomain(void)
293
{
294
    NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sip_domain"];
295
    return QString::fromNSString(str);
296
}
297
 
298
QString QASettings::getSipUser(void)
299
{
300
    NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sip_user"];
301
    return QString::fromNSString(str);
302
}
303
 
304
QString QASettings::getSipPassword(void)
305
{
306
    NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sip_password"];
307
    return QString::fromNSString(str);
308
}
309
 
310
bool QASettings::getSipNetworkIpv4(void)
311
{
312
    NSInteger boolean = [[ NSUserDefaults standardUserDefaults] boolForKey:@"sip_ipv4"];
313
    return boolean;
314
}
315
 
316
bool QASettings::getSipNetworkIpv6(void)
317
{
318
    NSInteger boolean = [[ NSUserDefaults standardUserDefaults] boolForKey:@"sip_ipv6"];
319
    return boolean;
320
}
321
 
322
bool QASettings::getSipEnabled(void)
323
{
324
    NSInteger boolean = [[ NSUserDefaults standardUserDefaults] boolForKey:@"sip_enabled"];
325
    return boolean;
326
}
327
bool QASettings::getSipIntegratedPhone(void)
328
{
329
    return getDefaultBool((char *)"sip_internal_phone", true);
330
}
331
 
332
// Settings for View
333
 
334
bool QASettings::getViewScale(void)
335
{
336
    return getDefaultBool((char *)"view_scale", true);
337
}
338
 
339
bool QASettings::getViewToolbarVisible(void)
340
{
341
    return getDefaultBool((char *)"view_toolbar", true);
342
}
343
 
344
bool QASettings::getViewToolbarForce(void)
345
{
346
    return getDefaultBool((char *)"view_toolbar_force", true);
347
}
348
 
349
bool QASettings::getViewRotation(void)
350
{
351
    NSInteger boolean = [[ NSUserDefaults standardUserDefaults] boolForKey:@"view_rotation"];
352
    return boolean;
353
}
354
 
355
// Settings for sound
356
 
357
QString QASettings::getSoundSystem(void)
358
{
359
    NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sound_system"];
360
 
361
    if (!str)
362
        return "singleBeep.wav";
363
 
364
    return QString::fromNSString(str);
365
}
366
 
367
QString QASettings::getSoundSingleBeep(void)
368
{
369
    NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sound_single"];
370
 
371
    if (!str)
372
        return "singleBeep.wav";
373
 
374
    return QString::fromNSString(str);
375
}
376
 
377
QString QASettings::getSoundDoubleBeep(void)
378
{
379
    NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"sound_double"];
380
 
381
    if (!str)
382
        return "doubleBeep.wav";
383
 
384
    return QString::fromNSString(str);
385
}
386
 
387
bool QASettings::getSoundEnabled(void)
388
{
389
    return getDefaultBool((char *)"sound_enable", true);
390
}
391
 
392
int QASettings::getSoundVolume(void)
393
{
394
    return getDefaultNumber((char *)"sound_volume", 100);
395
}
396
 
397
int QASettings::getSoundGain(void)
398
{
399
    return getDefaultNumber((char *)"sound_gain", 100);
400
}
401
 
402
// Settings for logging
403
 
404
bool QASettings::getLoggingInfo()
405
{
406
    NSInteger log_info = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_info"];
407
    return log_info;
408
}
409
 
410
bool QASettings::getLoggingWarning()
411
{
412
    NSInteger log_warning = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_warning"];
413
    return log_warning;
414
}
415
 
416
bool QASettings::getLoggingError()
417
{
418
    NSInteger log_error = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_error"];
419
    return log_error;
420
}
421
 
422
bool QASettings::getLoggingTrace()
423
{
424
    NSInteger log_trace = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_trace"];
425
    return log_trace;
426
}
427
 
428
bool QASettings::getLoggingDebug()
429
{
430
    NSInteger log_debug = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_debug"];
431
    return log_debug;
432
}
433
 
434
bool QASettings::getLoggingProfile()
435
{
436
    NSInteger log_profile = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_profile"];
437
    return log_profile;
438
}
439
 
440
bool QASettings::getLoggingLogFormat()
441
{
442
    NSInteger log_format = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_long_format"];
443
    return log_format;
444
}
445
 
446
bool QASettings::getLoggingLogfileEnabled()
447
{
448
    NSInteger boolean = [[ NSUserDefaults standardUserDefaults] boolForKey:@"logging_logfile_enabled"];
449
    return boolean;
450
}
451
 
452
QString QASettings::getLoggingLogfile()
453
{
454
    NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"logging_logfile"];
455
 
456
    if (!str)
457
        return "tpanel.log";
458
 
459
    return QString::fromNSString(str);
460
}
461
 
462
QString QASettings::getPassword1()
463
{
464
    NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_1"];
465
 
466
    if (!str)
467
        return "1988";
468
 
469
    return QString::fromNSString(str);
470
}
471
 
472
QString QASettings::getPassword2()
473
{
474
    NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_2"];
475
 
476
    if (!str)
477
        return "1988";
478
 
479
    return QString::fromNSString(str);
480
}
481
 
482
QString QASettings::getPassword3()
483
{
484
    NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_3"];
485
 
486
    if (!str)
487
        return "1988";
488
 
489
    return QString::fromNSString(str);
490
}
491
 
492
QString QASettings::getPassword4()
493
{
494
    NSString *str = [[ NSUserDefaults standardUserDefaults] stringForKey:@"password_4"];
495
 
496
    if (!str)
497
        return "1988";
498
 
499
    return QString::fromNSString(str);
500
}
501
 
502
// Static methods
503
QString QASettings::getLibraryPath()
504
{
505
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
506
    NSString *libraryDirectory = [paths objectAtIndex:0];
507
    return QString::fromNSString(libraryDirectory);
508
}
509
 
510
QString QASettings::getDocumentPath()
511
{
512
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
513
    NSString *documentDirectory = [paths objectAtIndex:0];
514
    return QString::fromNSString(documentDirectory);
515
}
516
 
517
QMargins QASettings::getNotchSize()
518
{
485 andreas 519
    DECL_TRACER("QASettings::getNotchSize()");
520
 
521
    NSArray *scenes = [[[UIApplication sharedApplication] connectedScenes] allObjects];
522
 
523
    if (scenes == nil || scenes.count <= 0)
524
    {
525
        MSG_WARNING("Found no scenes. Can't get the size of the notch, if there is any.");
526
        return QMargins();
527
    }
528
 
529
    NSArray<UIWindow *> *windows = [[scenes objectAtIndex:0] windows];
530
 
531
    if (windows == nil || windows.count <= 0)
532
    {
533
        MSG_WARNING("Found no windows! Can't calculate notch size.");
534
        return QMargins();
535
    }
536
 
446 andreas 537
    UIWindow* window = nil;
538
 
539
    for (UIWindow *w in windows)
540
    {
541
        if (w.isKeyWindow)
542
        {
543
            window = w;
544
            break;
545
        }
546
    }
547
 
548
    if (window == nil)
485 andreas 549
    {
550
        MSG_WARNING("No key window detected! Will take 1st window instead ...");
551
        window = [windows objectAtIndex:0];
446 andreas 552
 
485 andreas 553
        if (window == nil)
554
        {
555
            MSG_WARNING("No window found! Can't get the notch size, if any.");
556
            return QMargins();
557
        }
558
 
559
        MSG_DEBUG("Found first window to be a valid one.");
560
    }
561
 
446 andreas 562
    QMargins rect;
563
 
564
    float reservedTop = window.safeAreaInsets.top;
565
    float reservedBottom = window.safeAreaInsets.bottom;
566
    float reservedLeft = window.safeAreaInsets.left;
567
    float reservedRight = window.safeAreaInsets.right;
568
 
569
    rect.setLeft(reservedLeft);
570
    rect.setTop(reservedTop);
571
    rect.setBottom(reservedBottom);
572
    rect.setRight(reservedRight);
573
    return rect;
574
}
575
 
576
bool QASettings::getDefaultBool(char *key, bool def)
577
{
578
    NSString *nsKey = [[NSString alloc] initWithUTF8String: key];
579
 
580
    if (!nsKey)
581
        return def;
582
 
583
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
584
    id dataExists = [userDefaults objectForKey:nsKey];
585
 
586
    if (dataExists != nil)
587
    {
588
        bool ret = [[NSUserDefaults standardUserDefaults] boolForKey:nsKey];
589
        [nsKey release];
590
        return ret;
591
    }
592
 
593
    [nsKey release];
594
    return def;
595
}
596
 
597
int QASettings::getDefaultNumber(char *key, int def)
598
{
599
    NSString *nsKey = [[NSString alloc] initWithUTF8String: key];
600
 
601
    if (!nsKey)
602
        return def;
603
 
604
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
605
    id dataExists = [userDefaults objectForKey:nsKey];
606
 
607
    if (dataExists != nil)
608
    {
609
        long ret = [[NSUserDefaults standardUserDefaults] integerForKey:nsKey];
610
        [nsKey release];
611
        return (int)ret;
612
    }
613
 
614
    [nsKey release];
615
    return def;
616
}
617
 
618
void QASettings::openSettings()
619
{
620
    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
621
 
622
    if (!url)
623
        return;
624
 
625
    // Save current settings
626
    oldNetlinx = TConfig::getController();
627
    oldPort = TConfig::getPort();
628
    oldChannelID = TConfig::getChannel();
629
    oldSurface = TConfig::getFtpSurface();
630
    oldToolbarSuppress = TConfig::getToolbarSuppress();
631
    oldToolbarForce = TConfig::getToolbarForce();
632
    // Launch the setup
633
    UIApplication *application = [UIApplication sharedApplication];
634
    [application openURL:url options:@{} completionHandler:nil];
635
}
636
 
637
void QASettings::writeLog(int type, const std::string& msg)
638
{
639
    os_log_type_t dbType = OS_LOG_TYPE_DEBUG;
640
 
641
    switch (type)
642
    {
643
        case TERRINFO:      dbType = OS_LOG_TYPE_INFO; break;
644
        case TERRWARNING:   dbType = OS_LOG_TYPE_FAULT; break;
645
        case TERRERROR:     dbType = OS_LOG_TYPE_ERROR; break;
646
        case TERRDEBUG:     dbType = OS_LOG_TYPE_DEBUG; break;
647
        default:
648
            dbType = OS_LOG_TYPE_DEFAULT;
649
    }
650
 
651
    if (TPANEL_LOG == nil)
652
        TPANEL_LOG = os_log_create("at.theosys.tpanel", "tpanel");
653
 
654
    if (os_log_type_enabled(TPANEL_LOG, dbType))
655
        os_log_with_type(TPANEL_LOG, dbType, "%{public}s", msg.c_str());
656
    else
657
        NSLog(@"(tpanel) %s", msg.c_str());
658
 
659
}