+/**
+ * \ingroup Util
+ * \brief Get the (last) name of a full path file name
+ * @param fullName file/directory name to extract end name from
+ */
+std::string Util::GetName(std::string const & fullName)
+{
+ std::string filename = fullName;
+
+ std::string::size_type slash_pos = filename.rfind("/");
+ std::string::size_type backslash_pos = filename.rfind("\\");
+ slash_pos = slash_pos > backslash_pos ? slash_pos : backslash_pos;
+ if(slash_pos != std::string::npos)
+ {
+ return filename.substr(slash_pos + 1);
+ }
+ else
+ {
+ return filename;
+ }
+}
+
+/**
+ * \ingroup Util
+ * \brief Get the current date of the system in a dicom string
+ */
+std::string Util::GetCurrentDate()
+{
+ char tmp[512];
+ time_t tloc;
+ time (&tloc);
+ strftime(tmp,512,"%Y%m%d", localtime(&tloc) );
+ return tmp;
+}
+
+/**
+ * \ingroup Util
+ * \brief Get the current time of the system in a dicom string
+ */
+std::string Util::GetCurrentTime()
+{
+ char tmp[512];
+ time_t tloc;
+ time (&tloc);
+ strftime(tmp,512,"%H%M%S", localtime(&tloc) );
+ return tmp;
+}
+
+/**
+ * \brief Create a /DICOM/ string:
+ * It should a of even length (no odd length ever)
+ * It can contain as many (if you are reading this from your
+ * editor the following character is is backslash followed by zero
+ * that needed to be escaped with an extra backslash for doxygen) \\0
+ * as you want.
+ */
+std::string Util::DicomString(const char* s, size_t l)
+{
+ std::string r(s, s+l);
+ assert( !(r.size() % 2) ); // == basically 'l' is even
+ return r;
+}
+
+/**
+ * \ingroup Util
+ * \brief Create a /DICOM/ string:
+ * It should a of even lenght (no odd length ever)
+ * It can contain as many (if you are reading this from your
+ * editor the following character is is backslash followed by zero
+ * that needed to be escaped with an extra backslash for doxygen) \\0
+ * as you want.
+ * This function is similar to DicomString(const char*),
+ * except it doesn't take a lenght.
+ * It only pad with a null character if length is odd
+ */
+std::string Util::DicomString(const char* s)
+{
+ size_t l = strlen(s);
+ if( l%2 )
+ {
+ l++;
+ }
+ std::string r(s, s+l);
+ assert( !(r.size() % 2) );
+ return r;
+}
+
+/**
+ * \ingroup Util
+ * \brief Safely compare two Dicom String:
+ * - Both string should be of even lenght
+ * - We allow padding of even lenght string by either a null
+ * character of a space
+ */
+bool Util::DicomStringEqual(const std::string& s1, const char *s2)
+{
+ // s2 is the string from the DICOM reference: 'MONOCHROME1'
+ std::string s1_even = s1; //Never change input parameter
+ std::string s2_even = DicomString( s2 );
+ if( s1_even[s1_even.size()-1] == ' ')
+ {
+ s1_even[s1_even.size()-1] = '\0'; //replace space character by null
+ }
+ return s1_even == s2_even;
+}
+
+/**
+ * \ingroup Util
+ * \brief Return the IP adress of the machine writting the DICOM image
+ */
+std::string Util::GetIPAddress()
+{
+ // This is a rip from http://www.codeguru.com/Cpp/I-N/internet/network/article.php/c3445/
+#ifndef HOST_NAME_MAX
+ // SUSv2 guarantees that `Host names are limited to 255 bytes'.
+ // POSIX 1003.1-2001 guarantees that `Host names (not including the
+ // terminating NUL) are limited to HOST_NAME_MAX bytes'.
+# define HOST_NAME_MAX 255
+ // In this case we should maybe check the string was not truncated.
+ // But I don't known how to check that...
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+ // with WinSock DLL we need to initialise the WinSock before using gethostname
+ WORD wVersionRequested = MAKEWORD(1,0);
+ WSADATA WSAData;
+ int err = WSAStartup(wVersionRequested,&WSAData);
+ if (err != 0) {
+ /* Tell the user that we could not find a usable */
+ /* WinSock DLL. */
+ WSACleanup();
+ return "127.0.0.1";
+ }