(file) Return to omiutils.c CVS log (file) (dir) Up to [OMI] / omi / omiutils

  1 krisbash 1.1 #if defined(_MSC_VER)
  2              #ifdef _PREFAST_
  3              #pragma warning(push)
  4              #pragma warning(disable:26061 26071  26036) //public strsafe.h is giving errors about some of the methods hence disabling it
  5              #endif
  6              
  7              #include "strsafe.h"
  8              
  9              #ifdef _PREFAST_
 10              #pragma warning(pop)
 11              #endif 
 12              
 13              #ifdef _PREFAST_
 14              #pragma warning(push)
 15              #pragma warning(disable:28957)
 16              #endif
 17              #endif
 18              
 19              #include "omiutils.h"
 20              #include <strings.h>
 21              #include "OMI_Error.h"
 22 krisbash 1.1 #include "OMI_DebugError.h"
 23              
 24              #if defined(_MSC_VER)
 25              #ifdef _PREFAST_
 26              #pragma warning(pop)
 27              #endif 
 28              #endif
 29              #include <assert.h>
 30              
 31              
 32              static struct { const MI_Char *name; MI_Uint64 id; } 
 33              DeclIdMap[] = {
 34                  { MI_T("MSFT_GUID"), 1 },
 35                  { MI_T("MSFT_ETWEventHeader"), 2 },
 36                  { MI_T("MSFT_ETWEventPayload"), 3 },
 37                  { MI_T("MSFT_ETWExtendedData"), 4 },
 38                  { MI_T("MSFT_ETWEvent"), 5 },
 39                  { MI_T("CIM_Error"), 6 },
 40                  { MI_T("OMI_Error"), 7 },
 41                  { MI_T("OMI_DebugError"), 8 },
 42                  { MI_T("MSFT_CounterValue"), 9 },
 43 krisbash 1.1     { MI_T("MSFT_FormattedCounterValueReal64"), 10 },
 44                  { MI_T("MSFT_FormattedCounterValueUint32"), 11 },
 45                  { MI_T("MSFT_FormattedCounterValueUint64"), 12 },
 46                  { MI_T("MSFT_RawCounterValue"), 13 },
 47                  { NULL }
 48              };
 49              
 50              MI_Uint64 GetClassDeclId(_In_ const MI_ClassDecl* classDecl)
 51              {
 52                  int i = 0;
 53              
 54                  for (i=0;DeclIdMap[i].name;++i)
 55                      if (Tcscmp(classDecl->name, DeclIdMap[i].name) == 0)
 56                          return DeclIdMap[i].id;
 57              
 58                  //else if //
 59                  if (classDecl->owningClass != (void*)-1)
 60                      return (MI_Uint64)(ptrdiff_t)(void*)classDecl;
 61                  else //if (classDecl->owningClass == -1)
 62                      return 0;
 63              }
 64 krisbash 1.1 
 65              /*------------------------------------------------------------------------------
 66                  Creates a new instance of OMI_Error and sets the values of Message, 
 67                  OMI_ErrorCode, OMI_ErrorType and OMI_ErrorCategory properties. 
 68              ------------------------------------------------------------------------------*/
 69              
 70              static MI_Result MI_CALL CreateOMIError_shared(
 71                  _In_z_ const MI_Char* message,
 72                  MI_Uint32 errorCode, 
 73                  _In_z_ const MI_Char* errorType, 
 74                  MI_Uint16 errorCategory, 
 75                  const MI_ClassDecl *classDecl,
 76                  _Outptr_ MI_Instance **omiError)
 77              {
 78                  MI_Result   result = MI_RESULT_OK;
 79                  OMI_Error *err = NULL;
 80                  MI_Application application = {0};
 81                  *omiError = NULL;
 82              
 83                  result = MI_Application_Initialize(0, NULL, omiError, &application);
 84                  if (result != MI_RESULT_OK)
 85 krisbash 1.1         return result;
 86              
 87                  result = MI_Application_NewInstance(&application, classDecl->name, classDecl, (MI_Instance**)&err); 
 88                  if (result == MI_RESULT_OK)
 89                  {
 90                      result = OMI_Error_Set_Message(err, message);
 91                      if (result != MI_RESULT_OK) goto Exit;
 92                      result = OMI_Error_Set_error_Code(err, errorCode);
 93                      if (result != MI_RESULT_OK) goto Exit;
 94                      result = OMI_Error_Set_error_Type(err, errorType); 
 95                      if (result != MI_RESULT_OK) goto Exit;
 96                      result = OMI_Error_Set_error_Category(err, errorCategory);
 97                      if (result != MI_RESULT_OK) goto Exit;
 98              		result = OMI_Error_Set_CIMStatusCode(err, MI_RESULT_FAILED);
 99                      if (result != MI_RESULT_OK) goto Exit;
100                      *omiError = (MI_Instance*)err;
101                  }
102              
103              Exit:
104                  if ((result != MI_RESULT_OK) && err) MI_Instance_Delete((MI_Instance*)err); 
105                  MI_Application_Close(&application);
106 krisbash 1.1     return result;
107              }
108              
109              _Use_decl_annotations_
110              MI_Result MI_CALL CreateOMIError(
111                  const MI_Char* message,
112                  MI_Uint32 errorCode, 
113                  const MI_Char* errorType, 
114                  MI_Uint16 errorCategory, 
115                  MI_Instance **omiError)
116              {
117                  return CreateOMIError_shared(
118                      message, errorCode, errorType, errorCategory,
119                      &OMI_Error_rtti,
120                      omiError);
121              }
122              
123              _Use_decl_annotations_
124              MI_Result MI_CALL CreateOMIDebugError(
125                  const MI_Char* message,
126                  MI_Uint32 errorCode, 
127 krisbash 1.1     const MI_Char* errorType, 
128                  MI_Uint16 errorCategory, 
129                  MI_Instance **omiError)
130              {
131                  return CreateOMIError_shared(
132                      message, errorCode, errorType, errorCategory,
133                      &OMI_DebugError_rtti,
134                      omiError);
135              }
136              
137              
138              static MI_Result MI_CALL CreateOMIError_FromMiResult_shared(
139                  MI_Result miResult,
140                  const MI_ClassDecl *classDecl,
141                  _Outptr_ MI_Instance **omiError)
142              {
143                  const MI_Char* message;
144                  MI_Uint16 errorCategory; 
145              
146                  switch (miResult)
147                  {
148 krisbash 1.1     case MI_RESULT_OK: 
149                      assert(0 && "Why would one call CreateOMIError_FromMiResult(MI_RESULT_OK)?");
150                      message = MI_T("MI_RESULT_OK");
151                      errorCategory = MI_ERRORCATEGORY_NOT_SPECIFIED;
152                      break;
153                  case MI_RESULT_FAILED : 
154                      message = MI_T("MI_RESULT_FAILED");
155                      errorCategory = MI_ERRORCATEGORY_NOT_SPECIFIED;
156                      break;
157                  case MI_RESULT_ACCESS_DENIED : 
158                      message = MI_T("MI_RESULT_ACCESS_DENIED");
159                      errorCategory = MI_ERRORCATEGORY_ACCESS_DENIED;
160                      break;
161                  case MI_RESULT_INVALID_NAMESPACE : 
162                      message = MI_T("MI_RESULT_INVALID_NAMESPACE");
163                      errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
164                      break;
165                  case MI_RESULT_INVALID_PARAMETER : 
166                      message = MI_T("MI_RESULT_INVALID_PARAMETER");
167                      errorCategory = MI_ERRORCATEGORY_INVALID_ARGUMENT;
168                      break;
169 krisbash 1.1     case MI_RESULT_INVALID_CLASS : 
170                      message = MI_T("MI_RESULT_INVALID_CLASS");
171                      errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
172                      break;
173                  case MI_RESULT_NOT_FOUND : 
174                      message = MI_T("MI_RESULT_NOT_FOUND");
175                      errorCategory = MI_ERRORCATEGORY_OBJECT_NOT_FOUND;
176                      break;
177                  case MI_RESULT_NOT_SUPPORTED : 
178                      message = MI_T("MI_RESULT_NOT_SUPPORTED");
179                      errorCategory = MI_ERRORCATEGORY_NOT_IMPLEMENTED;
180                      break;
181                  case MI_RESULT_CLASS_HAS_CHILDREN : 
182                      message = MI_T("MI_RESULT_CLASS_HAS_CHILDREN");
183                      errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
184                      break;        
185                  case MI_RESULT_CLASS_HAS_INSTANCES : 
186                      message = MI_T("MI_RESULT_CLASS_HAS_INSTANCES");
187                      errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
188                      break;
189                  case MI_RESULT_INVALID_SUPERCLASS : 
190 krisbash 1.1         message = MI_T("MI_RESULT_INVALID_SUPERCLASS");
191                      errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
192                      break;
193                  case MI_RESULT_ALREADY_EXISTS : 
194                      message = MI_T("MI_RESULT_ALREADY_EXISTS");
195                      errorCategory = MI_ERRORCATEGORY_RESOURCE_EXISTS;
196                      break;
197                  case MI_RESULT_NO_SUCH_PROPERTY : 
198                      message = MI_T("MI_RESULT_NO_SUCH_PROPERTY");
199                      errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
200                      break;
201                  case MI_RESULT_TYPE_MISMATCH : 
202                      message = MI_T("MI_RESULT_TYPE_MISMATCH");
203                      errorCategory = MI_ERRORCATEGORY_INVALID_TYPE;
204                      break;
205                  case MI_RESULT_QUERY_LANGUAGE_NOT_SUPPORTED : 
206                      message = MI_T("MI_RESULT_QUERY_LANGUAGE_NOT_SUPPORTED");
207                      errorCategory = MI_ERRORCATEGORY_NOT_IMPLEMENTED;
208                      break;
209                  case MI_RESULT_INVALID_QUERY : 
210                      message = MI_T("MI_RESULT_INVALID_QUERY");
211 krisbash 1.1         errorCategory = MI_ERRORCATEGORY_INVALID_ARGUMENT;
212                      break;
213                  case MI_RESULT_METHOD_NOT_AVAILABLE : 
214                      message = MI_T("MI_RESULT_METHOD_NOT_AVAILABLE");
215                      errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
216                      break;
217                  case MI_RESULT_METHOD_NOT_FOUND : 
218                      message = MI_T("MI_RESULT_METHOD_NOT_FOUND");
219                      errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
220                      break;
221                  case MI_RESULT_NAMESPACE_NOT_EMPTY : 
222                      message = MI_T("MI_RESULT_NAMESPACE_NOT_EMPTY");
223                      errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
224                      break;
225                  case MI_RESULT_INVALID_ENUMERATION_CONTEXT : 
226                      message = MI_T("MI_RESULT_INVALID_ENUMERATION_CONTEXT");
227                      errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
228                      break;
229                  case MI_RESULT_INVALID_OPERATION_TIMEOUT : 
230                      message = MI_T("MI_RESULT_INVALID_OPERATION_TIMEOUT");
231                      errorCategory = MI_ERRORCATEGORY_INVALID_ARGUMENT;
232 krisbash 1.1         break;
233                  case MI_RESULT_PULL_HAS_BEEN_ABANDONED : 
234                      message = MI_T("MI_RESULT_PULL_HAS_BEEN_ABANDONED");
235                      errorCategory = MI_ERRORCATEGORY_OPERATION_STOPPED;
236                      break;
237                  case MI_RESULT_PULL_CANNOT_BE_ABANDONED : 
238                      message = MI_T("MI_RESULT_PULL_CANNOT_BE_ABANDONED");
239                      errorCategory = MI_ERRORCATEGORY_CLOS_EERROR;
240                      break;
241                  case MI_RESULT_FILTERED_ENUMERATION_NOT_SUPPORTED : 
242                      message = MI_T("MI_RESULT_FILTERED_ENUMERATION_NOT_SUPPORTED");
243                      errorCategory = MI_ERRORCATEGORY_NOT_IMPLEMENTED;
244                      break;
245                  case MI_RESULT_CONTINUATION_ON_ERROR_NOT_SUPPORTED : 
246                      message = MI_T("MI_RESULT_CONTINUATION_ON_ERROR_NOT_SUPPORTED");
247                      errorCategory = MI_ERRORCATEGORY_NOT_IMPLEMENTED;
248                      break;
249                  case MI_RESULT_SERVER_LIMITS_EXCEEDED : 
250                      message = MI_T("MI_RESULT_SERVER_LIMITS_EXCEEDED");
251                      errorCategory = MI_ERRORCATEGORY_RESOURCE_BUSY;
252                      break;
253 krisbash 1.1     case MI_RESULT_SERVER_IS_SHUTTING_DOWN : 
254                      message = MI_T("MI_RESULT_SERVER_IS_SHUTTING_DOWN");
255                      errorCategory = MI_ERRORCATEGORY_RESOURCE_UNAVAILABLE;
256                      break;        
257                  default:
258                      errorCategory = MI_ERRORCATEGORY_NOT_SPECIFIED;
259                      message = MI_T("Unrecognized MI_Result");
260                      break;        
261                  }
262              
263                  return CreateOMIError_shared(message, miResult, MI_RESULT_TYPE_MI, errorCategory, classDecl, omiError);
264              }
265              
266              _Use_decl_annotations_
267              MI_Result MI_CALL CreateOMIError_FromMiResult(
268                  MI_Result miResult,
269                  MI_Instance **omiError)
270              {
271                  return CreateOMIError_FromMiResult_shared(miResult, &OMI_Error_rtti, omiError);
272              }
273              
274 krisbash 1.1 _Use_decl_annotations_
275              MI_Result MI_CALL CreateOMIDebugError_FromMiResult(
276                  MI_Result miResult,
277                  MI_Instance **omiError)
278              {
279                  return CreateOMIError_FromMiResult_shared(miResult, &OMI_DebugError_rtti, omiError);
280              }

ViewCVS 0.9.2