source: branches/work_320/Main.cpp @ 679

Revision 679, 5.6 KB checked in by jls17, 5 years ago (diff)
  • fixed some memory leaks in case memory allocation fails in ARFieldList.cpp and ARSchemaList.cpp
  • small changes to the initialization of the crash handler
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
34CMain::CMain()
35{
36        crashHandler = NULL;
37}
38
39int CMain::Run(int argc, char* argv[])
40{
41        mTimer.StartTimer();
42        int result = AR_RETURN_ERROR;
43
44        OutputARInsideBanner();
45
46        try
47        {
48                CommandLineValidator cmdLineValidator(argc, argv);
49                if (!cmdLineValidator.Validate())
50                        return cmdLineValidator.GetExitCode();
51
52                string settingsIni = cmdLineValidator.GetIniFilename();
53
54                if (crashHandler != NULL)
55                        LOG << "Crash handler is installed" << endl;
56
57                cout << endl << "Load application configuration settings: '" << settingsIni << "' " << endl;
58                AppConfigReader reader(settingsIni);
59                AppConfig appConfig;
60                reader.LoadTo(appConfig);
61
62                // validate throws exceptions if configuration isnt valid
63                appConfig.Validate(cmdLineValidator);
64               
65                // store executable for later directory detection
66                appConfig.argv_0 = argv[0];
67
68                if (AppConfig::verboseMode)
69                        appConfig.Dump();
70               
71                //Delete existing files
72                if(appConfig.bDeleteExistingFiles)
73                {
74                        DoDeleteExistingFiles(appConfig.targetFolder);
75                }
76
77                //Create the target directory specified in the configuration files
78                //TODO: CreateAppDirectory returns false if the directory already exists .. this should be changed so
79                //      we can check if there is something going wrong and stop the process!!
80                FileSystemUtil fsUtil(appConfig);               
81                fsUtil.CreateAppDirectory();
82
83                if(fsUtil.ValidateTargetDir(appConfig.targetFolder) == 0)
84                {
85                        nFilesCreated = 0;
86
87                        if(appConfig.bCompactFolder) // Compact folder
88                        {
89                                FileSystemUtil::CompactFolder(appConfig.targetFolder);
90                        }
91
92                        if(!appConfig.fileMode) //ServerMode
93                        {
94                                result = StartServerMode(appConfig);
95                        }
96                        else //FileMode
97                        {
98                                result = StartFileMode(appConfig);
99                        }
100                }
101                else
102                {
103                        // TODO: ValidateTargetDir returns 0 on success. On error there is no information about the error
104                        // at all .. only "whoops, cant create directory" .. hell yes, and now? where is my glass sphere...
105                        cout << "Failed to create target directory: " << appConfig.targetFolder << endl;
106                        result = AR_RETURN_ERROR;
107                }
108
109                if(result == AR_RETURN_OK)
110                {
111                        mTimer.EndTimer();
112                        float nTotalDuration = mTimer.GetDuration();
113
114                        cout << endl << nFilesCreated << " files created in " << nTotalDuration << " seconds." << endl;
115                        cout << "Documentation successfully saved. The application will now exit." << endl;
116                        result =  AR_RETURN_OK;
117                }
118                else
119                {
120                        cout << "Application terminated." << endl;
121                }
122
123        }
124        catch(AppException &e)
125        {
126                cout << endl << "AppException: " << e.typeDescription() << " -- " << e.error() << endl; 
127        }
128        catch (ArgException &e)
129        { 
130                cerr << "error: " << e.error() << " for arg " << e.argId() << endl;
131                return AR_RETURN_ERROR;
132        }
133        catch (ExitException &ee) 
134        {
135                exit(ee.getExitStatus());
136        }
137        catch(exception &e)
138        {
139                cout << endl << "Unhandled execption in _main: " << e.what() << endl;
140        }
141
142        return result;
143}
144
145void CMain::SetCrashHandler(void *pAddr)
146{
147        crashHandler = pAddr;
148}
149
150const char* CMain::GetPlatformString() const
151{
152        char* platform;
153        if (sizeof(platform) == 4)
154                return "32bit";
155        if (sizeof(platform) == 8)
156                return "64bit";
157        return "";
158}
159
160void CMain::OutputARInsideBanner()
161{
162        cout << "ARInside Version " << AppVersion << " " << GetPlatformString() << endl << endl;
163}
164
165int CMain::StartServerMode(AppConfig &appConfig)
166{
167        int result = AR_RETURN_ERROR;
168        CARInside arInside(appConfig);
169        if(arInside.Init(appConfig.userName, appConfig.password, appConfig.serverName, appConfig.tcpPort, appConfig.rpcPort) == AR_RETURN_OK)
170        {
171                arInside.DoWork(0);
172                result = AR_RETURN_OK;
173        }
174        arInside.Terminate();
175        return result;
176}
177
178int CMain::StartFileMode(AppConfig &appConfig)
179{
180        int result = AR_RETURN_ERROR;
181        CARInside arInside(appConfig);
182
183        if(!appConfig.objListXML.empty())
184        {               
185                if(arInside.FileExists(appConfig.objListXML) == true)
186                {
187                        if(arInside.Init("", "", "", 0, 0) == AR_RETURN_OK)
188                        {
189                                arInside.DoWork(1);
190                                result = AR_RETURN_OK;
191                        }
192                }
193                else
194                {
195                        cout << "Could not find file '" << appConfig.objListXML << "'" << endl;
196                        result = AR_RETURN_ERROR;
197                }
198        }
199        else
200        {
201                cout << "No 'ObjListXML' file specified in the application configuration file!" << endl;
202                result = AR_RETURN_ERROR;
203        }
204
205        arInside.Terminate();
206        return result;
207}
208
209void CMain::DoDeleteExistingFiles(string path)
210{
211        cout << "Deleting existing files" << endl;
212        if (!FileSystemUtil::DeleteDirectory(path.c_str()))
213                cout << "Deletion failed!" << endl;                     
214}
Note: See TracBrowser for help on using the repository browser.