00001
00002
00003
00004
00005
00006 #include "fsHTMLParser.h"
00007 #include "strparsing.h"
00008 #include "system.h"
00009
00010 #pragma warning (disable : 4127)
00011 #pragma warning (disable : 4710)
00012
00013 fsHTMLParser::fsHTMLParser()
00014 {
00015 m_bKillDupes = TRUE;
00016 }
00017
00018 fsHTMLParser::~fsHTMLParser()
00019 {
00020
00021 }
00022
00023 void fsHTMLParser::ParseHTML(LPSTR pszHTML)
00024 {
00025 m_pszHTML = pszHTML;
00026 m_htmlLen = strlen (m_pszHTML);
00027
00028 m_strBaseURL = "";
00029
00030 ParseHTML ();
00031 }
00032
00033 LPCSTR fsHTMLParser::GetUrl(int iIndex)
00034 {
00035 return m_vUrls [iIndex];
00036 }
00037
00038 void fsHTMLParser::ParseHTML()
00039 {
00040 LPCSTR pszTagB = m_pszHTML;
00041
00042 m_vUrls.clear ();
00043 m_vUrlsRgns.clear ();
00044 m_vImgs.clear ();
00045 m_vImgsRgns.clear ();
00046 m_vImgsLinksTo.clear ();
00047 m_vLinkUrls.clear ();
00048 m_vLinkUrlsRgns.clear ();
00049 m_vLRTs.clear ();
00050
00051 m_iTagAOpened = -1;
00052
00053 do
00054 {
00055
00056 pszTagB = strchr (pszTagB, '<');
00057 if (pszTagB == NULL) break;
00058
00059
00060 pszTagB = ParseTag (pszTagB);
00061 }
00062 while (pszTagB);
00063 }
00064
00065 LPCSTR fsHTMLParser::ParseTag_A(LPCSTR pszTag, fsHTMLParser *pThis)
00066 {
00067 do
00068 {
00069
00070 if (strnicmp (pszTag, "href", 4) == 0)
00071 {
00072
00073 if (fsStrIsDivider (pszTag [4]) || pszTag [4] == '=')
00074 {
00075
00076 pszTag += 4;
00077 pszTag = pThis->ParseTag_A_Href (pszTag);
00078 if (pszTag == NULL) break;
00079 pszTag = strchr (pszTag, '>');
00080 if (pszTag == NULL) break;
00081 }
00082 }
00083
00084
00085 if (*pszTag == '>')
00086 {
00087 pszTag++;
00088 break;
00089 }
00090
00091 pszTag++;
00092 }
00093 while (*pszTag);
00094
00095 return pszTag;
00096 }
00097
00098 LPCSTR fsHTMLParser::ParseTag_Img(LPCSTR pszTag, fsHTMLParser *pThis)
00099 {
00100 do
00101 {
00102 if (strnicmp (pszTag, "src", 3) == 0)
00103 {
00104 if (fsStrIsDivider (pszTag [3]) || pszTag [3] == '=')
00105 {
00106 pszTag = pThis->ParseTag_Img_Src (pszTag);
00107 if (pszTag == NULL) break;
00108 pszTag = strchr (pszTag, '>');
00109 if (pszTag == NULL) break;
00110 }
00111 }
00112
00113 if (*pszTag == '>')
00114 {
00115 pszTag++;
00116 break;
00117 }
00118
00119 pszTag++;
00120 }
00121 while (*pszTag);
00122
00123 return pszTag;
00124 }
00125
00126 LPCSTR fsHTMLParser::ParseTag(LPCSTR pszTag)
00127 {
00128 typedef LPCSTR (*fntTagParser) (LPCSTR pszTag, fsHTMLParser *parser);
00129
00130
00131 LPCSTR apszTags [] = { "a", "img", "link", "area", "meta", "base", "frame" };
00132
00133 fntTagParser apfnTagParsers [] = { ParseTag_A, ParseTag_Img, ParseTag_Link, ParseTag_A,
00134 ParseTag_Meta, ParseTag_Base, ParseTag_Frame };
00135
00136
00137 pszTag++;
00138
00139 if (*pszTag == '/')
00140 {
00141
00142 if (strnicmp (pszTag, "/a>", 3) == 0 || strnicmp (pszTag, "/a ", 3) == 0)
00143 m_iTagAOpened = -1;
00144
00145
00146 pszTag = strchr (pszTag, '>');
00147 if (pszTag) pszTag++;
00148 return pszTag;
00149 }
00150
00151
00152 for (int i = 0; i < sizeof (apszTags) / sizeof (LPCSTR); i++)
00153 {
00154 int taglen = strlen (apszTags [i]);
00155 if (strnicmp (pszTag, apszTags [i], taglen) == 0 && fsStrIsDivider (pszTag [taglen]))
00156 {
00157
00158 pszTag += taglen;
00159 pszTag = apfnTagParsers [i] (pszTag, this);
00160 break;
00161 }
00162 }
00163
00164 if (i == sizeof (apszTags) / sizeof (LPCSTR))
00165 pszTag = ParseTag_Unknown (pszTag);
00166
00167 return pszTag;
00168 }
00169
00170 LPCSTR fsHTMLParser::ParseTag_Unknown(LPCSTR pszTag)
00171 {
00172
00173
00174 pszTag = strchr (pszTag, '>');
00175 if (pszTag) pszTag ++;
00176 return pszTag;
00177 }
00178
00179 LPCSTR fsHTMLParser::ParseTag_A_Href(LPCSTR pszTag, LPCSTR pszAddUrlEnds)
00180 {
00181 LPSTR pszUrl;
00182
00183
00184
00185 pszTag = Parse_HTMLGiving (pszTag, &pszUrl, pszAddUrlEnds);
00186
00187 if (pszUrl)
00188 {
00189 int iUrlFound = -1;
00190 if (m_bKillDupes)
00191 {
00192
00193
00194 for (int i = 0; i < m_vUrls.size (); i++)
00195 {
00196 if (stricmp (m_vUrls [i], pszUrl) == 0)
00197 {
00198 iUrlFound = i;
00199 break;
00200 }
00201 }
00202
00203 }
00204
00205 if (iUrlFound == -1)
00206 {
00207
00208
00209 fsTextRegion rgn;
00210 rgn.nStart = pszTag - strlen (pszUrl) - m_pszHTML;
00211 rgn.nEnd = pszTag - m_pszHTML;
00212
00213 if (pszTag [-1] == '"' || pszTag [-1] == '\'')
00214 {
00215 rgn.nStart --;
00216 rgn.nEnd --;
00217 }
00218 m_vUrlsRgns.add (rgn);
00219 m_vUrls.add (pszUrl);
00220 iUrlFound = m_vUrls.size () - 1;
00221 }
00222
00223 m_iTagAOpened = iUrlFound;
00224
00225 delete [] pszUrl;
00226 }
00227
00228
00229 return pszTag;
00230 }
00231
00232 LPCSTR fsHTMLParser::Parse_HTMLGiving(LPCSTR pszGiving, LPSTR *ppszValue, LPCSTR pszAddEnds)
00233 {
00234
00235
00236 pszGiving = fsStrSkipDividers (pszGiving);
00237
00238 *ppszValue = NULL;
00239
00240
00241 if (*pszGiving != '=')
00242 return pszGiving;
00243
00244 pszGiving ++;
00245
00246 pszGiving = fsStrSkipDividers (pszGiving);
00247
00248
00249 LPCSTR pszEnd = " >";
00250
00251 if (*pszGiving == '"' || *pszGiving == '\'')
00252 {
00253 if (*pszGiving == '"')
00254 pszEnd = "\"";
00255 else
00256 pszEnd = "'";
00257
00258 pszGiving ++;
00259 }
00260
00261 char szEnd [100];
00262 strcpy (szEnd, pszEnd);
00263 if (pszAddEnds)
00264 strcat (szEnd, pszAddEnds);
00265
00266
00267 pszGiving = fsStrGetStrUpToChar (pszGiving, szEnd, ppszValue);
00268
00269 if (pszGiving == NULL)
00270 return NULL;
00271
00272
00273 if (*(pszGiving - 1) == '>' || *(pszGiving - 1) == ' ')
00274 pszGiving --;
00275
00276 return pszGiving;
00277 }
00278
00279 LPCSTR fsHTMLParser::ParseTag_Img_Src(LPCSTR pszTag)
00280 {
00281 pszTag += 3;
00282
00283 LPSTR pszUrl;
00284 pszTag = Parse_HTMLGiving (pszTag, &pszUrl);
00285
00286 if (pszUrl)
00287 {
00288 fsTextRegion rgn;
00289 rgn.nStart = pszTag - strlen (pszUrl) - m_pszHTML;
00290 rgn.nEnd = pszTag - m_pszHTML;
00291 if (pszTag [-1] == '"' || pszTag [-1] == '\'')
00292 {
00293 rgn.nStart --;
00294 rgn.nEnd --;
00295 }
00296 m_vImgsRgns.add (rgn);
00297 m_vImgs.add (pszUrl);
00298 m_vImgsLinksTo.add (m_iTagAOpened);
00299 delete [] pszUrl;
00300 }
00301
00302 return pszTag;
00303 }
00304
00305 int fsHTMLParser::GetUrlCount()
00306 {
00307 return m_vUrls.size ();
00308 }
00309
00310 int fsHTMLParser::GetImageCount()
00311 {
00312 return m_vImgs.size ();
00313 }
00314
00315 LPCSTR fsHTMLParser::GetImage(int iIndex)
00316 {
00317 return m_vImgs [iIndex];
00318 }
00319
00320 int fsHTMLParser::GetImageLinkTo(int iImage)
00321 {
00322 return m_vImgsLinksTo [iImage];
00323 }
00324
00325 void fsHTMLParser::SetKillDupes(BOOL bKill)
00326 {
00327 m_bKillDupes = bKill;
00328 }
00329
00330 void fsHTMLParser::ReplaceUrl(int iIndex, LPCSTR pszNewUrl)
00331 {
00332 fsTextRegion &rgn = m_vUrlsRgns [iIndex];
00333 int nHole = ReplaceString (pszNewUrl, rgn);
00334
00335
00336
00337
00338
00339 rgn.nEnd -= nHole;
00340 CorrectRegions (rgn.nStart, nHole);
00341 }
00342
00343 int fsHTMLParser::ReplaceString(LPCSTR pszNewVal, fsTextRegion &rgn)
00344 {
00345 int newlen = strlen (pszNewVal);
00346
00347
00348 if (newlen > rgn.nEnd - rgn.nStart)
00349 {
00350
00351
00352
00353
00354 LPSTR pszBuf = NULL;
00355 fsnew (pszBuf, char, m_htmlLen - rgn.nEnd + 1);
00356
00357 CopyMemory (pszBuf, m_pszHTML + rgn.nEnd, m_htmlLen - rgn.nEnd + 1);
00358
00359
00360 CopyMemory (m_pszHTML + rgn.nStart + newlen, pszBuf, m_htmlLen - rgn.nEnd + 1);
00361 delete [] pszBuf;
00362 }
00363 else
00364 {
00365
00366 CopyMemory (m_pszHTML + rgn.nStart + newlen, m_pszHTML + rgn.nEnd, m_htmlLen - rgn.nEnd + 1);
00367 }
00368
00369
00370 CopyMemory (m_pszHTML + rgn.nStart, pszNewVal, newlen);
00371
00372
00373 m_htmlLen -= (int) rgn.nEnd - (int) rgn.nStart - newlen;
00374
00375 return (int) rgn.nEnd - (int) rgn.nStart - newlen;
00376 }
00377
00378 void fsHTMLParser::ReplaceImage(int iIndex, LPCSTR pszNewImg)
00379 {
00380 fsTextRegion &rgn = m_vImgsRgns [iIndex];
00381 int nHole = ReplaceString (pszNewImg, rgn);
00382
00383 rgn.nEnd -= nHole;
00384
00385 CorrectRegions (rgn.nStart, nHole);
00386 }
00387
00388 UINT fsHTMLParser::GetHTMLLength()
00389 {
00390 return m_htmlLen;
00391 }
00392
00393 void fsHTMLParser::CorrectRegions(int nStart, int nHole)
00394 {
00395
00396
00397
00398
00399 for (int i = 0; i < m_vUrlsRgns.size (); i++)
00400 {
00401 fsTextRegion &rgn = m_vUrlsRgns [i];
00402 if (rgn.nStart > nStart)
00403 {
00404 rgn.nStart -= nHole;
00405 rgn.nEnd -= nHole;
00406 }
00407 }
00408
00409 for (i = 0; i < m_vImgsRgns.size (); i++)
00410 {
00411 fsTextRegion &rgn = m_vImgsRgns [i];
00412 if (rgn.nStart > nStart)
00413 {
00414 rgn.nStart -= nHole;
00415 rgn.nEnd -= nHole;
00416 }
00417 }
00418
00419 for (i = 0; i < m_vLinkUrlsRgns.size (); i++)
00420 {
00421 fsTextRegion &rgn = m_vLinkUrlsRgns [i];
00422 if (rgn.nStart > nStart)
00423 {
00424 rgn.nStart -= nHole;
00425 rgn.nEnd -= nHole;
00426 }
00427 }
00428
00429 for (i = 0; i < m_vFrameRgns.size (); i++)
00430 {
00431 fsTextRegion &rgn = m_vFrameRgns [i];
00432 if (rgn.nStart > nStart)
00433 {
00434 rgn.nStart -= nHole;
00435 rgn.nEnd -= nHole;
00436 }
00437 }
00438 }
00439
00440 LPCSTR fsHTMLParser::ParseTag_Link(LPCSTR pszTag, fsHTMLParser *pThis)
00441 {
00442 fsLinkRelType lrt = LRT_UNKNOWN;
00443 BOOL bLinkAdded = FALSE;
00444
00445 do
00446 {
00447 if (strnicmp (pszTag, "rel", 3) == 0)
00448 {
00449 if (fsStrIsDivider (pszTag [3]) || pszTag [3] == '=')
00450 {
00451
00452 pszTag = pThis->ParseTag_Link_Rel (pszTag, &lrt);
00453 if (pszTag == NULL) break;
00454 }
00455 }
00456
00457 if (strnicmp (pszTag, "href", 4) == 0 && bLinkAdded == FALSE)
00458 {
00459 if (fsStrIsDivider (pszTag [4]) || pszTag [4] == '=')
00460 {
00461 pszTag = pThis->ParseTag_Link_Href (pszTag);
00462 if (pszTag == NULL) break;
00463 bLinkAdded = TRUE;
00464 }
00465 }
00466
00467 if (*pszTag == '>')
00468 {
00469 pszTag++;
00470 break;
00471 }
00472
00473 pszTag++;
00474 }
00475 while (*pszTag);
00476
00477 if (bLinkAdded)
00478 pThis->m_vLRTs.add (lrt);
00479
00480 return pszTag;
00481 }
00482
00483 LPCSTR fsHTMLParser::ParseTag_Link_Rel(LPCSTR pszTag, fsLinkRelType *lrt)
00484 {
00485 pszTag += 3;
00486
00487 LPSTR pszType;
00488 pszTag = Parse_HTMLGiving (pszTag, &pszType);
00489
00490 *lrt = LRT_UNKNOWN;
00491
00492 if (pszType)
00493 {
00494 if (stricmp (pszType, "stylesheet") == 0)
00495 *lrt = LRT_STYLESHEET;
00496
00497 delete [] pszType;
00498 }
00499
00500
00501 return pszTag;
00502 }
00503
00504 LPCSTR fsHTMLParser::ParseTag_Link_Href(LPCSTR pszTag)
00505 {
00506
00507
00508 pszTag += 4;
00509
00510 LPSTR pszUrl;
00511 pszTag = Parse_HTMLGiving (pszTag, &pszUrl);
00512
00513 if (pszUrl)
00514 {
00515 int iUrlFound = -1;
00516 if (m_bKillDupes)
00517 {
00518 for (int i = 0; i < m_vLinkUrls.size (); i++)
00519 if (stricmp (m_vLinkUrls [i], pszUrl) == 0)
00520 {
00521 iUrlFound = i;
00522 break;
00523 }
00524 }
00525
00526 if (iUrlFound == -1)
00527 {
00528 fsTextRegion rgn;
00529 rgn.nStart = pszTag - strlen (pszUrl) - m_pszHTML;
00530 rgn.nEnd = pszTag - m_pszHTML;
00531 if (pszTag [-1] == '"' || pszTag [-1] == '\'')
00532 {
00533 rgn.nStart --;
00534 rgn.nEnd --;
00535 }
00536 m_vLinkUrlsRgns.add (rgn);
00537 m_vLinkUrls.add (pszUrl);
00538 }
00539
00540 delete [] pszUrl;
00541 }
00542
00543
00544 return pszTag;
00545 }
00546
00547 int fsHTMLParser::GetLinkUrlCount()
00548 {
00549 return m_vLinkUrls.size ();
00550 }
00551
00552 LPCSTR fsHTMLParser::GetLinkUrl(int iIndex)
00553 {
00554 return m_vLinkUrls [iIndex];
00555 }
00556
00557 fsLinkRelType fsHTMLParser::GetLinkUrlRelType(int iIndex)
00558 {
00559 return m_vLRTs [iIndex];
00560 }
00561
00562 void fsHTMLParser::ReplaceLinkUrl(int iIndex, LPCSTR pszNewUrl)
00563 {
00564 fsTextRegion &rgn = m_vLinkUrlsRgns [iIndex];
00565 int nHole = ReplaceString (pszNewUrl, rgn);
00566
00567 rgn.nEnd -= nHole;
00568
00569 CorrectRegions (rgn.nStart, nHole);
00570 }
00571
00572 LPCSTR fsHTMLParser::ParseTag_Meta(LPCSTR pszTag, fsHTMLParser *pThis)
00573 {
00574 fsMetaHttpEquivType mhet = MHET_UNKNOWN;
00575
00576 do
00577 {
00578 if (strnicmp (pszTag, "http-equiv", 10) == 0)
00579 {
00580 if (fsStrIsDivider (pszTag [10]) || pszTag [10] == '=')
00581 {
00582
00583 pszTag = pThis->ParseTag_Meta_HttpEquiv (pszTag, &mhet);
00584 if (pszTag == NULL) break;
00585 }
00586 }
00587
00588 if (strnicmp (pszTag, "content", 7) == 0)
00589 {
00590 if (fsStrIsDivider (pszTag [7]) || pszTag [7] == '=')
00591 {
00592 pszTag = pThis->ParseTag_Meta_Content (pszTag, mhet);
00593 if (pszTag == NULL) break;
00594 pszTag = strchr (pszTag, '>');
00595 if (pszTag == NULL) break;
00596 }
00597 }
00598
00599 if (*pszTag == '>')
00600 {
00601 pszTag++;
00602 break;
00603 }
00604
00605 pszTag++;
00606 }
00607 while (*pszTag);
00608
00609 return pszTag;
00610 }
00611
00612 LPCSTR fsHTMLParser::ParseTag_Meta_HttpEquiv(LPCSTR pszTag, fsMetaHttpEquivType *mhet)
00613 {
00614 pszTag += 10;
00615
00616 LPSTR pszType;
00617 pszTag = Parse_HTMLGiving (pszTag, &pszType);
00618
00619 *mhet = MHET_UNKNOWN;
00620
00621 if (pszType)
00622 {
00623 if (stricmp (pszType, "refresh") == 0)
00624 *mhet = MHET_REFRESH;
00625
00626 delete [] pszType;
00627 }
00628
00629
00630 return pszTag;
00631 }
00632
00633 LPCSTR fsHTMLParser::ParseTag_Meta_Content(LPCSTR pszTag, fsMetaHttpEquivType mhet)
00634 {
00635 pszTag += 7;
00636
00637 switch (mhet)
00638 {
00639
00640
00641 case MHET_REFRESH:
00642
00643 pszTag = fsStrSkipDividers (pszTag);
00644 if (*pszTag != '=')
00645 {
00646
00647 return pszTag;
00648 }
00649 pszTag++;
00650
00651 BOOL bA;
00652 bA = *pszTag == '\'' || *pszTag == '"';
00653 if (bA) pszTag++;
00654
00655 pszTag = fsStrSkipDividers (pszTag);
00656
00657 while (fsStrIsDivider (*pszTag) == FALSE && *pszTag != ';') pszTag++;
00658
00659 if (*pszTag == ';') pszTag++;
00660
00661 pszTag = fsStrSkipDividers (pszTag);
00662
00663 if (strnicmp (pszTag, "url", 3) || (fsStrIsDivider (pszTag [3]) == FALSE && pszTag [3] != '='))
00664 {
00665
00666 return pszTag;
00667 }
00668
00669 pszTag += 3;
00670 pszTag = ParseTag_A_Href (pszTag, bA ? "\"\'" : NULL);
00671
00672
00673
00674 break;
00675
00676 default:
00677
00678 LPSTR pszContent;
00679 pszTag = Parse_HTMLGiving (pszTag, &pszContent);
00680 if (pszContent)
00681 delete [] pszContent;
00682 }
00683
00684 return pszTag;
00685 }
00686
00687 LPCSTR fsHTMLParser::ParseTag_Base(LPCSTR pszTag, fsHTMLParser *pThis)
00688 {
00689 pThis->m_BaseURLPosition.nStart = pszTag-4-1 - pThis->m_pszHTML;
00690
00691 do
00692 {
00693
00694 if (strnicmp (pszTag, "href", 4) == 0)
00695 {
00696
00697 if (fsStrIsDivider (pszTag [4]) || pszTag [4] == '=')
00698 {
00699
00700 pszTag += 4;
00701 pszTag = pThis->ParseTag_Base_Href (pszTag);
00702 if (pszTag == NULL) break;
00703 pszTag = strchr (pszTag, '>');
00704 if (pszTag == NULL) break;
00705 }
00706 }
00707
00708
00709 if (*pszTag == '>')
00710 {
00711 pszTag++;
00712 break;
00713 }
00714
00715 pszTag++;
00716 }
00717 while (*pszTag);
00718
00719 pThis->m_BaseURLPosition.nEnd = pszTag - pThis->m_pszHTML;
00720
00721 return pszTag;
00722 }
00723
00724 LPCSTR fsHTMLParser::ParseTag_Base_Href(LPCSTR pszTag, LPCSTR pszAddUrlEnds)
00725 {
00726 LPSTR pszUrl;
00727
00728
00729
00730 pszTag = Parse_HTMLGiving (pszTag, &pszUrl, pszAddUrlEnds);
00731
00732 if (pszUrl)
00733 {
00734 m_strBaseURL = pszUrl;
00735 delete [] pszUrl;
00736 }
00737
00738 return pszTag;
00739 }
00740
00741 LPCSTR fsHTMLParser::Get_BaseURL()
00742 {
00743 return m_strBaseURL;
00744 }
00745
00746 void fsHTMLParser::RemoveBaseTag()
00747 {
00748 int nHole = ReplaceString ("", m_BaseURLPosition);
00749
00750 m_BaseURLPosition.nEnd -= nHole;
00751
00752 CorrectRegions (m_BaseURLPosition.nStart, nHole);
00753 }
00754
00755 LPCSTR fsHTMLParser::ParseTag_Frame(LPCSTR pszTag, fsHTMLParser *pThis)
00756 {
00757 do
00758 {
00759
00760 if (strnicmp (pszTag, "src", 3) == 0)
00761 {
00762 if (fsStrIsDivider (pszTag [3]) || pszTag [3] == '=')
00763 {
00764
00765 pszTag += 3;
00766 pszTag = pThis->ParseTag_Frame_Src (pszTag);
00767 if (pszTag == NULL) break;
00768 pszTag = strchr (pszTag, '>');
00769 if (pszTag == NULL) break;
00770 }
00771 }
00772
00773
00774 if (*pszTag == '>')
00775 {
00776 pszTag++;
00777 break;
00778 }
00779
00780 pszTag++;
00781 }
00782 while (*pszTag);
00783
00784 return pszTag;
00785 }
00786
00787 LPCSTR fsHTMLParser::ParseTag_Frame_Src(LPCSTR pszTag, LPCSTR )
00788 {
00789 LPSTR pszUrl;
00790 pszTag = Parse_HTMLGiving (pszTag, &pszUrl);
00791
00792 if (pszUrl)
00793 {
00794 fsTextRegion rgn;
00795 rgn.nStart = pszTag - lstrlen (pszUrl) - m_pszHTML;
00796 rgn.nEnd = pszTag - m_pszHTML;
00797 if (pszTag [-1] == '"' || pszTag [-1] == '\'')
00798 {
00799 rgn.nStart --;
00800 rgn.nEnd --;
00801 }
00802 m_vFrameRgns.add (rgn);
00803 m_vFrameUrls.add (pszUrl);
00804 delete [] pszUrl;
00805 }
00806
00807 return pszTag;
00808 }
00809
00810 int fsHTMLParser::GetFrameUrlCount()
00811 {
00812 return m_vFrameUrls.size ();
00813 }
00814
00815 LPCSTR fsHTMLParser::GetFrameUrl(int iIndex)
00816 {
00817 return m_vFrameUrls [iIndex];
00818 }
00819
00820 void fsHTMLParser::ReplaceFrameUrl(int iIndex, LPCSTR pszNewUrl)
00821 {
00822 fsTextRegion &rgn = m_vFrameRgns [iIndex];
00823 int nHole = ReplaceString (pszNewUrl, rgn);
00824
00825 rgn.nEnd -= nHole;
00826
00827 CorrectRegions (rgn.nStart, nHole);
00828 }