www.pudn.com > ecc-0.3.16-src.zip > eccMisc.cpp
/* ========================================================================== ecc - Erik's Code Collection Copyright (C) 2003-2005 - Erik Dienske This file is part of ecc. ecc is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. ecc is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with ecc; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ===========================================================================*/ //--------------------------------------------------------------------------- #include#pragma hdrstop #include "eccMisc.h" #include "Registry.hpp" //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- #include "NewAPIs_Fixed.h" /* Including "NewAPIs_Fixed.h" prevents compatibility errors on older systems by wrapping some system-calls. */ //=========================================================================== namespace ecc { //=========================================================================== String GetSystemFolder(const TEccSystemFolder sf) { if (sf == sfTemp) { // The temporary folder is an environment variable: char buf[MAX_PATH]; if (!GetEnvironmentVariable("TEMP", buf, MAX_PATH)) return ""; if (!GetLongPathName(buf, buf, MAX_PATH)) return ""; else return IncludeTrailingBackslash(String(buf)); } String key_name; switch (sf) { case sfDesktop: key_name = "Desktop"; break; case sfFavorites: key_name = "Favorites"; break; case sfPersonal: key_name = "Personal"; break; case sfPrograms: key_name = "Programs"; break; case sfQuickLaunch: key_name = "Quick Launch"; break; case sfRecent: key_name = "Recent"; break; case sfStartMenu: key_name = "Start Menu"; break; case sfStartup: key_name = "Startup"; break; case sfAppData: key_name = "AppData"; break; default: return ""; } String key_str = "\\Software\\Microsoft\\Windows\\CurrentVersion\\"; if (sf == sfQuickLaunch) key_str += "GrpConv\\MapGroups"; else key_str += "Explorer\\Shell Folders"; const String c_key_str = key_str; String folder; TRegistry *reg = new TRegistry(); try { /* Abakt0.9.5-beta2: changed OpenKey() to OpenKeyReadOnly() Fixes a bug mentioned by Michael (15-sep-2006). */ if (reg->OpenKeyReadOnly(c_key_str)) { folder = reg->ReadString(key_name); reg->CloseKey(); } } __finally { delete reg; } return IncludeTrailingBackslash(folder); } //--------------------------------------------------------------------------- //=========================================================================== static int EccHourGlassCount; /* Increases with every HourGlass(true); Decreases with every HourGlass(false); When EccHourGlassCount is not 0 the Screen->Cursor displays an hourglass. */ //--------------------------------------------------------------------------- int GetHourGlassCount() { return EccHourGlassCount; } //--------------------------------------------------------------------------- void ResetHourGlass() { EccHourGlassCount = 0; Screen->Cursor = crDefault; } //--------------------------------------------------------------------------- void HourGlass(const bool state) { if (state) ++EccHourGlassCount; else --EccHourGlassCount; Screen->Cursor = (EccHourGlassCount) ? crHourGlass : crDefault; Application->ProcessMessages(); } //--------------------------------------------------------------------------- //=========================================================================== bool ConfirmBox(const String msg, const String caption) { return ( Application->MessageBox( msg.c_str(), caption.c_str(), MB_YESNO ) == IDYES ); } //--------------------------------------------------------------------------- String GetSystemUserName() { #define USERNAME_BUFSIZE 1024 LPTSTR lpszSystemInfo; // pointer to system information string DWORD cchBuff = USERNAME_BUFSIZE - 1; // size of computer or user name char tchBuffer[USERNAME_BUFSIZE]; // buffer for string lpszSystemInfo = tchBuffer; // Get the user name: String uname = "unknown_user"; if( GetUserName(lpszSystemInfo, &cchBuff) ) uname = String(lpszSystemInfo); return uname; } //--------------------------------------------------------------------------- void InitRandomizer() { Word Hour, Min, Sec, MSec; DecodeTime(Now(), Hour, Min, Sec, MSec); srand((MSec+Hour)*(Sec+Min)); } //--------------------------------------------------------------------------- bool DriveIsRemovable(String drive) { drive = ExtractFileDrive(drive); unsigned int dtype = GetDriveType( drive.c_str() ); return (dtype == DRIVE_REMOVABLE); } //--------------------------------------------------------------------------- /* See: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/getdiskfreespaceex.asp (The code on that page contained some flaws on April 2004.) Note: This function can be replaced with Borland's DiskFree function. */ bool GetDriveFreeSpace(String dir, String &freeBytesStr, __int64 &freeBytes) { __int64 i64FreeBytesToCaller, i64TotalBytes, i64FreeBytes; bool fResult; dir = IncludeTrailingPathDelimiter(ExtractFileDrive(dir)); fResult = GetDiskFreeSpaceEx( dir.c_str(), (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes, (PULARGE_INTEGER)&i64FreeBytes ); freeBytes = i64FreeBytes; /* TODO : Use i64FreeBytesToCaller? */ freeBytesStr.printf("%I64d", freeBytes); // fResult is zero on failure. return !fResult; } //--------------------------------------------------------------------------- //=========================================================================== } // namespace ecc; //===========================================================================