00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 #ifndef ACE_UUID_H
00015 #define ACE_UUID_H
00016 #include  "ace/pre.h"
00017 
00018 #include  "ace/config-all.h"
00019 
00020 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00021 # pragma once
00022 #endif 
00023 
00024 #include "ace/SString.h"
00025 #include "ace/Singleton.h"
00026 #include "ace/Synch_Traits.h"
00027 
00028 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00029 
00030 namespace ACE_Utils
00031 {
00032 
00033   class ACE_Export UUID_node
00034   {
00035   public:
00036 
00037 
00038     UUID_node (void);
00039 
00040     enum {NODE_ID_SIZE = 6};
00041     typedef u_char NodeID[NODE_ID_SIZE];
00042 
00043     NodeID& nodeID (void);
00044     void nodeID (NodeID&);
00045 
00046 
00047     bool operator == (const UUID_node& right) const;
00048     bool operator != (const UUID_node& right) const;
00049 
00050 
00051     
00052 
00053   private:
00054     NodeID nodeID_;
00055   };
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077   class ACE_Export UUID
00078   {
00079   public:
00080 
00081 
00082     UUID (void);
00083 
00084 
00085     UUID (const ACE_CString& uuidString);
00086 
00087     UUID (const UUID &right);
00088 
00089     
00090     ~UUID (void);
00091 
00092     ACE_UINT32 timeLow (void) const;
00093     void timeLow (ACE_UINT32);
00094 
00095     ACE_UINT16 timeMid (void) const;
00096     void timeMid (ACE_UINT16);
00097 
00098     ACE_UINT16 timeHiAndVersion (void) const;
00099     void timeHiAndVersion (ACE_UINT16);
00100 
00101     u_char clockSeqHiAndReserved (void) const;
00102     void clockSeqHiAndReserved (u_char);
00103 
00104     u_char clockSeqLow (void) const;
00105     void clockSeqLow (u_char);
00106 
00107     UUID_node* node (void) const;
00108     void node (UUID_node*);
00109 
00110     ACE_CString* thr_id (void);
00111     void thr_id (char*);
00112 
00113     ACE_CString* pid (void);
00114     void pid (char*);
00115 
00116 
00117     const ACE_CString* to_string (void);
00118 
00119 
00120     void from_string (const ACE_CString& uuid_string);
00121 
00122     static UUID NIL_UUID;
00123 
00124 
00125     bool operator== (const UUID &right) const;
00126     bool operator!= (const UUID &right) const;
00127 
00128 
00129     
00130     
00131     
00132     
00133 
00134   private:
00135     void from_string_i (const ACE_CString& uuidString);
00136 
00137     UUID& operator= (const UUID&);
00138 
00139 
00140     ACE_UINT32 timeLow_;
00141     ACE_UINT16 timeMid_;
00142     ACE_UINT16 timeHiAndVersion_;
00143     u_char clockSeqHiAndReserved_;
00144     u_char clockSeqLow_;
00145     UUID_node* node_;
00146     bool node_release_;
00147     ACE_CString thr_id_;
00148     ACE_CString pid_;
00149 
00150 
00151 
00152     ACE_CString *as_string_;
00153   };
00154 
00155 
00156 
00157 
00158 
00159 
00160 
00161 
00162   class ACE_Export UUID_Generator
00163   {
00164   public:
00165 
00166     enum {ACE_UUID_CLOCK_SEQ_MASK = 0x3FFF};
00167 
00168     UUID_Generator();
00169     ~UUID_Generator();
00170 
00171     void init (void);
00172 
00173 
00174 
00175 
00176     void generateUUID (UUID&, ACE_UINT16 version=0x0001, u_char variant=0x80);
00177 
00178 
00179 
00180     UUID* generateUUID (ACE_UINT16 version=0x0001, u_char variant=0x80);
00181 
00182 
00183 
00184     typedef ACE_UINT64 UUID_time;
00185 
00186 
00187 
00188     ACE_SYNCH_MUTEX* lock (void);
00189 
00190 
00191     void lock (ACE_SYNCH_MUTEX* lock,
00192                bool release_lock);
00193 
00194   private:
00195 
00196 
00197     UUID_time timeLast_;
00198 
00199 
00200 
00201     struct UUID_State
00202     {
00203       UUID_time timestamp;
00204       UUID_node node;
00205       ACE_UINT16 clockSequence;
00206     };
00207 
00208 
00209 
00210   void get_timestamp (UUID_time& timestamp);
00211 
00212 
00213 
00214 
00215     void get_systemtime( UUID_time& timeNow);
00216 
00217 
00218     UUID_State uuid_state_;
00219 
00220     ACE_SYNCH_MUTEX* lock_;
00221     bool destroy_lock_;
00222   };
00223 
00224   typedef ACE_Singleton<UUID_Generator, ACE_SYNCH_MUTEX> UUID_GENERATOR;
00225 
00226 }
00227 
00228 ACE_END_VERSIONED_NAMESPACE_DECL
00229 
00230 #if defined (__ACE_INLINE__)
00231 #include "ace/UUID.inl"
00232 #endif 
00233 
00234 #include  "ace/post.h"
00235 #endif // ACE_UUID_H