Logger::Logger(QObject *parent) : QObject(parent) { QString logpath(qApp->property("data_path").toString()); if(logpath.isEmpty()) logpath = QDir::home().filePath("Inventory.log"); QFileInfo fi(logpath); QDir dir(fi.absoluteDir()); fi.setFile( dir, "Inventory.log" ); file.setFileName(fi.absoluteFilePath()); }
/** * @brief Initializes the application. */ bool App::OnInit() { // initialize wxWidgets SetAppName(wxT("UltraDefrag")); wxInitAllImageHandlers(); if(!wxApp::OnInit()) return false; // initialize udefrag library if(::udefrag_init_library() < 0){ wxLogError(wxT("Initialization failed!")); return false; } // set out of memory handler #if !defined(__GNUC__) winx_set_killer(out_of_memory_handler); _set_new_handler(out_of_memory_handler); _set_new_mode(1); #endif // initialize debug log wxFileName logpath(wxT(".\\logs\\ultradefrag.log")); logpath.Normalize(); wxSetEnv(wxT("UD_LOG_FILE_PATH"),logpath.GetFullPath()); ::udefrag_set_log_file_path(); // initialize logging m_log = new Log(); // use global config object for internal settings wxFileConfig *cfg = new wxFileConfig(wxT(""),wxT(""), wxT("gui.ini"),wxT(""),wxCONFIG_USE_RELATIVE_PATH); wxConfigBase::Set(cfg); // enable i18n support InitLocale(); // save report translation on setup wxString cmdLine(GetCommandLine()); if(cmdLine.Find(wxT("--setup")) != wxNOT_FOUND){ SaveReportTranslation(); ::winx_flush_dbg_log(0); delete m_log; return false; } // start web statistics m_statThread = new StatThread(); // check for administrative rights if(!Utils::CheckAdminRights()){ wxMessageDialog dlg(NULL, wxT("Administrative rights are needed to run the program!"), wxT("UltraDefrag"),wxOK | wxICON_ERROR ); dlg.ShowModal(); Cleanup(); return false; } // create synchronization event g_synchEvent = ::CreateEvent(NULL,TRUE,FALSE,NULL); if(!g_synchEvent){ letrace("cannot create synchronization event"); wxMessageDialog dlg(NULL, wxT("Cannot create synchronization event!"), wxT("UltraDefrag"),wxOK | wxICON_ERROR ); dlg.ShowModal(); Cleanup(); return false; } // keep things DPI-aware HDC hdc = ::GetDC(NULL); if(hdc){ g_scaleFactor = (double)::GetDeviceCaps(hdc,LOGPIXELSX) / 96.0f; ::ReleaseDC(NULL,hdc); } g_iconSize = wxSystemSettings::GetMetric(wxSYS_SMALLICON_X); if(g_iconSize < 20) g_iconSize = 16; else if(g_iconSize < 24) g_iconSize = 20; else if(g_iconSize < 32) g_iconSize = 24; else g_iconSize = 32; // support taskbar icon overlay setup on shell restart g_TaskbarIconMsg = ::RegisterWindowMessage(wxT("TaskbarButtonCreated")); if(!g_TaskbarIconMsg) letrace("cannot register TaskbarButtonCreated message"); // create main window g_mainFrame = new MainFrame(); g_mainFrame->Show(true); SetTopWindow(g_mainFrame); return true; }
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLn, int nShowCmd) { bool good_engine; std::string cmd_str(lpCmdLn); std::vector<std::string> args; /* get 'our' module name */ SmartBuffer<CHAR> module_buf(MAX_PATH); GetModuleFileName(NULL, module_buf.get(), MAX_PATH); /* start logging */ std::string logpath(TOSDB_LOG_PATH); logpath.append(LOG_NAME); StartLogging(logpath.c_str()); /* add the appropriate engine name to the module path */ std::string path(module_buf.get()); std::string serv_ext(path.begin() + path.find_last_of("-"), path.end()); #ifdef _DEBUG if(serv_ext != "-x86_d.exe" && serv_ext != "-x64_d.exe"){ #else if(serv_ext != "-x86.exe" && serv_ext != "-x64.exe"){ #endif TOSDB_LogH("STARTUP", "service path doesn't provide proper extension"); return 1; } path.erase(path.find_last_of("\\")); engine_path = path; engine_path.append("\\").append(ENGINE_BASE_NAME).append(serv_ext); GetSystemInfo(&sys_info); ParseArgs(args,cmd_str); size_t argc = args.size(); int admin_pos = 0; int no_service_pos = 0; /* look for --admin and/or --noservice args */ if(argc > 0 && args[0] == "--admin") admin_pos = 1; else if(argc > 1 && args[1] == "--admin") admin_pos = 2; if(argc > 0 && args[0] == "--noservice") no_service_pos = 1; else if(argc > 1 && args[1] == "--noservice") no_service_pos = 2; switch(argc){ /* look for custom_session arg */ case 0: break; case 1: if(admin_pos == 0 && no_service_pos == 0) custom_session = std::stoi(args[0]); break; case 2: if( (admin_pos == 1 && no_service_pos != 2) || (no_service_pos == 1 && admin_pos != 2)) { custom_session = std::stoi(args[1]); } break; case 3: if(admin_pos > 0 && no_service_pos > 0) custom_session = std::stoi(args[2]); break; default: std::string serr("invalid # of args: "); serr.append(std::to_string(argc)); TOSDB_LogH("STARTUP",serr.c_str()); return 1; } std::stringstream ss_args; ss_args << "argc: " << std::to_string(argc) << " custom_session: " << std::to_string(custom_session) << " admin_pos: " << std::to_string(admin_pos) << " no_service_pos: " << std::to_string(no_service_pos); TOSDB_Log("STARTUP", std::string("lpCmdLn: ").append(cmd_str).c_str() ); TOSDB_Log("STARTUP", ss_args.str().c_str() ); integrity_level = admin_pos > 0 ? "High Mandatory Level" : "Medium Mandatory Level"; /* populate the engine command and if --noservice is passed jump right into the engine via SpawnRestrictedProcess; otherwise Start the service which will handle that for us prepend '--spawned' so engine knows *we* called it; if someone else passes '--spawned' they deserve what they get */ if(no_service_pos > 0){ is_service = false; TOSDB_Log("STARTUP", "starting tos-databridge-engine.exe directly(NOT A SERVICE)"); good_engine = SpawnRestrictedProcess("--spawned --noservice", custom_session); if(!good_engine){ std::string serr("failed to spawn "); serr.append(engine_path).append(" --spawned --noservice"); TOSDB_LogH("STARTUP", serr.c_str()); } }else{ SERVICE_TABLE_ENTRY dTable[] = { {SERVICE_NAME,ServiceMain}, {NULL,NULL} }; /* START SERVICE */ if( !StartServiceCtrlDispatcher(dTable) ){ TOSDB_LogH("STARTUP", "StartServiceCtrlDispatcher() failed. " "(Be sure to use an appropriate Window's tool to start the service " "(e.g SC.exe, Services.msc) or pass '--noservice' to run directly.)"); } } StopLogging(); return 0; }