00001
00002 #include "stdafx.h"
00003 #include "CommonError.h"
00004 #include "CommonSmart.h"
00005 #include <stdio.h>
00006
00007
00008
00009 hresult_exception::hresult_exception()
00010 {
00011 hr = 0;
00012 }
00013
00014 hresult_exception::hresult_exception(const hresult_exception &e)
00015 {
00016 hr = e.hr;
00017 }
00018
00019 hresult_exception::hresult_exception(HRESULT a)
00020 {
00021 hr = a;
00022 }
00023
00024 hresult_exception &hresult_exception::operator=(const hresult_exception &e)
00025 {
00026 hr = e.hr;
00027 return *this;
00028 }
00029
00030 hresult_exception &hresult_exception::operator=(HRESULT a)
00031 {
00032 hr = a;
00033 return *this;
00034 }
00035
00036 hresult_exception::~hresult_exception()
00037 {
00038 }
00039
00040 const char *hresult_exception::what() const
00041 {
00042 static char message[80];
00043 sprintf_s(message, sizeof(message), "HRESULT (0x%08lx) exception", hr);
00044 return message;
00045 }
00046
00047
00048
00049 LPOLESTR common_descs[] =
00050 {
00051 OLESTR("Improper use of object"),
00052 OLESTR("Unknown exception"),
00053 OLESTR("Data conversion has failed"),
00054 OLESTR("Requested != count in GetAll"),
00055 OLESTR("[out] parameter is not empty"),
00056 OLESTR("Passed interface is not from the same project"),
00057 OLESTR("Object was not found"),
00058 OLESTR("File could not be opened"),
00059 OLESTR("VERIFY has failed"),
00060 OLESTR("COMTHROW test exception throwed"),
00061 };
00062
00063 LPOLESTR core_descs[] =
00064 {
00065 OLESTR("Object is locked by another Core component"),
00066 OLESTR("Lock value in Storage is invalid"),
00067 OLESTR("Attribute is not found"),
00068 OLESTR("Meta object is not found"),
00069 OLESTR("Meta project is invalid"),
00070 OLESTR("Invalid response from Repository"),
00071 OLESTR("CoreProject - CoreMetaProject mismatch"),
00072 OLESTR("Object is deleted or unloaded (zombie)"),
00073 OLESTR("Invalid ValueType"),
00074 OLESTR("No active transaction"),
00075 OLESTR("Object already exists"),
00076 OLESTR("No Territory has been selected"),
00077 OLESTR("Object is not locked"),
00078 OLESTR("Invalid data in Repository"),
00079 OLESTR("Cannot delete Object, has nonempty collection"),
00080 OLESTR("Cannot resolve the connection string"),
00081 OLESTR("Invalid binary file storage"),
00082 OLESTR("Project has no name"),
00083 };
00084
00085 LPOLESTR meta_descs[] =
00086 {
00087 OLESTR("Invalid ATTVAL type"),
00088 OLESTR("MetaProject is not open"),
00089 OLESTR("Invalid Path"),
00090 OLESTR("Invalid MetaRef")
00091 };
00092
00093 LPOLESTR parser_descs[] =
00094 {
00095 OLESTR("Invalid DTD file"),
00096 OLESTR("Invalid GUID"),
00097 OLESTR("Invalid XML filename"),
00098 OLESTR("Invalid MGA object"),
00099 OLESTR("Invalid META object"),
00100 OLESTR("Too many passes while parsing the XML file"),
00101 OLESTR("Invalid long value in XML file")
00102 };
00103
00104 void throw_com_error(HRESULT hr, LPCOLESTR desc)
00105 {
00106 ASSERT( desc != NULL );
00107
00108 try
00109 {
00110 CComObjPtr<ICreateErrorInfo> errorinfo;
00111 COMTHROW( CreateErrorInfo(PutOut(errorinfo)) );
00112 COMTHROW( errorinfo->SetDescription(const_cast<LPOLESTR>(desc)) );
00113 COMTHROW( errorinfo->SetSource(OLESTR("GME")) );
00114
00115 CComObjPtr<IErrorInfo> errorinfo2;
00116 COMTHROW( QueryInterface(errorinfo, errorinfo2) );
00117 COMTHROW( SetErrorInfo(0, errorinfo2) );
00118
00119 throw _com_error(hr, errorinfo2, true);
00120 }
00121 catch(hresult_exception &)
00122 {
00123
00124 }
00125 }
00126
00127 void SetErrorInfo(LPCOLESTR desc)
00128 {
00129 ASSERT( desc != NULL );
00130
00131 try
00132 {
00133 CComObjPtr<ICreateErrorInfo> errorinfo;
00134 COMTHROW( CreateErrorInfo(PutOut(errorinfo)) );
00135 COMTHROW( errorinfo->SetDescription(const_cast<LPOLESTR>(desc)) );
00136 COMTHROW( errorinfo->SetSource(OLESTR("GME")) );
00137
00138 CComObjPtr<IErrorInfo> errorinfo2;
00139 COMTHROW( QueryInterface(errorinfo, errorinfo2) );
00140 COMTHROW( SetErrorInfo(0, errorinfo2) );
00141 }
00142 catch(hresult_exception &)
00143 {
00144
00145 }
00146 }
00147
00148
00149 struct errtab {
00150 long code;
00151 LPOLESTR descr;
00152 };
00153
00154 #include "..\Mga\MgaErr.c"
00155
00156 #define MGAERRCODEBASE 0x87650000
00157 #define MGAERRCODESPAN 0x1000
00158
00159 LPCOLESTR MgaGetErrorInfo(HRESULT hr) {
00160 if(hr >= MGAERRCODEBASE && hr < MGAERRCODEBASE + MGAERRCODESPAN) {
00161 for(struct errtab const *hh = MgaErrTab; hh->code != 0; hh++) {
00162 if(hh->code == hr) {
00163 return hh->descr;
00164 }
00165 }
00166 }
00167 return NULL;
00168 }
00169
00170 bool MgaSetErrorInfo(HRESULT hr) {
00171 LPCOLESTR mgaError = MgaGetErrorInfo(hr);
00172 if (mgaError)
00173 {
00174 SetErrorInfo(mgaError);
00175 return true;
00176 }
00177 return false;
00178 }
00179
00180 void SetErrorInfo(HRESULT hr, LPOLESTR desc2)
00181 {
00182 ASSERT( sizeof(common_descs)/sizeof(LPOLESTR) == (E_COMMON_LAST-E_COMMON_FIRST+1) );
00183 ASSERT( sizeof(core_descs)/sizeof(LPOLESTR) == (E_CORE_LAST-E_CORE_FIRST+1) );
00184 ASSERT( sizeof(meta_descs)/sizeof(LPOLESTR) == (E_META_LAST-E_META_FIRST+1) );
00185 ASSERT( sizeof(parser_descs)/sizeof(LPOLESTR) == (E_PARSER_LAST-E_PARSER_FIRST+1) );
00186
00187 LPOLESTR desc = NULL;
00188 if( E_COMMON_FIRST <= hr && hr <= E_COMMON_LAST ) desc = common_descs[hr - E_COMMON_FIRST];
00189 else if( E_CORE_FIRST <= hr && hr <= E_CORE_LAST ) desc = core_descs[hr - E_CORE_FIRST];
00190 else if( E_META_FIRST <= hr && hr <= E_META_LAST ) desc = meta_descs[hr - E_META_FIRST];
00191 else if( E_PARSER_FIRST <= hr && hr <= E_PARSER_LAST ) desc = parser_descs[hr - E_PARSER_FIRST];
00192
00193 if( desc2 == NULL )
00194 {
00195 if( desc != NULL )
00196 SetErrorInfo(desc);
00197 else if (hr >= MGAERRCODEBASE && hr < MGAERRCODEBASE + MGAERRCODESPAN)
00198 {
00199 MgaSetErrorInfo(hr);
00200 }
00201 }
00202 else
00203 {
00204 CComBSTR d(desc);
00205 if( desc != NULL )
00206 COMTHROW(d.Append(L" :"));
00207
00208 COMTHROW(d.Append(desc2));
00209 SetErrorInfo(d);
00210 }
00211 }
00212
00213 bool GetErrorInfo(BSTR *desc)
00214 {
00215 ASSERT( desc != NULL );
00216
00217 try
00218 {
00219 CComObjPtr<IErrorInfo> errinfo;
00220 COMTHROW( GetErrorInfo(0, PutOut(errinfo)) );
00221 ASSERT( errinfo != NULL );
00222
00223 if( errinfo) COMTHROW( errinfo->GetDescription(desc) );
00224 }
00225 catch(hresult_exception &)
00226 {
00227
00228 return false;
00229 }
00230 return true;
00231 }
00232
00233 void GetErrorInfo(HRESULT hr, BSTR *p)
00234 {
00235 ASSERT( p != NULL );
00236
00237 LPOLESTR desc = NULL;
00238 if( E_COMMON_FIRST <= hr && hr <= E_COMMON_LAST ) desc = common_descs[hr - E_COMMON_FIRST];
00239 else if( E_CORE_FIRST <= hr && hr <= E_CORE_LAST ) desc = core_descs[hr - E_CORE_FIRST];
00240 else if( E_META_FIRST <= hr && hr <= E_META_LAST ) desc = meta_descs[hr - E_META_FIRST];
00241 else if( E_PARSER_FIRST <= hr && hr <= E_PARSER_LAST ) desc = parser_descs[hr - E_PARSER_FIRST];
00242
00243 if( desc != NULL )
00244 {
00245 SysFreeString(*p);
00246 *p = SysAllocString(desc);
00247 }
00248 else if (hr >= MGAERRCODEBASE && hr < MGAERRCODEBASE + MGAERRCODESPAN)
00249 {
00250 LPCOLESTR mgaError = MgaGetErrorInfo(hr);
00251 if (mgaError)
00252 *p = SysAllocString(mgaError);
00253 else
00254 GetErrorInfo(E_FAIL, p);
00255 }
00256 else
00257 {
00258 LPWSTR errorText = NULL;
00259 FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_IGNORE_INSERTS,
00260 NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&errorText, 0, NULL);
00261 if (errorText != NULL) {
00262 SysFreeString(*p);
00263 *p = SysAllocString(errorText);
00264 LocalFree(errorText);
00265 } else {
00266 if (!GetErrorInfo(p))
00267 {
00268 GetErrorInfo(E_FAIL, p);
00269 }
00270 }
00271 }
00272 }