From db208190bef1a84e828876ed2fc25983442b24cb Mon Sep 17 00:00:00 2001 From: lotodore Date: Sat, 8 Sep 2007 16:26:10 +0000 Subject: [PATCH] Added avatar manager which will help when transfering and caching avatars. Using boost::filesystem. MD5 sum is used to identify avatars, different types of files are possible. Avatar cache (and the avatars provided) use for example .png as file names, so that no additional storage for the md5sum is required. A cache directory with write permissions is required, however, as avatars are not cached in RAM. --- pokerth_lib.pro | 2 + src/core/avatarmanager.h | 51 +++++++++++ src/core/common/avatarmanager.cpp | 136 ++++++++++++++++++++++++++++++ src/core/common/crypthelper.cpp | 7 +- src/core/crypthelper.h | 3 +- 5 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 src/core/avatarmanager.h create mode 100644 src/core/common/avatarmanager.cpp diff --git a/pokerth_lib.pro b/pokerth_lib.pro index 540c1693..91798066 100644 --- a/pokerth_lib.pro +++ b/pokerth_lib.pro @@ -45,6 +45,7 @@ HEADERS += \ src/config/configfile.h \ src/core/thread.h \ src/core/crypthelper.h \ + src/core/avatarmanager.h \ src/engine/boardinterface.h \ src/engine/enginefactory.h \ src/engine/handinterface.h \ @@ -106,6 +107,7 @@ SOURCES += \ src/gui/guiinterface.cpp \ src/core/common/thread.cpp \ src/core/common/crypthelper.cpp \ + src/core/avatarmanager.cpp \ src/core/tinyxml/tinystr.cpp \ src/core/tinyxml/tinyxml.cpp \ src/core/tinyxml/tinyxmlerror.cpp \ diff --git a/src/core/avatarmanager.h b/src/core/avatarmanager.h new file mode 100644 index 00000000..94a6fe2b --- /dev/null +++ b/src/core/avatarmanager.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * Copyright (C) 2007 by Lothar May * + * * + * This program 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +/* A manager for avatar files, MD5sums and a cache. */ + +#ifndef _AVATARMANAGER_H_ +#define _AVATARMANAGER_H_ + +#include +#include + +class AvatarManager +{ +public: + + AvatarManager(); + ~AvatarManager(); + + bool Init(const std::string &dataDir, const std::string &cacheDir); + + bool GetHashForAvatar(const std::string &fileName, MD5Buf &md5buf); + bool GetAvatarFileName(const MD5Buf &md5buf, std::string &fileName) const; + bool StoreAvatarInCache(const MD5Buf &md5buf, const std::string &fileExtension, const unsigned char *data, unsigned size); + +protected: + typedef std::map AvatarMap; + + void InternalReadDirectory(const std::string &dir); + +private: + AvatarMap m_avatars; + + std::string m_cacheDir; +}; + +#endif diff --git a/src/core/common/avatarmanager.cpp b/src/core/common/avatarmanager.cpp new file mode 100644 index 00000000..f07b013a --- /dev/null +++ b/src/core/common/avatarmanager.cpp @@ -0,0 +1,136 @@ +/*************************************************************************** + * Copyright (C) 2007 by Lothar May * + * * + * This program 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. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "avatarmanager.h" + +#include +#include + +using namespace std; +using namespace boost::filesystem; + + +AvatarManager::AvatarManager() +{ +} + +AvatarManager::~AvatarManager() +{ +} + +bool +AvatarManager::Init(const std::string &dataDir, const std::string &cacheDir) +{ + bool retVal = false; + try + { + InternalReadDirectory(dataDir); + InternalReadDirectory(cacheDir); + m_cacheDir = cacheDir; + retVal = true; + } catch (...) + { + } + return retVal; +} + +bool +AvatarManager::GetHashForAvatar(const std::string &fileName, MD5Buf &md5buf) +{ + bool found = false; + + if (exists(fileName)) + { + AvatarMap::const_iterator i = m_avatars.begin(); + AvatarMap::const_iterator end = m_avatars.end(); + while (i != end) + { + if (i->second == fileName) + { + md5buf = i->first; + found = true; + break; + } + ++i; + } + if (!found) + { + if (CryptHelper::MD5Sum(fileName, md5buf)) + { + m_avatars.insert(AvatarMap::value_type(md5buf, fileName)); + found = true; + } + } + } + return found; +} + +bool +AvatarManager::GetAvatarFileName(const MD5Buf &md5buf, std::string &fileName) const +{ + bool retVal = false; + AvatarMap::const_iterator pos = m_avatars.find(md5buf); + if (pos != m_avatars.end()) + { + fileName = pos->second; + retVal = true; + } + return retVal; +} + +bool +AvatarManager::StoreAvatarInCache(const MD5Buf &md5buf, const std::string &fileExtension, const unsigned char *data, unsigned size) +{ + bool retVal = false; + try + { + path tmpPath(m_cacheDir); + tmpPath /= (md5buf.ToString() + "." + fileExtension); + string fileName(tmpPath.file_string()); + ofstream o(fileName.c_str()); + o.write((const char *)data, size); + m_avatars.insert(AvatarMap::value_type(md5buf, fileName)); + retVal = true; + } catch (...) + { + } + return retVal; +} + +void +AvatarManager::InternalReadDirectory(const std::string &dir) +{ + directory_iterator i(dir); + directory_iterator end; + + while (i != end) + { + if (is_regular(i->status())) + { + string md5sum(basename(i->path())); + MD5Buf tmpBuf; + if (tmpBuf.FromString(md5sum)) + { + m_avatars.insert(AvatarMap::value_type(tmpBuf, i->path().file_string())); + } + } + ++i; + } +} + diff --git a/src/core/common/crypthelper.cpp b/src/core/common/crypthelper.cpp index 24e45e1b..90808a7e 100644 --- a/src/core/common/crypthelper.cpp +++ b/src/core/common/crypthelper.cpp @@ -89,11 +89,16 @@ MD5Buf::FromString(const std::string &text) } bool -MD5Buf::operator==(const MD5Buf &other) +MD5Buf::operator==(const MD5Buf &other) const { return memcmp(data, other.data, MD5_DATA_SIZE) == 0; } +bool +MD5Buf::operator<(const MD5Buf &other) const +{ + return memcmp(data, other.data, MD5_DATA_SIZE) < 0; +} bool CryptHelper::MD5Sum(const std::string &fileName, MD5Buf &buf) diff --git a/src/core/crypthelper.h b/src/core/crypthelper.h index b5dea316..86d9a894 100644 --- a/src/core/crypthelper.h +++ b/src/core/crypthelper.h @@ -32,7 +32,8 @@ struct MD5Buf std::string ToString() const; bool FromString(const std::string &text); - bool operator==(const MD5Buf &other); + bool operator==(const MD5Buf &other) const; + bool operator<(const MD5Buf &other) const; unsigned char data[MD5_DATA_SIZE]; };