std::wstring GetAppDataPath() { if (appDataPath.empty()) { if (IsWindowsVistaOrLater()) { WCHAR* pathBuffer; if (FAILED(SHGetKnownFolderPath(FOLDERID_LocalAppDataLow, 0, 0, &pathBuffer))) throw std::runtime_error("Unable to find app data directory"); appDataPath.assign(pathBuffer); CoTaskMemFree(pathBuffer); } else { std::auto_ptr<wchar_t> pathBuffer(new wchar_t[MAX_PATH]); if (!SHGetSpecialFolderPathW(0, pathBuffer.get(), CSIDL_LOCAL_APPDATA, true)) throw std::runtime_error("Unable to find app data directory"); appDataPath.assign(pathBuffer.get()); } appDataPath += L"\\Adblock Plus for IE"; // Ignore errors here, this isn't a critical operation ::CreateDirectoryW(appDataPath.c_str(), NULL); } return appDataPath; }
/** * Get the path string to be used when searching for PDB files. * * @param process Process handle * @return searchPath Returned search path string */ static const char* getSymbolSearchPath(HANDLE process) { static std::string symbolSearchPath; if (symbolSearchPath.empty()) { static const size_t bufferSize = 1024; boost::scoped_array<char> pathBuffer(new char[bufferSize]); GetModuleFileNameA(NULL, pathBuffer.get(), bufferSize); boost::filesystem::path exePath(pathBuffer.get()); symbolSearchPath = exePath.parent_path().string(); symbolSearchPath += ";C:\\Windows\\System32;C:\\Windows"; } return symbolSearchPath.c_str(); }
static CString dumpNodePath(WebKitDOMNode* node) { GOwnPtr<gchar> nodeName(webkit_dom_node_get_node_name(node)); GString* path = g_string_new(nodeName.get()); WebKitDOMNode* parent = webkit_dom_node_get_parent_node(node); while (parent) { GOwnPtr<gchar> parentName(webkit_dom_node_get_node_name(parent)); g_string_append(path, " > "); g_string_append(path, parentName.get()); parent = webkit_dom_node_get_parent_node(parent); } GOwnPtr<gchar> pathBuffer(g_string_free(path, FALSE)); return pathBuffer.get(); }
bool Execute(const std::string& path, const std::string& args, const std::string& dir) { const char* const pathStr = path.c_str(); std::vector<char> pathBuffer(pathStr, pathStr + path.size() + 1); const char* const argsStr = args.c_str(); std::vector<char> argsBuffer(argsStr, argsStr + args.size() + 1); // TODO: support more than one argument std::vector<char*> argv; argv.push_back(&pathBuffer[0]); if (!args.empty()) argv.push_back(&argsBuffer[0]); argv.push_back(0); return g_spawn_async(dir.c_str(), &argv[0], 0, G_SPAWN_SEARCH_PATH, 0, 0, 0, 0); }
FILE* LogDebugEnabled() { if (DebugLogOn(sServer)) { static StrPtrLen statsFileNameStr("server_debug_status"); StrPtrLenDel pathStr(sServer->GetPrefs()->GetErrorLogDir()); ResizeableStringFormatter pathBuffer(NULL,0); pathBuffer.PutFilePath(&pathStr,&statsFileNameStr); pathBuffer.PutTerminator(); char* filePath = pathBuffer.GetBufPtr(); return ::fopen(filePath, "a"); } return NULL; }
status_t __find_directory(directory_which which, dev_t device, bool createIt, char *returnedPath, int32 _pathLength) { if (_pathLength <= 0) return E2BIG; size_t pathLength = _pathLength; const char *templatePath = NULL; /* as with the R5 version, no on-stack buffer */ char *buffer = (char*)malloc(pathLength); if (buffer == NULL) return B_NO_MEMORY; MemoryDeleter bufferDeleter(buffer); memset(buffer, 0, pathLength); strlcat(buffer, "/boot", pathLength); switch ((int)which) { /* Haiku system directories */ case B_SYSTEM_DIRECTORY: case B_BEOS_SYSTEM_DIRECTORY: case B_SYSTEM_ADDONS_DIRECTORY: case B_SYSTEM_BOOT_DIRECTORY: case B_SYSTEM_FONTS_DIRECTORY: case B_SYSTEM_LIB_DIRECTORY: case B_SYSTEM_SERVERS_DIRECTORY: case B_SYSTEM_APPS_DIRECTORY: case B_SYSTEM_BIN_DIRECTORY: case B_BEOS_ETC_DIRECTORY: case B_SYSTEM_DOCUMENTATION_DIRECTORY: case B_SYSTEM_PREFERENCES_DIRECTORY: case B_SYSTEM_TRANSLATORS_DIRECTORY: case B_SYSTEM_MEDIA_NODES_DIRECTORY: case B_SYSTEM_SOUNDS_DIRECTORY: case B_SYSTEM_DATA_DIRECTORY: case B_SYSTEM_DEVELOP_DIRECTORY: case B_SYSTEM_PACKAGES_DIRECTORY: case B_SYSTEM_HEADERS_DIRECTORY: templatePath = kSystemDirectories[which - B_SYSTEM_DIRECTORY]; break; /* Obsolete common directories and writable system directories */ case B_COMMON_DIRECTORY: case B_COMMON_SYSTEM_DIRECTORY: case B_COMMON_ADDONS_DIRECTORY: case B_COMMON_BOOT_DIRECTORY: case B_COMMON_FONTS_DIRECTORY: case B_COMMON_LIB_DIRECTORY: case B_COMMON_SERVERS_DIRECTORY: case B_COMMON_BIN_DIRECTORY: case B_SYSTEM_ETC_DIRECTORY: case B_COMMON_DOCUMENTATION_DIRECTORY: case B_SYSTEM_SETTINGS_DIRECTORY: case B_COMMON_DEVELOP_DIRECTORY: case B_SYSTEM_LOG_DIRECTORY: case B_SYSTEM_SPOOL_DIRECTORY: case B_SYSTEM_TEMP_DIRECTORY: case B_SYSTEM_VAR_DIRECTORY: case B_COMMON_TRANSLATORS_DIRECTORY: case B_COMMON_MEDIA_NODES_DIRECTORY: case B_COMMON_SOUNDS_DIRECTORY: case B_COMMON_DATA_DIRECTORY: case B_SYSTEM_CACHE_DIRECTORY: case B_COMMON_PACKAGES_DIRECTORY: case B_COMMON_HEADERS_DIRECTORY: case B_SYSTEM_NONPACKAGED_DIRECTORY: case B_SYSTEM_NONPACKAGED_ADDONS_DIRECTORY: case B_SYSTEM_NONPACKAGED_TRANSLATORS_DIRECTORY: case B_SYSTEM_NONPACKAGED_MEDIA_NODES_DIRECTORY: case B_SYSTEM_NONPACKAGED_BIN_DIRECTORY: case B_SYSTEM_NONPACKAGED_DATA_DIRECTORY: case B_SYSTEM_NONPACKAGED_FONTS_DIRECTORY: case B_SYSTEM_NONPACKAGED_SOUNDS_DIRECTORY: case B_SYSTEM_NONPACKAGED_DOCUMENTATION_DIRECTORY: case B_SYSTEM_NONPACKAGED_LIB_DIRECTORY: case B_SYSTEM_NONPACKAGED_HEADERS_DIRECTORY: case B_SYSTEM_NONPACKAGED_DEVELOP_DIRECTORY: templatePath = kCommonDirectories[which - B_COMMON_DIRECTORY]; break; /* User directories */ case B_USER_DIRECTORY: case B_USER_CONFIG_DIRECTORY: case B_USER_ADDONS_DIRECTORY: case B_USER_BOOT_DIRECTORY: case B_USER_FONTS_DIRECTORY: case B_USER_LIB_DIRECTORY: case B_USER_SETTINGS_DIRECTORY: case B_USER_DESKBAR_DIRECTORY: case B_USER_PRINTERS_DIRECTORY: case B_USER_TRANSLATORS_DIRECTORY: case B_USER_MEDIA_NODES_DIRECTORY: case B_USER_SOUNDS_DIRECTORY: case B_USER_DATA_DIRECTORY: case B_USER_CACHE_DIRECTORY: case B_USER_PACKAGES_DIRECTORY: case B_USER_HEADERS_DIRECTORY: case B_USER_DEVELOP_DIRECTORY: case B_USER_DOCUMENTATION_DIRECTORY: case B_USER_NONPACKAGED_DIRECTORY: case B_USER_NONPACKAGED_ADDONS_DIRECTORY: case B_USER_NONPACKAGED_TRANSLATORS_DIRECTORY: case B_USER_NONPACKAGED_MEDIA_NODES_DIRECTORY: case B_USER_NONPACKAGED_BIN_DIRECTORY: case B_USER_NONPACKAGED_DATA_DIRECTORY: case B_USER_NONPACKAGED_FONTS_DIRECTORY: case B_USER_NONPACKAGED_SOUNDS_DIRECTORY: case B_USER_NONPACKAGED_DOCUMENTATION_DIRECTORY: case B_USER_NONPACKAGED_LIB_DIRECTORY: case B_USER_NONPACKAGED_HEADERS_DIRECTORY: case B_USER_NONPACKAGED_DEVELOP_DIRECTORY: case B_USER_SERVERS_DIRECTORY: case B_USER_APPS_DIRECTORY: case B_USER_BIN_DIRECTORY: case B_USER_PREFERENCES_DIRECTORY: case B_USER_ETC_DIRECTORY: case B_USER_LOG_DIRECTORY: case B_USER_SPOOL_DIRECTORY: case B_USER_VAR_DIRECTORY: templatePath = kUserDirectories[which - B_USER_DIRECTORY]; break; default: return EINVAL; } if (templatePath == NULL) return ENOENT; PathBuffer pathBuffer(buffer, pathLength, strlen(buffer)); // resolve "$h" placeholder to the user's home directory if (!strncmp(templatePath, "$h", 2)) { pathBuffer.Append("/home"); templatePath += 2; } else if (templatePath[0] != '\0') pathBuffer.Append('/'); // resolve "$a" placeholder to the architecture subdirectory, if not // primary if (char* dollar = strchr(templatePath, '$')) { if (dollar[1] == 'a') { pathBuffer.Append(templatePath, dollar - templatePath); templatePath = dollar + 2; } } // append (remainder of) template path pathBuffer.Append(templatePath); if (pathBuffer.Length() >= pathLength) return E2BIG; strlcpy(returnedPath, buffer, pathLength); return B_OK; }
status_t __find_directory(directory_which which, dev_t device, bool createIt, char *returnedPath, int32 _pathLength) { if (_pathLength <= 0) return E2BIG; size_t pathLength = _pathLength; status_t err = B_OK; dev_t bootDevice = -1; struct fs_info fsInfo; struct stat st; const char *templatePath = NULL; /* as with the R5 version, no on-stack buffer */ char *buffer = (char*)malloc(pathLength); if (buffer == NULL) return B_NO_MEMORY; MemoryDeleter bufferDeleter(buffer); memset(buffer, 0, pathLength); /* fiddle with non-boot volume for items that need it */ switch (which) { case B_DESKTOP_DIRECTORY: case B_TRASH_DIRECTORY: bootDevice = dev_for_path("/boot"); if (device <= 0) device = bootDevice; if (fs_stat_dev(device, &fsInfo) != B_OK) return ENODEV; if (device != bootDevice) { #ifdef _KERNEL_MODE err = _user_entry_ref_to_path(device, fsInfo.root, /*"."*/ NULL, buffer, pathLength); #else err = _kern_entry_ref_to_path(device, fsInfo.root, /*"."*/ NULL, buffer, pathLength); #endif if (err != B_OK) return err; } else { /* use the user id to find the home folder */ /* done later */ strlcat(buffer, "/boot", pathLength); } break; case B_PACKAGE_LINKS_DIRECTORY: // this is a directory living in rootfs break; default: strlcat(buffer, "/boot", pathLength); break; } switch ((int)which) { /* Per volume directories */ case B_DESKTOP_DIRECTORY: if (device == bootDevice || !strcmp(fsInfo.fsh_name, "bfs")) templatePath = "$h/Desktop"; break; case B_TRASH_DIRECTORY: // TODO: eventually put that into the file system API? if (device == bootDevice || !strcmp(fsInfo.fsh_name, "bfs")) templatePath = "trash"; // TODO: add suffix for current user else if (!strcmp(fsInfo.fsh_name, "fat")) templatePath = "RECYCLED/_BEOS_"; break; /* Haiku system directories */ case B_SYSTEM_DIRECTORY: case B_BEOS_SYSTEM_DIRECTORY: case B_SYSTEM_ADDONS_DIRECTORY: case B_SYSTEM_BOOT_DIRECTORY: case B_SYSTEM_FONTS_DIRECTORY: case B_SYSTEM_LIB_DIRECTORY: case B_SYSTEM_SERVERS_DIRECTORY: case B_SYSTEM_APPS_DIRECTORY: case B_SYSTEM_BIN_DIRECTORY: case B_BEOS_ETC_DIRECTORY: case B_SYSTEM_DOCUMENTATION_DIRECTORY: case B_SYSTEM_PREFERENCES_DIRECTORY: case B_SYSTEM_TRANSLATORS_DIRECTORY: case B_SYSTEM_MEDIA_NODES_DIRECTORY: case B_SYSTEM_SOUNDS_DIRECTORY: case B_SYSTEM_DATA_DIRECTORY: case B_SYSTEM_DEVELOP_DIRECTORY: case B_SYSTEM_PACKAGES_DIRECTORY: case B_SYSTEM_HEADERS_DIRECTORY: templatePath = kSystemDirectories[which - B_SYSTEM_DIRECTORY]; break; /* Obsolete common directories and writable system directories */ case B_COMMON_DIRECTORY: case B_COMMON_SYSTEM_DIRECTORY: case B_COMMON_ADDONS_DIRECTORY: case B_COMMON_BOOT_DIRECTORY: case B_COMMON_FONTS_DIRECTORY: case B_COMMON_LIB_DIRECTORY: case B_COMMON_SERVERS_DIRECTORY: case B_COMMON_BIN_DIRECTORY: case B_SYSTEM_ETC_DIRECTORY: case B_COMMON_DOCUMENTATION_DIRECTORY: case B_SYSTEM_SETTINGS_DIRECTORY: case B_COMMON_DEVELOP_DIRECTORY: case B_SYSTEM_LOG_DIRECTORY: case B_SYSTEM_SPOOL_DIRECTORY: case B_SYSTEM_TEMP_DIRECTORY: case B_SYSTEM_VAR_DIRECTORY: case B_COMMON_TRANSLATORS_DIRECTORY: case B_COMMON_MEDIA_NODES_DIRECTORY: case B_COMMON_SOUNDS_DIRECTORY: case B_COMMON_DATA_DIRECTORY: case B_SYSTEM_CACHE_DIRECTORY: case B_COMMON_PACKAGES_DIRECTORY: case B_COMMON_HEADERS_DIRECTORY: case B_SYSTEM_NONPACKAGED_DIRECTORY: case B_SYSTEM_NONPACKAGED_ADDONS_DIRECTORY: case B_SYSTEM_NONPACKAGED_TRANSLATORS_DIRECTORY: case B_SYSTEM_NONPACKAGED_MEDIA_NODES_DIRECTORY: case B_SYSTEM_NONPACKAGED_BIN_DIRECTORY: case B_SYSTEM_NONPACKAGED_DATA_DIRECTORY: case B_SYSTEM_NONPACKAGED_FONTS_DIRECTORY: case B_SYSTEM_NONPACKAGED_SOUNDS_DIRECTORY: case B_SYSTEM_NONPACKAGED_DOCUMENTATION_DIRECTORY: case B_SYSTEM_NONPACKAGED_LIB_DIRECTORY: case B_SYSTEM_NONPACKAGED_HEADERS_DIRECTORY: case B_SYSTEM_NONPACKAGED_DEVELOP_DIRECTORY: templatePath = kCommonDirectories[which - B_COMMON_DIRECTORY]; break; /* User directories */ case B_USER_DIRECTORY: case B_USER_CONFIG_DIRECTORY: case B_USER_ADDONS_DIRECTORY: case B_USER_BOOT_DIRECTORY: case B_USER_FONTS_DIRECTORY: case B_USER_LIB_DIRECTORY: case B_USER_SETTINGS_DIRECTORY: case B_USER_DESKBAR_DIRECTORY: case B_USER_PRINTERS_DIRECTORY: case B_USER_TRANSLATORS_DIRECTORY: case B_USER_MEDIA_NODES_DIRECTORY: case B_USER_SOUNDS_DIRECTORY: case B_USER_DATA_DIRECTORY: case B_USER_CACHE_DIRECTORY: case B_USER_PACKAGES_DIRECTORY: case B_USER_HEADERS_DIRECTORY: case B_USER_DEVELOP_DIRECTORY: case B_USER_DOCUMENTATION_DIRECTORY: case B_USER_NONPACKAGED_DIRECTORY: case B_USER_NONPACKAGED_ADDONS_DIRECTORY: case B_USER_NONPACKAGED_TRANSLATORS_DIRECTORY: case B_USER_NONPACKAGED_MEDIA_NODES_DIRECTORY: case B_USER_NONPACKAGED_BIN_DIRECTORY: case B_USER_NONPACKAGED_DATA_DIRECTORY: case B_USER_NONPACKAGED_FONTS_DIRECTORY: case B_USER_NONPACKAGED_SOUNDS_DIRECTORY: case B_USER_NONPACKAGED_DOCUMENTATION_DIRECTORY: case B_USER_NONPACKAGED_LIB_DIRECTORY: case B_USER_NONPACKAGED_HEADERS_DIRECTORY: case B_USER_NONPACKAGED_DEVELOP_DIRECTORY: case B_USER_SERVERS_DIRECTORY: case B_USER_APPS_DIRECTORY: case B_USER_BIN_DIRECTORY: case B_USER_PREFERENCES_DIRECTORY: case B_USER_ETC_DIRECTORY: case B_USER_LOG_DIRECTORY: case B_USER_SPOOL_DIRECTORY: case B_USER_VAR_DIRECTORY: templatePath = kUserDirectories[which - B_USER_DIRECTORY]; break; /* Global directories */ case B_APPS_DIRECTORY: case B_UTILITIES_DIRECTORY: templatePath = SYSTEM "/apps"; break; case B_PREFERENCES_DIRECTORY: templatePath = SYSTEM "/preferences"; break; case B_PACKAGE_LINKS_DIRECTORY: templatePath = "packages"; break; default: return EINVAL; } if (templatePath == NULL) return ENOENT; PathBuffer pathBuffer(buffer, pathLength, strlen(buffer)); // resolve "$h" placeholder to the user's home directory if (!strncmp(templatePath, "$h", 2)) { if (bootDevice > -1 && device != bootDevice) { pathBuffer.Append("/home"); } else { size_t length = get_user_home_path(buffer, pathLength); if (length >= pathLength) return E2BIG; pathBuffer.SetTo(buffer, pathLength, length); } templatePath += 2; } else if (templatePath[0] != '\0') pathBuffer.Append('/'); // resolve "$a" placeholder to the architecture subdirectory, if not // primary if (char* dollar = strchr(templatePath, '$')) { if (dollar[1] == 'a') { pathBuffer.Append(templatePath, dollar - templatePath); #ifndef _KERNEL_MODE const char* architecture = __get_architecture(); if (strcmp(architecture, __get_primary_architecture()) != 0) { pathBuffer.Append('/'); pathBuffer.Append(architecture); } #endif templatePath = dollar + 2; } } // append (remainder of) template path pathBuffer.Append(templatePath); if (pathBuffer.Length() >= pathLength) return E2BIG; if (createIt && stat(buffer, &st) < 0) { err = create_path(buffer, 0755); if (err != B_OK) return err; } strlcpy(returnedPath, buffer, pathLength); return B_OK; }
void LogStatus(QTSS_ServerState theServerState) { static QTSS_ServerState lastServerState = 0; static char *sPLISTHeader[] = { "<?xml version=\"1.0\" encoding=\"UTF-8\"?>", #if __MacOSX__ "<!DOCTYPE plist SYSTEM \"file://localhost/System/Library/DTDs/PropertyList.dtd\">", #else "<!ENTITY % plistObject \"(array | data | date | dict | real | integer | string | true | false )\">", "<!ELEMENT plist %plistObject;>", "<!ATTLIST plist version CDATA \"0.9\">", "", "<!-- Collections -->", "<!ELEMENT array (%plistObject;)*>", "<!ELEMENT dict (key, %plistObject;)*>", "<!ELEMENT key (#PCDATA)>", "", "<!--- Primitive types -->", "<!ELEMENT string (#PCDATA)>", "<!ELEMENT data (#PCDATA)> <!-- Contents interpreted as Base-64 encoded -->", "<!ELEMENT date (#PCDATA)> <!-- Contents should conform to a subset of ISO 8601 (in particular, YYYY '-' MM '-' DD 'T' HH ':' MM ':' SS 'Z'. Smaller units may be omitted with a loss of precision) -->", "", "<!-- Numerical primitives -->", "<!ELEMENT true EMPTY> <!-- Boolean constant true -->", "<!ELEMENT false EMPTY> <!-- Boolean constant false -->", "<!ELEMENT real (#PCDATA)> <!-- Contents should represent a floating point number matching (\"+\" | \"-\")? d+ (\".\"d*)? (\"E\" (\"+\" | \"-\") d+)? where d is a digit 0-9. -->", "<!ELEMENT integer (#PCDATA)> <!-- Contents should represent a (possibly signed) integer number in base 10 -->", "]>", #endif }; static int numHeaderLines = sizeof(sPLISTHeader) / sizeof(char*); static char* sPlistStart = "<plist version=\"0.9\">"; static char* sPlistEnd = "</plist>"; static char* sDictStart = "<dict>"; static char* sDictEnd = "</dict>"; static char* sKey = " <key>%s</key>\n"; static char* sValue = " <string>%s</string>\n"; static char *sAttributes[] = { "qtssSvrServerName", "qtssSvrServerVersion", "qtssSvrServerBuild", "qtssSvrServerPlatform", "qtssSvrRTSPServerComment", "qtssSvrServerBuildDate", "qtssSvrStartupTime", "qtssSvrCurrentTimeMilliseconds", "qtssSvrCPULoadPercent", "qtssSvrState", "qtssRTPSvrCurConn", "qtssRTSPCurrentSessionCount", "qtssRTSPHTTPCurrentSessionCount", "qtssRTPSvrCurBandwidth", "qtssRTPSvrCurPackets", "qtssRTPSvrTotalConn", "qtssRTPSvrTotalBytes", "qtssMP3SvrCurConn", "qtssMP3SvrTotalConn", "qtssMP3SvrCurBandwidth", "qtssMP3SvrTotalBytes" }; static int numAttributes = sizeof(sAttributes) / sizeof(char*); static StrPtrLen statsFileNameStr("server_status"); if (false == sServer->GetPrefs()->ServerStatFileEnabled()) return; UInt32 interval = sServer->GetPrefs()->GetStatFileIntervalSec(); if (interval == 0 || (OS::UnixTime_Secs() % interval) > 0 ) return; // If the total number of RTSP sessions is 0 then we // might not need to update the "server_status" file. char* thePrefStr = NULL; // We start lastRTSPSessionCount off with an impossible value so that // we force the "server_status" file to be written at least once. static int lastRTSPSessionCount = -1; // Get the RTSP session count from the server. (void)QTSS_GetValueAsString(sServer, qtssRTSPCurrentSessionCount, 0, &thePrefStr); int currentRTSPSessionCount = ::atoi(thePrefStr); delete [] thePrefStr; thePrefStr = NULL; if (currentRTSPSessionCount == 0 && currentRTSPSessionCount == lastRTSPSessionCount) { // we don't need to update the "server_status" file except the // first time we are in the idle state. if (theServerState == qtssIdleState && lastServerState == qtssIdleState) { lastRTSPSessionCount = currentRTSPSessionCount; lastServerState = theServerState; return; } } else { // save the RTSP session count for the next time we execute. lastRTSPSessionCount = currentRTSPSessionCount; } StrPtrLenDel pathStr(sServer->GetPrefs()->GetErrorLogDir()); StrPtrLenDel fileNameStr(sServer->GetPrefs()->GetStatsMonitorFileName()); ResizeableStringFormatter pathBuffer(NULL,0); pathBuffer.PutFilePath(&pathStr,&fileNameStr); pathBuffer.PutTerminator(); char* filePath = pathBuffer.GetBufPtr(); FILE* statusFile = ::fopen(filePath, "w"); char* theAttributeValue = NULL; int i; if (statusFile != NULL) { ::chmod(filePath, 0640); for ( i = 0; i < numHeaderLines; i++) { qtss_fprintf(statusFile, "%s\n",sPLISTHeader[i]); } qtss_fprintf(statusFile, "%s\n", sPlistStart); qtss_fprintf(statusFile, "%s\n", sDictStart); // show each element value for ( i = 0; i < numAttributes; i++) { (void)QTSS_GetValueAsString(sServer, QTSSModuleUtils::GetAttrID(sServer,sAttributes[i]), 0, &theAttributeValue); if (theAttributeValue != NULL) { qtss_fprintf(statusFile, sKey, sAttributes[i]); qtss_fprintf(statusFile, sValue, theAttributeValue); delete [] theAttributeValue; theAttributeValue = NULL; } } qtss_fprintf(statusFile, "%s\n", sDictEnd); qtss_fprintf(statusFile, "%s\n\n", sPlistEnd); ::fclose(statusFile); } lastServerState = theServerState; }