Example #1
0
	void D3DFontObject9::DrawText(const boost::shared_ptr<const ID3DSprite> &pSprite,
		std::wstring textString, RECT &screenRect, uint32 flags, const D3DXCOLOR &color) const {
		if (m_d3dxFont != nullptr) {
			CComPtr<ID3DXSprite> pD3DXSprite = nullptr;
			const auto pSprite9 = boost::dynamic_pointer_cast<const D3DSprite9>(pSprite);
			if (pSprite9 != nullptr)
				pD3DXSprite = pSprite9->GetD3DXSprite();

			// has trailing whitespace?
			// todo: proper fix for multiline + hcentered
			uint32 length = textString.length();
			if (length != 0 && textString.back() == L' ')
			{
				// this hack only works for single line align
				if ((flags & DT_SINGLELINE) == DT_SINGLELINE) {
					flags &= ~(DT_CENTER | DT_VCENTER | DT_RIGHT | DT_BOTTOM);
					screenRect = GetTextExtent(textString, screenRect, flags);
				}
				else
					textString.back() = 0xA0; // "non breaking space"
			}

			m_d3dxFont->DrawTextW(pD3DXSprite, textString.data(), length, &screenRect, flags, color);
		}
	}
Example #2
0
bool CServerPath::SegmentizeAddSegment(std::wstring & segment, tSegmentList& segments, bool& append)
{
	if (traits[m_type].has_dots) {
		if (segment == L".") {
			return true;
		}
		else if (segment == L"..") {
			if (segments.empty()) {
				return false;
			}
			else {
				segments.pop_back();
				return true;
			}
		}
	}

	bool append_next = false;
	if (!segment.empty() && traits[m_type].separatorEscape && segment.back() == traits[m_type].separatorEscape) {
		append_next = true;
		segment[segment.size() - 1] = traits[m_type].separators[0];
	}

	if (append) {
		segments.back() += segment;
	}
	else {
		segments.push_back(std::move(segment));
	}

	append = append_next;

	return true;
}
Example #3
0
 void formatPath(std::wstring & fname)
 {
     if(fname.empty()) return;
     
     std::replace(fname.begin(), fname.end(), L'\\', L'/');
     if(fname.back() != L'/') fname += L'/';
 }
