~swag/armagetronad/0.2.9-sty+ct+ap-fork

« back to all changes in this revision

Viewing changes to src/tools/tConfiguration.cpp

  • Committer: SwagTron
  • Date: 2019-03-05 07:13:03 UTC
  • Revision ID: swagtron-20190305071303-5m4cn9hs6h8ydsgf
- Ported toggle from 0.4. Seems kind of hacky. Had to add another FindConfigItem of type tConfItemBase due to tab completion using the previous tString function. Plan to change this later, but I really needed the toggle function. Tried to cast the two, but that did not work out. Seemed like the bug-less option for the time being. Those unfamiliar with this function, you can now toggle boolean commands (Ex. toggle text_out)

Show diffs side-by-side

added added

removed removed

Lines of Context:
150
150
bool           tConfItemBase::printChange=true;
151
151
bool           tConfItemBase::printErrors=true;
152
152
 
 
153
//Stolen from 0.4. Allows you to toggle boolean commands.
 
154
static void st_ToggleConfigItem( std::istream & s )
 
155
{
 
156
    tString name;
 
157
    s >> name;
 
158
 
 
159
    if ( name.Size() == 0 )
 
160
    {
 
161
        con << tOutput( "$toggle_usage_error" );
 
162
        return;
 
163
    }
 
164
 
 
165
    tConfItemBase *base = tConfItemBase::FindConfigItem2( name );
 
166
 
 
167
    if ( !base )
 
168
    {
 
169
        con << tOutput( "$config_command_unknown", name );
 
170
        return;
 
171
    }
 
172
 
 
173
    tConfItem< bool > *confItem = dynamic_cast< tConfItem< bool > * >( base );
 
174
    if ( confItem && confItem->Writable() )
 
175
    {
 
176
        confItem->SetVal( !*confItem->GetTarget() );
 
177
    }
 
178
    else
 
179
    {
 
180
        con << tOutput( "$toggle_invalid_config_item", name );
 
181
    }
 
182
}
 
183
 
 
184
static tConfItemFunc toggleConfItemFunc( "TOGGLE", st_ToggleConfigItem );
 
185
 
153
186
 
154
187
//! @param newLevel         the new access level to set over the course of the lifetime of this object
155
188
//! @param allowElevation   only if set to true, getting higher access rights is possible. Use with extreme care.
293
326
                if(printChange)
294
327
                {
295
328
                    con << tOutput( "$access_level_change", name, tCurrentAccessLevel::GetName( ci->requiredLevel ) , tCurrentAccessLevel::GetName( level ) );
296
 
                }
 
329
                }
297
330
                ci->requiredLevel = level;
298
331
            }
299
332
        }
306
339
    virtual void WriteVal(std::ostream &s)
307
340
    {
308
341
        tASSERT(0);
309
 
    }
310
 
 
 
342
    }
 
343
 
311
344
    virtual void FetchVal(tString &val){};
312
345
 
313
346
    virtual bool Writable(){
380
413
    virtual void WriteVal(std::ostream &s)
381
414
    {
382
415
        tASSERT(0);
383
 
    }
384
 
 
 
416
    }
 
417
 
385
418
    virtual void FetchVal(tString &val){};
386
419
 
387
420
    virtual bool Writable(){
466
499
        delete st_confMap;
467
500
        st_confMap = 0;
468
501
    }
469
 
}
470
 
 
471
 
void tConfItemBase::ExportAll(){
472
 
    SaveAll(std::cout, true);
 
502
}
 
503
 
 
504
void tConfItemBase::ExportAll(){
 
505
    SaveAll(std::cout, true);
473
506
}
474
507
 
475
508
void tConfItemBase::SaveAll(std::ostream &s, bool all){
528
561
            tConfItemBase * ci = (*iter).second;
529
562
 
530
563
            bool cb=ci->changed;
531
 
            ci->changed=false;
532
 
 
533
 
#ifdef DEBUG
534
 
            con << "Current level: " << tCurrentAccessLevel::GetAccessLevel() << "\n";
535
 
            con << "Required level: " << ci->requiredLevel << "\n";
536
 
#endif
 
564
            ci->changed=false;
 
565
 
 
566
#ifdef DEBUG
 
567
            con << "Current level: " << tCurrentAccessLevel::GetAccessLevel() << "\n";
 
568
            con << "Required level: " << ci->requiredLevel << "\n";
 
569
#endif
537
570
 
538
571
            if ( ci->requiredLevel >= tCurrentAccessLevel::GetAccessLevel() )
539
572
            {
624
657
    }
625
658
 
626
659
    //  std::cout << line << " lines read.\n";
627
 
}
628
 
 
629
 
tString tConfItemBase::FindConfigItem(tString name)
630
 
{
631
 
    tConfItemMap & confmap = ConfItemMap();
632
 
    for(tConfItemMap::iterator iter = confmap.begin(); iter != confmap.end() ; ++iter)
633
 
    {
634
 
        tConfItemBase * ci = (*iter).second;
635
 
        tString command;
636
 
        command << ci->title.ToLower();
637
 
        if (command.Contains(name.ToLower()))
638
 
        {
639
 
            if (command.StartsWith(name.ToLower()))
640
 
            {
641
 
                return ci->title;
642
 
            }
643
 
        }
644
 
    }
645
 
    return tString("");
646
 
}
647
 
 
648
 
