Ticket #2069: backendsettings.cpp

File backendsettings.cpp, 25.4 KB (added by Teo En Ming, 19 years ago)
Line 
1#include <cstdio>
2
3#include "backendsettings.h"
4#include "libmyth/mythcontext.h"
5#include "libmyth/settings.h"
6#include <unistd.h>
7
8
9static HostLineEdit *LocalServerIP()
10{
11    HostLineEdit *gc = new HostLineEdit("BackendServerIP");
12    gc->setLabel(QObject::tr("IP address for") + QString(" ") +
13                 gContext->GetHostName());
14    gc->setValue("127.0.0.1");
15    gc->setHelpText(QObject::tr("Enter the IP address of this machine.  "
16                    "Use an externally accessible address (ie, not "
17                    "127.0.0.1) if you are going to be running a frontend "
18                    "on a different machine than this one."));
19    return gc;
20};
21
22static HostLineEdit *LocalServerPort()
23{
24    HostLineEdit *gc = new HostLineEdit("BackendServerPort");
25    gc->setLabel(QObject::tr("Port the server runs on"));
26    gc->setValue("6543");
27    gc->setHelpText(QObject::tr("Unless you've got good reason to, don't "
28                    "change this."));
29    return gc;
30};
31
32static HostLineEdit *LocalStatusPort()
33{
34    HostLineEdit *gc = new HostLineEdit("BackendStatusPort");
35    gc->setLabel(QObject::tr("Port the server shows status on"));
36    gc->setValue("6544");
37    gc->setHelpText(QObject::tr("Port which the server will listen to for "
38                    "HTTP requests.  Currently, it shows a little status "
39                    "information."));
40    return gc;
41};
42
43static GlobalLineEdit *MasterServerIP()
44{
45    GlobalLineEdit *gc = new GlobalLineEdit("MasterServerIP");
46    gc->setLabel(QObject::tr("Master Server IP address"));
47    gc->setValue("127.0.0.1");
48    gc->setHelpText(QObject::tr("The IP address of the master backend "
49                    "server. All frontend and non-master backend machines "
50                    "will connect to this server.  If you only have one "
51                    "backend, this should be the same IP address as "
52                    "above."));
53    return gc;
54};
55
56static GlobalLineEdit *MasterServerPort()
57{
58    GlobalLineEdit *gc = new GlobalLineEdit("MasterServerPort");
59    gc->setLabel(QObject::tr("Port the master server runs on"));
60    gc->setValue("6543");
61    gc->setHelpText(QObject::tr("Unless you've got good reason to, "
62                    "don't change this."));
63    return gc;
64};
65
66static HostLineEdit *RecordFilePrefix()
67{
68    HostLineEdit *gc = new HostLineEdit("RecordFilePrefix");
69    gc->setLabel(QObject::tr("Directory to hold recordings"));
70    gc->setValue("/mnt/store/");
71    gc->setHelpText(QObject::tr("All recordings get stored in this "
72                    "directory."));
73    return gc;
74};
75
76static GlobalComboBox *TVFormat()
77{
78    GlobalComboBox *gc = new GlobalComboBox("TVFormat");
79    gc->setLabel(QObject::tr("TV format"));
80    gc->addSelection("NTSC");
81    gc->addSelection("ATSC");
82    gc->addSelection("PAL");
83    gc->addSelection("SECAM");
84    gc->addSelection("PAL-NC");
85    gc->addSelection("PAL-M");
86    gc->addSelection("PAL-N");
87    gc->addSelection("PAL-BG");
88    gc->addSelection("PAL-DK");
89    gc->addSelection("PAL-I");
90    gc->addSelection("PAL-60");
91    gc->addSelection("NTSC-JP");
92    gc->setHelpText(QObject::tr("The TV standard to use for viewing TV."));
93    return gc;
94};
95
96static GlobalComboBox *VbiFormat()
97{
98    GlobalComboBox *gc = new GlobalComboBox("VbiFormat");
99    gc->setLabel(QObject::tr("VBI format"));
100    gc->addSelection("None");
101    gc->addSelection("PAL Teletext");
102    gc->addSelection("NTSC Closed Caption");
103    gc->setHelpText(QObject::tr("VBI stands for Vertical Blanking Interrupt.  "
104                    "VBI is used to carry Teletext and Closed Captioning "
105                    "data."));
106    return gc;
107};
108
109static GlobalComboBox *FreqTable()
110{
111    GlobalComboBox *gc = new GlobalComboBox("FreqTable");
112    gc->setLabel(QObject::tr("Channel frequency table"));
113    gc->addSelection("Singapore-PAL-BG");
114    gc->addSelection("us-cable");
115    gc->addSelection("us-bcast");
116    gc->addSelection("us-cable-hrc");
117    gc->addSelection("us-cable-irc");
118    gc->addSelection("japan-bcast");
119    gc->addSelection("japan-cable");
120    gc->addSelection("europe-west");
121    gc->addSelection("europe-east");
122    gc->addSelection("italy");
123    gc->addSelection("newzealand");
124    gc->addSelection("australia");
125    gc->addSelection("ireland");
126    gc->addSelection("france");
127    gc->addSelection("china-bcast");
128    gc->addSelection("southafrica");
129    gc->addSelection("argentina");
130    gc->addSelection("australia-optus");
131    gc->setHelpText(QObject::tr("Select the appropriate frequency table for "
132                    "your system.  If you have an antenna, use a \"-bcast\" "
133                    "frequency."));
134    return gc;
135};
136
137static GlobalCheckBox *SaveTranscoding()
138{
139    GlobalCheckBox *gc = new GlobalCheckBox("SaveTranscoding");
140    gc->setLabel(QObject::tr("Save original files after transcoding (globally)"));
141    gc->setValue(false);
142    gc->setHelpText(QObject::tr("When set and the transcoder is active, the "
143                    "original files will be renamed to .old once the "
144                    "transcoding is complete."));
145    return gc;
146};
147
148static GlobalCheckBox *DeletesFollowLinks()
149{
150    GlobalCheckBox *gc = new GlobalCheckBox("DeletesFollowLinks");
151    gc->setLabel(QObject::tr("Follow symbolic links when deleting files"));
152    gc->setValue(false);
153    gc->setHelpText(QObject::tr("This will cause Myth to follow symlinks "
154                    "when recordings and related files are deleted, instead "
155                    "of deleting the symlink and leaving the actual file."));
156    return gc;
157};
158
159static GlobalComboBox *TimeOffset()
160{
161    GlobalComboBox *gc = new GlobalComboBox("TimeOffset");
162    gc->setLabel(QObject::tr("Time offset for XMLTV listings"));
163    gc->addSelection("None");
164    gc->addSelection("Auto");
165    gc->addSelection("+0030");
166    gc->addSelection("+0100");
167    gc->addSelection("+0130");
168    gc->addSelection("+0200");
169    gc->addSelection("+0230");
170    gc->addSelection("+0300");
171    gc->addSelection("+0330");
172    gc->addSelection("+0400");
173    gc->addSelection("+0430");
174    gc->addSelection("+0500");
175    gc->addSelection("+0530");
176    gc->addSelection("+0600");
177    gc->addSelection("+0630");
178    gc->addSelection("+0700");
179    gc->addSelection("+0730");
180    gc->addSelection("+0800");
181    gc->addSelection("+0830");
182    gc->addSelection("+0900");
183    gc->addSelection("+0930");
184    gc->addSelection("+1000");
185    gc->addSelection("+1030");
186    gc->addSelection("+1100");
187    gc->addSelection("+1130");
188    gc->addSelection("+1200");
189    gc->addSelection("-1100");
190    gc->addSelection("-1030");
191    gc->addSelection("-1000");
192    gc->addSelection("-0930");
193    gc->addSelection("-0900");
194    gc->addSelection("-0830");
195    gc->addSelection("-0800");
196    gc->addSelection("-0730");
197    gc->addSelection("-0700");
198    gc->addSelection("-0630");
199    gc->addSelection("-0600");
200    gc->addSelection("-0530");
201    gc->addSelection("-0500");
202    gc->addSelection("-0430");
203    gc->addSelection("-0400");
204    gc->addSelection("-0330");
205    gc->addSelection("-0300");
206    gc->addSelection("-0230");
207    gc->addSelection("-0200");
208    gc->addSelection("-0130");
209    gc->addSelection("-0100");
210    gc->addSelection("-0030");
211    gc->setHelpText(QObject::tr("Adjust the relative timezone of the XMLTV EPG data read "
212                    "by mythfilldatabase.  'Auto' converts the XMLTV time to local time "
213                    "using your computer's timezone.  'None' ignores the "
214                    "XMLTV timezone, interpreting times as local."));
215    return gc;
216};
217
218static GlobalSpinBox *EITTransportTimeout()
219{
220    GlobalSpinBox *gc = new GlobalSpinBox("EITTransportTimeout", 1, 15, 1);
221    gc->setLabel(QObject::tr("EIT Transport Timeout (mins)"));
222    gc->setValue(5);
223    QString helpText = QObject::tr(
224        "Maximum time to spend waiting for listings data on one DTV channel "
225        "before checking for new listings data on the next channel.");
226    gc->setHelpText(helpText);
227    return gc;
228}
229
230static GlobalCheckBox *MasterBackendOverride()
231{
232    GlobalCheckBox *gc = new GlobalCheckBox("MasterBackendOverride");
233    gc->setLabel(QObject::tr("Master Backend Override"));
234    gc->setValue(true);
235    gc->setHelpText(QObject::tr("If enabled, the master backend will stream and"
236                    " delete files if it finds them in the video directory. "
237                    "Useful if you are using a central storage location, like "
238                    "a NFS share, and your slave backend isn't running."));
239    return gc;
240};
241
242static GlobalSpinBox *WOLbackendReconnectWaitTime()
243{
244    GlobalSpinBox *gc = new GlobalSpinBox("WOLbackendReconnectWaitTime", 0, 1200, 5);
245    gc->setLabel(QObject::tr("Reconnect wait time (secs)"));
246    gc->setValue(0);
247    gc->setHelpText(QObject::tr("Length of time the frontend waits between the "
248                    "tries to wake up the master backend. This should be the "
249                    "time your masterbackend needs to startup. Set 0 to "
250                    "disable."));
251    return gc;
252};
253
254static GlobalSpinBox *WOLbackendConnectRetry()
255{
256    GlobalSpinBox *gc = new GlobalSpinBox("WOLbackendConnectRetry", 1, 60, 1);
257    gc->setLabel(QObject::tr("Count of reconnect tries"));
258    gc->setHelpText(QObject::tr("Number of times the frontend will try to wake "
259                    "up the master backend."));
260    gc->setValue(5);
261    return gc;
262};
263
264static GlobalLineEdit *WOLbackendCommand()
265{
266    GlobalLineEdit *gc = new GlobalLineEdit("WOLbackendCommand");
267    gc->setLabel(QObject::tr("Wake Command"));
268    gc->setValue("");
269    gc->setHelpText(QObject::tr("The command used to wake up your master "
270                    "backend server."));
271    return gc;
272};
273
274static GlobalLineEdit *WOLslaveBackendsCommand()
275{
276    GlobalLineEdit *gc = new GlobalLineEdit("WOLslaveBackendsCommand");
277    gc->setLabel(QObject::tr("Wake command for slaves"));
278    gc->setValue("");
279    gc->setHelpText(QObject::tr("The command used to wakeup your slave "
280                    "backends. Leave empty to disable."));
281    return gc;
282};
283
284static GlobalSpinBox *idleTimeoutSecs()
285{
286    GlobalSpinBox *gc = new GlobalSpinBox("idleTimeoutSecs", 0, 1200, 5);
287    gc->setLabel(QObject::tr("Idle timeout (secs)"));
288    gc->setValue(0);
289    gc->setHelpText(QObject::tr("The amount of time the master backend idles "
290                    "before it shuts down all backends. Set to 0 to disable "
291                    "auto shutdown."));
292    return gc;
293};
294   
295static GlobalSpinBox *idleWaitForRecordingTime()
296{
297    GlobalSpinBox *gc = new GlobalSpinBox("idleWaitForRecordingTime", 0, 120, 1);
298    gc->setLabel(QObject::tr("Max. wait for recording (min)"));
299    gc->setValue(15);
300    gc->setHelpText(QObject::tr("The amount of time the master backend waits "
301                    "for a recording.  If it's idle but a recording starts "
302                    "within this time period, the backends won't shut down."));
303    return gc;
304};
305
306static GlobalSpinBox *StartupSecsBeforeRecording()
307{
308    GlobalSpinBox *gc = new GlobalSpinBox("StartupSecsBeforeRecording", 0, 1200, 5);
309    gc->setLabel(QObject::tr("Startup before rec. (secs)"));
310    gc->setValue(120);
311    gc->setHelpText(QObject::tr("The amount of time the master backend will be "
312                    "woken up before a recording starts."));
313    return gc;
314};
315
316static GlobalLineEdit *WakeupTimeFormat()
317{
318    GlobalLineEdit *gc = new GlobalLineEdit("WakeupTimeFormat");
319    gc->setLabel(QObject::tr("Wakeup time format"));
320    gc->setValue("hh:mm yyyy-MM-dd");
321    gc->setHelpText(QObject::tr("The format of the time string passed to the "
322                    "\'setWakeuptime Command\' as $time. See "
323                    "QT::QDateTime.toString() for details. Set to 'time_t' for "
324                    "seconds since epoch."));
325    return gc;
326};
327
328static GlobalLineEdit *SetWakeuptimeCommand()
329{
330    GlobalLineEdit *gc = new GlobalLineEdit("SetWakeuptimeCommand");
331    gc->setLabel(QObject::tr("Set wakeuptime command"));
332    gc->setValue("");
333    gc->setHelpText(QObject::tr("The command used to set the time (passed as "
334                    "$time) to wake up the masterbackend"));
335    return gc;
336};
337
338static GlobalLineEdit *ServerHaltCommand()
339{
340    GlobalLineEdit *gc = new GlobalLineEdit("ServerHaltCommand");
341    gc->setLabel(QObject::tr("Server halt command"));
342    gc->setValue("sudo /sbin/halt -p");
343    gc->setHelpText(QObject::tr("The command used to halt the backends."));
344    return gc;
345};
346
347static GlobalLineEdit *preSDWUCheckCommand()
348{
349    GlobalLineEdit *gc = new GlobalLineEdit("preSDWUCheckCommand");
350    gc->setLabel(QObject::tr("Pre Shutdown check-command"));
351    gc->setValue("");
352    gc->setHelpText(QObject::tr("A command executed before the backend would "
353                    "shutdown. The return value determines if "
354                    "the backend can shutdown. 0 - yes, "
355                    "1 - restart idleing, "
356                    "2 - reset the backend to wait for a frontend."));
357    return gc;
358};
359
360static GlobalCheckBox *blockSDWUwithoutClient()
361{
362    GlobalCheckBox *gc = new GlobalCheckBox("blockSDWUwithoutClient");
363    gc->setLabel(QObject::tr("Block shutdown before client connected"));
364    gc->setValue(true);
365    gc->setHelpText(QObject::tr("If set, the automatic shutdown routine will "
366                    "be disabled until a client connects."));
367    return gc;
368};
369
370static GlobalLineEdit *startupCommand()
371{
372    GlobalLineEdit *gc = new GlobalLineEdit("startupCommand");
373    gc->setLabel(QObject::tr("Startup command"));
374    gc->setValue("");
375    gc->setHelpText(QObject::tr("This command is executed right after starting "
376                    "the BE. As a parameter \'$status\' is replaced by either "
377                    "\'auto\' if the machine was started automatically or "
378                    "\'user\' if a user switched it on."));
379    return gc;
380};
381
382static HostSpinBox *JobQueueMaxSimultaneousJobs()
383{
384    HostSpinBox *gc = new HostSpinBox("JobQueueMaxSimultaneousJobs", 1, 10, 1);
385    gc->setLabel(QObject::tr("Maximum simultaneous jobs on this backend"));
386    gc->setHelpText(QObject::tr("The Job Queue will be limited to running "
387                    "this many simultaneous jobs on this backend."));
388    gc->setValue(1);
389    return gc;
390};
391
392static HostSpinBox *JobQueueCheckFrequency()
393{
394    HostSpinBox *gc = new HostSpinBox("JobQueueCheckFrequency", 5, 300, 5);
395    gc->setLabel(QObject::tr("Job Queue Check frequency (in seconds)"));
396    gc->setHelpText(QObject::tr("When looking for new jobs to process, the "
397                    "Job Queue will wait this long between checks."));
398    gc->setValue(60);
399    return gc;
400};
401
402static HostComboBox *JobQueueCPU()
403{
404    HostComboBox *gc = new HostComboBox("JobQueueCPU");
405    gc->setLabel(QObject::tr("CPU Usage"));
406    gc->addSelection(QObject::tr("Low"), "0");
407    gc->addSelection(QObject::tr("Medium"), "1");
408    gc->addSelection(QObject::tr("High"), "2");
409    gc->setHelpText(QObject::tr("This setting controls approximately how "
410                    "much CPU jobs in the queue may consume. "
411                    "On 'High', all available CPU time may be used "
412                    "which could cause problems on slower systems." ));
413    return gc;
414};
415
416static HostTimeBox *JobQueueWindowStart()
417{
418    HostTimeBox *gc = new HostTimeBox("JobQueueWindowStart", "00:00");
419    gc->setLabel(QObject::tr("Job Queue Start Time"));
420    gc->setHelpText(QObject::tr("This setting controls the start of the "
421                    "Job Queue time window which determines when new jobs will "
422                    "be started."));
423    return gc;
424};
425
426static HostTimeBox *JobQueueWindowEnd()
427{
428    HostTimeBox *gc = new HostTimeBox("JobQueueWindowEnd", "23:59");
429    gc->setLabel(QObject::tr("Job Queue End Time"));
430    gc->setHelpText(QObject::tr("This setting controls the end of the "
431                    "Job Queue time window which determines when new jobs will "
432                    "be started."));
433    return gc;
434};
435
436static GlobalCheckBox *JobsRunOnRecordHost()
437{
438    GlobalCheckBox *gc = new GlobalCheckBox("JobsRunOnRecordHost");
439    gc->setLabel(QObject::tr("Run Jobs only on original recording host"));
440    gc->setValue(false);
441    gc->setHelpText(QObject::tr("If set, jobs in the queue will be required "
442                                "to run on the backend that made the "
443                                "original recording."));
444    return gc;
445};
446
447static GlobalCheckBox *AutoTranscodeBeforeAutoCommflag()
448{
449    GlobalCheckBox *gc = new GlobalCheckBox("AutoTranscodeBeforeAutoCommflag");
450    gc->setLabel(QObject::tr("Run Transcode Jobs before Auto-Commercial Flagging"));
451    gc->setValue(false);
452    gc->setHelpText(QObject::tr("If set, if both auto-transcode and "
453                                "auto commercial flagging are turned ON for a "
454                                "recording, transcoding will run first, "
455                                "otherwise, commercial flagging runs first."));
456    return gc;
457};
458
459static GlobalCheckBox *AutoCommflagWhileRecording()
460{
461    GlobalCheckBox *gc = new GlobalCheckBox("AutoCommflagWhileRecording");
462    gc->setLabel(QObject::tr("Start Auto-Commercial Flagging jobs when the "
463                             "recording starts"));
464    gc->setValue(false);
465    gc->setHelpText(QObject::tr("If set and Auto Commercial Flagging is ON for "
466                                "a recording, the flagging job will be started "
467                                "as soon as the recording starts.  NOT "
468                                "recommended on underpowered systems."));
469    return gc;
470};
471
472static GlobalLineEdit *UserJobDesc1()
473{
474    GlobalLineEdit *gc = new GlobalLineEdit("UserJobDesc1");
475    gc->setLabel(QObject::tr("User Job #1 Description"));
476    gc->setValue("User Job #1");
477    gc->setHelpText(QObject::tr("The Description for this User Job."));
478    return gc;
479};
480
481static GlobalLineEdit *UserJob1()
482{
483    GlobalLineEdit *gc = new GlobalLineEdit("UserJob1");
484    gc->setLabel(QObject::tr("User Job #1 Command"));
485    gc->setValue("");
486    gc->setHelpText(QObject::tr("The command to run whenever this User Job "
487                    "number is scheduled."));
488    return gc;
489};
490
491static GlobalLineEdit *UserJobDesc2()
492{
493    GlobalLineEdit *gc = new GlobalLineEdit("UserJobDesc2");
494    gc->setLabel(QObject::tr("User Job #2 Description"));
495    gc->setValue("User Job #2");
496    gc->setHelpText(QObject::tr("The Description for this User Job."));
497    return gc;
498};
499
500static GlobalLineEdit *UserJob2()
501{
502    GlobalLineEdit *gc = new GlobalLineEdit("UserJob2");
503    gc->setLabel(QObject::tr("User Job #2 Command"));
504    gc->setValue("");
505    gc->setHelpText(QObject::tr("The command to run whenever this User Job "
506                    "number is scheduled."));
507    return gc;
508};
509
510static GlobalLineEdit *UserJobDesc3()
511{
512    GlobalLineEdit *gc = new GlobalLineEdit("UserJobDesc3");
513    gc->setLabel(QObject::tr("User Job #3 Description"));
514    gc->setValue("User Job #3");
515    gc->setHelpText(QObject::tr("The Description for this User Job."));
516    return gc;
517};
518
519static GlobalLineEdit *UserJob3()
520{
521    GlobalLineEdit *gc = new GlobalLineEdit("UserJob3");
522    gc->setLabel(QObject::tr("User Job #3 Command"));
523    gc->setValue("");
524    gc->setHelpText(QObject::tr("The command to run whenever this User Job "
525                    "number is scheduled."));
526    return gc;
527};
528
529static GlobalLineEdit *UserJobDesc4()
530{
531    GlobalLineEdit *gc = new GlobalLineEdit("UserJobDesc4");
532    gc->setLabel(QObject::tr("User Job #4 Description"));
533    gc->setValue("User Job #4");
534    gc->setHelpText(QObject::tr("The Description for this User Job."));
535    return gc;
536};
537
538static GlobalLineEdit *UserJob4()
539{
540    GlobalLineEdit *gc = new GlobalLineEdit("UserJob4");
541    gc->setLabel(QObject::tr("User Job #4 Command"));
542    gc->setValue("");
543    gc->setHelpText(QObject::tr("The command to run whenever this User Job "
544                    "number is scheduled."));
545    return gc;
546};
547
548static HostCheckBox *JobAllowCommFlag()
549{
550    HostCheckBox *gc = new HostCheckBox("JobAllowCommFlag");
551    gc->setLabel(QObject::tr("Allow Commercial Detection jobs"));
552    gc->setValue(true);
553    gc->setHelpText(QObject::tr("Allow jobs of this type to run on this "
554                                "backend."));
555    return gc;
556};
557
558static HostCheckBox *JobAllowTranscode()
559{
560    HostCheckBox *gc = new HostCheckBox("JobAllowTranscode");
561    gc->setLabel(QObject::tr("Allow Transcoding jobs"));
562    gc->setValue(true);
563    gc->setHelpText(QObject::tr("Allow jobs of this type to run on this "
564                                "backend."));
565    return gc;
566};
567
568static HostCheckBox *JobAllowUserJob1()
569{
570    HostCheckBox *gc = new HostCheckBox("JobAllowUserJob1");
571    gc->setLabel(QObject::tr("Allow 'User Job #1' jobs"));
572    gc->setValue(false);
573    gc->setHelpText(QObject::tr("Allow jobs of this type to run on this "
574                                "backend."));
575    return gc;
576};
577
578static HostCheckBox *JobAllowUserJob2()
579{
580    HostCheckBox *gc = new HostCheckBox("JobAllowUserJob2");
581    gc->setLabel(QObject::tr("Allow 'User Job #2' jobs"));
582    gc->setValue(false);
583    gc->setHelpText(QObject::tr("Allow jobs of this type to run on this "
584                                "backend."));
585    return gc;
586};
587
588static HostCheckBox *JobAllowUserJob3()
589{
590    HostCheckBox *gc = new HostCheckBox("JobAllowUserJob3");
591    gc->setLabel(QObject::tr("Allow 'User Job #3' jobs"));
592    gc->setValue(false);
593    gc->setHelpText(QObject::tr("Allow jobs of this type to run on this "
594                                "backend."));
595    return gc;
596};
597
598static HostCheckBox *JobAllowUserJob4()
599{
600    HostCheckBox *gc = new HostCheckBox("JobAllowUserJob4");
601    gc->setLabel(QObject::tr("Allow 'User Job #4' jobs"));
602    gc->setValue(false);
603    gc->setHelpText(QObject::tr("Allow jobs of this type to run on this "
604                                "backend."));
605    return gc;
606};
607
608
609BackendSettings::BackendSettings() {
610    VerticalConfigurationGroup* server = new VerticalConfigurationGroup(false);
611    server->setLabel(QObject::tr("Host Address Backend Setup"));
612    server->addChild(LocalServerIP());
613    server->addChild(LocalServerPort());
614    server->addChild(LocalStatusPort());
615    server->addChild(MasterServerIP());
616    server->addChild(MasterServerPort());
617    addChild(server);
618
619    VerticalConfigurationGroup* group1 = new VerticalConfigurationGroup(false);
620    group1->setLabel(QObject::tr("Host-specific Backend Setup"));
621    group1->addChild(RecordFilePrefix());
622    group1->addChild(SaveTranscoding());
623    addChild(group1);
624
625    VerticalConfigurationGroup* group2 = new VerticalConfigurationGroup(false);
626    group2->setLabel(QObject::tr("Global Backend Setup"));
627    group2->addChild(TVFormat());
628    group2->addChild(VbiFormat());
629    group2->addChild(FreqTable());
630    group2->addChild(TimeOffset());
631    group2->addChild(EITTransportTimeout());
632    group2->addChild(MasterBackendOverride());
633    group2->addChild(DeletesFollowLinks());
634    addChild(group2);
635
636    VerticalConfigurationGroup* group3 = new VerticalConfigurationGroup(false);
637    group3->setLabel(QObject::tr("Shutdown/Wakeup Options"));
638    group3->addChild(startupCommand());
639    group3->addChild(blockSDWUwithoutClient());
640    group3->addChild(idleTimeoutSecs());
641    group3->addChild(idleWaitForRecordingTime());
642    group3->addChild(StartupSecsBeforeRecording());
643    group3->addChild(WakeupTimeFormat());
644    group3->addChild(SetWakeuptimeCommand());
645    group3->addChild(ServerHaltCommand());
646    group3->addChild(preSDWUCheckCommand());
647    addChild(group3);   
648
649    VerticalConfigurationGroup* group4 = new VerticalConfigurationGroup(false);
650    group4->setLabel(QObject::tr("WakeOnLan settings"));
651
652    VerticalConfigurationGroup* backend = new VerticalConfigurationGroup();
653    backend->setLabel(QObject::tr("MasterBackend"));
654    backend->addChild(WOLbackendReconnectWaitTime());
655    backend->addChild(WOLbackendConnectRetry());
656    backend->addChild(WOLbackendCommand());
657    group4->addChild(backend);
658   
659    group4->addChild(WOLslaveBackendsCommand());
660    addChild(group4);
661
662    VerticalConfigurationGroup* group5 = new VerticalConfigurationGroup(false);
663    group5->setLabel(QObject::tr("Job Queue (Host-Specific)"));
664    group5->addChild(JobQueueMaxSimultaneousJobs());
665    group5->addChild(JobQueueCheckFrequency());
666
667    HorizontalConfigurationGroup* group5a =
668              new HorizontalConfigurationGroup(false, false);
669    VerticalConfigurationGroup* group5a1 =
670              new VerticalConfigurationGroup(false, false);
671    group5a1->addChild(JobQueueWindowStart());
672    group5a1->addChild(JobQueueWindowEnd());
673    group5a1->addChild(JobQueueCPU());
674    group5a1->addChild(JobAllowCommFlag());
675    group5a1->addChild(JobAllowTranscode());
676    group5a->addChild(group5a1);
677
678    VerticalConfigurationGroup* group5a2 =
679            new VerticalConfigurationGroup(false, false);
680    group5a2->addChild(JobAllowUserJob1());
681    group5a2->addChild(JobAllowUserJob2());
682    group5a2->addChild(JobAllowUserJob3());
683    group5a2->addChild(JobAllowUserJob4());
684    group5a->addChild(group5a2);
685    group5->addChild(group5a);
686    addChild(group5);   
687
688    VerticalConfigurationGroup* group6 = new VerticalConfigurationGroup(false);
689    group6->setLabel(QObject::tr("Job Queue (Global)"));
690    group6->addChild(JobsRunOnRecordHost());
691    group6->addChild(AutoTranscodeBeforeAutoCommflag());
692    group6->addChild(AutoCommflagWhileRecording());
693    addChild(group6);   
694
695    VerticalConfigurationGroup* group7 = new VerticalConfigurationGroup(false);
696    group7->setLabel(QObject::tr("Job Queue (Job Commands)"));
697    group7->addChild(UserJobDesc1());
698    group7->addChild(UserJob1());
699    group7->addChild(UserJobDesc2());
700    group7->addChild(UserJob2());
701    group7->addChild(UserJobDesc3());
702    group7->addChild(UserJob3());
703    group7->addChild(UserJobDesc4());
704    group7->addChild(UserJob4());
705    addChild(group7);   
706}