X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmUtil.cxx;h=552b5840af767f19e0a9d055283d24b18728a0d3;hb=d1c68c2c2ae9fadf927053150f7fbc625a7c7366;hp=6880df0c9927683231d7d26a6237d137c85e0cd5;hpb=c71ac9ad83b1945760f695ce40ba3169d5467628;p=gdcm.git diff --git a/src/gdcmUtil.cxx b/src/gdcmUtil.cxx index 6880df0c..552b5840 100644 --- a/src/gdcmUtil.cxx +++ b/src/gdcmUtil.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmUtil.cxx,v $ Language: C++ - Date: $Date: 2005/01/28 00:02:15 $ - Version: $Revision: 1.125 $ + Date: $Date: 2005/02/01 10:29:56 $ + Version: $Revision: 1.128 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -19,7 +19,6 @@ #include "gdcmUtil.h" #include "gdcmDebug.h" #include -#include // For GetCurrentDate, GetCurrentTime #include @@ -81,15 +80,20 @@ // For GetCurrentThreadID() #ifdef __linux__ -#include -#include + #include + #include #endif #ifdef __sun -#include + #include #endif namespace gdcm { +//------------------------------------------------------------------------- +const std::string Util::GDCM_UID = "1.2.826.0.1.3680043.2.1143"; +std::string Util::RootUID = GDCM_UID; + +//------------------------------------------------------------------------- /** * \brief Provide a better 'c++' approach for sprintf * For example c code is: @@ -105,7 +109,6 @@ namespace gdcm * gdcm style code is * Format("%04x|%04x", group , elem); */ - std::string Util::Format(const char *format, ...) { char buffer[2048]; @@ -380,29 +383,27 @@ bool Util::IsCurrentProcessorBigEndian() #endif } - - #ifdef _WIN32 -typedef BOOL(WINAPI * pSnmpExtensionInit) ( - IN DWORD dwTimeZeroReference, - OUT HANDLE * hPollForTrapEvent, - OUT AsnObjectIdentifier * supportedView); - -typedef BOOL(WINAPI * pSnmpExtensionTrap) ( - OUT AsnObjectIdentifier * enterprise, - OUT AsnInteger * genericTrap, - OUT AsnInteger * specificTrap, - OUT AsnTimeticks * timeStamp, - OUT RFC1157VarBindList * variableBindings); - -typedef BOOL(WINAPI * pSnmpExtensionQuery) ( - IN BYTE requestType, - IN OUT RFC1157VarBindList * variableBindings, - OUT AsnInteger * errorStatus, - OUT AsnInteger * errorIndex); - -typedef BOOL(WINAPI * pSnmpExtensionInitEx) ( - OUT AsnObjectIdentifier * supportedView); + typedef BOOL(WINAPI * pSnmpExtensionInit) ( + IN DWORD dwTimeZeroReference, + OUT HANDLE * hPollForTrapEvent, + OUT AsnObjectIdentifier * supportedView); + + typedef BOOL(WINAPI * pSnmpExtensionTrap) ( + OUT AsnObjectIdentifier * enterprise, + OUT AsnInteger * genericTrap, + OUT AsnInteger * specificTrap, + OUT AsnTimeticks * timeStamp, + OUT RFC1157VarBindList * variableBindings); + + typedef BOOL(WINAPI * pSnmpExtensionQuery) ( + IN BYTE requestType, + IN OUT RFC1157VarBindList * variableBindings, + OUT AsnInteger * errorStatus, + OUT AsnInteger * errorIndex); + + typedef BOOL(WINAPI * pSnmpExtensionInitEx) ( + OUT AsnObjectIdentifier * supportedView); #endif //_WIN32 @@ -595,13 +596,13 @@ int GetMacAddrSys ( unsigned char *addr ) // We should investiage the use of SIZEOF_ADDR_IFREQ // #ifdef HAVE_SA_LEN -#ifndef max -#define max(a,b) ((a) > (b) ? (a) : (b)) -#endif -#define ifreq_size(i) max(sizeof(struct ifreq),\ - sizeof((i).ifr_name)+(i).ifr_addr.sa_len) + #ifndef max + #define max(a,b) ((a) > (b) ? (a) : (b)) + #endif + #define ifreq_size(i) max(sizeof(struct ifreq),\ + sizeof((i).ifr_name)+(i).ifr_addr.sa_len) #else -#define ifreq_size(i) sizeof(struct ifreq) + #define ifreq_size(i) sizeof(struct ifreq) #endif // HAVE_SA_LEN if( (sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP)) < 0 ) @@ -695,7 +696,7 @@ std::string Util::GetMACAddress() // http://groups-beta.google.com/group/comp.unix.solaris/msg/ad36929d783d63be // http://bdn.borland.com/article/0,1410,26040,00.html unsigned char addr[6]; - + int stat = GetMacAddrSys(addr); if (stat == 0) { @@ -706,13 +707,11 @@ std::string Util::GetMACAddress() int res; std::string sres; while(!zero) - { - res = getlastdigit(addr); - sres.push_back( '0' + res ); - zero = (addr[0] == 0) && (addr[1] == 0) && (addr[2] == 0) && (addr[3] == 0) && (addr[4] == 0) && (addr[5] == 0); - } - // Since we push back the proper number is reversed: - std::reverse(sres.begin(),sres.end()); + { + res = getlastdigit(addr); + sres.insert(sres.begin(), '0' + res); + zero = (addr[0] == 0) && (addr[1] == 0) && (addr[2] == 0) && (addr[3] == 0) && (addr[4] == 0) && (addr[5] == 0); + } return sres; } @@ -734,7 +733,7 @@ std::string Util::GetIPAddress() // 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 +#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__) || defined(__MINGW32__) @@ -784,6 +783,36 @@ std::string Util::GetIPAddress() return str; } +unsigned int Util::GetCurrentThreadID() +{ +// FIXME the implementation is far from complete +#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__MINGW32__) + return (unsigned int)GetCurrentThreadId(); +#endif +#ifdef __linux__ + return 0; + // Doesn't work on fedora, but is in the man page... + //return (unsigned int)gettid(); +#endif +#ifdef __sun + return (unsigned int)thr_self(); +#else + //default implementation + return 0; +#endif +} + +unsigned int Util::GetCurrentProcessID() +{ +#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__MINGW32__) + // NOTE: There is also a _getpid()... + return (unsigned int)GetCurrentProcessId(); +#else + // get process identification, POSIX + return (unsigned int)getpid(); +#endif +} + /** * \brief Creates a new UID. As stipulate in the DICOM ref * each time a DICOM image is create it should have @@ -792,19 +821,18 @@ std::string Util::GetIPAddress() */ std::string Util::CreateUniqueUID(const std::string &root) { - std::string prefix = root; + std::string prefix; std::string append; if( root.empty() ) { - // No root was specified use "GDCM" then - // echo "gdcm" | od -b - // 0000000 147 144 143 155 012 - //prefix = "147.144.143.155"; // special easter egg - // gdcm UID prefix, as supplied by http://www.medicalconnections.co.uk - prefix = "1.2.826.0.1.3680043.2.1143"; + prefix = RootUID; } - // else + else + { + prefix = root; + } + // A root was specified use it to forge our new UID: append += "."; append += Util::GetMACAddress(); @@ -827,37 +855,20 @@ std::string Util::CreateUniqueUID(const std::string &root) return prefix + append; } -unsigned int Util::GetCurrentThreadID() +void Util::SetRootUID(const std::string &root) { -// FIXME the implementation is far from complete -#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__MINGW32__) - return (unsigned int)GetCurrentThreadId(); -#endif -#ifdef __linux__ - return 0; - // Doesn't work on fedora, but is in the man page... - //return (unsigned int)gettid(); -#endif -#ifdef __sun - return (unsigned int)thr_self(); -#else - //default implementation - return 0; -#endif + if( root.empty() ) + RootUID = GDCM_UID; + else + RootUID = root; } -unsigned int Util::GetCurrentProcessID() +const std::string &Util::GetRootUID() { -#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__MINGW32__) - // NOTE: There is also a _getpid()... - return (unsigned int)GetCurrentProcessId(); -#else - // get process identification, POSIX - return (unsigned int)getpid(); -#endif - + return RootUID; } +//------------------------------------------------------------------------- /** * \brief * @param os ostream to write to @@ -922,5 +933,6 @@ std::ostream &binary_write(std::ostream &os, std::string const &val) return os.write(val.c_str(), val.size()); } +//------------------------------------------------------------------------- } // end namespace gdcm