/** LISTING BEGIN **/
649
 
// writes the list of all commands and their help to config_all.cfg in the var directory
650
 
void tConfItemBase::WriteAllToFile()
651
 
{
652
 
    tConfItemMap & confmap = ConfItemMap();
653
 
    int sim_maxlen = -1;
654
 
 
 
660
}
 
661
 
 
662
//Stolen from 0.4. Needed for "TOGGLE" function. 
 
663
tConfItemBase *tConfItemBase::FindConfigItem2(tString const &name) {
 
664
    tConfItemMap & confmap = ConfItemMap();
 
665
    tConfItemMap::iterator iter = confmap.find( name.ToUpper() );
 
666
    if ( iter != confmap.end() ) {
 
667
        return iter->second;
 
668
    } else {
 
669
        return 0;
 
670
    }
 
671
}
 
672
 
 
673
tString tConfItemBase::FindConfigItem(tString name)
 
674
{
 
675
    tConfItemMap & confmap = ConfItemMap();
 
676
    for(tConfItemMap::iterator iter = confmap.begin(); iter != confmap.end() ; ++iter)
 
677
    {
 
678
        tConfItemBase * ci = (*iter).second;
 
679
        tString command;
 
680
        command << ci->title.ToLower();
 
681
        if (command.Contains(name.ToLower()))
 
682
        {
 
683
            if (command.StartsWith(name.ToLower()))
 
684
            {
 
685
                return ci->title;
 
686
            }
 
687
        }
 
688
    }
 
689
    return tString("");
 
690
}
 
691
 
 
692
/** LISTING BEGIN **/
 
693
// writes the list of all commands and their help to config_all.cfg in the var directory
 
694
void tConfItemBase::WriteAllToFile()
 
695
{
 
696
    tConfItemMap & confmap = ConfItemMap();
 
697
    int sim_maxlen = -1;
 
698
 
655
699
    for(tConfItemMap::iterator iter = confmap.begin(); iter != confmap.end() ; ++iter)
656
700
    {
657
701
        tConfItemBase * ci = (*iter).second;
658
702
        if (static_cast<int>(strlen(ci->title)) > sim_maxlen)
659
703
            sim_maxlen = strlen(ci->title);
660
 
    }
661
 
 
 
704
    }
 
705
 
662
706
    std::ofstream w;
663
 
    if ( tDirectories::Var().Open(w, "config_all.cfg"))
664
 
    {
665
 
        /*w << "{| border=\"2\" cellspacing=\"0\" cellpadding=\"4\" rules=\"all\" style=\"margin:1em 1em 1em 0; border:solid 1px #AAAAAA; border-collapse:collapse; background-color:#F9F9F9; font-size:95%; empty-cells:show;\"\n";
666
 
        w << "!Command\n";
667
 
        w << "!Default\n";
668
 
        w << "!Meaning\n";
669
 
        w << "|-\n";
670
 
        */
 
707
    if ( tDirectories::Var().Open(w, "config_all.cfg"))
 
708
    {
 
709
        /*w << "{| border=\"2\" cellspacing=\"0\" cellpadding=\"4\" rules=\"all\" style=\"margin:1em 1em 1em 0; border:solid 1px #AAAAAA; border-collapse:collapse; background-color:#F9F9F9; font-size:95%; empty-cells:show;\"\n";
 
710
        w << "!Command\n";
 
711
        w << "!Default\n";
 
712
        w << "!Meaning\n";
 
713
        w << "|-\n";
 
714
        */
671
715
        for(tConfItemMap::iterator iter = confmap.begin(); iter != confmap.end() ; ++iter)
672
716
        {
673
717
            tConfItemBase * ci = (*iter).second;
674
 
            tString help ( ci->help );
675
 
 
676
 
            tString mess, value;
677
 
 
678
 
            //  fetch the value set for this setting.
679
 
            ci->FetchVal(value);
680
 
 
681
 
            mess << ci->title << " ";
682
 
 
683
 
            mess.SetPos( sim_maxlen+2, false );
 
718
            tString help ( ci->help );
 
719
 
 
720
            tString mess, value;
 
721
 
 
722
            //  fetch the value set for this setting.
 
723
            ci->FetchVal(value);
 
724
 
 
725
            mess << ci->title << " ";
 
726
 
 
727
            mess.SetPos( sim_maxlen+2, false );
684
728
            mess << value << " ";
685
729
            mess << " # ";
686
730
            mess << help;
687
 
            mess << "\n";
 
731
            mess << "\n";
688
732
 
689
 
            w << mess;
690
 
            /*w << "| " << ci->title << " || " << value << " || " << help << "\n";
 
733
            w << mess;
 
734
            /*w << "| " << ci->title << " || " << value << " || " << help << "\n";
691
735
            w << "|-\n";*/
692
 
        }
693
 
        //w << "|}\n";
694
 
    }
695
 
    w.close();
696
 
}
697
 
 
698
 
