1    	// @(#)root/base:$Id$
2    	// Author: Fons Rademakers   30/9/2001
3    	
4    	/*************************************************************************
5    	 * Copyright (C) 1995-2001, Rene Brun and Fons Rademakers.               *
6    	 * All rights reserved.                                                  *
7    	 *                                                                       *
8    	 * For the licensing terms see $ROOTSYS/LICENSE.                         *
9    	 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
10   	 *************************************************************************/
11   	
12   	#ifndef ROOT_TUUID
13   	#define ROOT_TUUID
14   	
15   	//////////////////////////////////////////////////////////////////////////
16   	//                                                                      //
17   	// TUUID                                                                //
18   	//                                                                      //
19   	// This class defines a UUID (Universally Unique IDentifier), also      //
20   	// known as GUIDs (Globally Unique IDentifier). A UUID is 128 bits      //
21   	// long, and if generated according to this algorithm, is either        //
22   	// guaranteed to be different from all other UUIDs/GUIDs generated      //
23   	// until 3400 A.D. or extremely likely to be different. UUIDs were      //
24   	// originally used in the Network Computing System (NCS) and            //
25   	// later in the Open Software Foundation's (OSF) Distributed Computing  //
26   	// Environment (DCE).                                                   //
27   	//                                                                      //
28   	//////////////////////////////////////////////////////////////////////////
29   	
30   	#ifdef WIN32
31   	#undef GetCurrentTime
32   	#endif
33   	#ifndef ROOT_Rtypes
34   	#include "Rtypes.h"
35   	#endif
36   	
37   	// forward declaration
38   	class TBuffer;
39   	class TFile;
40   	class TDirectory;
41   	class TInetAddress;
42   	class TDatime;
43   	
44   	class TUUID {
45   	
46   	protected:
47   	   UInt_t    fUUIDIndex;             //!index in the list of UUIDs in TProcessUUID
48   	   UInt_t    fTimeLow;               // 60 bit time, lower 32 bits
49   	   UShort_t  fTimeMid;               // middle 16 time bits
50   	   UShort_t  fTimeHiAndVersion;      // high 12 time bits + 4 UUID version bits
51   	   UChar_t   fClockSeqHiAndReserved; // high 6 clock bits + 2 bits reserved
52   	   UChar_t   fClockSeqLow;           // low 8 clock bits
53   	   UChar_t   fNode[6];               // 6 node id bytes
54   	
55   	   struct uuid_time_t {
56   	      UInt_t high;
57   	      UInt_t low;
58   	   };
59   	
60   	   Int_t CmpTime(uuid_time_t *t1, uuid_time_t *t2);
61   	   void  Format(UShort_t clockseq, uuid_time_t ts);
62   	   void  GetNodeIdentifier();
63   	   void  GetCurrentTime(uuid_time_t *timestamp);
64   	   void  GetSystemTime(uuid_time_t *timestamp);
65   	   void  GetRandomInfo(UChar_t seed[16]);
66   	   void  SetFromString(const char *uuid_str);
67   	
68   	public:
69   	   TUUID();
70   	   TUUID(const char *uuid_str);
71   	   virtual ~TUUID();
72   	
73   	   const char  *AsString() const;
74   	   Int_t        Compare(const TUUID &u) const;
75   	   UShort_t     Hash() const;
76   	   void         Print() const;
77   	   TInetAddress GetHostAddress() const;
78   	   TDatime      GetTime() const;
79   	   void         GetUUID(UChar_t uuid[16]) const;
80   	   void         SetUUID(const char *uuid_str);
81   	   UInt_t       GetUUIDNumber() const { return fUUIDIndex; }
82   	   void         SetUUIDNumber(UInt_t index) { fUUIDIndex = index; }
83   	
84   	   void         StreamerV1(TBuffer &b);
85   	   void         FillBuffer(char *&buffer);
86   	   void         ReadBuffer(char *&buffer);
87   	   Int_t        Sizeof() const { return 18; }
88   	
89   	   ClassDef(TUUID,1)  // Universally Unique IDentifier
90   	};
91   	
92   	
93   	inline TBuffer &operator>>(TBuffer &buf, TUUID &uuid)
94   	{ uuid.Streamer(buf); return buf; }
95   	
96   	// Not inlined in order to avoid const casted away warning in user code.  
97   	TBuffer &operator<<(TBuffer &buf, const TUUID &uuid);
98   	
99   	inline Bool_t operator==(const TUUID &u1, const TUUID &u2)
100  	{ return (!u1.Compare(u2)) ? kTRUE : kFALSE; }
101  	
102  	inline Bool_t operator!=(const TUUID &u1, const TUUID &u2)
103  	{ return !(u1 == u2); }
104  	
105  	
106  	#endif
107