diff options
| author | Don Bright <hugh.m.bright@gmail.com> | 2013-05-27 01:24:53 (GMT) | 
|---|---|---|
| committer | Don Bright <hugh.m.bright@gmail.com> | 2013-05-27 01:24:53 (GMT) | 
| commit | 08952ee2164efd8257adbd8684317ec1c945b7ac (patch) | |
| tree | 5b50d417d950ad27e90f2765977e42caac1a881d /src | |
| parent | 31c88a434b3201d88819b485f74da843c2728cb2 (diff) | |
windows - library path find, also windows build fixes
Diffstat (limited to 'src')
| -rw-r--r-- | src/CGALEvaluator.cc | 3 | ||||
| -rw-r--r-- | src/CSGTermEvaluator.cc | 2 | ||||
| -rw-r--r-- | src/PlatformUtils-win.cc | 57 | ||||
| -rw-r--r-- | src/PlatformUtils-win32.cc | 15 | ||||
| -rw-r--r-- | src/PlatformUtils.cc | 33 | ||||
| -rw-r--r-- | src/PlatformUtils.h | 1 | 
6 files changed, 81 insertions, 30 deletions
| diff --git a/src/CGALEvaluator.cc b/src/CGALEvaluator.cc index 2ea7a8d..686bde1 100644 --- a/src/CGALEvaluator.cc +++ b/src/CGALEvaluator.cc @@ -279,7 +279,7 @@ Response CGALEvaluator::visit(State &state, const CsgNode &node)  	if (state.isPostfix()) {  		CGAL_Nef_polyhedron N;  		if (!isCached(node)) { -			CGALEvaluator::CsgOp op; +			CGALEvaluator::CsgOp op = CGE_UNION;  			switch (node.type) {  			case CSG_TYPE_UNION:  				op = CGE_UNION; @@ -291,7 +291,6 @@ Response CGALEvaluator::visit(State &state, const CsgNode &node)  				op = CGE_INTERSECTION;  				break;  			default: -				op = -1;  				assert(false);  			}  			N = applyToChildren(node, op); diff --git a/src/CSGTermEvaluator.cc b/src/CSGTermEvaluator.cc index 4624d4c..6b39c66 100644 --- a/src/CSGTermEvaluator.cc +++ b/src/CSGTermEvaluator.cc @@ -124,7 +124,7 @@ Response CSGTermEvaluator::visit(State &state, const AbstractPolyNode &node)  Response CSGTermEvaluator::visit(State &state, const CsgNode &node)  {  	if (state.isPostfix()) { -		CsgOp op; +		CsgOp op = CSGT_UNION;  		switch (node.type) {  		case CSG_TYPE_UNION:  			op = CSGT_UNION; diff --git a/src/PlatformUtils-win.cc b/src/PlatformUtils-win.cc new file mode 100644 index 0000000..d06df51 --- /dev/null +++ b/src/PlatformUtils-win.cc @@ -0,0 +1,57 @@ +#include "PlatformUtils.h" +#include "printutils.h" +#include <windows.h> +#define _WIN32_IE 0x0501 // SHGFP_TYPE_CURRENT +#include <shlobj.h> + +// convert from windows api w_char strings (usually utf16) to utf8 std::string +std::string winapi_wstr_to_utf8( std::wstring wstr ) +{ +	std::string utf8_str(""); + +	UINT CodePage = CP_UTF8; +	DWORD dwFlags = 0; +	LPCSTR lpMultiByteStr = NULL; +	int cbMultiByte = 0; +	LPWSTR lpWideCharStr = &wstr[0]; +	int cchWideChar = (int)wstr.size(); + +	int numbytes = MultiByteToWideChar( CodePage, dwFlags, lpMultiByteStr, +		cbMultiByte, lpWideCharStr, cchWideChar ); + +	cbMultiByte = numbytes; +	lpMultiByteStr = &utf8_str[0]; + +	int result = MultiByteToWideChar( CodePage, dwFlags, lpMultiByteStr, +		cbMultiByte, lpWideCharStr, cchWideChar ); + +	if (result != numbytes) { +		PRINT("ERROR: error converting w_char str to utf8 string"); +	} + +	return utf8_str; +} + + +// retrieve the path to 'My Documents' for the current user under windows +// In XP this is 'c:\documents and settings\username\my documents' +// In Vista, 7, 8+ this is 'c:\users\username\documents' +// This code may have problems with unusual dir types in Vista because +// Mingw does not provide access to the updated SHGetKnownFolderPath +std::string PlatformUtils::documentsPath() +{ +	std::string retval; +	std::wstring path(MAX_PATH,0); + +	HRESULT result = SHGetFolderPathW(NULL, CSIDL_PERSONAL, NULL, +	  SHGFP_TYPE_CURRENT, &path[0]); + +	if (result == S_OK) { +		path = std::wstring( path.c_str() ); // stip extra NULLs +		retval = winapi_wstr_to_utf8( path ); +	} else { +		PRINT("ERROR: Could not find My Documents location"); +		retval = ""; +	} +	return retval; +} diff --git a/src/PlatformUtils-win32.cc b/src/PlatformUtils-win32.cc deleted file mode 100644 index 61382dd..0000000 --- a/src/PlatformUtils-win32.cc +++ /dev/null @@ -1,15 +0,0 @@ -#include "PlatformUtils.h" -#include <windows.h> -#include <shlobj.h> - -std::string PlatformUtils::documentsPath() -{ -	std::string retval; -	CHAR my_documents[MAX_PATH]; -	HRESULT result = SHGetFolderPath(NULL, CSIDL_MYDOCUMENTS, NULL,  -																	 SHGFP_TYPE_CURRENT, my_documents); -	 -	if (result != S_OK) retval = ""; -	else retval = my_documents; -	return retval; -} diff --git a/src/PlatformUtils.cc b/src/PlatformUtils.cc index a7efe40..47569b0 100644 --- a/src/PlatformUtils.cc +++ b/src/PlatformUtils.cc @@ -1,26 +1,35 @@  #include "PlatformUtils.h"  #include "boosty.h" +bool PlatformUtils::createLibraryPath() +{ +	std::string path = PlatformUtils::libraryPath(); +	bool OK = false; +	try { +		if (!fs::exists(fs::path(path))) { +			PRINTB("Creating library folder %s", path ); +			OK = fs::create_directories( path ); +		} +		if (!OK) { +			PRINTB("ERROR: Cannot create %s", path ); +		} +	} catch (const fs::filesystem_error& ex) { +		PRINTB("ERROR: %s",ex.what()); +	} +	return OK; +} +  std::string PlatformUtils::libraryPath()  {  	fs::path path; -	bool OK = true;  	try {  		path = boosty::canonical(fs::path(PlatformUtils::documentsPath()));  		if (path.empty()) return ""; -		PRINTB("path size %i",boosty::stringy(path).size());  		path /= "OpenSCAD";  		path /= "libraries"; -		PRINTB("Appended path %s", path ); -		PRINTB("Exists: %i", fs::exists(path) ); -		if (!fs::exists(path)) { -			PRINTB("Creating library folder %s", boosty::stringy(path) ); -			OK &= fs::create_directories( path ); -		} -		if (!OK) { -			PRINTB("ERROR: Cannot find nor create %s", boosty::stringy(path) ); -			path = fs::path(""); -		} +		//PRINTB("path size %i",boosty::stringy(path).size()); +		//PRINTB("Appended path %s", path ); +		//PRINTB("Exists: %i", fs::exists(path) );  	} catch (const fs::filesystem_error& ex) {  		PRINTB("ERROR: %s",ex.what());  	} diff --git a/src/PlatformUtils.h b/src/PlatformUtils.h index 202abaa..089b3ca 100644 --- a/src/PlatformUtils.h +++ b/src/PlatformUtils.h @@ -7,6 +7,7 @@ namespace PlatformUtils {  	std::string documentsPath();  	std::string libraryPath(); +	bool createLibraryPath();  } | 