static void sg_ListAllCommands(std::istream &s)
699
 
{
700
 
    tConfItemBase::WriteAllToFile();
701
 
}
702
 
static tConfItemFunc sg_ListAllCommandsConf("LIST_ALL_COMMANDS", &sg_ListAllCommands);
703
 
 
704
 
/** LISTING END **/
705
 
 
706
 
/** LISTING ACCESS_LEVEL BEGIN **/
707
 
// writes the list of all commands and their help to config_all_levels.cfg in the var directory
708
 
void tConfItemBase::WriteAllLevelsToFile()
709
 
{
710
 
    tConfItemMap & confmap = ConfItemMap();
711
 
    int sim_maxlen = -1;
712
 
 
 
736
        }
 
737
        //w << "|}\n";
 
738
    }
 
739
    w.close();
 
740
}
 
741
 
 
742
static void sg_ListAllCommands(std::istream &s)
 
743
{
 
744
    tConfItemBase::WriteAllToFile();
 
745
}
 
746
static tConfItemFunc sg_ListAllCommandsConf("LIST_ALL_COMMANDS", &sg_ListAllCommands);
 
747
 
 
748
/** LISTING END **/
 
749
 
 
750
/** LISTING ACCESS_LEVEL BEGIN **/
 
751
// writes the list of all commands and their help to config_all_levels.cfg in the var directory
 
752
void tConfItemBase::WriteAllLevelsToFile()
 
753
{
 
754
    tConfItemMap & confmap = ConfItemMap();
 
755
    int sim_maxlen = -1;
 
756
 
713
757
    for(tConfItemMap::iterator iter = confmap.begin(); iter != confmap.end() ; ++iter)
714
758
    {
715
759
        tConfItemBase * ci = (*iter).second;
716
760
        if (static_cast<int>(strlen(ci->title)) > sim_maxlen)
717
761
            sim_maxlen = strlen(ci->title);
718
 
    }
719
 
 
 
762
    }
 
763
 
720
764
    std::ofstream w;
721
 
    if ( tDirectories::Var().Open(w, "config_all_levels.cfg"))
722
 
    {
 
765
    if ( tDirectories::Var().Open(w, "config_all_levels.cfg"))
 
766
    {
723
767
        for(tConfItemMap::iterator iter = confmap.begin(); iter != confmap.end() ; ++iter)
724
768
        {
725
769
            tConfItemBase * ci = (*iter).second;
726
 
            tString help ( ci->help );
727
 
 
728
 
            tString mess;
729
 
 
 
770
            tString help ( ci->help );
 
771
 
 
772
            tString mess;
 
773
 
730
774
            mess << "ACCESS_LEVEL ";
731
 
            mess << ci->title << " ";
 
775
            mess << ci->title << " ";
732
776
 
733
 
            //mess.SetPos( sim_maxlen+2, false );
734
 
            mess << ci->requiredLevel;
 
777
            //mess.SetPos( sim_maxlen+2, false );
 
778
            mess << ci->requiredLevel;
735
779
            mess.SetPos( sim_maxlen+5, false );
736
780
            mess << " # ";
737
781
            mess << help;
738
 
            mess << "\n";
 
782
            mess << "\n";
739
783
 
740
784
            w << mess;
741
 
        }
742
 
    }
743
 
    w.close();
744
 
}
745
 
 
746
 
static void sg_ListAllCommandsLevels(std::istream &s)
747
 
{
748
 
    tConfItemBase::WriteAllLevelsToFile();
749
 
}
750
 
static tConfItemFunc sg_ListAllCommandsLevelsConf("LIST_ALL_COMMANDS_LEVELS", &sg_ListAllCommandsLevels);
751
 
 
752
 
/** LISTING ACCESS_LEVEL END **/
753
 
 
754
 
/** SET ALL ACCESS_LEVEL BEGIN **/
755
 
void tConfItemBase::SetAllAccessLevel(int newLevel)
756
 
{
757
 
    tConfItemMap & confmap = ConfItemMap();
758
 
    tAccessLevel level = static_cast< tAccessLevel >( newLevel );
759
 
 
760
 
    for(tConfItemMap::iterator iter = confmap.begin(); iter != confmap.end() ; ++iter)
761
 
    {
762
 
        tConfItemBase * ci = (*iter).second;
763
 
        ci->requiredLevel = level;
764
 
    }
765
 
 
766
 
    tString message;
767
 
    message << "All access levels of commands have been changed to " << tCurrentAccessLevel::GetName(level) << "!\n";
768
 
    con << message;
769
 
}
770
 
 
771
 
static void st_SetCommandsAccessLevel(std::istream &s)
772
 
{
773
 
    tString levelStr;
774
 
    s >> levelStr;
775
 
 
776
 
    int newLevel = atoi(levelStr);
777
 
    tConfItemBase::SetAllAccessLevel(newLevel);
778
 
}
779
 
static tConfItemFunc st_SetCommandsAccessLevelConf("SET_COMMANDS_ACCESSLEVEL", &st_SetCommandsAccessLevel);
780
 
