Choco OS  V.0.16.9.0
Join to the chocolate world
oc_streamman.c
Go to the documentation of this file.
1 
27 #include <oc_streamman.h>
28 #include <string.h>
29 #include <oc_streams_cfg.c>
30 
36 #define _________________________________________VARIABLES_SECTION__________________________________________________________________________
37 
38 static bool ModuleEnabledFlag = false;
39 static oC_List(oC_Stream_t) Streams = NULL;
40 static const oC_Allocator_t Allocator = {
41  .Name = "streams manager" ,
42  .EventFlags = 0 ,
43  .EventHandler = NULL
44 };
45 
46 #undef _________________________________________VARIABLES_SECTION__________________________________________________________________________
47 
48 
54 #define _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________
55 
56 //==========================================================================================================================================
57 //==========================================================================================================================================
58 oC_ErrorCode_t oC_StreamMan_TurnOn( void )
59 {
60  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
61 
62  if(oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == false , oC_ErrorCode_ModuleIsTurnedOn))
63  {
64  Streams = oC_List_New(&Allocator,AllocationFlags_NoWait);
65 
66  if(Streams)
67  {
68  ModuleEnabledFlag = true;
69  errorCode = oC_ErrorCode_None;
70 
71 #define IN oC_Stream_Type_Input
72 #define OUT oC_Stream_Type_Output
73 #define ADD_STREAM( NAME , TYPE , DRIVER_NAME , CONFIG_NAME ) oC_AssignErrorCode(&errorCode , oC_StreamMan_Add(oC_Stream_New(&Allocator,AllocationFlags_NoWait,TYPE,#NAME,&DRIVER_NAME,&CONFIG_NAME)));
74  CFG_STREAMS_LIST(ADD_STREAM)
75 #undef IN
76 #undef OUT
77 #undef ADD_STREAM
78  }
79  else
80  {
81  errorCode = oC_ErrorCode_AllocationError;
82  }
83  }
84 
85  return errorCode;
86 }
87 
88 //==========================================================================================================================================
89 //==========================================================================================================================================
90 oC_ErrorCode_t oC_StreamMan_TurnOff( void )
91 {
92  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
93 
94  if(oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet))
95  {
96  errorCode = oC_ErrorCode_None;
97 
98  oC_List_Foreach(Streams,stream)
99  {
100  if(!oC_Stream_Delete(&stream))
101  {
102  errorCode = oC_ErrorCode_ReleaseError;
103  }
104  }
105 
106  if(!oC_List_Delete(Streams,AllocationFlags_CanWaitForever))
107  {
108  errorCode = oC_ErrorCode_ReleaseError;
109  }
110  }
111 
112  return errorCode;
113 }
114 
115 //==========================================================================================================================================
116 //==========================================================================================================================================
117 oC_ErrorCode_t oC_StreamMan_Add( oC_Stream_t Stream )
118 {
119  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
120 
121  if(
122  oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet) &&
123  oC_AssignErrorCodeIfFalse(&errorCode , oC_Stream_IsCorrect(Stream) , oC_ErrorCode_ObjectNotCorrect)
124  )
125  {
126  bool added = oC_List_PushCopyBack(Streams,Stream,&Allocator);
127 
128  if(added)
129  {
130  errorCode = oC_ErrorCode_None;
131  }
132  else
133  {
134  errorCode = oC_ErrorCode_CannotAddObjectToList;
135  }
136  }
137 
138  return errorCode;
139 }
140 
141 //==========================================================================================================================================
142 //==========================================================================================================================================
143 oC_ErrorCode_t oC_StreamMan_Remove( oC_Stream_t Stream )
144 {
145  oC_ErrorCode_t errorCode = oC_ErrorCode_ImplementError;
146 
147  if(
148  oC_AssignErrorCodeIfFalse(&errorCode , ModuleEnabledFlag == true , oC_ErrorCode_ModuleNotStartedYet) &&
149  oC_AssignErrorCodeIfFalse(&errorCode , oC_Stream_IsCorrect(Stream) , oC_ErrorCode_ObjectNotCorrect)
150  )
151  {
152  bool contains = oC_List_Contains(Streams,Stream);
153 
154  if(contains)
155  {
156  bool removed = oC_List_RemoveAll(Streams,Stream);
157 
158  if(removed)
159  {
160  errorCode = oC_ErrorCode_None;
161  }
162  else
163  {
164  errorCode = oC_ErrorCode_CannotRemoveObjectFromList;
165  }
166  }
167  else
168  {
169  errorCode = oC_ErrorCode_ObjectNotFoundOnList;
170  }
171  }
172 
173  return errorCode;
174 }
175 
176 //==========================================================================================================================================
177 //==========================================================================================================================================
178 oC_List(oC_Stream_t) oC_StreamMan_GetList( void )
179 {
180  oC_List(oC_Stream_t) list = NULL;
181 
183  {
184  list = Streams;
185  }
186 
187  return list;
188 }
189 
190 //==========================================================================================================================================
191 //==========================================================================================================================================
192 oC_Stream_t oC_StreamMan_GetStream( const char * Name )
193 {
194  oC_Stream_t streamToReturn = NULL;
195 
197  {
198  oC_List_Foreach(Streams,stream)
199  {
200  if(strcmp(oC_Stream_GetName(stream),Name)==0)
201  {
202  streamToReturn = stream;
203  }
204  }
205  }
206 
207  return streamToReturn;
208 }
209 
210 //==========================================================================================================================================
211 //==========================================================================================================================================
212 oC_Stream_t oC_StreamMan_GetStdErrorStream( void )
213 {
214  return oC_StreamMan_GetStream(CFG_STDERR_STREAM_NAME);
215 }
216 
217 #undef _________________________________________INTERFACE_FUNCTIONS_SECTION________________________________________________________________
218 
219 
static bool ModuleEnabledFlag
Definition: oc_memman.c:211
const char * Name
Definition: oc_stdlib.h:161
identifier for allocations
Definition: oc_stdlib.h:159
#define CFG_STDERR_STREAM_NAME
standard error stream for fatal system errors
The file with configurations of streams.
The file with interface for stream manager.
static const oC_Allocator_t Allocator
Definition: oc_eth.c:152
#define CFG_STREAMS_LIST(ADD_STREAM)
#define NULL
pointer to a zero
Definition: oc_null.h:37