source: branches/work_304/Main.cpp @ 333

Revision 333, 5.4 KB checked in by jls17, 6 years ago (diff)
  • few changes to fix or suppress compiler warnings
Line 
1//Copyright (C) 2009 Stefan Nerlich | stefan.nerlich@hotmail.com
2//
3//This file is part of ARInside.
4//
5//    ARInside is free software: you can redistribute it and/or modify
6//    it under the terms of the GNU General Public License as published by
7//    the Free Software Foundation, version 2 of the License.
8//
9//    ARInside 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 Foobar.  If not, see <http://www.gnu.org/licenses/>.
16
17#include "stdafx.h"
18
19#include "Main.h"
20#include "AppConfigReader.h"
21#include "AppException.h"
22#include "ARInside.h"
23#include "ConfigFile.h"
24#include "FileSystemUtil.h"
25#include "tclap/CmdLine.h"
26#include "util/CommandLineValidator.h"
27
28using namespace TCLAP;
29
30// this variable counts all generated files and as such is defined globally and referenced in other files
31// TODO: remote this global dependency
32int nFilesCreated;
33
34int CMain::Run(int argc, char* argv[])
35{
36        mTimer.StartTimer();
37        int result = AR_RETURN_ERROR;
38
39        OutputARInsideBanner();
40
41        try
42        {
43                CommandLineValidator cmdLineValidator(argc, argv);
44                if (!cmdLineValidator.Validate())
45                        return cmdLineValidator.GetExitCode();
46
47                string settingsIni = cmdLineValidator.GetIniFilename();
48
49                cout << endl << "Load application configuration settings: '" << settingsIni << "' " << endl;
50                AppConfigReader reader(settingsIni);
51                AppConfig appConfig;
52                reader.LoadTo(appConfig);
53
54                // validate throws exceptions if configuration isnt valid
55                appConfig.Validate(cmdLineValidator);
56               
57                // store executable for later directory detection
58                appConfig.argv_0 = argv[0];
59
60                if (AppConfig::verboseMode)
61                        appConfig.Dump();
62               
63                //Delete existing files
64                if(appConfig.bDeleteExistingFiles)
65                {
66                        DoDeleteExistingFiles(appConfig.targetFolder);
67                }
68
69                //Create the target directory specified in the configuration files
70                //TODO: CreateAppDirectory returns false if the directory already exists .. this should be changed so
71                //      we can check if there is something going wrong and stop the process!!
72                FileSystemUtil fsUtil(appConfig);               
73                fsUtil.CreateAppDirectory();
74
75                if(fsUtil.ValidateTargetDir(appConfig.targetFolder) == 0)
76                {
77                        nFilesCreated = 0;
78
79                        if(appConfig.bCompactFolder) // Compact folder
80                        {
81                                FileSystemUtil::CompactFolder(appConfig.targetFolder);
82                        }
83
84                        if(!appConfig.fileMode) //ServerMode
85                        {
86                                result = StartServerMode(appConfig);
87                        }
88                        else //FileMode
89                        {
90                                result = StartFileMode(appConfig);
91                        }
92                }
93                else
94                {
95                        // TODO: ValidateTargetDir returns 0 on success. On error there is no information about the error
96                        // at all .. only "whoops, cant create directory" .. hell yes, and now? where is my glass sphere...
97                        cout << "Failed to create target directory: " << appConfig.targetFolder << endl;
98                        result = AR_RETURN_ERROR;
99                }
100
101                if(result == AR_RETURN_OK)
102                {
103                        mTimer.EndTimer();
104                        float nTotalDuration = mTimer.GetDuration();
105
106                        cout << endl << nFilesCreated << " files created in " << nTotalDuration << " seconds." << endl;
107                        cout << "Documentation successfully saved. The application will now exit." << endl;
108                        result =  AR_RETURN_OK;
109                }
110                else
111                {
112                        cout << "Application terminated." << endl;
113                }
114
115        }
116        catch(AppException &e)
117        {
118                cout << endl << "AppException: " << e.typeDescription() << " -- " << e.error() << endl; 
119        }
120        catch (ArgException &e)
121        { 
122                cerr << "error: " << e.error() << " for arg " << e.argId() << endl;
123                return AR_RETURN_ERROR;
124        }
125        catch (ExitException &ee) 
126        {
127                exit(ee.getExitStatus());
128        }
129        catch(exception &e)
130        {
131                cout << endl << "Unhandled execption in _main: " << e.what() << endl;
132        }
133
134        return result;
135}
136
137const char* CMain::GetPlatformString() const
138{
139        char* platform;
140        if (sizeof(platform) == 4)
141                return "32bit";
142        if (sizeof(platform) == 8)
143                return "64bit";
144        return "";
145}
146
147void CMain::OutputARInsideBanner()
148{
149        cout << "ARInside Version " << AppVersion << " " << GetPlatformString() << endl << endl;
150}
151
152int CMain::StartServerMode(AppConfig &appConfig)
153{
154        int result = AR_RETURN_ERROR;
155        CARInside arInside(appConfig);
156        if(arInside.Init(appConfig.userName, appConfig.password, appConfig.serverName, appConfig.tcpPort, appConfig.rpcPort) == AR_RETURN_OK)
157        {
158                arInside.DoWork(0);
159                result = AR_RETURN_OK;
160        }
161        arInside.Terminate();
162        return result;
163}
164
165int CMain::StartFileMode(AppConfig &appConfig)
166{
167        int result = AR_RETURN_ERROR;
168        CARInside arInside(appConfig);
169
170        if(!appConfig.objListXML.empty())
171        {               
172                if(arInside.FileExists(appConfig.objListXML) == true)
173                {
174                        if(arInside.Init("", "", "", 0, 0) == AR_RETURN_OK)
175                        {
176                                arInside.DoWork(1);
177                                result = AR_RETURN_OK;
178                        }
179                }
180                else
181                {
182                        cout << "Could not find file '" << appConfig.objListXML << "'" << endl;
183                        result = AR_RETURN_ERROR;
184                }
185        }
186        else
187        {
188                cout << "No 'ObjListXML' file specified in the application configuration file!" << endl;
189                result = AR_RETURN_ERROR;
190        }
191
192        arInside.Terminate();
193        return result;
194}
195
196void CMain::DoDeleteExistingFiles(string path)
197{
198        cout << "Deleting existing files" << endl;
199        if (!FileSystemUtil::DeleteDirectory(path.c_str()))
200                cout << "Deletion failed!" << endl;                     
201}
Note: See TracBrowser for help on using the repository browser.