/** SET ALL ACCESS_LEVEL END **/
781
 
 
782
 
void tConfItemBase::WriteChangedToFile()
783
 
{
784
 
    tConfItemMap & confmap = ConfItemMap();
785
 
    int sim_maxlen = -1;
786
 
 
 
785
        }
 
786
    }
 
787
    w.close();
 
788
}
 
789
 
 
790
static void sg_ListAllCommandsLevels(std::istream &s)
 
791
{
 
792
    tConfItemBase::WriteAllLevelsToFile();
 
793
}
 
794
static tConfItemFunc sg_ListAllCommandsLevelsConf("LIST_ALL_COMMANDS_LEVELS", &sg_ListAllCommandsLevels);
 
795
 
 
796
/** LISTING ACCESS_LEVEL END **/
 
797
 
 
798
/** SET ALL ACCESS_LEVEL BEGIN **/
 
799
void tConfItemBase::SetAllAccessLevel(int newLevel)
 
800
{
 
801
    tConfItemMap & confmap = ConfItemMap();
 
802
    tAccessLevel level = static_cast< tAccessLevel >( newLevel );
 
803
 
 
804
    for(tConfItemMap::iterator iter = confmap.begin(); iter != confmap.end() ; ++iter)
 
805
    {
 
806
        tConfItemBase * ci = (*iter).second;
 
807
        ci->requiredLevel = level;
 
808
    }
 
809
 
 
810
    tString message;
 
811
    message << "All access levels of commands have been changed to " << tCurrentAccessLevel::GetName(level) << "!\n";
 
812
    con << message;
 
813
}
 
814
 
 
815
static void st_SetCommandsAccessLevel(std::istream &s)
 
816
{
 
817
    tString levelStr;
 
818
    s >> levelStr;
 
819
 
 
820
    int newLevel = atoi(levelStr);
 
821
    tConfItemBase::SetAllAccessLevel(newLevel);
 
822
}
 
823
static tConfItemFunc st_SetCommandsAccessLevelConf("SET_COMMANDS_ACCESSLEVEL", &st_SetCommandsAccessLevel);
 
824
/** SET ALL ACCESS_LEVEL END **/
 
825
 
 
826
void tConfItemBase::WriteChangedToFile()
 
827
{
 
828
    tConfItemMap & confmap = ConfItemMap();
 
829
    int sim_maxlen = -1;
 
830
 
787
831
    for(tConfItemMap::iterator iter = confmap.begin(); iter != confmap.end() ; ++iter)
788
832
    {
789
833
        tConfItemBase * ci = (*iter).second;
790
834
        if (static_cast<int>(strlen(ci->title)) > sim_maxlen)
791
835
            sim_maxlen = strlen(ci->title);
792
 
    }
793
 
 
 
836
    }
 
837
 
794
838
    std::ofstream w;
795
 
    if ( tDirectories::Var().Open(w, "config_changed.cfg"))
796
 
    {
 
839
    if ( tDirectories::Var().Open(w, "config_changed.cfg"))
 
840
    {
797
841
        for(tConfItemMap::iterator iter = confmap.begin(); iter != confmap.end() ; ++iter)
798
842
        {
799
 
            tConfItemBase * ci = (*iter).second;
800
 
            if (!ci->changed) continue;
801
 
 
802
 
            tString help ( ci->help );
803
 
 
804
 
            tString mess, value;
805
 
 
806
 
            //  fetch the value set for this setting.
807
 
            ci->FetchVal(value);
808
 
 
809
 
            mess << ci->title << " ";
810
 
 
811
 
            mess.SetPos( sim_maxlen+2, false );
 
843
            tConfItemBase * ci = (*iter).second;
 
844
            if (!ci->changed) continue;
 
845
 
 
846
            tString help ( ci->help );
 
847
 
 
848
            tString mess, value;
 
849
 
 
850
            //  fetch the value set for this setting.
 
851
            ci->FetchVal(value);
 
852
 
 
853
            mess << ci->title << " ";
 
854
 
 
855
            mess.SetPos( sim_maxlen+2, false );
812
856
            mess << value << " ";
813
857
            mess << " # ";
814
858
            mess << help;
815
 
            mess << "\n";
 
859
            mess << "\n";
816
860
 
817
861
            w << mess;
818
 
        }
819
 
    }
820
 
    w.close();
821
 
}
822
 
 
823
 
void tConfItemBase::DownloadSettings_Go(nMessage &m)
824
 
{
825
 
    //  download the config if this is a client
826
 
    if (sn_GetNetState() == nCLIENT)
827
 
    {
828
 
        tString m_title;
829
 
        m >> m_title;
830
 
        if ((m_title == "DOWNLOAD_BEGIN") && m.End())
831
 
        {
832
 
            con << "Downloading config from server...\n";
833
 
 
834
 
            //  truncate the file for fresh settings
835
 
            std::ofstream o;
836
 
            if ( tDirectories::Var().Open(o, "server_settings.cfg", std::ios::trunc) ) {}
837
 
            o.close();
838
 
            return;
839
 
        }
840
 
        else if ((m_title == "DOWNLOAD_END") && m.End())
841
 
        {
842
 
            con << "Download complete!\n";
843
 
            return;
844
 
        }
845
 
        tString m_value;
846
 
        m >> m_value;
847
 
 
848
 
        std::ofstream o;
849
 
        if (tDirectories::Var().Open(o, "server_settings.cfg", std::ios::app))
850
 
        {
851
 
            o << m_title << " " << m_value << "\n";
852
 
        }
853
 
        o.close();
854
 
    }
855
 
}
856
 
 
857
 
