1+ using System . Collections . Generic ;
2+ using System . IO ;
3+
4+ namespace MsieJavaScriptEngine . Utilities
5+ {
6+ /// <summary>
7+ /// Unique document name manager
8+ /// </summary>
9+ internal sealed class UniqueDocumentNameManager
10+ {
11+ /// <summary>
12+ /// Default document name
13+ /// </summary>
14+ private readonly string _defaultName ;
15+
16+ /// <summary>
17+ /// Storage of unique names
18+ /// </summary>
19+ private readonly Dictionary < string , uint > _storage = new Dictionary < string , uint > ( ) ;
20+
21+ /// <summary>
22+ /// Synchronizer of unique name storage
23+ /// </summary>
24+ private readonly object _storageSynchronizer = new object ( ) ;
25+
26+
27+ /// <summary>
28+ /// Constructs an instance of the unique document name manager
29+ /// </summary>
30+ /// <param name="defaultName">Default document name</param>
31+ public UniqueDocumentNameManager ( string defaultName )
32+ {
33+ _defaultName = defaultName ;
34+ }
35+
36+
37+ /// <summary>
38+ /// Gets a unique document name
39+ /// </summary>
40+ /// <param name="name">Document name</param>
41+ /// <returns>Unique document name</returns>
42+ public string GetUniqueName ( string name )
43+ {
44+ string appropriateName = ! string . IsNullOrWhiteSpace ( name ) ?
45+ Path . GetFileNameWithoutExtension ( name ) : _defaultName ;
46+ string extension = Path . GetExtension ( name ) ;
47+
48+ lock ( _storageSynchronizer )
49+ {
50+ uint count ;
51+ _storage . TryGetValue ( appropriateName , out count ) ;
52+ _storage [ appropriateName ] = ++ count ;
53+
54+ string uniqueName = count > 1 ?
55+ string . Concat ( appropriateName , " [" , count , "]" , extension )
56+ :
57+ string . Concat ( appropriateName , extension )
58+ ;
59+
60+ return uniqueName ;
61+ }
62+ }
63+ }
64+ }
0 commit comments