0027349: XtControl_Reader is not thread-safe
[occt.git] / src / IFSelect / IFSelect_Activator.cxx
1 // Copyright (c) 1999-2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14
15 #include <Dico_DictionaryOfInteger.hxx>
16 #include <Dico_IteratorOfDictionaryOfInteger.hxx>
17 #include <IFSelect_Activator.hxx>
18 #include <IFSelect_SessionPilot.hxx>
19 #include <Interface_Macros.hxx>
20 #include <Standard_DomainError.hxx>
21 #include <TCollection_AsciiString.hxx>
22 #include <TCollection_HAsciiString.hxx>
23 #include <TColStd_SequenceOfInteger.hxx>
24 #include <TColStd_SequenceOfTransient.hxx>
25
26 IMPLEMENT_STANDARD_RTTIEXT(IFSelect_Activator,MMgt_TShared)
27
28 static Handle(Dico_DictionaryOfInteger) thedico; // = new Dico_DictionaryOfInteger;
29 static TColStd_SequenceOfInteger   thenums, themodes;
30 static TColStd_SequenceOfTransient theacts;
31
32
33     void IFSelect_Activator::Adding
34   (const Handle(IFSelect_Activator)& actor,
35    const Standard_Integer number,
36    const Standard_CString command,
37    const Standard_Integer mode)
38 {
39   Standard_Boolean deja;
40   if (thedico.IsNull()) thedico = new Dico_DictionaryOfInteger;
41   Standard_Integer& num = thedico->NewItem(command,deja,Standard_True);
42   if (deja) {
43 #ifdef OCCT_DEBUG
44     cout<<"****  XSTEP commands, name conflict on "<<command<<" first defined remains  ****"<<endl;
45 //    Standard_DomainError::Raise("IFSelect_Activator : Add");
46 #endif
47   }
48   num = thenums.Length() + 1;
49   thenums.Append(number);
50   theacts.Append(actor);
51   themodes.Append(mode);
52 }
53
54     void IFSelect_Activator::Add
55   (const Standard_Integer number, const Standard_CString command) const
56       {  Adding (this,number,command,0);  }
57
58     void IFSelect_Activator::AddSet
59   (const Standard_Integer number, const Standard_CString command) const
60       {  Adding (this,number,command,1);  }
61
62     void IFSelect_Activator::Remove (const Standard_CString command)
63       {  thedico->RemoveItem(command);  }
64
65     Standard_Boolean IFSelect_Activator::Select
66   (const Standard_CString command, Standard_Integer& number,
67    Handle(IFSelect_Activator)& actor)
68 {
69   Standard_Integer num;
70   if (!thedico->GetItem(command,num,Standard_False)) return Standard_False;
71   number = thenums(num);
72   actor = Handle(IFSelect_Activator)::DownCast(theacts(num));
73   return Standard_True;
74 }
75
76     Standard_Integer IFSelect_Activator::Mode
77   (const Standard_CString command)
78 {
79   Standard_Integer num;
80   if (!thedico->GetItem(command,num,Standard_False)) return -1;
81   return themodes(num);
82 }
83
84
85     Handle(TColStd_HSequenceOfAsciiString) IFSelect_Activator::Commands
86   (const Standard_Integer mode, const Standard_CString command)
87 {
88   Standard_Integer num;
89   Dico_IteratorOfDictionaryOfInteger iter (thedico,command);
90   Handle(TColStd_HSequenceOfAsciiString) list =
91     new  TColStd_HSequenceOfAsciiString();
92   for (iter.Start(); iter.More(); iter.Next()) {
93     if (mode < 0) {
94       DeclareAndCast(IFSelect_Activator,acti,theacts(iter.Value()));
95       if (acti.IsNull()) continue;
96       if (command[0] == '\0' || !strcmp(command,acti->Group()) )
97         list->Append(iter.Name());
98     } else {
99       num = iter.Value();
100       if (themodes(num) == mode) list->Append(iter.Name());
101     }
102   }
103   return list;
104 }
105
106
107     IFSelect_Activator::IFSelect_Activator ()
108     : thegroup ("XSTEP")    {  }
109
110     void  IFSelect_Activator::SetForGroup
111   (const Standard_CString group, const Standard_CString file)
112     {  thegroup.Clear();  thegroup.AssignCat (group);
113        thefile.Clear();   thefile.AssignCat  (file);   }
114
115     Standard_CString  IFSelect_Activator::Group () const
116     {  return thegroup.ToCString();  }
117
118     Standard_CString  IFSelect_Activator::File  () const
119     {  return thefile.ToCString();   }