static nDescriptor downloadSettings(61,tConfItemBase::DownloadSettings_Go, "download settings");
858
 
 
859
 
void tConfItemBase::DownloadSettings_To(int peer)
860
 
{
861
 
    //  transfer the settings to the requested client
862
 
    //  Client ID must be greater than 0 for it to work
863
 
    if ((sn_GetNetState() == nSERVER) && (peer > 0))
864
 
    {
865
 
        {
 
862
        }
 
863
    }
 
864
    w.close();
 
865
}
 
866
 
 
867
void tConfItemBase::DownloadSettings_Go(nMessage &m)
 
868
{
 
869
    //  download the config if this is a client
 
870
    if (sn_GetNetState() == nCLIENT)
 
871
    {
 
872
        tString m_title;
 
873
        m >> m_title;
 
874
        if ((m_title == "DOWNLOAD_BEGIN") && m.End())
 
875
        {
 
876
            con << "Downloading config from server...\n";
 
877
 
 
878
            //  truncate the file for fresh settings
 
879
            std::ofstream o;
 
880
            if ( tDirectories::Var().Open(o, "server_settings.cfg", std::ios::trunc) ) {}
 
881
            o.close();
 
882
            return;
 
883
        }
 
884
        else if ((m_title == "DOWNLOAD_END") && m.End())
 
885
        {
 
886
            con << "Download complete!\n";
 
887
            return;
 
888
        }
 
889
        tString m_value;
 
890
        m >> m_value;
 
891
 
 
892
        std::ofstream o;
 
893
        if (tDirectories::Var().Open(o, "server_settings.cfg", std::ios::app))
 
894
        {
 
895
            o << m_title << " " << m_value << "\n";
 
896
        }
 
897
        o.close();
 
898
    }
 
899
}
 
900
 
 
901
static nDescriptor downloadSettings(61,tConfItemBase::DownloadSettings_Go, "download settings");
 
902
 
 
903
void tConfItemBase::DownloadSettings_To(int peer)
 
904
{
 
905
    //  transfer the settings to the requested client
 
906
    //  Client ID must be greater than 0 for it to work
 
907
    if ((sn_GetNetState() == nSERVER) && (peer > 0))
 
908
    {
 
909
        {
866
910
            nMessage *m=new nMessage(downloadSettings);
867
 
            *m << tString("DOWNLOAD_BEGIN");
868
 
            m->Send(peer);
869
 
        }
 
911
            *m << tString("DOWNLOAD_BEGIN");
 
912
            m->Send(peer);
 
913
        }
870
914
 
871
915
        tConfItemMap & confmap = ConfItemMap();
872
916
        for(tConfItemMap::iterator iter = confmap.begin(); iter != confmap.end() ; ++iter)
873
917
        {
874
 
            tConfItemBase * item = (*iter).second;
875
 
            if (item && item->CanSave())
 
918
            tConfItemBase * item = (*iter).second;
 
919
            if (item && item->CanSave())
876
920
            {
877
921
                nMessage *m=new nMessage(downloadSettings);
878
 
                *m << item->title;
879
 
 
880
 
                tString value;
881
 
                item->FetchVal(value);
882
 
                *m << value;
883
 
 
884
 
                m->Send(peer);
 
922
                *m << item->title;
 
923
 
 
924
                tString value;
 
925
                item->FetchVal(value);
 
926
                *m << value;
 
927
 
 
928
                m->Send(peer);
885
929
            }
886
 
        }
887
 
 
888
 
        {
 
930
        }
 
931
 
 
932
        {
889
933
            nMessage *m=new nMessage(downloadSettings);
890
 
            *m << tString("DOWNLOAD_END");
891
 
            m->Send(peer);
892
 
        }
893
 
    }
894
 
}
895
 
 
896
 
tString configFileDownload("");
897
 
void tConfItemBase::DownloadConfig_Go(nMessage &m)
898
 
