diff --git a/Modules.cpp b/Modules.cpp index 9b0c085d..bdf85845 100644 --- a/Modules.cpp +++ b/Modules.cpp @@ -147,7 +147,7 @@ void CModule::SetClient(CClient* pClient) { m_pClient = pClient; } bool CModule::LoadRegistry() { //CString sPrefix = (m_pUser) ? m_pUser->GetUserName() : ".global"; - return (m_mssRegistry.ReadFromDisk(GetSavePath() + "/.registry", 0600) == MCString::MCS_SUCCESS); + return (m_mssRegistry.ReadFromDisk(GetSavePath() + "/.registry") == MCString::MCS_SUCCESS); } bool CModule::SaveRegistry() const { diff --git a/ZNCString.cpp b/ZNCString.cpp index 88f32bec..d14e52e5 100644 --- a/ZNCString.cpp +++ b/ZNCString.cpp @@ -1031,7 +1031,7 @@ bool CString::RightChomp(unsigned int uLen) { } //////////////// MCString //////////////// -int MCString::WriteToDisk(const CString& sPath, mode_t iMode) const { +MCString::status_t MCString::WriteToDisk(const CString& sPath, mode_t iMode) const { CFile cFile(sPath); if (this->empty()) { @@ -1066,10 +1066,10 @@ int MCString::WriteToDisk(const CString& sPath, mode_t iMode) const { return MCS_SUCCESS; } -int MCString::ReadFromDisk(const CString& sPath, mode_t iMode) { +MCString::status_t MCString::ReadFromDisk(const CString& sPath) { clear(); CFile cFile(sPath); - if (!cFile.Open(O_RDONLY, iMode)) { + if (!cFile.Open(O_RDONLY)) { return MCS_EOPEN; } diff --git a/ZNCString.h b/ZNCString.h index 60e60962..97677986 100644 --- a/ZNCString.h +++ b/ZNCString.h @@ -226,31 +226,108 @@ public: */ CString Right(unsigned int uCount) const; + /** Get the first line of this string. + * @return The first line of text. + */ CString FirstLine() const { return Token(0, false, "\n"); } + + /** Get a token out of this string. For example in the string "a bc d e", + * each of "a", "bc", "d" and "e" are tokens. + * @param uPos The number of the token you are interested. The first + * token has a position of 0. + * @param bRest If false, only the token you asked for is returned. Else + * you get the substring starting from the beginning of + * your token. + * @param sSep Seperator between tokens. + * @param bAllowEmpty If this is true, empty tokens are allowed. In the + * example from above this means that there is a + * token "" before the "e" token. + * @return The token you asked for and, if bRest is true, everything + * after it. + * @see Split() if you need a string split into all of its tokens. + */ CString Token(unsigned int uPos, bool bRest = false, const CString& sSep = " ", bool bAllowEmpty = false) const; + + /** Get a token out of this string. This function behaves much like the + * other Token() function in this class. The extra arguments are + * handled similarly to Split(). + */ CString Token(unsigned int uPos, bool bRest, const CString& sSep, bool bAllowEmpty, const CString& sLeft, const CString& sRight, bool bTrimQuotes = true) const; unsigned int URLSplit(MCString& msRet) const; unsigned int OptionSplit(MCString& msRet, bool bUpperKeys = false) const; unsigned int QuoteSplit(VCString& vsRet) const; + /** Split up this string into tokens. + * Via sLeft and sRight you can define "markers" like with Replace(). + * Anything in such a marked section is treated as a single token. All + * occurences of sDelim in such a block are ignored. + * @param sDelim Delimiter between tokens. + * @param vsRet Vector for returning the result. + * @param bAllowEmpty Do empty tokens count as a valid token? + * @param sLeft Left delimiter like with Replace(). + * @param sRight Right delimiter like with Replace(). + * @param bTrimQuotes Should sLeft and sRight be removed from the token + * they mark? + * @param bTrimWhiteSpace If this is true, CString::Trim() is called on + * each token. + * @return The number of tokens found. + */ unsigned int Split(const CString& sDelim, VCString& vsRet, bool bAllowEmpty = true, const CString& sLeft = "", const CString& sRight = "", bool bTrimQuotes = true, bool bTrimWhiteSpace = false) const; + /** Split up this string into tokens. + * This function is identical to the other CString::Split(), except that + * the result is returned as a SCString instead of a VCString. + */ unsigned int Split(const CString& sDelim, SCString& ssRet, bool bAllowEmpty = true, const CString& sLeft = "", const CString& sRight = "", bool bTrimQuotes = true, bool bTrimWhiteSpace = false) const; + /** Produces a random string. + * @param uLength The length of the resulting string. + * @return A random string. + */ static CString RandomString(unsigned int uLength); + /** @return The MD5 hash of this string. */ CString MD5() const; + /** @return The SHA256 hash of this string. */ CString SHA256() const; + + /** Treat this string as base64-encoded data and decode it. + * @param sRet String to which the result of the decode is safed. + * @return The length of the resulting string. + */ unsigned long Base64Decode(CString& sRet) const; + /** Treat this string as base64-encoded data and decode it. + * The result is saved in this CString instance. + * @return The length of the resulting string. + */ unsigned long Base64Decode(); + /** Treat this string as base64-encoded data and decode it. + * @return The decoded string. + */ CString Base64Decode_n() const; + /** Base64-encode the current string. + * @param sRet String where the result is saved. + * @param uWrap A boolean(!?!) that decides if the result should be + * wrapped after everywhere 57 characters. + * @return true unless this code is buggy. + * @todo WTF @ uWrap. + * @todo This only returns false if some formula we use was wrong?! + */ bool Base64Encode(CString& sRet, unsigned int uWrap = 0) const; + /** Base64-encode the current string. + * This string is overwritten with the result of the encode. + * @todo return value and param are as with Base64Encode() from above. + */ bool Base64Encode(unsigned int uWrap = 0); + /** Base64-encode the current string + * @todo uWrap is as broken as Base64Encode()'s uWrap. + * @return The encoded string. + */ CString Base64Encode_n(unsigned int uWrap = 0) const; #ifdef HAVE_LIBSSL @@ -261,36 +338,122 @@ public: void Crypt(const CString& sPass, bool bEncrypt, const CString& sIvec = ""); #endif + /** Pretty-print a percent value. + * @param d The percent value. This should be in range 0-100. + * @return The "pretty" string. + */ static CString ToPercent(double d); + /** Pretty-print a number of bytes. + * @param d The number of bytes. + * @return A string describing the number of bytes. + */ static CString ToByteStr(unsigned long long d); + /** Pretty-print a time span. + * @param s Number of seconds to print. + * @return A string like "4w 6d 4h 3m 58s". + */ static CString ToTimeStr(unsigned long s); + /** @return True if this string is not "false". */ bool ToBool() const; + /** @return The numerical value of this string similar to atoi(). */ short ToShort() const; + /** @return The numerical value of this string similar to atoi(). */ unsigned short ToUShort() const; + /** @return The numerical value of this string similar to atoi(). */ int ToInt() const; + /** @return The numerical value of this string similar to atoi(). */ long ToLong() const; + /** @return The numerical value of this string similar to atoi(). */ unsigned int ToUInt() const; + /** @return The numerical value of this string similar to atoi(). */ unsigned long ToULong() const; + /** @return The numerical value of this string similar to atoi(). */ unsigned long long ToULongLong() const; + /** @return The numerical value of this string similar to atoi(). */ long long ToLongLong() const; + /** @return The numerical value of this string similar to atoi(). */ double ToDouble() const; + /** Trim this string. All leading/trailing occurences of characters from + * s are removed. + * @param s A list of characters that should be trimmed. + * @return true if this string was modified. + */ bool Trim(const CString& s = " \t\r\n"); + /** Trim this string. All leading occurences of characters from s are + * removed. + * @param s A list of characters that should be trimmed. + * @return true if this string was modified. + */ bool TrimLeft(const CString& s = " \t\r\n"); + /** Trim this string. All trailing occurences of characters from s are + * removed. + * @param s A list of characters that should be trimmed. + * @return true if this string was modified. + */ bool TrimRight(const CString& s = " \t\r\n"); + /** Trim this string. All leading/trailing occurences of characters from + * s are removed. This CString instance is not modified. + * @param s A list of characters that should be trimmed. + * @return The trimmed string. + */ CString Trim_n(const CString& s = " \t\r\n") const; + /** Trim this string. All leading occurences of characters from s are + * removed. This CString instance is not modified. + * @param s A list of characters that should be trimmed. + * @return The trimmed string. + */ CString TrimLeft_n(const CString& s = " \t\r\n") const; + /** Trim this string. All trailing occurences of characters from s are + * removed. This CString instance is not modified. + * @param s A list of characters that should be trimmed. + * @return The trimmed string. + */ CString TrimRight_n(const CString& s = " \t\r\n") const; + /** Trim a given prefix. + * @param sPrefix The prefix that should be removed. + * @return True if this string was modified. + */ bool TrimPrefix(const CString& sPrefix); + /** Trim a given suffix. + * @param sSuffix The suffix that should be removed. + * @return True if this string was modified. + */ bool TrimSuffix(const CString& sSuffix); + /** Trim a given prefix. + * @param sPrefix The prefix that should be removed. + * @return A copy of this string without the prefix. + */ CString TrimPrefix_n(const CString& sPrefix) const; + /** Trim a given suffix. + * @param sSuffix The suffix that should be removed. + * @return A copy of this string without the prefix. + */ CString TrimSuffix_n(const CString& sSuffix) const; + /** Remove characters from the beginning of this string. + * @param uLen The number of characters to remove. + * @return true if this string was modified. + */ bool LeftChomp(unsigned int uLen = 1); + /** Remove characters from the end of this string. + * @param uLen The number of characters to remove. + * @return true if this string was modified. + */ bool RightChomp(unsigned int uLen = 1); + /** Remove characters from the beginning of this string. + * This string object isn't modified. + * @param uLen The number of characters to remove. + * @return The result of the conversion. + */ CString LeftChomp_n(unsigned int uLen = 1) const; + /** Remove characters from the end of this string. + * This string object isn't modified. + * @param uLen The number of characters to remove. + * @return The result of the conversion. + */ CString RightChomp_n(unsigned int uLen = 1) const; private: @@ -298,28 +461,70 @@ protected: unsigned char* strnchr(const unsigned char* src, unsigned char c, unsigned int iMaxBytes, unsigned char* pFill = NULL, unsigned int* piCount = NULL) const; }; +/** + * @brief A dictionary for strings. + * + * This class maps strings to other strings. + */ class MCString : public map { public: + /** Construct an empty MCString. */ MCString() : map() {} + /** Destruct this MCString. */ virtual ~MCString() { clear(); } - enum + /** Status codes that can be returned by WriteToDisk() and + * ReadFromDisk(). */ + enum status_t { + /// No errors. MCS_SUCCESS = 0, + /// Opening the file failed. MCS_EOPEN = 1, + /// Writing to the file failed. MCS_EWRITE = 2, + /// WriteFilter() failed. MCS_EWRITEFIL = 3, + /// ReadFilter() failed. MCS_EREADFIL = 4 }; - int WriteToDisk(const CString& sPath, mode_t iMode = 0644) const; - int ReadFromDisk(const CString& sPath, mode_t iMode = 0644); + /** Write this map to a file. + * @param sPath The file name to write to. + * @param iMode The mode for the file. + * @return The result of the operation. + * @see WriteFilter. + */ + enum status_t WriteToDisk(const CString& sPath, mode_t iMode = 0644) const; + /** Read a map from a file. + * @param sPath The file name to read from. + * @return The result of the operation. + * @see ReadFilter. + */ + enum status_t ReadFromDisk(const CString& sPath); + /** Filter used while writing this map. This function is called by + * WriteToDisk() for each pair that is going to be written. This + * function has the chance to modify the data that will be written. + * @param sKey The key that will be written. Can be modified. + * @param sValue The value that will be written. Can be modified. + * @return true unless WriteToDisk() should fail with MCS_EWRITEFIL. + */ virtual bool WriteFilter(CString& sKey, CString& sValue) const { return true; } + /** Filter used while reading this map. This function is called by + * ReadFromDisk() for each pair that is beging read. This function has + * the chance to modify the data that is being read. + * @param sKey The key that was read. Can be modified. + * @param sValue The value that was read. Can be modified. + * @return true unless ReadFromDisk() should fail with MCS_EWRITEFIL. + */ virtual bool ReadFilter(CString& sKey, CString& sValue) const { return true; } - //! make them parse safe, right now using hex encoding on anything !isalnum + /** Encode a value so that it can safely be parsed by ReadFromDisk(). + * This is an internal function. + */ virtual CString& Encode(CString& sValue) const; + /** Undo the effects of Encode(). This is an internal function. */ virtual CString& Decode(CString& sValue) const; };