예제 #1
0
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&) { }
}
예제 #2
0
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;
}