{
899
 
    //  download the config if this is a client
900
 
    if (sn_GetNetState() == nCLIENT)
901
 
    {
902
 
        tString c_line;
903
 
        m >> c_line;
904
 
        if ((c_line == "DOWNLOAD_BEGIN") && !m.End())
905
 
        {
906
 
            m >> configFileDownload;
907
 
            con << "Downloading \"" << configFileDownload << "\" from server...\n";
908
 
 
909
 
            //  truncate the file for fresh settings
910
 
            std::ofstream o;
911
 
            tString configFile;
912
 
            configFile << "public/" << configFileDownload;
913
 
            if ( tDirectories::Config().Open(o, configFile, std::ios::trunc) ) {}
914
 
            o.close();
915
 
            return;
916
 
        }
917
 
        else if ((c_line == "DOWNLOAD_END") && m.End())
918
 
        {
919
 
            con << "Download complete!\n";
920
 
            configFileDownload = "";
921
 
            return;
922
 
        }
923
 
 
924
 
        if (configFileDownload == "") return;
925
 
 
926
 
        std::ofstream o;
927
 
        tString configFile;
928
 
        configFile << "public/" << configFileDownload;
929
 
        if (tDirectories::Config().Open(o, configFile, std::ios::app))
930
 
        {
931
 
            o << c_line << "\n";
932
 
        }
933
 
        o.close();
934
 
    }
935
 
}
936
 
 
937
 
static nDescriptor downloadConfigs(62,tConfItemBase::DownloadConfig_Go, "download config");
938
 
 
939
 
bool st_downloadConfigProcess = false;
940
 
void tConfItemBase::DownloadConfig_To(tString file, int peer)
941
 
{
942
 
    //  don't process if its under process
943
 
    if (st_downloadConfigProcess) return;
944
 
    st_downloadConfigProcess = true;
945
 
 
 
934
            *m << tString("DOWNLOAD_END");
 
935
            m->Send(peer);
 
936
        }
 
937
    }
 
938
}
 
939
 
 
940
tString configFileDownload("");
 
941
void tConfItemBase::DownloadConfig_Go(nMessage &m)
 
942
{
 
943
    //  download the config if this is a client
 
944
    if (sn_GetNetState() == nCLIENT)
 
945
    {
 
946
        tString c_line;
 
947
        m >> c_line;
 
948
        if ((c_line == "DOWNLOAD_BEGIN") && !m.End())
 
949
        {
 
950
            m >> configFileDownload;
 
951
            con << "Downloading \"" << configFileDownload << "\" from server...\n";
 
952
 
 
953
            //  truncate the file for fresh settings
 
954
            std::ofstream o;
 
955
            tString configFile;
 
956
            configFile << "public/" << configFileDownload;
 
957
            if ( tDirectories::Config().Open(o, configFile, std::ios::trunc) ) {}
 
958
            o.close();
 
959
            return;
 
960
        }
 
961
        else if ((c_line == "DOWNLOAD_END") && m.End())
 
962
        {
 
963
            con << "Download complete!\n";
 
964
            configFileDownload = "";
 
965
            return;
 
966
        }
 
967
 
 
968
        if (configFileDownload == "") return;
 
969
 
 
970
        std::ofstream o;
 
971
        tString configFile;
 
972
        configFile << "public/" << configFileDownload;
 
973
        if (tDirectories::Config().Open(o, configFile, std::ios::app))
 
974
        {
 
975
            o << c_line << "\n";
 
976
        }
 
977
        o.close();
 
978
    }
 
979
}
 
980
 
 
981
static nDescriptor downloadConfigs(62,tConfItemBase::DownloadConfig_Go, "download config");
 
982
 
 
983
bool st_downloadConfigProcess = false;
 
984
void tConfItemBase::DownloadConfig_To(tString file, int peer)
 
985
{
 
986
    //  don't process if its under process
 
987
    if (st_downloadConfigProcess) return;
 
988
    st_downloadConfigProcess = true;
 
989
 
946
990
    // refuse to load illegal paths
947
991
    if( !tPath::IsValidPath( file ) )
948
 
        return;
949
 
 
950
 
    nMessage *m = NULL;
951
 
 
952
 
    std::ifstream i;
953
 
    tString configFile;
954
 
    configFile << "public/" << file;
955
 
 
956
 
    //  transfer the settings from config to the client
957
 
    //  Client ID must be greater than 0 for it to work
958
 
    if ((sn_GetNetState() == nSERVER) && (peer > 0) && tDirectories::Config().Open(i, configFile))
959
 
    {
 
992
        return;
 
993
 
 
994
    nMessage *m = NULL;
 
995
 
 
996
    std::ifstream i;
 
997
    tString configFile;
 
998
    configFile << "public/" << file;
 
999
 
 
1000
    //  transfer the settings from config to the client
 
1001
    //  Client ID must be greater than 0 for it to work
 
1002
    if ((sn_GetNetState() == nSERVER) && (peer > 0) && tDirectories::Config().Open(i, configFile))
 
1003
    {
960
1004
        m = new nMessage(downloadConfigs);
961
 
        *m << tString("DOWNLOAD_BEGIN");
962
 
        *m << file;
963
 
        m->Send(peer);
964
 
 
965
 
        std::istream &s(i);
966
 
        int i = 0;
967
 
        while (!s.eof() && s.good())
968
 
        {
969
 
            tString line;
970
 
            line.ReadLine(s);
971
 
 
 
1005
        *m << tString("DOWNLOAD_BEGIN");
 
1006
        *m << file;
 
1007
        m->Send(peer);
 
1008
 
 
1009
        std::istream &s(i);
 
1010
        int i = 0;
 
1011
        while (!s.eof() && s.good())
 
1012
        {
 
1013
            tString line;
 
1014
            line.ReadLine(s);
 
1015
 
972
1016
            m = new nMessage(downloadConfigs);
973
 
            *m << line;
974
 
            m->Send(peer);
975
 
 
976
 
            i++;
977
 
        }
978
 
 
 
1017
            *m << line;
 
1018
            m->Send(peer);
 
1019
 
 
1020
            i++;
 
1021
        }
 
1022
 
979
1023
        m = new nMessage(downloadConfigs);
980
 
        *m << tString("DOWNLOAD_END");
981
 
        m->Send(peer);
982
 
    }
983
 
    i.close();
984
 
 
985
 
    st_downloadConfigProcess = false;
986
 
}
 
1024
        *m << tString("DOWNLOAD_END");
 
1025
        m->Send(peer);
 
1026
    }
 
