source: xmlrpcnet/trunk/fuentes/src/GuidEx.cs @ 379

Last change on this file since 379 was 379, checked in by hectorgh, 5 years ago

adding project files

File size: 6.4 KB
Line 
1//==========================================================================================
2//
3//              OpenNETCF.GuidEx
4//              Copyright (C) 2003-2005, OpenNETCF.org
5//
6//              This library is free software; you can redistribute it and/or modify it under
7//              the terms of the OpenNETCF.org Shared Source License.
8//
9//              This library is distributed in the hope that it will be useful, but
10//              WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11//              FITNESS FOR A PARTICULAR PURPOSE. See the OpenNETCF.org Shared Source License
12//              for more details.
13//
14//              You should have received a copy of the OpenNETCF.org Shared Source License
15//              along with this library; if not, email licensing@opennetcf.org to request a copy.
16//
17//              If you wish to contact the OpenNETCF Advisory Board to discuss licensing, please
18//              email licensing@opennetcf.org.
19//
20//              For general enquiries, email enquiries@opennetcf.org or visit our website at:
21//              http://www.opennetcf.org
22//
23//              !!! A HUGE thank-you goes out to Casey Chesnut for supplying parts of this code !!!
24//      !!! You can contact Casey at http://www.brains-n-brawn.com   
25//
26//==========================================================================================
27
28#if(COMPACT_FRAMEWORK)
29
30using System;
31using System.Runtime.InteropServices;
32//using OpenNETCF.Security.Cryptography;
33
34// New for v1.3 - "The Guid to end all Guids" - Peter Foot
35namespace OpenNETCF
36{
37        /// <summary>
38        /// Helper class for generating a globally unique identifier (GUID).
39        /// <para><b>Revised in v1.3</b></para>
40        /// </summary>
41        /// <seealso cref="System.Guid"/>
42        public sealed class GuidEx
43        {
44                private GuidEx(){}
45
46        #region New Guid
47                /// <summary>
48                /// Initializes a new instance of the <see cref="System.Guid"/> class.
49                /// </summary>
50                /// <returns>A new <see cref="System.Guid"/> object.</returns>
51                /// <remarks>On CE.NET 4.1 and higher this method uses the CoCreateGuid API call.
52                /// On CE 3.0 based Pocket PCs it uses the OpenNETCF.Security.Cryptography classes to generate a random Guid.</remarks>
53                public static System.Guid NewGuid()
54                {
55                        //cocreateguid supported on CE.NET 4.1 and above (4.0 not supported by .NETCF)
56                        if(System.Environment.OSVersion.Version.Major > 3)
57                        {
58                                return NewOleGuid();
59                        }
60                        else
61                        {
62                                //check if target has crypto API support
63//                              if(OpenNETCF.Security.Cryptography.NativeMethods.Context.IsCryptoApi)
64//                              {
65//                                      return NewCryptoGuid();
66//                              }
67//                              else
68                                {
69                                        //if not use random generator
70                                        return NewRandomGuid();
71                                }
72                        }
73                }
74                #endregion
75
76
77                #region Constants
78                // constants that are used in the class
79                private class Const
80                {
81                        // guid variant types
82                        public enum GuidVariant
83                        {
84                                ReservedNCS = 0x00,
85                                Standard = 0x02,
86                                ReservedMicrosoft = 0x06,
87                                ReservedFuture = 0x07
88                        }
89
90                        // guid version types
91                        public enum GuidVersion
92                        {
93                                TimeBased = 0x01,
94                                Reserved = 0x02,
95                                NameBased = 0x03,
96                                Random = 0x04
97                        }
98
99                        // multiplex variant info
100                        public const int VariantByte = 8;
101                        public const int VariantByteMask = 0x3f;
102                        public const int VariantByteShift = 6;
103
104                        // multiplex version info
105                        public const int VersionByte = 7;
106                        public const int VersionByteMask = 0x0f;
107                        public const int VersionByteShift = 4;
108                }
109                #endregion
110
111                #region Crypto
112//              /// <summary>
113//              /// Create a new Random Guid using Crypto APIs
114//              /// </summary>
115//              /// <returns></returns>
116//              public static System.Guid NewCryptoGuid()
117//              {
118//                      //create guid manually
119//                      byte[] guidbytes = new byte[16];
120//
121//                      //use crypto apis to generate random bytes
122//                      OpenNETCF.Security.Cryptography.RNGCryptoServiceProvider rng = new OpenNETCF.Security.Cryptography.RNGCryptoServiceProvider();
123//                      rng.GetBytes(guidbytes);
124//                     
125//                      //set version etc       
126//                      MakeValidRandomGuid(guidbytes);
127//
128//                      // create the new System.Guid object
129//                      return new System.Guid(guidbytes);
130//              }
131                #endregion
132
133                #region Random
134                /// <summary>
135                /// Create a new Random Guid (For platforms without Crypto support).
136                /// </summary>
137                /// <returns></returns>
138                public static System.Guid NewRandomGuid()
139                {
140                        byte[] guidbytes = new byte[16];
141      (new Random()).NextBytes(guidbytes);
142
143                        //set version etc
144                        MakeValidRandomGuid(guidbytes);
145                       
146         
147                        // create the new System.Guid object
148                        return new System.Guid(guidbytes);
149                }
150                #endregion
151
152                #region Helper Methods
153                private static void MakeValidRandomGuid(byte[] guidbytes)
154                {
155                        // set the variant
156                        guidbytes[Const.VariantByte] &= Const.VariantByteMask;
157                        guidbytes[Const.VariantByte] |= 
158                                ((int)Const.GuidVariant.Standard << Const.VariantByteShift);
159
160                        // set the version
161                        guidbytes[Const.VersionByte] &= Const.VersionByteMask;
162                        guidbytes[Const.VersionByte] |= 
163                                ((int)Const.GuidVersion.Random << Const.VersionByteShift);
164                }
165                #endregion
166
167                #region Ticks
168                /// <summary>
169                /// Create a new <see cref="Guid"/> only using TickCount and bit shifting.
170                /// </summary>
171                public static System.Guid NewGuidTicks()
172                {
173                        // Create a unique GUID
174                        long fileTime = DateTime.Now.ToUniversalTime().ToFileTime();
175                        UInt32 high32 = (UInt32)(fileTime >> 32)+0x146BF4;
176                        int tick = System.Environment.TickCount;
177                        byte[] guidBytes = new byte[8];
178
179                        // load the byte array with random bits
180                        Random rand = new Random((int)fileTime);
181                        rand.NextBytes(guidBytes);
182
183                        // use tick info in the middle of the array
184                        guidBytes[2] = (byte)(tick >> 24);
185                        guidBytes[3] = (byte)(tick >> 16);
186                        guidBytes[4] = (byte)(tick >> 8);
187                        guidBytes[5] = (byte)tick;
188
189                        // Construct a Guid with our data
190                        System.Guid guid = new System.Guid((int)fileTime, (short)high32, (short)((high32 | 0x10000000) >> 16), guidBytes);
191                        return guid;
192                }
193                #endregion
194
195                #region Ole
196                /// <summary>
197                /// Create a new <see cref="Guid"/> using COM APIs
198                /// </summary>
199                /// <returns></returns>
200                /// <remarks>Requires Windows CE.NET 4.1 or higher.</remarks>
201                public static System.Guid NewOleGuid()
202                {
203                        System.Guid val = System.Guid.Empty;
204
205                        int hresult = 0;
206                        hresult = CoCreateGuid(ref val);
207
208                        if(hresult != 0)
209                        {
210                                throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error(), "Error creating new Guid");
211                        }
212
213                        return val;
214                }
215                [DllImport("ole32.dll", SetLastError=true)]
216                private static extern int CoCreateGuid(ref System.Guid pguid);
217                #endregion
218        }
219
220}
221
222#endif
Note: See TracBrowser for help on using the repository browser.