MistString Path::GetHome() { #if defined(MIST_OS_WINDOWS) MistString result = Path::GetEnv(L"HOMEDRIVE"); result.append(Path::GetEnv(L"HOMEPATH")); size_t n = result.size(); if(n > 0 && result[n-1] != L'\\') result.append(L"\\"); return result; #elif defined(MIST_OS_FAMILY_UNIX) std::string path; struct passwd* pwd = getpwuid(getuid()); if(pwd) path = pwd->pw_dir; else { pwd = getpwuid(getuid()); if(pwd) path = pwd->pw_dir; else return Path::GetEnv(L"HOME") + L"/"; } size_t n = path.size(); if(n > 0 && path[n-1] != '/') path.append("/"); return string::StringToWStringFast(path); #endif }
void FormatString::replace(const MistString& search, const MistString& replacement) { size_t pos = 0; while((pos = mStr.find(search, pos)) != MistString::npos) { mStr.replace(pos, search.length(), replacement); pos += replacement.length(); } }
MistString Path::GetFileNameWithoutExtension(const MistString& path) { MistString filename = Path::GetFileName(path); size_t rs = filename.rfind(L'.'); if(rs != MistString::npos) { return MistString(filename.begin(), filename.begin() + rs); } return filename; }
MistString Path::GetDirectory(const MistString& path) { size_t rs = path.rfind(L'/'); if(rs == MistString::npos) { rs = path.rfind(L'\\'); } if(rs != MistString::npos) { return MistString(path.begin(), path.begin() + rs + 1); } return MistString(L""); }
MistString Path::GetFileName(const MistString& path) { size_t rs = path.rfind(L'/'); if(rs == MistString::npos) { rs = path.rfind(L'\\'); } if(rs != MistString::npos) { return MistString(path.begin() + (rs+1), path.end()); } return path; }
DirectoryIterator& DirectoryIterator ::operator++() { if(mImpl) { MistString n = mImpl->next(); if(n.empty()) mIsEnd = true; else { mFile = mPath + mImpl->get(); } } return *this; }
bool File::MoveDirectory(const MistString& src, const MistString& dst) { #if defined(MIST_OS_WINDOWS) return ::MoveFileW(src.c_str(), dst.c_str()) == TRUE; #elif defined(MIST_OS_FAMILY_APPLE) return mist_apple_moveitem(src, dst); #elif defined(MIST_OS_FAMILY_UNIX) return ::rename(string::WStringToString(src).c_str(), string::WStringToString(dst).c_str()) == 0; #endif }
DirectoryIteratorImpl(const MistString& path) { MistString findPath = path + L"/*"; mFH = FindFirstFileW(findPath.c_str(), &mFD); if(mFH == INVALID_HANDLE_VALUE) { DWORD error = GetLastError(); if(error != ERROR_NO_MORE_FILES) { } } else { mCurrent = mFD.cFileName; if(mCurrent == L"." || mCurrent == L"..") next(); } }
MistString Path::GetEnv(const MistString& env) { #if defined(MIST_OS_WINDOWS) DWORD len = GetEnvironmentVariableW(env.c_str(), 0, 0); if (len != 0) { wchar_t* buffer = new wchar_t[len]; GetEnvironmentVariableW(env.c_str(), buffer, len); MistString result(buffer); delete [] buffer; return result; } #elif defined(MIST_OS_FAMILY_UNIX) return string::StringToWStringFast(getenv(string::WStringToString(env).c_str())); #endif return MistString(); }
bool File::CopyFile(const MistString& src, const MistString& dst) { #if defined(MIST_OS_WINDOWS) return ::CopyFileW(src.c_str(), dst.c_str(), FALSE) == TRUE; #elif defined(MIST_OS_FAMILY_APPLE) return mist_apple_copyitem(src, dst); #elif defined(MIST_OS_FAMILY_UNIX) return mist_generic_cp_mv("/bin/cp", string::WStringToString(src).c_str(), string::WStringToString(dst).c_str()); #endif }
float4 Convert::ToFloat4(const MistString& str) { MistString buffer; size_t pos = 0; float4 result; while(str[pos] == L' ') pos ++; for(int i=0; i<4; ++i) { while(str[pos] != ' ' && pos < str.size()) { buffer.push_back(str[pos]); pos ++; } result.value[i] = (float)Convert::ToDouble(buffer); buffer.clear(); while(str[pos] == L' ' && pos < str.size()) pos ++; } return result; }
bool File::CopyDirectory(const MistString& src, const MistString& dst) { #if defined(MIST_OS_WINDOWS) SHFILEOPSTRUCT s = { 0 }; s.hwnd = 0; s.wFunc = FO_COPY; s.fFlags = FOF_SILENT; s.pTo = dst.c_str(); s.pFrom = src.c_str(); return SHFileOperation(&s) == 0; #elif defined(MIST_OS_FAMILY_APPLE) return mist_apple_copyitem(src, dst); #elif defined(MIST_OS_FAMILY_UNIX) return mist_generic_cp_mv("/bin/cp", string::WStringToString(src).c_str(), string::WStringToString(dst).c_str(), true); #endif }
MistString Path::ExpandPath(const MistString& path) { #if defined(MIST_OS_WINDOWS) wchar_t buffer[_MAX_PATH]; DWORD n = ExpandEnvironmentStringsW(path.c_str(), buffer, sizeof(buffer)); if(n > 0 && n < sizeof(buffer)) { return MistString(buffer, n-1); } else return path; #elif defined(MIST_OS_FAMILY_UNIX) MistString result; MistString::const_iterator it = path.begin(); MistString::const_iterator end = path.end(); if (it != end && *it == L'~') { ++it; if (it != end && *it == L'/') { result += Path::GetHome(); ++it; } else result += '~'; } while (it != end) { if (*it == L'$') { std::wstring var; ++it; if (it != end && *it == L'{') { ++it; while (it != end && *it != L'}') var += *it++; if (it != end) ++it; } else { while (it != end && (((*it >= L'a' && *it <= L'z') || (*it >= L'A' && *it <= L'Z') || (*it >= L'0' && *it <= L'9')) || *it == L'_')) var += *it++; } result += Path::GetEnv(var); } else result += *it++; } return result; #endif }
bool File::DeleteDirectory(const MistString& src) { #if defined(MIST_OS_WINDOWS) return ::RemoveDirectoryW(src.c_str()) == TRUE; #elif defined(MIST_OS_FAMILY_APPLE) return mist_apple_deleteitem(src); #elif defined(MIST_OS_FAMILY_UNIX) return mist_generic_rm(string::WStringToString(src).c_str(), true); #endif }
bool File::DeleteFile(const MistString& src) { #if defined(MIST_OS_WINDOWS) return ::DeleteFileW(src.c_str()) == TRUE; #elif defined(MIST_OS_FAMILY_APPLE) return mist_apple_deleteitem(src); #elif defined(MIST_OS_FAMILY_UNIX) return ::remove(string::WStringToString(src).cstr()) == 0; #endif }
bool File::PathExists(const MistString& path) { #ifdef MIST_OS_WINDOWS return PathFileExistsW(path.c_str())?true:false; #else struct stat sb; if (stat(string::WStringToString(path).c_str(), &sb) == 0 && S_ISDIR(sb.st_mode)) { return true; } #endif return false; }
bool File::CreateDirectory(const MistString& dir){ #if defined(MIST_OS_WINDOWS) return ::CreateDirectoryW(dir.c_str(), NULL) == TRUE; #elif defined(MIST_OS_FAMILY_APPLE) return mist_apple_createdirectory(dir); #elif defined(MIST_OS_FAMILY_UNIX) return mkdir(string::WStringToString(dir).c_str(), S_IRWXU) == 0; #endif }
bool File::FileExists(const MistString& filepath) { #ifdef MIST_OS_WINDOWS return PathFileExistsW(filepath.c_str())?true:false; #elif defined(MIST_OS_FAMILY_APPLE) return mist_apple_file_exists(filepath); #else struct stat sb; if (stat(Miststring::WStringToString(filepath).c_str(), &sb) == 0 && S_ISREG(sb.st_mode)) { return true; } #endif return false; }
bool AnimationPlayer::deserialize(const ConfigParserPtr& parser) { if(parser->toNode(L"animations")) { if(parser->toFirstChild()) { do { StoryBoardPtr storyboard = MakeSharedPtr<StoryBoard>(); MistString name = parser->getString(L"name"); if(!name.empty()) { bool isdefault = parser->getBool(L"default", false); if(isdefault) setDefault(name); if(parser->toFirstChild()) { do { MistString type = parser->getCurrentNodeName(); // linear animation if(type == L"linear") { MistString prop_name = parser->getString(L"prop"); MistString prop_type = parser->getString(L"prop_type"); void* prop = getProperty(prop_name); if(prop) { create_linear_animation(prop_type, prop, parser, storyboard.get()); } // keyframe animation } else if(type == L"keyframe") { MistString prop_name = parser->getString(L"prop"); MistString prop_type = parser->getString(L"prop_type"); void* prop = getProperty(prop_name); if(prop) { create_key_frame_animation(prop_type, prop, parser, storyboard.get()); // back to parent node parser->toParent(); } } } while(parser->toNextChild()); // back to parent node parser->toParent(); // add storyboard mStoryBoards[name] = storyboard; // connect to finish event storyboard->onComplete() += Bind(this, &AnimationPlayer::onAnimationFinished); } } } while(parser->toNextChild()); parser->toParent(); } parser->toParent(); } else return false; if(!mDefault.empty()) play(mDefault); return true; }