00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00026
00027
00028
00029
00030 #include "browserTypes.h"
00031 #include "indexFileHandler.h"
00032 #include "browserLog.h"
00033 #include "mozilla_api.h"
00034 #include <sys/stat.h>
00035 #include <ctype.h>
00036
00037 #include "nsCOMPtr.h"
00038 #include "nsMemory.h"
00039 #include "gtkmozembed_internal.h"
00040 #include "nsIWebBrowser.h"
00041 #include "nsIDOMDocument.h"
00042 #include "nsIWebNavigation.h"
00043 #include "nsIDOMNodeList.h"
00044 #include "nsIDOMNode.h"
00045 #include "nsIDOMHTMLMetaElement.h"
00046 #include "nsIWebBrowserPersist.h"
00047 #include "nsILocalFile.h"
00048 #include "nsIScrollable.h"
00049 #include "nsIViewManager.h"
00050 #include "nsIPresShell.h"
00051 #include "nsIBaseWindow.h"
00052 #include "nsIDeviceContext.h"
00053 #include "nsIDOMHTMLLinkElement.h"
00054 #include "nsIDocShell.h"
00055 #include "nsIDOMHTMLDocument.h"
00056 #include "nsIDOMHTMLCollection.h"
00057 #include "nsIWebBrowserFocus.h"
00058 #include "nsIDOMHTMLAnchorElement.h"
00059 #include "nsIDOMWindow.h"
00060 #include "nsNetUtil.h"
00061 #include "nsITextScroll.h"
00062 #include "nsIScrollableView.h"
00063
00064
00065 static float GetWebPagePixelScale(nsCOMPtr < nsIWebBrowser > web_browser);
00066 static gulong GetWebPageWindowSize(nsCOMPtr < nsIWebBrowser > web_browser);
00067 static gboolean mozilla_link_update(GtkMozEmbed * b, gint type);
00068 static nsIDOMWindow *GetDOMOWindowObject(nsIWebBrowser * wb);
00069 static gboolean mozilla_link_module_goto_rel(GtkMozEmbed * b, char *value);
00070
00071 gboolean mozilla_get_page_type(GtkMozEmbed * b, gchar ** type)
00072 {
00073 nsCOMPtr < nsIWebBrowser > wb;
00074 nsAutoString metaTypeName;
00075 nsAutoString metaTypeContent;
00076 nsAutoString metaTagName;
00077 nsresult result;
00078 PRUint32 numnodes = 0;
00079 char *typeValue = NULL;
00080
00081 metaTagName.AssignWithConversion("meta");
00082 metaTypeName.AssignWithConversion("type");
00083
00084 g_return_val_if_fail(b != NULL, FALSE);
00085 gtk_moz_embed_get_nsIWebBrowser(b, getter_AddRefs(wb));
00086 if (!wb)
00087 return (FALSE);
00088
00089 nsCOMPtr < nsIWebNavigation > nav(do_QueryInterface(wb));
00090 nsCOMPtr < nsIDOMDocument > domDoc;
00091 nav->GetDocument(getter_AddRefs(domDoc));
00092 if (!domDoc)
00093 return (FALSE);
00094
00095 nsCOMPtr < nsIDOMNodeList > nodeList;
00096 result = domDoc->GetElementsByTagName(metaTagName, getter_AddRefs(nodeList));
00097
00098 BR_PAGEBARPRINTF("domDoc->GetElementsByTagName returned %d", result);
00099
00100 nodeList->GetLength(&numnodes);
00101
00102 if (numnodes != 0)
00103 {
00104 BR_PAGEBARPRINTF("page does contain %d meta tags", numnodes);
00105
00106
00107 for (unsigned int i = 0; i < numnodes; i++)
00108 {
00109 nsCOMPtr < nsIDOMNode > node;
00110 nodeList->Item(i, getter_AddRefs(node));
00111
00112 nsCOMPtr < nsIDOMHTMLMetaElement > metaElement = do_QueryInterface(node);
00113
00114 if (metaElement)
00115 {
00116 nsCOMPtr < nsIDOMElement > domElement = do_QueryInterface(node);
00117 if (!domElement)
00118 return (FALSE);
00119
00120 domElement->GetAttribute(metaTypeName, metaTypeContent);
00121
00122 typeValue = ToNewCString(metaTypeContent);
00123 *type = g_strdup(typeValue);
00124 nsMemory::Free(typeValue);
00125
00126 BR_PAGEBARPRINTF("node [%d] is meta data with type [%s]", i, (**type == NULL) ? "none" : *type);
00127
00128 if (**type != NULL)
00129 {
00130
00131 break;
00132 }
00133 }
00134 }
00135
00136 if (**type == NULL)
00137 {
00138 return FALSE;
00139 }
00140 else
00141 {
00142 return TRUE;
00143 }
00144
00145
00146 }
00147 else
00148 {
00149 BR_PAGEBARPRINTF("page does not contain any meta data");
00150 return FALSE;
00151 }
00152 return FALSE;
00153 }
00154
00155
00156 gboolean mozilla_save(GtkMozEmbed * b, gchar * file_name, gint all)
00157 {
00158 #ifdef SELECTION_ENABLED
00159 nsCOMPtr < nsIWebBrowser > wb;
00160 gint i = 0;
00161 gchar *relative_path = NULL;
00162
00163 g_return_val_if_fail(b != NULL, FALSE);
00164
00165
00166 gtk_moz_embed_get_nsIWebBrowser(b, getter_AddRefs(wb));
00167 if (!wb)
00168 return (FALSE);
00169
00170 nsCOMPtr < nsIWebNavigation > nav(do_QueryInterface(wb));
00171
00172 nsCOMPtr < nsIDOMDocument > domDoc;
00173 nav->GetDocument(getter_AddRefs(domDoc));
00174
00175 if (!domDoc)
00176 return (FALSE);
00177 nsCOMPtr < nsIWebBrowserPersist > persist(do_QueryInterface(wb));
00178
00179 if (persist)
00180 {
00181 nsCOMPtr < nsILocalFile > file;
00182 nsCOMPtr < nsILocalFile > relative = nsnull;
00183 if (all)
00184 {
00185
00186 relative_path = g_strdup(file_name);
00187 relative_path = g_strconcat(relative_path, "_files/", NULL);
00188
00189 for (i = strlen(relative_path) - 1; i >= 0; --i)
00190 if (relative_path[i] == '/')
00191 {
00192 relative_path[i] = '\0';
00193 break;
00194 }
00195
00196 mkdir(relative_path, 0755);
00197
00198 nsAutoString s;
00199
00200 s.AssignWithConversion(relative_path);
00201 NS_NewLocalFile(s, PR_TRUE, getter_AddRefs(relative));
00202 }
00203
00204 nsAutoString s;
00205
00206 s.AssignWithConversion(file_name);
00207 NS_NewLocalFile(s, PR_TRUE, getter_AddRefs(file));
00208
00209 if (file)
00210 persist->SaveDocument(domDoc, file, relative, nsnull, 0, 0);
00211
00212 if (all)
00213 g_free(relative_path);
00214
00215 return (TRUE);
00216 }
00217 #endif //SELECTION_ENABLED
00218 return (FALSE);
00219 }
00220
00221
00222
00223 gboolean mozilla_next_link(GtkMozEmbed * embed)
00224 {
00225 return mozilla_link_update(embed, NEXT_LINK);
00226 }
00227
00228 gboolean mozilla_previous_link(GtkMozEmbed * embed)
00229 {
00230 return mozilla_link_update(embed, PREVIOUS_LINK);
00231 }
00232
00233
00234
00235
00236
00237 static gboolean mozilla_link_update(GtkMozEmbed * b, gint type)
00238 {
00239 static PRInt32 currentFocus = (-1);
00240
00241 nsCOMPtr < nsIWebBrowser > wb;
00242 PRUint32 numnodes = 0;
00243
00244 g_return_val_if_fail(b != NULL, FALSE);
00245 gtk_moz_embed_get_nsIWebBrowser(b, getter_AddRefs(wb));
00246 if (!wb)
00247 return (FALSE);
00248
00249
00250 nsCOMPtr < nsIWebNavigation > nav(do_QueryInterface(wb));
00251 nsCOMPtr < nsIDOMDocument > domDoc;
00252 nav->GetDocument(getter_AddRefs(domDoc));
00253 if (!domDoc)
00254 return (FALSE);
00255
00256 nsCOMPtr < nsIDOMHTMLDocument > htmlDoc = do_QueryInterface(domDoc);
00257 if (!htmlDoc)
00258 return (FALSE);
00259
00260 nsCOMPtr < nsIDOMHTMLCollection > links;
00261 htmlDoc->GetLinks(getter_AddRefs(links));
00262 nsCOMPtr < nsIDOMNode > link;
00263 links->GetLength(&numnodes);
00264
00265 if (numnodes != 0)
00266 {
00267
00268 nsCOMPtr < nsIWebBrowserFocus > focus = do_QueryInterface(wb);
00269 if (!focus)
00270 return (FALSE);
00271 nsCOMPtr < nsIDOMElement > focusElement;
00272 focus->GetFocusedElement(getter_AddRefs(focusElement));
00273
00274 if (focusElement)
00275 {
00276 BR_MOZILLA_DOCPRINTF("there is a focused element %d mode to %d\n", currentFocus, (currentFocus + numnodes - 1) % numnodes);
00277
00278 if (type == PREVIOUS_LINK)
00279 {
00280 currentFocus = (currentFocus + numnodes - 1) % numnodes;
00281 }
00282 else
00283 {
00284 currentFocus = (currentFocus + 1) % numnodes;
00285 }
00286
00287 links->Item(currentFocus, getter_AddRefs(link));
00288 nsCOMPtr < nsIDOMHTMLAnchorElement > anchor = do_QueryInterface(link);
00289 if (!anchor)
00290 return (FALSE);
00291 if (anchor)
00292 {
00293 BR_MOZILLA_DOCPRINTF("node is anchor");
00294 anchor->Focus();
00295 }
00296 }
00297 else
00298 {
00299
00300 links->Item(0, getter_AddRefs(link));
00301
00302 nsCOMPtr < nsIDOMHTMLAnchorElement > anchor = do_QueryInterface(link);
00303 if (!anchor)
00304 return (FALSE);
00305 if (anchor)
00306 {
00307 BR_MOZILLA_DOCPRINTF("node is anchor");
00308 anchor->Focus();
00309 currentFocus = 0;
00310 }
00311
00312 }
00313 }
00314 else
00315 {
00316 BR_MOZILLA_DOCPRINTF("page does not contain any links");
00317 return FALSE;
00318 }
00319 return TRUE;
00320 }
00321
00322 gboolean mozilla_next_page(GtkMozEmbed * b)
00323 {
00324 return mozilla_link_module_goto_rel(b, "NEXT");
00325 }
00326
00327 gboolean mozilla_previous_page(GtkMozEmbed * b)
00328 {
00329 return mozilla_link_module_goto_rel(b, "PREV");
00330 }
00331
00332 gboolean mozilla_overview_page(GtkMozEmbed * b)
00333 {
00334 return mozilla_link_module_goto_rel(b, "INDEX");
00335 }
00336
00337 gboolean mozilla_alt_page(GtkMozEmbed * b)
00338 {
00339 return mozilla_link_module_goto_rel(b, "ALT");
00340 }
00341
00342
00343
00344
00345
00346
00347
00348 static gboolean mozilla_link_module_goto_rel(GtkMozEmbed * b, char *value)
00349 {
00350 nsCOMPtr < nsIWebBrowser > wb;
00351 PRUint32 numnodes = 0;
00352 nsresult result;
00353 nsAutoString aHref;
00354 nsAutoString linkTagName;
00355 nsAutoString linkRelNameContent;
00356 char *urlValue = NULL;
00357
00358 linkTagName.AssignWithConversion("link");
00359
00360
00361 g_return_val_if_fail(b != NULL, FALSE);
00362
00363 gtk_moz_embed_get_nsIWebBrowser(b, getter_AddRefs(wb));
00364 if (!wb)
00365 return (FALSE);
00366
00367 BR_MOZILLA_DOCPRINTF("entry %s", value);
00368
00369
00370 nsCOMPtr < nsIWebNavigation > nav(do_QueryInterface(wb));
00371 nsCOMPtr < nsIDOMDocument > domDoc;
00372 nav->GetDocument(getter_AddRefs(domDoc));
00373 if (!domDoc)
00374 return (FALSE);
00375
00376 nsCOMPtr < nsIDOMNodeList > nodeList;
00377 result = domDoc->GetElementsByTagName(linkTagName, getter_AddRefs(nodeList));
00378
00379
00380 BR_MOZILLA_DOCPRINTF("domDoc->GetElementsByTagName returned %d", result);
00381
00382 nodeList->GetLength(&numnodes);
00383
00384 if (numnodes != 0)
00385 {
00386 BR_MOZILLA_DOCPRINTF("page does contain %d links\n", numnodes);
00387
00388
00389 for (unsigned int i = 0; i < numnodes; i++)
00390 {
00391 nsCOMPtr < nsIDOMNode > node;
00392 nodeList->Item(i, getter_AddRefs(node));
00393
00394 nsCOMPtr < nsIDOMHTMLLinkElement > linkElement = do_QueryInterface(node);
00395 if (!linkElement)
00396 return (FALSE);
00397
00398 linkElement->GetRel(linkRelNameContent);
00399
00400 if (linkRelNameContent.EqualsIgnoreCase(value))
00401 {
00402 linkElement->GetHref(aHref);
00403
00404 urlValue = ToNewCString(aHref);
00405
00406 BR_MOZILLA_DOCPRINTF("node is linkelement with url %s", urlValue);
00407 gtk_moz_embed_load_url(GTK_MOZ_EMBED(b), urlValue);
00408
00409 nsMemory::Free(urlValue);
00410 return TRUE;
00411 }
00412 else
00413 {
00414 BR_MOZILLA_DOCPRINTF("node is linkelement with rel != %s", value);
00415 }
00416 }
00417 }
00418 else
00419 {
00420 BR_MOZILLA_DOCPRINTF("page does not contain any links");
00421 }
00422 return FALSE;
00423 }
00424
00425 gboolean mozilla_handle_link(GtkMozEmbed * b)
00426 {
00427 nsCOMPtr < nsIWebBrowser > wb;
00428 char *urlValue;
00429 nsAutoString aHref;
00430
00431 g_return_val_if_fail(b != NULL, FALSE);
00432 gtk_moz_embed_get_nsIWebBrowser(b, getter_AddRefs(wb));
00433 if (!wb)
00434 return (FALSE);
00435
00436
00437 nsCOMPtr < nsIWebBrowserFocus > focus = do_QueryInterface(wb);
00438 nsCOMPtr < nsIDOMElement > focusElement;
00439 focus->GetFocusedElement(getter_AddRefs(focusElement));
00440
00441 if (focusElement)
00442 {
00443 BR_MOZILLA_DOCPRINTF("There is a focused element");
00444
00445 nsCOMPtr < nsIDOMHTMLAnchorElement > anchor = do_QueryInterface(focusElement);
00446 if (anchor)
00447 {
00448 anchor->GetHref(aHref);
00449
00450
00451 urlValue = ToNewCString(aHref);
00452
00453 BR_MOZILLA_DOCPRINTF("node is anchor with url %s", urlValue);
00454 gtk_moz_embed_load_url(GTK_MOZ_EMBED(b), urlValue);
00455
00456 nsMemory::Free(urlValue);
00457 return TRUE;
00458 }
00459 else
00460 {
00461 BR_MOZILLA_DOCPRINTF("node is NO anchor !!!!!");
00462 }
00463 }
00464 else
00465 {
00466 BR_MOZILLA_DOCPRINTF("page does not contain a focussed element");
00467 }
00468 return FALSE;
00469 }
00470
00471
00472 gboolean mozilla_back(GtkMozEmbed * b)
00473 {
00474 g_return_val_if_fail(b != NULL, FALSE);
00475
00476 if (gtk_moz_embed_can_go_back(GTK_MOZ_EMBED(b)))
00477 {
00478 gtk_moz_embed_go_back(GTK_MOZ_EMBED(b));
00479 return TRUE;
00480 }
00481 else
00482 {
00483 return FALSE;
00484 }
00485 }
00486
00487 gboolean mozilla_zoom(GtkMozEmbed * b, float size)
00488 {
00489 nsCOMPtr < nsIWebBrowser > wb;
00490 nsCOMPtr < nsIDOMWindow > activeWindow;
00491
00492 g_return_val_if_fail(b != NULL, FALSE);
00493 gtk_moz_embed_get_nsIWebBrowser(b, getter_AddRefs(wb));
00494 if (!wb)
00495 return (FALSE);
00496
00497 BR_LOGPRINTF("mozilla_zoom -- GetDOMOWindowObject");
00498
00499 activeWindow = GetDOMOWindowObject(wb);
00500
00501 if ((activeWindow) && (size > 0))
00502 {
00503 activeWindow->SetTextZoom(size);
00504 return TRUE;
00505 }
00506 return FALSE;
00507 }
00508
00509
00510
00511
00512
00513
00514 static nsIDOMWindow *GetDOMOWindowObject(nsIWebBrowser * wb)
00515 {
00516 nsCOMPtr < nsIDOMWindow > oDomWindow;
00517 nsresult rv;
00518
00519 rv = wb->GetContentDOMWindow(getter_AddRefs(oDomWindow));
00520
00521 BR_LOGPRINTF("GetContentDOMWindow rv %d", rv);
00522
00523 if (!oDomWindow)
00524 {
00525 BR_WARNPRINTF("Cannot create Dom Window Object");
00526 }
00527 return oDomWindow;
00528 }
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570 gboolean mozilla_scrollable(direction_t direction, GtkMozEmbed * b)
00571 {
00572 PRBool scrollable = PR_FALSE;
00573
00574 nsCOMPtr < nsIWebBrowser > wb;
00575 nsCOMPtr < nsIDocShell > doc_shell;
00576 nsCOMPtr < nsIPresShell > presShell;
00577
00578
00579
00580 gtk_moz_embed_get_nsIWebBrowser(b, getter_AddRefs(wb));
00581
00582 if (wb)
00583 {
00584 doc_shell = do_GetInterface(wb);
00585
00586 if (doc_shell)
00587 {
00588 doc_shell->GetPresShell(getter_AddRefs(presShell));
00589
00590 if (presShell)
00591 {
00592 nsIViewManager *vm = presShell->GetViewManager();
00593
00594 if (vm)
00595 {
00596 nsIScrollableView *scrollableView = nsnull;
00597
00598 vm->GetRootScrollableView(&scrollableView);
00599
00600 if (scrollableView)
00601 {
00602 switch (direction)
00603 {
00604 case pageDown_t:
00605 scrollableView->CanScroll(PR_FALSE, PR_TRUE, scrollable);
00606 break;
00607 case pageUp_t:
00608 scrollableView->CanScroll(PR_FALSE, PR_FALSE, scrollable);
00609 break;
00610 }
00611
00612 }
00613 }
00614
00615 }
00616 }
00617 }
00618
00619 BR_PAGEBARPRINTF("return %s", (scrollable == PR_TRUE) ? "TRUE" : "FALSE");
00620
00621 return scrollable;
00622 }
00623
00624 gboolean mozilla_scroll(int count, GtkMozEmbed * b)
00625 {
00626 gboolean returnValue = FALSE;
00627
00628 nsCOMPtr < nsIWebBrowser > wb;
00629 nsCOMPtr < nsITextScroll > textscrollInterface;
00630
00631 g_return_val_if_fail(b != NULL, FALSE);
00632
00633 BR_PAGEBARPRINTF("count %d", count);
00634
00635 gtk_moz_embed_get_nsIWebBrowser(b, getter_AddRefs(wb));
00636 if (wb)
00637 {
00638 textscrollInterface = do_QueryInterface(wb);
00639
00640 if (textscrollInterface)
00641 {
00642
00643 textscrollInterface->ScrollByPages(count);
00644 returnValue = TRUE;
00645 }
00646 }
00647 return returnValue;
00648 }
00649
00650 gint mozilla_determine_page_offset(GtkMozEmbed * b)
00651 {
00652 nsCOMPtr < nsIWebBrowser > wb;
00653 nsCOMPtr < nsIScrollable > scrollable;
00654 gint offset = DEFAULT_PAGE_OFFSET;
00655
00656 BR_PAGEBARPRINTF("mozilla_determine_page_offset -- entry\n");
00657
00658 g_return_val_if_fail(b != NULL, DEFAULT_PAGE_OFFSET);
00659
00660 BR_PAGEBARPRINTF("mozilla_determine_page_offset -- b != NULL\n");
00661
00662 gtk_moz_embed_get_nsIWebBrowser(b, getter_AddRefs(wb));
00663 if (!wb)
00664 {
00665 BR_WARNPRINTF("mozilla_determine_page_offset -- wb == null\n");
00666 return (DEFAULT_PAGE_OFFSET);
00667 }
00668
00669
00670 scrollable = do_QueryInterface(wb);
00671
00672 if (scrollable)
00673 {
00674 gint minPos;
00675 gint maxPos;
00676 gint curPos;
00677 int pixelscale, htmlSize, htmlPos;
00678 gulong theWindowSize;
00679
00680 scrollable->GetScrollRange(scrollable->ScrollOrientation_Y, &minPos, &maxPos);
00681 BR_PAGEBARPRINTF("scrollable->getScrollRange returned [%d,%d]\n", minPos, maxPos);
00682 scrollable->GetCurScrollPos(scrollable->ScrollOrientation_Y, &curPos);
00683 BR_PAGEBARPRINTF("scrollable->getCurScrollPos returned %d\n", curPos);
00684
00685
00686 theWindowSize = GetWebPageWindowSize(wb);
00687 BR_PAGEBARPRINTF("theWindowSize=%d\n", theWindowSize);
00688
00689
00690
00691 pixelscale = (int) (100 / GetWebPagePixelScale(wb));
00692 BR_PAGEBARPRINTF("100/pixelscale=%d\n", pixelscale);
00693
00694
00695
00696 htmlSize = (maxPos - minPos);
00697 htmlPos = curPos * 100 + theWindowSize * pixelscale;
00698
00699
00700 offset = (gint) (htmlPos / htmlSize) + 1;
00701 if (offset > 100)
00702 {
00703 offset = 100;
00704 }
00705 BR_PAGEBARPRINTF("CALCULATED OFFSET = %d\n", offset);
00706
00707 }
00708
00709 return offset;
00710 }
00711
00712
00713
00714
00715
00716
00717
00718 static float GetWebPagePixelScale(nsCOMPtr < nsIWebBrowser > web_browser)
00719 {
00720 nsCOMPtr < nsIDocShell > doc_shell;
00721 nsCOMPtr < nsIPresShell > presShell;
00722 nsCOMPtr < nsIViewManager > vm;
00723
00724 nsIDeviceContext *dx = NULL;
00725 float pixelscale = 0;
00726
00727 doc_shell = do_GetInterface(web_browser);
00728
00729 if (doc_shell)
00730 {
00731 doc_shell->GetPresShell(getter_AddRefs(presShell));
00732
00733 if (presShell)
00734 {
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744 vm = presShell->GetViewManager();
00745
00746
00747 vm->GetDeviceContext(dx);
00748 pixelscale = dx->TwipsToDevUnits();
00749
00750
00751 }
00752 }
00753 return pixelscale;
00754
00755 }
00756
00757
00758
00759
00760
00761
00762 static gulong GetWebPageWindowSize(nsCOMPtr < nsIWebBrowser > web_browser)
00763 {
00764 nsCOMPtr < nsIBaseWindow > baseWindow;
00765 gulong theWindowSize = 0;
00766
00767
00768 baseWindow = do_QueryInterface(web_browser);
00769
00770 if (baseWindow)
00771 {
00772 int x, y, cx, cy;
00773
00774 baseWindow->GetPositionAndSize(&x, &y, &cx, &cy);
00775
00776
00777 theWindowSize = cy - y;
00778
00779 }
00780 return theWindowSize;
00781 }
00782
00783
00784
00785
00786
00787
00788
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902 static int htoi(char *s)
00903 {
00904 int value;
00905 int c;
00906
00907 c = ((unsigned char *)s)[0];
00908 if (isupper(c))
00909 c = tolower(c);
00910 value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16;
00911
00912 c = ((unsigned char *)s)[1];
00913 if (isupper(c))
00914 c = tolower(c);
00915 value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10;
00916
00917 return (value);
00918 }
00919
00920 int raw_url_decode(char *str, int len)
00921 {
00922 char *dest = str;
00923 char *data = str;
00924
00925 while (len--) {
00926 if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1))
00927 && isxdigit((int) *(data + 2))) {
00928 *dest = (char) htoi(data + 1);
00929 data += 2;
00930 len -= 2;
00931 } else {
00932 *dest = *data;
00933 }
00934 data++;
00935 dest++;
00936 }
00937 *dest = '\0';
00938 return dest - str;
00939 }
00940
00941
00942
00943 char * mozilla_uri_to_path(const char * aUri)
00944 {
00945
00946
00947 char * protocol = "file://";
00948 if (NULL == aUri) return NULL;
00949 unsigned int min = strlen(protocol);
00950
00951 if (strlen(aUri) <= min) return NULL;
00952 if (aUri != strstr(aUri, protocol))
00953 {
00954 return NULL;
00955 }
00956
00957 char * path = strdup((char *) &aUri[min]);
00958
00959
00960 raw_url_decode(path, strlen(path));
00961 return path;
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973 }
00974