void CCreateNewDatabase::CollectInformation(std::string& folder)
{
	HANDLE				hFile;
	WIN32_FIND_DATA		FileInformation;

	std::string firstFile;

	folder = SallyAPI::String::PathHelper::CorrectPath(folder);

	firstFile.append(folder);
	firstFile.append("*");

	hFile = FindFirstFile(firstFile.c_str(), &FileInformation);

	if(hFile != INVALID_HANDLE_VALUE)
	{
		do
		{
			if ((strcmp(FileInformation.cFileName, ".") != NULL) &&
				(strcmp(FileInformation.cFileName, "..") != NULL))
			{
				std::string filename;
				filename.append(folder);
				filename.append(FileInformation.cFileName);

				if (FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
				{
					CollectInformation(filename);
				}
				else  if (SallyAPI::String::StringHelper::StringEndsWith(filename, ".jpg")
					|| SallyAPI::String::StringHelper::StringEndsWith(filename, ".bmp")
					|| SallyAPI::String::StringHelper::StringEndsWith(filename, ".png")
					|| SallyAPI::String::StringHelper::StringEndsWith(filename, ".jpeg"))
				{
					m_iFileCount++;
				}
			}
		} while ((FindNextFile(hFile, &FileInformation) == TRUE) && (m_bPleaseStop == false));
	}
	FindClose(hFile);
	return;
}
Esempio n. 2
0
///////////////////////////////////////////////////////////////////////////////
// OnInitDialog
BOOL CCrashReportDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// get our path name - we assume that crashed exe is in same directory
	TCHAR appPath[_MAX_PATH];
	appPath[0]=0;
	::GetModuleFileName(NULL, appPath, _MAX_PATH);
	TCHAR *cp = _tcsrchr(appPath, _T('\\'));
	if (cp != NULL)
	{
		cp++;
		*cp = 0;
	}
	TCHAR crashedAppicationPath[MAX_PATH];
	_sntprintf(crashedAppicationPath, MAX_PATH, _T("%s%s"), appPath, CRASHREPORT_APPEXENAME);
	//=== Initialize the gui with the Crashed Title / icon
	InitializeDisplay(CRASHREPORT_APPTITLE, crashedAppicationPath);
	//=== Create the native report
	m_debugInfo += CollectInformation(crashedAppicationPath);


	//=== Application Monitor Data
#ifdef USE_APPLICATIONMONITOR
	TCHAR bf[MAX_PATH];
	GetModuleFileName(NULL, bf, MAX_PATH);
	LPTSTR pos = _tcsrchr(bf, '\\');
	pos[1] = 0;
	_tcscat(bf, CRASHREPORT_APPEXENAME);
	pos = _tcsrchr(bf, '.');
	pos[1] = 0;
	_tcscat(bf, _T("ini"));

	IniAppSettings settings;
	settings.Load(bf);
	std::basic_string<TCHAR> stateString;
	if (settings.Read(CRASHREPORT_INIMONITORSECTION, CRASHREPORT_INIMONITORVALUE, stateString, _T("")))
	{
		AppMonitor appMon;
		if (appMon.Load(stateString.c_str()))
		{
			const AppMonitor::State& state = appMon.GetState();
			m_appID = state.AppUniqueID;
			CString line;
			line.Format(_T("AppUniqueID: %u\r\n"), state.AppUniqueID);
			m_debugInfo += line;
			line.Format(_T("IsAfterCrashStatus: %d\r\n"), appMon.IsAfterCrash());
			m_debugInfo += line;
			line.Format(_T("Statistics: %d/%d - %d/%d\r\n"), 
				state.Crashes, 
				state.Runs, 
				state.TotalCrashes, 
				state.TotalRuns
				);
			m_debugInfo += line;
		}

	}

#endif


	//=== Add the rest of the files to the report
	INT fileNum = 0;
	LPCTSTR files[] = CRASHREPORT_FILES;
	while (files[fileNum] != 0)
	{
		TCHAR bf[MAX_PATH];
		_sntprintf(bf, MAX_PATH, _T("%s%s"), appPath, files[fileNum]);
		CStringA fileContents;
		if (ReadFileContents(bf, fileContents))
		{
			m_debugInfo += _T("\r\n@===");
			m_debugInfo += files[fileNum];
			m_debugInfo += _T("\r\n");
			m_debugInfo += CA2CT(fileContents);
		}
		fileNum++;
	}
	LoadHandCursor();
	SetTimer(1, 80, NULL);
	return TRUE;  // return TRUE  unless you set the focus to a control
}
void CCreateNewDatabase::RunEx()
{
	//SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST);

	// reset values
	m_strQueryCreateItem = "";
	m_iCreateItem = 0;
	
	m_strQueryUpdateItem = "";
	m_iUpdateItem = 0;

	m_strQueryNoUpdateItem = "";
	m_iNoUpdateItem = 0;

	// calculate last run time
	// Scheduler
	SallyAPI::Scheduler::CSchedulerManager* schedulerManager = SallyAPI::Scheduler::CSchedulerManager::GetInstance();
	SYSTEMTIME lastRun = schedulerManager->GetLastSchedulerRun(m_pWindow, "dbcreator");

	//Convert both to FILETIMEs
	m_ftLastRun.dwHighDateTime = 0;
	m_ftLastRun.dwLowDateTime = 0;
	SystemTimeToFileTime(&lastRun, &m_ftLastRun);

	m_strCreateDate = SallyAPI::Date::DateHelper::GetCurrentDateString(false);

	// set the database version
	m_pWindow->SetPropertyInt("databaseVersion", 4);

	std::string mediaDB = m_strMediaDirectory;
	mediaDB.append("media.db");

	bool bFileExists = SallyAPI::File::FileHelper::FileExistsAndNotEmpty(mediaDB);

	SallyAPI::Database::CDatabaseConnection* dbconn = SallyAPI::Database::CDatabaseConnection::Open(mediaDB);

	dbconn->LockDatabase();
	if (bFileExists == false)
	{
		// Create
		std::string queryCreate;
		queryCreate.append("CREATE TABLE media ( \
						   Filename			TEXT UNIQUE, \
						   Album			TEXT, \
						   Artist			TEXT, \
						   Band				TEXT, \
						   Title			TEXT, \
						   Year				TEXT, \
						   Genre			TEXT, \
						   Track			TEXT, \
						   Type				varchar(1) NOT NULL, \
						   DeleteFlag		INTEGER, \
						   Rating			INTEGER, \
						   PlayTime			INTEGER, \
						   Cover			INTEGER, \
						   DBAddDate		varchar(19) NOT NULL, \
						   FileCreateDate	varchar(19) NOT NULL, \
						   LastPlayDate		varchar(19) NOT NULL, \
						   AlbumArtist      TEXT, \
						   Field1			TEXT, \
						   Field2			TEXT, \
						   PRIMARY KEY (Filename));");

		try
		{
			SallyAPI::Database::CStatement* stmtCreate = dbconn->CreateStatement();
			stmtCreate->Execute(queryCreate.c_str());
		}
		catch (SallyAPI::Database::CSQLException* e)
		{
			SallyAPI::System::CLogger* logger = SallyAPI::Core::CGame::GetLogger();
			logger->Error(e->GetMessage());
		}
	}
	dbconn->ReleaseDatabase();

	// Set Delete Flag
	std::string querySetDelete = "UPDATE media SET DeleteFlag = 1;";

	dbconn->LockDatabase();

	try
	{
		SallyAPI::Database::CStatement* stmtSetDelete = dbconn->CreateStatement();
		stmtSetDelete->Execute(querySetDelete.c_str());
	}
	catch (SallyAPI::Database::CSQLException* e)
	{
		SallyAPI::System::CLogger* logger = SallyAPI::Core::CGame::GetLogger();
		logger->Error(e->GetMessage());
	}

	dbconn->ReleaseDatabase();

	std::vector<std::string>::iterator iter;

	// Collect Information
	for (iter = m_vFolders.begin(); iter != m_vFolders.end(); iter++)
	{
		std::string folder = *iter;
		CollectInformation(folder);

		if (m_bPleaseStop)
		{
			SallyAPI::Database::CDatabaseConnection::Close(mediaDB);
			return;
		}
	}

	m_pProcessbar->SetMaxPosition(m_iFileCount);

	// Create Database
	for (iter = m_vFolders.begin(); iter != m_vFolders.end(); iter++)
	{
		std::string folder = *iter;
		AddFolder(dbconn, folder, mediaDB);

		if (m_bPleaseStop)
		{
			SallyAPI::Database::CDatabaseConnection::Close(mediaDB);
			return;
		}
	}
	// execute rest of the create item statements
	ExecuteCreateItem(dbconn);
	ExecuteUpdateItem(dbconn);
	ExecuteNoUpdateItem(dbconn);

	// Set Delete Flag
	std::string queryDelete;
	queryDelete.append("DELETE FROM media WHERE DeleteFlag = 1;");

	dbconn->LockDatabase();

	try
	{
		SallyAPI::Database::CStatement* stmtDelete = dbconn->CreateStatement();
		stmtDelete->Execute(queryDelete.c_str());
	}
	catch (SallyAPI::Database::CSQLException* e)
	{
		SallyAPI::System::CLogger* logger = SallyAPI::Core::CGame::GetLogger();
		logger->Error(e->GetMessage());
	}

	dbconn->ReleaseDatabase();

	SallyAPI::Database::CDatabaseConnection::Close(mediaDB);

	m_pWindow->SendMessageToParent(0, 0, m_iMessageId);
}