-///////////////////////////////////////////////////////////////////////////
-// to prevent a flashing screen when non-printable character
-
-char * _cleanString(char *v) {
- char *d;
- int i, l;
- l = strlen(v);
- for (i=0,d=v;
- i<l ;
- i++,d++) {
- if (!isprint(*d))
- *d = '.';
- }
- return v;
-}
-
-
-///////////////////////////////////////////////////////////////////////////
-// to prevent a flashing screen when non-printable character
-
-std::string _CreateCleanString(std::string s) {
-/* char *d, *di, *v;
- int i, l;
- v=(char*)s.c_str();
- l = strlen(v);
- d = di = strdup(v);
- for (i=0;
- i<l ;
- i++,di++,v++) {
- if (!isprint(*v))
- *di = '.';
- }
- return d;*/
- string str=s;
- for(int i=0;i<str.size();i++)
+/**
+ * \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";
+ }
+#endif
+
+#endif //HOST_NAME_MAX
+
+ std::string str;
+ char szHostName[HOST_NAME_MAX+1];
+ int r = gethostname(szHostName, HOST_NAME_MAX);
+
+ if( r == 0 )
+ {
+ // Get host adresses
+ struct hostent * pHost = gethostbyname(szHostName);
+
+ for( int i = 0; pHost!= NULL && pHost->h_addr_list[i]!= NULL; i++ )
+ {
+ for( int j = 0; j<pHost->h_length; j++ )
+ {
+ if( j > 0 ) str += ".";
+
+ str += Util::Format("%u",
+ (unsigned int)((unsigned char*)pHost->h_addr_list[i])[j]);
+ }
+ // str now contains one local IP address
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+ WSACleanup();
+#endif
+
+ }
+ }
+ // If an error occur r == -1
+ // Most of the time it will return 127.0.0.1...
+ return str;
+}
+
+/**
+ * \ingroup Util
+ * \brief Creates a new UID. As stipulate in the DICOM ref
+ * each time a DICOM image is create it should have
+ * a unique identifier (URI)
+ */
+std::string Util::CreateUniqueUID(const std::string& root)
+{
+ // The code works as follow:
+ // echo "gdcm" | od -b
+ // 0000000 147 144 143 155 012
+ // Therefore we return
+ // radical + 147.144.143.155 + IP + time()
+ std::string radical = root;
+ if( !root.size() ) //anything better ?