1027
    i.close();
 
1028
 
 
1029
    st_downloadConfigProcess = false;
 
1030
}
987
1031
 
988
1032
 
989
1033
int tConfItemBase::AccessLevel(std::istream &s){
1341
1385
static tExtraConfigCommandLineAnalyzer s_extraAnalyzer;
1342
1386
#endif
1343
1387
 
1344
 
static void st_InstallSigHupHandler();
1345
 
 
1346
 
static tString st_customConfigLine = tString("");
1347
 
static tSettingItem<tString> st_customConfigLineConf("CUSTOM_CONFIGS", st_customConfigLine);
1348
 
 
1349
 
//  CUSTOM_CONFIGS config1.cfg;config2.cfg;
1350
 
void st_LoadCustomConfigs()
1351
 
{
1352
 
    if (st_customConfigLine.Filter() != "")
1353
 
    {
1354
 
        tArray<tString> configs = st_customConfigLine.Split(";");
1355
 
        if (configs.Len() > 0)
1356
 
        {
1357
 
            for(int i = 0; i < configs.Len(); i++)
1358
 
            {
1359
 
                tString config = configs[i];
1360
 
 
1361
 
                Load(tDirectories::Config(), config);
1362
 
                Load(tDirectories::Var(), config);
1363
 
                Load(tDirectories::Resource(), config);
1364
 
            }
1365
 
        }
1366
 
    }
1367
 
}
1368
 
static void st_LoadCustomConfigsStr(std::istream &s)
1369
 
{
1370
 
    st_LoadCustomConfigs();
1371
 
}
 
1388
static void st_InstallSigHupHandler();
 
1389
 
 
1390
static tString st_customConfigLine = tString("");
 
1391
static tSettingItem<tString> st_customConfigLineConf("CUSTOM_CONFIGS", st_customConfigLine);
 
1392
 
 
1393
//  CUSTOM_CONFIGS config1.cfg;config2.cfg;
 
1394
void st_LoadCustomConfigs()
 
1395
{
 
1396
    if (st_customConfigLine.Filter() != "")
 
1397
    {
 
1398
        tArray<tString> configs = st_customConfigLine.Split(";");
 
1399
        if (configs.Len() > 0)
 
1400
        {
 
1401
            for(int i = 0; i < configs.Len(); i++)
 
1402
            {
 
1403
                tString config = configs[i];
 
1404
 
 
1405
                Load(tDirectories::Config(), config);
 
1406
                Load(tDirectories::Var(), config);
 
1407
                Load(tDirectories::Resource(), config);
 
1408
            }
 
1409
        }
 
1410
    }
 
1411
}
 
1412
static void st_LoadCustomConfigsStr(std::istream &s)
 
1413
{
 
1414
    st_LoadCustomConfigs();
 
1415
}
1372
1416
static tConfItemFunc st_LoadCustomConfigsConf("LOAD_CUSTOM_CONFIGS", &st_LoadCustomConfigsStr);
1373
1417
 
1374
1418
void st_LoadConfig( bool printChange )
1399
1443
    if (st_FirstUse)
1400
1444
    {
1401
1445
        Load( config, "default.cfg" );
1402
 
    }
1403
 
 
 
1446
    }
 
1447
 
1404
1448
    Load( config, "settings_client.cfg" );
1405
1449
#endif
1406
1450
 
1407
1451
    Load( data, "moviepack/settings.cfg" );
1408
1452
 
1409
1453
    Load( config, "autoexec.cfg" );
1410
 
    Load( var, "autoexec.cfg" );
1411
 
 
 
1454
    Load( var, "autoexec.cfg" );
 
1455
 
1412
1456
    st_LoadCustomConfigs();
1413
1457
 
1414
1458
    // load configuration from playback
1416
1460
    st_settingsFromRecording = tRecorder::IsPlayingBack();
1417
1461
 
1418
1462
    tConfItemBase::printChange=true;
1419
 
}
1420
 
 
1421
 
static void st_ReLoadConfig(std::istream &s)
1422
 
{
1423
 
    st_LoadConfig(false);
1424
 
}
1425
 
static tConfItemFunc st_ReLoadConfigConf("RELOAD_CONFIG", &st_ReLoadConfig);
1426
 
static tAccessLevelSetter st_ReLoadConfigConfLevel( st_ReLoadConfigConf, tAccessLevel_Moderator );
1427
 
 
1428
 