Example #4
0
std::vector<std::wstring> GetFileList(const std::wstring& pattern, const bool fullPaths)
{
	const std::wstring directory = (fullPaths ? GetDirPart(pattern) : L"");

	// may not pass an empty string to FindFirstFileEx
	UIETWASSERT(pattern.length() > 0);

	// string passed to FindFirstFileEx must not end in a backslash
	UIETWASSERT(pattern.back() != L'\\');

	WIN32_FIND_DATA findData;
	HANDLE hFindFile = ::FindFirstFileExW(pattern.c_str(), FindExInfoBasic,
				&findData, FindExSearchNameMatch, NULL, 0);

	std::vector<std::wstring> result;
	if (hFindFile == INVALID_HANDLE_VALUE)
	{
		// If there are NO matching files, then FindFirstFileExW returns
		// INVALID_HANDLE_VALUE and the last error is ERROR_FILE_NOT_FOUND.
		UIETWASSERT(::GetLastError() == ERROR_FILE_NOT_FOUND);
		return result;
	}
	do
	{
		result.emplace_back(directory + findData.cFileName);
	} while (::FindNextFileW(hFindFile, &findData));

	UIETWASSERT(::GetLastError() == ERROR_NO_MORE_FILES);
	ATLVERIFY(::FindClose(hFindFile));
	return result;
}
	std::list<std::wstring> EnumerateFiles(std::wstring path)
	{
		std::list<std::wstring> result;
		if (path.empty())
			return result;

#if defined(_WIN32)
		HANDLE dir;
		WIN32_FIND_DATAW data;

		// Rewrite slashes for better compatibility.
		for (auto& c: path)
		{
			if (c == L'/')
				c = L'\\';
		}

		// Appending '\*' handles the case of querying a disk root.
		if (path.back() != L'\\')
			path += L'\\';
		path += L'*';

		if ((dir = ::FindFirstFileW(path.c_str(), &data)) != INVALID_HANDLE_VALUE)
		{
			BOOL rc = TRUE;
			do
			{
				if (!(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
					result.push_back(data.cFileName);
				rc = ::FindNextFileW(dir, &data);
			}
			while (rc);
			::FindClose(dir);
		}
#else
		DIR* dir;

		std::string u8path = UTF8Encoding().Convert(path);
		if (u8path.empty() || u8path.back() != '/')
			u8path += '/';

		if ((dir = ::opendir(u8path.c_str())) != nullptr)
		{
			struct dirent ent, *pent = &ent;
			while (::readdir_r(dir, pent, &pent) == 0 && pent != nullptr)
			{
				struct stat st;
				if (::stat((u8path + pent->d_name).c_str(), &st) == 0 && (st.st_mode & S_IFREG))
				{
					result.push_back(UTF8Encoding().Convert(pent->d_name));
				}
			}
			::closedir(dir);
		}
#endif
		return result;
	}
Example #6
0
	RECT D3DFontObject9::GetTextExtent(std::wstring textString, RECT rect, uint32 flags) const {
		if (m_d3dxFont != nullptr) {
			uint32 length = textString.length();
			bool trailingSpace = (length != 0 && textString.back() == L' ');
			if (trailingSpace)
				textString.back() = L'.';

			m_d3dxFont->DrawTextW(nullptr, textString.data(), length, &rect, flags | DT_CALCRECT, 0);

			// adjust the rectangle...
			if (trailingSpace) {
				rect.right += m_spaceExtent.x;
				rect.right -= m_pointExtent.x;
			}
		}

		return rect;
	}
Example #7
0
int DeleteFolder(std::wstring path) {
  if (path.back() == '\\')
    path.pop_back();

  path.push_back('\0');

  SHFILEOPSTRUCT fos = {0};
  fos.wFunc = FO_DELETE;
  fos.pFrom = path.c_str();
  fos.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT;

  return SHFileOperation(&fos);
}
Example #8
0
int CPython::ExecFunc(const std::vector<std::wstring> &argv, std::wstring &err, HANDLE hfile)
{
	std::vector<std::wstring>::const_iterator itr, eitr; 
	itr = argv.cbegin(); eitr = argv.cend(); err = *itr; 
	if (argv.size() <= 0) {
		err = text("No python command function found"); return 1;
	}
	err.push_back(text('('));
	for (++itr; itr != eitr; ++itr) { 
		err.append(*itr); err.push_back(text(',')); 
	} 
	if (err.back() == text(',')) err.pop_back(); 
	err.push_back(text(')')); 
	Addtolist(1,1,text("Execute Function: %s"),err.c_str());

	int id = 0; FILE *pfile = nullptr; DWORD count = 0;
	PyObject *poldout, *polderr, *pnewout, *pnewerr; 
	if (DuplicateHandle (
		GetCurrentProcess(), hfile, GetCurrentProcess(), &hfile, 
		0, false, DUPLICATE_SAME_ACCESS
	)) {
		id = open_osfhandle((intptr_t)hfile, _O_WRONLY); 
		pfile = fdopen(id,"w"); setvbuf(pfile,nullptr,_IONBF,1024);
		poldout = PySys_GetObject("stdout");
		polderr = PySys_GetObject("stderr");
		pnewout = PyFile_FromFile(pfile, "logger", "w", nullptr);
		pnewerr = PyFile_FromFile(pfile, "logger", "w", nullptr);
		PySys_SetObject("stdout", pnewout);
		PySys_SetObject("stderr", pnewerr);
	} else poldout = polderr = pnewout = pnewerr = nullptr;

	std::wstring_convert<std::codecvt_utf8_utf16<wchar>> cvt; 
	std::string str = cvt.to_bytes(err); 
	std::size_t pos = str.find(text('.')); 
	if (pos != std::string::npos) { 
		std::string mod = str.substr(0, pos); 
		PyObject* dest = PyImport_ImportModule(mod.c_str()); 
		PyObject* main = PyImport_AddModule("__main__"); 
		PyObject_SetAttrString(main, mod.c_str(), dest); 
	} 
	str.insert(0, "print ");
	int irslt = PyRun_SimpleString(str.c_str());
	if (irslt != 0) err = text("Internal error that PyRun_SimpleString fail"); 
	else err = text("Execute python function successfully .."); 

	if (pnewout != nullptr) PySys_SetObject("stdout", poldout);
	if (pnewerr != nullptr) PySys_SetObject("stderr", polderr);
	if (pfile != nullptr) fclose(pfile); return irslt;
}
bool DialogInstall::ExtractCurrentFile(const std::wstring& fileName)
{
	// Some archives don't explicity list directories, so create them recursively
	if (!CreateDirectoryRecursive(fileName))
	{
		return false;
	}

	if (fileName.back() == L'\\')
	{
		// Nothing left to do
		return true;
	}

	if (unzOpenCurrentFile(m_PackageUnzFile) != UNZ_OK)
	{
		return false;
	}

	HANDLE hFile = CreateFile(fileName.c_str(), GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		return false;
	}

	int read;
	do
	{
		BYTE buffer[16384];
		DWORD written;
		read = unzReadCurrentFile(m_PackageUnzFile, buffer, 16384);
		if (read < 0 || !WriteFile(hFile, (LPCVOID)buffer, read, &written, nullptr) || read != written)
		{
			read = UNZ_ERRNO;
			break;
		}
	}
	while (read != UNZ_EOF);

	CloseHandle(hFile);

	return unzCloseCurrentFile(m_PackageUnzFile) == UNZ_OK && read == UNZ_EOF;
}
Example #10
0
bool Ends_With(std::wstring const& str, wchar_t const& end_part){
	if (!str.empty()){
		return str.back() == end_part;
	}
	return false;
}