void ClientManager::saveUsers() const { try { SimpleXML xml; xml.addTag("Users"); xml.stepIn(); { Lock l(cs); for(auto& i: nicks) { if(i.second.second) { xml.addTag("User"); xml.addChildAttrib("CID", i.first.toBase32()); xml.addChildAttrib("Nick", i.second.first); } } } xml.stepOut(); const string fName = getUsersFile(); File out(fName + ".tmp", File::WRITE, File::CREATE | File::TRUNCATE); BufferedOutputStream<false> f(&out); f.write(SimpleXML::utf8Header); xml.toXML(&f); f.flush(); out.close(); File::deleteFile(fName); File::renameFile(fName + ".tmp", fName); } catch(const Exception&) { } }
void ClientManager::loadUsers() { try { SimpleXML xml; xml.fromXML(File(getUsersFile(), File::READ, File::OPEN).read()); if(xml.findChild("Users")) { xml.stepIn(); { Lock l(cs); while(xml.findChild("User")) { nicks[CID(xml.getChildAttrib("CID"))] = std::make_pair(xml.getChildAttrib("Nick"), false); } } xml.stepOut(); } } catch(const Exception&) { } }
static AGArray * getUserInfo() { AGArray * result = NULL; HANDLE hFile; HANDLE hMapping; char usersFile[MAX_PATH]; char *userData; char *current; char *maxData; int fileSize; char *name, *dir; usersFile[0] = '\0'; getUsersFile(usersFile, MAX_PATH); hFile = CreateFile(usersFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) return NULL; fileSize = GetFileSize(hFile, NULL); hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); if (NULL != hMapping) { userData = (char *)MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0); maxData = userData + fileSize; result = AGArrayNew(AGUnownedPointerElements, 0); if (NULL != result) { for (current = userData; current < maxData; current++) { if ((name = findString(current, maxData)) && (dir = findString(current + strlen(name) + 1, maxData))) { AGUserInfo * user; int id; id = findID(current - 4); user = (AGUserInfo *)malloc(sizeof(AGUserInfo)); if (NULL != user) { user->name = name; user->dir = dir; user->id = id; current += strlen(name) + strlen(dir) + 1; AGArrayAppend(result, user); } } } } UnmapViewOfFile(userData); CloseHandle(hMapping); } CloseHandle(hFile); return result; }