static bool st_UserCfgSave = true;
 
1463
}
 
1464
 
 
1465
static void st_ReLoadConfig(std::istream &s)
 
1466
{
 
1467
    st_LoadConfig(false);
 
1468
}
 
1469
static tConfItemFunc st_ReLoadConfigConf("RELOAD_CONFIG", &st_ReLoadConfig);
 
1470
static tAccessLevelSetter st_ReLoadConfigConfLevel( st_ReLoadConfigConf, tAccessLevel_Moderator );
 
1471
 
 
1472
static bool st_UserCfgSave = true;
1429
1473
static tConfItem<bool> st_UserCfgSaveConf("CFG_USER_SAVE", st_UserCfgSave);
1430
1474
 
1431
1475
void st_SaveConfig()
1438
1482
 
1439
1483
    std::ofstream s;
1440
1484
    if ( tDirectories::Var().Open( s, "user.cfg", std::ios::out, true ) )
1441
 
    {
 
1485
    {
1442
1486
        if (st_UserCfgSave)
1443
1487
            tConfItemBase::SaveAll(s);
1444
1488
    }
1448
1492
        con << o;
1449
1493
        std::cerr << o;
1450
1494
    }
1451
 
}
1452
 
 
1453
 
void st_LoadUserConfig()
1454
 
{
1455
 
    const tPath& var = tDirectories::Var();
1456
 
    Load(var, "user.cfg");
 
1495
}
 
1496
 
 
1497
void st_LoadUserConfig()
 
1498
{
 
1499
    const tPath& var = tDirectories::Var();
 
1500
    Load(var, "user.cfg");
1457
1501
}
1458
1502
 
1459
1503
void st_LoadConfig()
1527
1571
tConfItemFunc::~tConfItemFunc(){}
1528
1572
 
1529
1573
void tConfItemFunc::ReadVal(std::istream &s){(*f)(s);}
1530
 
void tConfItemFunc::WriteVal(std::ostream &){}
 
1574
void tConfItemFunc::WriteVal(std::ostream &){}
1531
1575
void tConfItemFunc::FetchVal(tString &val){}
1532
1576
 
1533
1577
bool tConfItemFunc::Save(){return false;}
1534
 
 
1535
 
void st_Include( tString const & file )
1536
 
{
1537
 
    // refuse to load illegal paths
1538
 
    if( !tPath::IsValidPath( file ) )
1539
 
        return;
1540
 
 
1541
 
    if ( !tRecorder::IsPlayingBack() )
1542
 
    {
1543
 
        // really load include file
1544
 
        if ( !file.EndsWith(".cfg") || !Load( tDirectories::Var(), file ) )
1545
 
        {
1546
 
            if (!Load( tDirectories::Config(), file ) && tConfItemBase::printErrors )
1547
 
            {
1548
 
                con << tOutput( "$config_include_not_found", file );
1549
 
            }
1550
 
        }
1551
 
    }
1552
 
    else
1553
 
    {
1554
 
        // just read configuration, and don't forget to reset the config level
1555
 
        tCurrentAccessLevel levelResetter;
1556
 
        tConfItemBase::LoadPlayback();
1557
 
    }
1558
 
 
1559
 
    // mark section
1560
 
    char const * section = "INCLUDE_END";
1561
 
    tRecorder::Record( section );
1562
 
    tRecorder::PlaybackStrict( section );
1563
 
 
1564
 
}
 
1578
 
 
1579
void st_Include( tString const & file )
 
1580
{
 
1581
    // refuse to load illegal paths
 
1582
    if( !tPath::IsValidPath( file ) )
 
1583
        return;
 
1584
 
 
1585
    if ( !tRecorder::IsPlayingBack() )
 
1586
    {
 
1587
        // really load include file
 
1588
        if ( !file.EndsWith(".cfg") || !Load( tDirectories::Var(), file ) )
 
1589
        {
 
1590
            if (!Load( tDirectories::Config(), file ) && tConfItemBase::printErrors )
 
1591
            {
 
1592
                con << tOutput( "$config_include_not_found", file );
 
1593
            }
 
1594
        }
 
1595
    }
 
1596
    else
 
1597
    {
 
1598
        // just read configuration, and don't forget to reset the config level
 
1599
        tCurrentAccessLevel levelResetter;
 
1600
        tConfItemBase::LoadPlayback();
 
1601
    }
 
1602
 
 
1603
    // mark section
 
1604
    char const * section = "INCLUDE_END";
 
1605
    tRecorder::Record( section );
 
1606
    tRecorder::PlaybackStrict( section );
 
1607
 
 
1608
}
1565
1609
 
1566
1610
static void Include(std::istream& s, bool error )
1567
1611
{
1633
1677
// settings missing in optimized mode
1634
1678
static tConfItemFunc st_Dummy10("SIMULATE_RECEIVE_PACKET_LOSS", &st_Dummy);
1635
1679
static tConfItemFunc st_Dummy11("SIMULATE_SEND_PACKET_LOSS", &st_Dummy);
1636
 
#endif
 
1680
#endif