root/src/Catalog.h @ bc4c8be2
| 5fa4a398 | david.sorber | #ifndef __CATALOG_H__
|
||
#define __CATALOG_H__
|
||||
| f16b75e3 | david.sorber | #include <climits>
|
||
| 5fa4a398 | david.sorber | #include <cstdint>
|
||
#include <string>
|
||||
| 8a16b7a0 | david.sorber | #include <string_view>
|
||
| 5fa4a398 | david.sorber | #include <vector>
|
||
#include "CatalogItem.h"
|
||||
| 8a16b7a0 | david.sorber | // I mean this should go into some sort of utils
|
||
template<class T>
|
||||
static inline void tokenize(
|
||||
T input,
|
||||
std::string delim,
|
||||
std::vector<std::string_view>& tokens)
|
||||
{
|
||||
uint32_t prevOffset = 0;
|
||||
auto pos = std::string_view::npos;
|
||||
while ((pos = input.find(delim, prevOffset)) != std::string_view::npos)
|
||||
{
|
||||
tokens.emplace_back(input.data() + prevOffset, (pos - prevOffset));
|
||||
prevOffset = pos + delim.size();
|
||||
}
|
||||
// Final (or only one) parameter
|
||||
tokens.emplace_back(input.data() + prevOffset,
|
||||
(input.size() - prevOffset));
|
||||
}
|
||||
| 5fa4a398 | david.sorber | class Catalog
|
||
{
|
||||
public:
|
||||
| c393c256 | david.sorber | static inline CatalogItem INVALID_ITEM{"INVALID", "INVALID"};
|
||
| 5fa4a398 | david.sorber | Catalog();
|
||
~Catalog();
|
||||
| f16b75e3 | david.sorber | int load(
|
||
char* filePath,
|
||||
char* passwordBuffer,
|
||||
uint32_t passwordBufferSize,
|
||||
float* complete);
|
||||
inline bool getLoaded() const
|
||||
{
|
||||
return m_loaded;
|
||||
}
|
||||
| 5fa4a398 | david.sorber | inline std::vector<CatalogItem>::iterator begin()
|
||
{
|
||||
return m_catalog.begin();
|
||||
}
|
||||
inline std::vector<CatalogItem>::iterator end()
|
||||
{
|
||||
return m_catalog.end();
|
||||
}
|
||||
| c393c256 | david.sorber | inline CatalogItem& getItemById(int id)
|
||
{
|
||||
for (auto& iter : m_catalog)
|
||||
{
|
||||
if (iter.getId() == id)
|
||||
{
|
||||
return iter;
|
||||
}
|
||||
}
|
||||
return INVALID_ITEM;
|
||||
}
|
||||
| 5fa4a398 | david.sorber | void setAllVisible();
|
||
void filter(const std::string& criteria);
|
||||
| f16b75e3 | david.sorber | static const char* errToString(int err)
|
||
{
|
||||
switch (err)
|
||||
{
|
||||
case ERR_PWHASH_OUT_OF_MEMORY:
|
||||
return "pwhash: out of memory";
|
||||
case ERR_DECRYPT_INCOMPLETE_HEADER:
|
||||
return "decrypt: incomplete header";
|
||||
case ERR_DECRYPT_CORRUPTED_CHUNK:
|
||||
| 7cb84a4d | david.sorber | return "decrypt: corrupted chunk (check password)";
|
||
| f16b75e3 | david.sorber | |||
case ERR_DECRYPT_PREMATURE_END:
|
||||
| 7cb84a4d | david.sorber | return "decrypt: premature end of file (file likely corrupted)";
|
||
| f16b75e3 | david.sorber | |||
default:
|
||||
return "unknown error";
|
||||
}
|
||||
}
|
||||
| 5fa4a398 | david.sorber | |||
private:
|
||||
| f16b75e3 | david.sorber | static inline const int ERR_PWHASH_OUT_OF_MEMORY = INT_MIN + 19;
|
||
static inline const int ERR_DECRYPT_INCOMPLETE_HEADER = INT_MIN + 20;
|
||||
static inline const int ERR_DECRYPT_CORRUPTED_CHUNK = INT_MIN + 21;
|
||||
static inline const int ERR_DECRYPT_PREMATURE_END = INT_MIN + 22;
|
||||
void sort();
|
||||
bool m_loaded;
|
||||
| 5fa4a398 | david.sorber | std::vector<CatalogItem> m_catalog;
|
||
};
|
||||
#endif // __CATALOG_H__
|