Index: src/OFString.h ================================================================== --- src/OFString.h +++ src/OFString.h @@ -166,10 +166,20 @@ */ + (instancetype)stringWithCString: (const char *)cString encoding: (of_string_encoding_t)encoding length: (size_t)cStringLength; +/*! + * @brief Creates a new OFString from OFData with the specified encoding. + * + * @param data OFData with the contents of the string + * @param encoding The encoding in which the string is stored in the OFData + * @return An new autoreleased OFString + */ ++ (instancetype)stringWithData: (OFData *)data + encoding: (of_string_encoding_t)encoding; + /*! * @brief Creates a new OFString from another string. * * @param string A string to initialize the OFString with * @return A new autoreleased OFString @@ -400,10 +410,21 @@ */ - initWithCString: (const char *)cString encoding: (of_string_encoding_t)encoding length: (size_t)cStringLength; +/*! + * @brief Initializes an already allocated OFString from OFData with the + * specified encoding. + * + * @param data OFData with the contents of the string + * @param encoding The encoding in which the string is stored in the OFData + * @return An initialized OFString + */ +- initWithData: (OFData *)data + encoding: (of_string_encoding_t)encoding; + /*! * @brief Initializes an already allocated OFString with another string. * * @param string A string to initialize the OFString with * @return An initialized OFString Index: src/OFString.m ================================================================== --- src/OFString.m +++ src/OFString.m @@ -467,10 +467,17 @@ return (id)[[OFString_UTF8 alloc] initWithCString: cString encoding: encoding length: cStringLength]; } + +- initWithData: (OFData *)data + encoding: (of_string_encoding_t)encoding +{ + return (id)[[OFString_UTF8 alloc] initWithData: data + encoding: encoding]; +} - initWithString: (OFString *)string { return (id)[[OFString_UTF8 alloc] initWithString: string]; } @@ -673,10 +680,17 @@ { return [[[self alloc] initWithCString: cString encoding: encoding length: cStringLength] autorelease]; } + ++ (instancetype)stringWithData: (OFData *)data + encoding: (of_string_encoding_t)encoding +{ + return [[[self alloc] initWithData: data + encoding: encoding] autorelease]; +} + (instancetype)stringWithString: (OFString *)string { return [[[self alloc] initWithString: string] autorelease]; } @@ -851,10 +865,28 @@ encoding: (of_string_encoding_t)encoding length: (size_t)cStringLength { OF_INVALID_INIT_METHOD } + +- initWithData: (OFData *)data + encoding: (of_string_encoding_t)encoding +{ + @try { + if ([data itemSize] != 1) + @throw [OFInvalidArgumentException exception]; + + self = [self initWithCString: [data items] + encoding: encoding + length: [data count]]; + } @catch (id e) { + [self release]; + @throw e; + } + + return self; +} - initWithString: (OFString *)string { OF_INVALID_INIT_METHOD }