diff options
Diffstat (limited to 'src/dutil/rssutil.cpp')
| -rw-r--r-- | src/dutil/rssutil.cpp | 125 |
1 files changed, 70 insertions, 55 deletions
diff --git a/src/dutil/rssutil.cpp b/src/dutil/rssutil.cpp index db49d954..8f994dfc 100644 --- a/src/dutil/rssutil.cpp +++ b/src/dutil/rssutil.cpp | |||
| @@ -2,6 +2,21 @@ | |||
| 2 | 2 | ||
| 3 | #include "precomp.h" | 3 | #include "precomp.h" |
| 4 | 4 | ||
| 5 | |||
| 6 | // Exit macros | ||
| 7 | #define RssExitOnLastError(x, s, ...) ExitOnLastErrorSource(DUTIL_SOURCE_RSSUTIL, x, s, __VA_ARGS__) | ||
| 8 | #define RssExitOnLastErrorDebugTrace(x, s, ...) ExitOnLastErrorDebugTraceSource(DUTIL_SOURCE_RSSUTIL, x, s, __VA_ARGS__) | ||
| 9 | #define RssExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_RSSUTIL, x, s, __VA_ARGS__) | ||
| 10 | #define RssExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_RSSUTIL, x, s, __VA_ARGS__) | ||
| 11 | #define RssExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_RSSUTIL, x, s, __VA_ARGS__) | ||
| 12 | #define RssExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_RSSUTIL, x, s, __VA_ARGS__) | ||
| 13 | #define RssExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_RSSUTIL, p, x, e, s, __VA_ARGS__) | ||
| 14 | #define RssExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_RSSUTIL, p, x, s, __VA_ARGS__) | ||
| 15 | #define RssExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_RSSUTIL, p, x, e, s, __VA_ARGS__) | ||
| 16 | #define RssExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_RSSUTIL, p, x, s, __VA_ARGS__) | ||
| 17 | #define RssExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_RSSUTIL, e, x, s, __VA_ARGS__) | ||
| 18 | #define RssExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_RSSUTIL, g, x, s, __VA_ARGS__) | ||
| 19 | |||
| 5 | static HRESULT ParseRssDocument( | 20 | static HRESULT ParseRssDocument( |
| 6 | __in IXMLDOMDocument *pixd, | 21 | __in IXMLDOMDocument *pixd, |
| 7 | __out RSS_CHANNEL **ppChannel | 22 | __out RSS_CHANNEL **ppChannel |
| @@ -68,10 +83,10 @@ extern "C" HRESULT DAPI RssParseFromString( | |||
| 68 | IXMLDOMDocument *pixdRss = NULL; | 83 | IXMLDOMDocument *pixdRss = NULL; |
| 69 | 84 | ||
| 70 | hr = XmlLoadDocument(wzRssString, &pixdRss); | 85 | hr = XmlLoadDocument(wzRssString, &pixdRss); |
| 71 | ExitOnFailure(hr, "Failed to load RSS string as XML document."); | 86 | RssExitOnFailure(hr, "Failed to load RSS string as XML document."); |
| 72 | 87 | ||
| 73 | hr = ParseRssDocument(pixdRss, &pNewChannel); | 88 | hr = ParseRssDocument(pixdRss, &pNewChannel); |
| 74 | ExitOnFailure(hr, "Failed to parse RSS document."); | 89 | RssExitOnFailure(hr, "Failed to parse RSS document."); |
| 75 | 90 | ||
| 76 | *ppChannel = pNewChannel; | 91 | *ppChannel = pNewChannel; |
| 77 | pNewChannel = NULL; | 92 | pNewChannel = NULL; |
| @@ -102,10 +117,10 @@ extern "C" HRESULT DAPI RssParseFromFile( | |||
| 102 | IXMLDOMDocument *pixdRss = NULL; | 117 | IXMLDOMDocument *pixdRss = NULL; |
| 103 | 118 | ||
| 104 | hr = XmlLoadDocumentFromFile(wzRssFile, &pixdRss); | 119 | hr = XmlLoadDocumentFromFile(wzRssFile, &pixdRss); |
| 105 | ExitOnFailure(hr, "Failed to load RSS string as XML document."); | 120 | RssExitOnFailure(hr, "Failed to load RSS string as XML document."); |
| 106 | 121 | ||
| 107 | hr = ParseRssDocument(pixdRss, &pNewChannel); | 122 | hr = ParseRssDocument(pixdRss, &pNewChannel); |
| 108 | ExitOnFailure(hr, "Failed to parse RSS document."); | 123 | RssExitOnFailure(hr, "Failed to parse RSS document."); |
| 109 | 124 | ||
| 110 | *ppChannel = pNewChannel; | 125 | *ppChannel = pNewChannel; |
| 111 | pNewChannel = NULL; | 126 | pNewChannel = NULL; |
| @@ -175,17 +190,17 @@ static HRESULT ParseRssDocument( | |||
| 175 | // Get the document element and start processing channels. | 190 | // Get the document element and start processing channels. |
| 176 | // | 191 | // |
| 177 | hr = pixd ->get_documentElement(&pRssElement); | 192 | hr = pixd ->get_documentElement(&pRssElement); |
| 178 | ExitOnFailure(hr, "failed get_documentElement in ParseRssDocument"); | 193 | RssExitOnFailure(hr, "failed get_documentElement in ParseRssDocument"); |
| 179 | 194 | ||
| 180 | hr = pRssElement->get_childNodes(&pChannelNodes); | 195 | hr = pRssElement->get_childNodes(&pChannelNodes); |
| 181 | ExitOnFailure(hr, "Failed to get child nodes of Rss Document element."); | 196 | RssExitOnFailure(hr, "Failed to get child nodes of Rss Document element."); |
| 182 | 197 | ||
| 183 | while (S_OK == (hr = XmlNextElement(pChannelNodes, &pNode, &bstrNodeName))) | 198 | while (S_OK == (hr = XmlNextElement(pChannelNodes, &pNode, &bstrNodeName))) |
| 184 | { | 199 | { |
| 185 | if (0 == lstrcmpW(bstrNodeName, L"channel")) | 200 | if (0 == lstrcmpW(bstrNodeName, L"channel")) |
| 186 | { | 201 | { |
| 187 | hr = ParseRssChannel(pNode, &pNewChannel); | 202 | hr = ParseRssChannel(pNode, &pNewChannel); |
| 188 | ExitOnFailure(hr, "Failed to parse RSS channel."); | 203 | RssExitOnFailure(hr, "Failed to parse RSS channel."); |
| 189 | } | 204 | } |
| 190 | else if (0 == lstrcmpW(bstrNodeName, L"link")) | 205 | else if (0 == lstrcmpW(bstrNodeName, L"link")) |
| 191 | { | 206 | { |
| @@ -242,13 +257,13 @@ static HRESULT ParseRssChannel( | |||
| 242 | // the RSS_CHANNEL structure | 257 | // the RSS_CHANNEL structure |
| 243 | // | 258 | // |
| 244 | hr = XmlSelectNodes(pixnChannel, L"item", &pNodeList); | 259 | hr = XmlSelectNodes(pixnChannel, L"item", &pNodeList); |
| 245 | ExitOnFailure(hr, "Failed to select all RSS items in an RSS channel."); | 260 | RssExitOnFailure(hr, "Failed to select all RSS items in an RSS channel."); |
| 246 | 261 | ||
| 247 | hr = pNodeList->get_length(&cItems); | 262 | hr = pNodeList->get_length(&cItems); |
| 248 | ExitOnFailure(hr, "Failed to count the number of RSS items in RSS channel."); | 263 | RssExitOnFailure(hr, "Failed to count the number of RSS items in RSS channel."); |
| 249 | 264 | ||
| 250 | pNewChannel = static_cast<RSS_CHANNEL*>(MemAlloc(sizeof(RSS_CHANNEL) + sizeof(RSS_ITEM) * cItems, TRUE)); | 265 | pNewChannel = static_cast<RSS_CHANNEL*>(MemAlloc(sizeof(RSS_CHANNEL) + sizeof(RSS_ITEM) * cItems, TRUE)); |
| 251 | ExitOnNull(pNewChannel, hr, E_OUTOFMEMORY, "Failed to allocate RSS channel structure."); | 266 | RssExitOnNull(pNewChannel, hr, E_OUTOFMEMORY, "Failed to allocate RSS channel structure."); |
| 252 | 267 | ||
| 253 | pNewChannel->cItems = cItems; | 268 | pNewChannel->cItems = cItems; |
| 254 | 269 | ||
| @@ -256,7 +271,7 @@ static HRESULT ParseRssChannel( | |||
| 256 | // Process the elements under a channel now. | 271 | // Process the elements under a channel now. |
| 257 | // | 272 | // |
| 258 | hr = pixnChannel->get_childNodes(&pNodeList); | 273 | hr = pixnChannel->get_childNodes(&pNodeList); |
| 259 | ExitOnFailure(hr, "Failed to get child nodes of RSS channel element."); | 274 | RssExitOnFailure(hr, "Failed to get child nodes of RSS channel element."); |
| 260 | 275 | ||
| 261 | cItems = 0; // reset the counter and use this to walk through the channel items | 276 | cItems = 0; // reset the counter and use this to walk through the channel items |
| 262 | while (S_OK == (hr = XmlNextElement(pNodeList, &pNode, &bstrNodeName))) | 277 | while (S_OK == (hr = XmlNextElement(pNodeList, &pNode, &bstrNodeName))) |
| @@ -264,45 +279,45 @@ static HRESULT ParseRssChannel( | |||
| 264 | if (0 == lstrcmpW(bstrNodeName, L"title")) | 279 | if (0 == lstrcmpW(bstrNodeName, L"title")) |
| 265 | { | 280 | { |
| 266 | hr = XmlGetText(pNode, &bstrNodeValue); | 281 | hr = XmlGetText(pNode, &bstrNodeValue); |
| 267 | ExitOnFailure(hr, "Failed to get RSS channel title."); | 282 | RssExitOnFailure(hr, "Failed to get RSS channel title."); |
| 268 | 283 | ||
| 269 | hr = StrAllocString(&pNewChannel->wzTitle, bstrNodeValue, 0); | 284 | hr = StrAllocString(&pNewChannel->wzTitle, bstrNodeValue, 0); |
| 270 | ExitOnFailure(hr, "Failed to allocate RSS channel title."); | 285 | RssExitOnFailure(hr, "Failed to allocate RSS channel title."); |
| 271 | } | 286 | } |
| 272 | else if (0 == lstrcmpW(bstrNodeName, L"link")) | 287 | else if (0 == lstrcmpW(bstrNodeName, L"link")) |
| 273 | { | 288 | { |
| 274 | hr = XmlGetText(pNode, &bstrNodeValue); | 289 | hr = XmlGetText(pNode, &bstrNodeValue); |
| 275 | ExitOnFailure(hr, "Failed to get RSS channel link."); | 290 | RssExitOnFailure(hr, "Failed to get RSS channel link."); |
| 276 | 291 | ||
| 277 | hr = StrAllocString(&pNewChannel->wzLink, bstrNodeValue, 0); | 292 | hr = StrAllocString(&pNewChannel->wzLink, bstrNodeValue, 0); |
| 278 | ExitOnFailure(hr, "Failed to allocate RSS channel link."); | 293 | RssExitOnFailure(hr, "Failed to allocate RSS channel link."); |
| 279 | } | 294 | } |
| 280 | else if (0 == lstrcmpW(bstrNodeName, L"description")) | 295 | else if (0 == lstrcmpW(bstrNodeName, L"description")) |
| 281 | { | 296 | { |
| 282 | hr = XmlGetText(pNode, &bstrNodeValue); | 297 | hr = XmlGetText(pNode, &bstrNodeValue); |
| 283 | ExitOnFailure(hr, "Failed to get RSS channel description."); | 298 | RssExitOnFailure(hr, "Failed to get RSS channel description."); |
| 284 | 299 | ||
| 285 | hr = StrAllocString(&pNewChannel->wzDescription, bstrNodeValue, 0); | 300 | hr = StrAllocString(&pNewChannel->wzDescription, bstrNodeValue, 0); |
| 286 | ExitOnFailure(hr, "Failed to allocate RSS channel description."); | 301 | RssExitOnFailure(hr, "Failed to allocate RSS channel description."); |
| 287 | } | 302 | } |
| 288 | else if (0 == lstrcmpW(bstrNodeName, L"ttl")) | 303 | else if (0 == lstrcmpW(bstrNodeName, L"ttl")) |
| 289 | { | 304 | { |
| 290 | hr = XmlGetText(pNode, &bstrNodeValue); | 305 | hr = XmlGetText(pNode, &bstrNodeValue); |
| 291 | ExitOnFailure(hr, "Failed to get RSS channel description."); | 306 | RssExitOnFailure(hr, "Failed to get RSS channel description."); |
| 292 | 307 | ||
| 293 | pNewChannel->dwTimeToLive = (DWORD)wcstoul(bstrNodeValue, NULL, 10); | 308 | pNewChannel->dwTimeToLive = (DWORD)wcstoul(bstrNodeValue, NULL, 10); |
| 294 | } | 309 | } |
| 295 | else if (0 == lstrcmpW(bstrNodeName, L"item")) | 310 | else if (0 == lstrcmpW(bstrNodeName, L"item")) |
| 296 | { | 311 | { |
| 297 | hr = ParseRssItem(pNode, cItems, pNewChannel); | 312 | hr = ParseRssItem(pNode, cItems, pNewChannel); |
| 298 | ExitOnFailure(hr, "Failed to parse RSS item."); | 313 | RssExitOnFailure(hr, "Failed to parse RSS item."); |
| 299 | 314 | ||
| 300 | ++cItems; | 315 | ++cItems; |
| 301 | } | 316 | } |
| 302 | else | 317 | else |
| 303 | { | 318 | { |
| 304 | hr = ParseRssUnknownElement(pNode, &pNewChannel->pUnknownElements); | 319 | hr = ParseRssUnknownElement(pNode, &pNewChannel->pUnknownElements); |
| 305 | ExitOnFailure(hr, "Failed to parse unknown RSS channel element: %ls", bstrNodeName); | 320 | RssExitOnFailure(hr, "Failed to parse unknown RSS channel element: %ls", bstrNodeName); |
| 306 | } | 321 | } |
| 307 | 322 | ||
| 308 | ReleaseNullBSTR(bstrNodeValue); | 323 | ReleaseNullBSTR(bstrNodeValue); |
| @@ -349,7 +364,7 @@ static HRESULT ParseRssItem( | |||
| 349 | if (pChannel->cItems <= cItem) | 364 | if (pChannel->cItems <= cItem) |
| 350 | { | 365 | { |
| 351 | hr = E_UNEXPECTED; | 366 | hr = E_UNEXPECTED; |
| 352 | ExitOnFailure(hr, "Unexpected number of items parsed."); | 367 | RssExitOnFailure(hr, "Unexpected number of items parsed."); |
| 353 | } | 368 | } |
| 354 | 369 | ||
| 355 | pItem = pChannel->rgItems + cItem; | 370 | pItem = pChannel->rgItems + cItem; |
| @@ -358,71 +373,71 @@ static HRESULT ParseRssItem( | |||
| 358 | // Process the elements under an item now. | 373 | // Process the elements under an item now. |
| 359 | // | 374 | // |
| 360 | hr = pixnItem->get_childNodes(&pNodeList); | 375 | hr = pixnItem->get_childNodes(&pNodeList); |
| 361 | ExitOnFailure(hr, "Failed to get child nodes of RSS item element."); | 376 | RssExitOnFailure(hr, "Failed to get child nodes of RSS item element."); |
| 362 | while (S_OK == (hr = XmlNextElement(pNodeList, &pNode, &bstrNodeName))) | 377 | while (S_OK == (hr = XmlNextElement(pNodeList, &pNode, &bstrNodeName))) |
| 363 | { | 378 | { |
| 364 | if (0 == lstrcmpW(bstrNodeName, L"title")) | 379 | if (0 == lstrcmpW(bstrNodeName, L"title")) |
| 365 | { | 380 | { |
| 366 | hr = XmlGetText(pNode, &bstrNodeValue); | 381 | hr = XmlGetText(pNode, &bstrNodeValue); |
| 367 | ExitOnFailure(hr, "Failed to get RSS channel title."); | 382 | RssExitOnFailure(hr, "Failed to get RSS channel title."); |
| 368 | 383 | ||
| 369 | hr = StrAllocString(&pItem->wzTitle, bstrNodeValue, 0); | 384 | hr = StrAllocString(&pItem->wzTitle, bstrNodeValue, 0); |
| 370 | ExitOnFailure(hr, "Failed to allocate RSS item title."); | 385 | RssExitOnFailure(hr, "Failed to allocate RSS item title."); |
| 371 | } | 386 | } |
| 372 | else if (0 == lstrcmpW(bstrNodeName, L"link")) | 387 | else if (0 == lstrcmpW(bstrNodeName, L"link")) |
| 373 | { | 388 | { |
| 374 | hr = XmlGetText(pNode, &bstrNodeValue); | 389 | hr = XmlGetText(pNode, &bstrNodeValue); |
| 375 | ExitOnFailure(hr, "Failed to get RSS channel link."); | 390 | RssExitOnFailure(hr, "Failed to get RSS channel link."); |
| 376 | 391 | ||
| 377 | hr = StrAllocString(&pItem->wzLink, bstrNodeValue, 0); | 392 | hr = StrAllocString(&pItem->wzLink, bstrNodeValue, 0); |
| 378 | ExitOnFailure(hr, "Failed to allocate RSS item link."); | 393 | RssExitOnFailure(hr, "Failed to allocate RSS item link."); |
| 379 | } | 394 | } |
| 380 | else if (0 == lstrcmpW(bstrNodeName, L"description")) | 395 | else if (0 == lstrcmpW(bstrNodeName, L"description")) |
| 381 | { | 396 | { |
| 382 | hr = XmlGetText(pNode, &bstrNodeValue); | 397 | hr = XmlGetText(pNode, &bstrNodeValue); |
| 383 | ExitOnFailure(hr, "Failed to get RSS item description."); | 398 | RssExitOnFailure(hr, "Failed to get RSS item description."); |
| 384 | 399 | ||
| 385 | hr = StrAllocString(&pItem->wzDescription, bstrNodeValue, 0); | 400 | hr = StrAllocString(&pItem->wzDescription, bstrNodeValue, 0); |
| 386 | ExitOnFailure(hr, "Failed to allocate RSS item description."); | 401 | RssExitOnFailure(hr, "Failed to allocate RSS item description."); |
| 387 | } | 402 | } |
| 388 | else if (0 == lstrcmpW(bstrNodeName, L"guid")) | 403 | else if (0 == lstrcmpW(bstrNodeName, L"guid")) |
| 389 | { | 404 | { |
| 390 | hr = XmlGetText(pNode, &bstrNodeValue); | 405 | hr = XmlGetText(pNode, &bstrNodeValue); |
| 391 | ExitOnFailure(hr, "Failed to get RSS item guid."); | 406 | RssExitOnFailure(hr, "Failed to get RSS item guid."); |
| 392 | 407 | ||
| 393 | hr = StrAllocString(&pItem->wzGuid, bstrNodeValue, 0); | 408 | hr = StrAllocString(&pItem->wzGuid, bstrNodeValue, 0); |
| 394 | ExitOnFailure(hr, "Failed to allocate RSS item guid."); | 409 | RssExitOnFailure(hr, "Failed to allocate RSS item guid."); |
| 395 | } | 410 | } |
| 396 | else if (0 == lstrcmpW(bstrNodeName, L"pubDate")) | 411 | else if (0 == lstrcmpW(bstrNodeName, L"pubDate")) |
| 397 | { | 412 | { |
| 398 | hr = XmlGetText(pNode, &bstrNodeValue); | 413 | hr = XmlGetText(pNode, &bstrNodeValue); |
| 399 | ExitOnFailure(hr, "Failed to get RSS item guid."); | 414 | RssExitOnFailure(hr, "Failed to get RSS item guid."); |
| 400 | 415 | ||
| 401 | hr = TimeFromString(bstrNodeValue, &pItem->ftPublished); | 416 | hr = TimeFromString(bstrNodeValue, &pItem->ftPublished); |
| 402 | ExitOnFailure(hr, "Failed to convert RSS item time."); | 417 | RssExitOnFailure(hr, "Failed to convert RSS item time."); |
| 403 | } | 418 | } |
| 404 | else if (0 == lstrcmpW(bstrNodeName, L"enclosure")) | 419 | else if (0 == lstrcmpW(bstrNodeName, L"enclosure")) |
| 405 | { | 420 | { |
| 406 | hr = XmlGetAttribute(pNode, L"url", &bstrNodeValue); | 421 | hr = XmlGetAttribute(pNode, L"url", &bstrNodeValue); |
| 407 | ExitOnFailure(hr, "Failed to get RSS item enclosure url."); | 422 | RssExitOnFailure(hr, "Failed to get RSS item enclosure url."); |
| 408 | 423 | ||
| 409 | hr = StrAllocString(&pItem->wzEnclosureUrl, bstrNodeValue, 0); | 424 | hr = StrAllocString(&pItem->wzEnclosureUrl, bstrNodeValue, 0); |
| 410 | ExitOnFailure(hr, "Failed to allocate RSS item enclosure url."); | 425 | RssExitOnFailure(hr, "Failed to allocate RSS item enclosure url."); |
| 411 | ReleaseNullBSTR(bstrNodeValue); | 426 | ReleaseNullBSTR(bstrNodeValue); |
| 412 | 427 | ||
| 413 | hr = XmlGetAttributeNumber(pNode, L"length", &pItem->dwEnclosureSize); | 428 | hr = XmlGetAttributeNumber(pNode, L"length", &pItem->dwEnclosureSize); |
| 414 | ExitOnFailure(hr, "Failed to get RSS item enclosure length."); | 429 | RssExitOnFailure(hr, "Failed to get RSS item enclosure length."); |
| 415 | 430 | ||
| 416 | hr = XmlGetAttribute(pNode, L"type", &bstrNodeValue); | 431 | hr = XmlGetAttribute(pNode, L"type", &bstrNodeValue); |
| 417 | ExitOnFailure(hr, "Failed to get RSS item enclosure type."); | 432 | RssExitOnFailure(hr, "Failed to get RSS item enclosure type."); |
| 418 | 433 | ||
| 419 | hr = StrAllocString(&pItem->wzEnclosureType, bstrNodeValue, 0); | 434 | hr = StrAllocString(&pItem->wzEnclosureType, bstrNodeValue, 0); |
| 420 | ExitOnFailure(hr, "Failed to allocate RSS item enclosure type."); | 435 | RssExitOnFailure(hr, "Failed to allocate RSS item enclosure type."); |
| 421 | } | 436 | } |
| 422 | else | 437 | else |
| 423 | { | 438 | { |
| 424 | hr = ParseRssUnknownElement(pNode, &pItem->pUnknownElements); | 439 | hr = ParseRssUnknownElement(pNode, &pItem->pUnknownElements); |
| 425 | ExitOnFailure(hr, "Failed to parse unknown RSS item element: %ls", bstrNodeName); | 440 | RssExitOnFailure(hr, "Failed to parse unknown RSS item element: %ls", bstrNodeName); |
| 426 | } | 441 | } |
| 427 | 442 | ||
| 428 | ReleaseNullBSTR(bstrNodeValue); | 443 | ReleaseNullBSTR(bstrNodeValue); |
| @@ -460,39 +475,39 @@ static HRESULT ParseRssUnknownElement( | |||
| 460 | RSS_UNKNOWN_ELEMENT* pNewUnknownElement; | 475 | RSS_UNKNOWN_ELEMENT* pNewUnknownElement; |
| 461 | 476 | ||
| 462 | pNewUnknownElement = static_cast<RSS_UNKNOWN_ELEMENT*>(MemAlloc(sizeof(RSS_UNKNOWN_ELEMENT), TRUE)); | 477 | pNewUnknownElement = static_cast<RSS_UNKNOWN_ELEMENT*>(MemAlloc(sizeof(RSS_UNKNOWN_ELEMENT), TRUE)); |
| 463 | ExitOnNull(pNewUnknownElement, hr, E_OUTOFMEMORY, "Failed to allocate unknown element."); | 478 | RssExitOnNull(pNewUnknownElement, hr, E_OUTOFMEMORY, "Failed to allocate unknown element."); |
| 464 | 479 | ||
| 465 | hr = pNode->get_namespaceURI(&bstrNodeNamespace); | 480 | hr = pNode->get_namespaceURI(&bstrNodeNamespace); |
| 466 | if (S_OK == hr) | 481 | if (S_OK == hr) |
| 467 | { | 482 | { |
| 468 | hr = StrAllocString(&pNewUnknownElement->wzNamespace, bstrNodeNamespace, 0); | 483 | hr = StrAllocString(&pNewUnknownElement->wzNamespace, bstrNodeNamespace, 0); |
| 469 | ExitOnFailure(hr, "Failed to allocate RSS unknown element namespace."); | 484 | RssExitOnFailure(hr, "Failed to allocate RSS unknown element namespace."); |
| 470 | } | 485 | } |
| 471 | else if (S_FALSE == hr) | 486 | else if (S_FALSE == hr) |
| 472 | { | 487 | { |
| 473 | hr = S_OK; | 488 | hr = S_OK; |
| 474 | } | 489 | } |
| 475 | ExitOnFailure(hr, "Failed to get unknown element namespace."); | 490 | RssExitOnFailure(hr, "Failed to get unknown element namespace."); |
| 476 | 491 | ||
| 477 | hr = pNode->get_baseName(&bstrNodeName); | 492 | hr = pNode->get_baseName(&bstrNodeName); |
| 478 | ExitOnFailure(hr, "Failed to get unknown element name."); | 493 | RssExitOnFailure(hr, "Failed to get unknown element name."); |
| 479 | 494 | ||
| 480 | hr = StrAllocString(&pNewUnknownElement->wzElement, bstrNodeName, 0); | 495 | hr = StrAllocString(&pNewUnknownElement->wzElement, bstrNodeName, 0); |
| 481 | ExitOnFailure(hr, "Failed to allocate RSS unknown element name."); | 496 | RssExitOnFailure(hr, "Failed to allocate RSS unknown element name."); |
| 482 | 497 | ||
| 483 | hr = XmlGetText(pNode, &bstrNodeValue); | 498 | hr = XmlGetText(pNode, &bstrNodeValue); |
| 484 | ExitOnFailure(hr, "Failed to get unknown element value."); | 499 | RssExitOnFailure(hr, "Failed to get unknown element value."); |
| 485 | 500 | ||
| 486 | hr = StrAllocString(&pNewUnknownElement->wzValue, bstrNodeValue, 0); | 501 | hr = StrAllocString(&pNewUnknownElement->wzValue, bstrNodeValue, 0); |
| 487 | ExitOnFailure(hr, "Failed to allocate RSS unknown element value."); | 502 | RssExitOnFailure(hr, "Failed to allocate RSS unknown element value."); |
| 488 | 503 | ||
| 489 | hr = pNode->get_attributes(&pixnnmAttributes); | 504 | hr = pNode->get_attributes(&pixnnmAttributes); |
| 490 | ExitOnFailure(hr, "Failed get attributes on RSS unknown element."); | 505 | RssExitOnFailure(hr, "Failed get attributes on RSS unknown element."); |
| 491 | 506 | ||
| 492 | while (S_OK == (hr = pixnnmAttributes->nextNode(&pixnAttribute))) | 507 | while (S_OK == (hr = pixnnmAttributes->nextNode(&pixnAttribute))) |
| 493 | { | 508 | { |
| 494 | hr = ParseRssUnknownAttribute(pixnAttribute, &pNewUnknownElement->pAttributes); | 509 | hr = ParseRssUnknownAttribute(pixnAttribute, &pNewUnknownElement->pAttributes); |
| 495 | ExitOnFailure(hr, "Failed to parse attribute on RSS unknown element."); | 510 | RssExitOnFailure(hr, "Failed to parse attribute on RSS unknown element."); |
| 496 | 511 | ||
| 497 | ReleaseNullObject(pixnAttribute); | 512 | ReleaseNullObject(pixnAttribute); |
| 498 | } | 513 | } |
| @@ -501,7 +516,7 @@ static HRESULT ParseRssUnknownElement( | |||
| 501 | { | 516 | { |
| 502 | hr = S_OK; | 517 | hr = S_OK; |
| 503 | } | 518 | } |
| 504 | ExitOnFailure(hr, "Failed to enumerate all attributes on RSS unknown element."); | 519 | RssExitOnFailure(hr, "Failed to enumerate all attributes on RSS unknown element."); |
| 505 | 520 | ||
| 506 | RSS_UNKNOWN_ELEMENT** ppTail = ppUnknownElement; | 521 | RSS_UNKNOWN_ELEMENT** ppTail = ppUnknownElement; |
| 507 | while (*ppTail) | 522 | while (*ppTail) |
| @@ -543,31 +558,31 @@ static HRESULT ParseRssUnknownAttribute( | |||
| 543 | RSS_UNKNOWN_ATTRIBUTE* pNewUnknownAttribute; | 558 | RSS_UNKNOWN_ATTRIBUTE* pNewUnknownAttribute; |
| 544 | 559 | ||
| 545 | pNewUnknownAttribute = static_cast<RSS_UNKNOWN_ATTRIBUTE*>(MemAlloc(sizeof(RSS_UNKNOWN_ATTRIBUTE), TRUE)); | 560 | pNewUnknownAttribute = static_cast<RSS_UNKNOWN_ATTRIBUTE*>(MemAlloc(sizeof(RSS_UNKNOWN_ATTRIBUTE), TRUE)); |
| 546 | ExitOnNull(pNewUnknownAttribute, hr, E_OUTOFMEMORY, "Failed to allocate unknown attribute."); | 561 | RssExitOnNull(pNewUnknownAttribute, hr, E_OUTOFMEMORY, "Failed to allocate unknown attribute."); |
| 547 | 562 | ||
| 548 | hr = pNode->get_namespaceURI(&bstrNodeNamespace); | 563 | hr = pNode->get_namespaceURI(&bstrNodeNamespace); |
| 549 | if (S_OK == hr) | 564 | if (S_OK == hr) |
| 550 | { | 565 | { |
| 551 | hr = StrAllocString(&pNewUnknownAttribute->wzNamespace, bstrNodeNamespace, 0); | 566 | hr = StrAllocString(&pNewUnknownAttribute->wzNamespace, bstrNodeNamespace, 0); |
| 552 | ExitOnFailure(hr, "Failed to allocate RSS unknown attribute namespace."); | 567 | RssExitOnFailure(hr, "Failed to allocate RSS unknown attribute namespace."); |
| 553 | } | 568 | } |
| 554 | else if (S_FALSE == hr) | 569 | else if (S_FALSE == hr) |
| 555 | { | 570 | { |
| 556 | hr = S_OK; | 571 | hr = S_OK; |
| 557 | } | 572 | } |
| 558 | ExitOnFailure(hr, "Failed to get unknown attribute namespace."); | 573 | RssExitOnFailure(hr, "Failed to get unknown attribute namespace."); |
| 559 | 574 | ||
| 560 | hr = pNode->get_baseName(&bstrNodeName); | 575 | hr = pNode->get_baseName(&bstrNodeName); |
| 561 | ExitOnFailure(hr, "Failed to get unknown attribute name."); | 576 | RssExitOnFailure(hr, "Failed to get unknown attribute name."); |
| 562 | 577 | ||
| 563 | hr = StrAllocString(&pNewUnknownAttribute->wzAttribute, bstrNodeName, 0); | 578 | hr = StrAllocString(&pNewUnknownAttribute->wzAttribute, bstrNodeName, 0); |
| 564 | ExitOnFailure(hr, "Failed to allocate RSS unknown attribute name."); | 579 | RssExitOnFailure(hr, "Failed to allocate RSS unknown attribute name."); |
| 565 | 580 | ||
| 566 | hr = XmlGetText(pNode, &bstrNodeValue); | 581 | hr = XmlGetText(pNode, &bstrNodeValue); |
| 567 | ExitOnFailure(hr, "Failed to get unknown attribute value."); | 582 | RssExitOnFailure(hr, "Failed to get unknown attribute value."); |
| 568 | 583 | ||
| 569 | hr = StrAllocString(&pNewUnknownAttribute->wzValue, bstrNodeValue, 0); | 584 | hr = StrAllocString(&pNewUnknownAttribute->wzValue, bstrNodeValue, 0); |
| 570 | ExitOnFailure(hr, "Failed to allocate RSS unknown attribute value."); | 585 | RssExitOnFailure(hr, "Failed to allocate RSS unknown attribute value."); |
| 571 | 586 | ||
| 572 | RSS_UNKNOWN_ATTRIBUTE** ppTail = ppUnknownAttribute; | 587 | RSS_UNKNOWN_ATTRIBUTE** ppTail = ppUnknownAttribute; |
| 573 | while (*ppTail) | 588 | while (*ppTail) |
