first draft of SDI browser application derived from ROS Explorer
Added: trunk/reactos/subsys/system/ibrowser/
Added: trunk/reactos/subsys/system/ibrowser/Makefile
Added: trunk/reactos/subsys/system/ibrowser/Makefile.MinGW
Added: trunk/reactos/subsys/system/ibrowser/Makefile.PCH
Added: trunk/reactos/subsys/system/ibrowser/expat.license
Added: trunk/reactos/subsys/system/ibrowser/favorites.cpp
Added: trunk/reactos/subsys/system/ibrowser/favorites.h
Added: trunk/reactos/subsys/system/ibrowser/ibrowser.cpp
Added: trunk/reactos/subsys/system/ibrowser/ibrowser.dsp
Added: trunk/reactos/subsys/system/ibrowser/ibrowser.dsw
Added: trunk/reactos/subsys/system/ibrowser/ibrowser.h
Added: trunk/reactos/subsys/system/ibrowser/ibrowser.rc
Added: trunk/reactos/subsys/system/ibrowser/ibrowser_intres.h
Added: trunk/reactos/subsys/system/ibrowser/ibrowser_intres.rc
Added: trunk/reactos/subsys/system/ibrowser/mainframe.cpp
Added: trunk/reactos/subsys/system/ibrowser/mainframe.h
Added: trunk/reactos/subsys/system/ibrowser/make_ibrowser.dsp
Added: trunk/reactos/subsys/system/ibrowser/precomp.cpp
Added: trunk/reactos/subsys/system/ibrowser/precomp.h
Added: trunk/reactos/subsys/system/ibrowser/readme.txt
Added: trunk/reactos/subsys/system/ibrowser/res/
Added: trunk/reactos/subsys/system/ibrowser/res/dot.ico
Added: trunk/reactos/subsys/system/ibrowser/res/dot_red.ico
Added: trunk/reactos/subsys/system/ibrowser/res/dot_trans.ico
Added: trunk/reactos/subsys/system/ibrowser/res/favorites.ico
Added: trunk/reactos/subsys/system/ibrowser/res/ibrowser.ico
Added: trunk/reactos/subsys/system/ibrowser/res/network.ico
Added: trunk/reactos/subsys/system/ibrowser/res/reactos.ico
Added: trunk/reactos/subsys/system/ibrowser/res/toolbar.bmp
Added: trunk/reactos/subsys/system/ibrowser/utility/
Added: trunk/reactos/subsys/system/ibrowser/utility/comutil.h
Deleted: trunk/reactos/subsys/system/ibrowser/utility/dragdropimpl.cpp
Deleted: trunk/reactos/subsys/system/ibrowser/utility/dragdropimpl.h
Deleted: trunk/reactos/subsys/system/ibrowser/utility/shellbrowserimpl.cpp
Deleted: trunk/reactos/subsys/system/ibrowser/utility/shellbrowserimpl.h
Deleted: trunk/reactos/subsys/system/ibrowser/utility/shellclasses.cpp
Deleted: trunk/reactos/subsys/system/ibrowser/utility/shellclasses.dsp
Deleted: trunk/reactos/subsys/system/ibrowser/utility/shellclasses.dsw
Deleted: trunk/reactos/subsys/system/ibrowser/utility/shellclasses.h
Deleted: trunk/reactos/subsys/system/ibrowser/utility/shelltests.cpp
Deleted: trunk/reactos/subsys/system/ibrowser/utility/splitpath.c
Deleted: trunk/reactos/subsys/system/ibrowser/utility/treedroptarget.h
Modified: trunk/reactos/subsys/system/ibrowser/utility/utility.cpp
Modified: trunk/reactos/subsys/system/ibrowser/utility/utility.h
Modified: trunk/reactos/subsys/system/ibrowser/utility/window.cpp
Modified: trunk/reactos/subsys/system/ibrowser/utility/window.h
Added: trunk/reactos/subsys/system/ibrowser/webchild.cpp
Added: trunk/reactos/subsys/system/ibrowser/webchild.h
Property changes on: trunk/reactos/subsys/system/ibrowser
___________________________________________________________________
Name: svn:ignore
   + *.coff
*.exe
*.d
*.o
*.a
*.sym
*.map
bin
Debug
Release
DRelease
UDebug
URelease
_NO_COMUTIL
doxy-doc
Win32
WineDll
WineRelease
*.ncb
*.opt
*.aps
*.ncb
*.plg
*.suo
buildno.h
notifyhook.dll
*.gch
*.h.pch
pack.*
.gdbinit
start-gdb.bat
libexpat.dll

Added: trunk/reactos/subsys/system/ibrowser/Makefile
--- trunk/reactos/subsys/system/ibrowser/Makefile	2005-01-26 00:03:05 UTC (rev 13301)
+++ trunk/reactos/subsys/system/ibrowser/Makefile	2005-01-26 00:12:33 UTC (rev 13302)
@@ -0,0 +1,47 @@
+#
+#  ROS Internet Web Browser
+#
+#  Makefile
+#
+
+PATH_TO_TOP := ../../..
+
+TARGET_TYPE := program
+
+TARGET_APPTYPE := windows
+
+TARGET_NAME := ibrowser
+
+TARGET_INSTALLDIR := .
+
+TARGET_CFLAGS := \
+	-D__USE_W32API -DWIN32 -D_ROS_ \
+	-D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 \
+	-DUNICODE -fexceptions -Wall
+
+TARGET_CPPFLAGS := $(TARGET_CFLAGS)
+
+TARGET_RCFLAGS := -D__USE_W32API -DWIN32 -D_ROS_ -D__WINDRES__
+
+TARGET_SDKLIBS := gdi32.a comctl32.a ole32.a oleaut32.a shell32.a expat.a
+
+TARGET_GCCLIBS := stdc++ uuid
+
+TARGET_OBJECTS := \
+	ibrowser.o \
+	mainframe.o \
+	webchild.o \
+	favorites.o \
+	utility/utility.o \
+	utility/window.o \
+	utility/xmlstorage.o
+
+TARGET_CPPAPP := yes
+
+TARGET_PCH := precomp.h
+
+DEP_OBJECTS := $(TARGET_OBJECTS)
+
+include $(PATH_TO_TOP)/rules.mak
+include $(TOOLS_PATH)/helper.mk
+include $(TOOLS_PATH)/depend.mk
Property changes on: trunk/reactos/subsys/system/ibrowser/Makefile
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Added: trunk/reactos/subsys/system/ibrowser/Makefile.MinGW
--- trunk/reactos/subsys/system/ibrowser/Makefile.MinGW	2005-01-26 00:03:05 UTC (rev 13301)
+++ trunk/reactos/subsys/system/ibrowser/Makefile.MinGW	2005-01-26 00:12:33 UTC (rev 13302)
@@ -0,0 +1,67 @@
+#
+#  ROS Internet Web Browser
+#
+#  Makefile.MinGW
+#
+
+CC = gcc
+CXX = g++
+LINK = g++
+
+CFLAGS	= -DWIN32 -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -fexceptions -Wall -I.
+RCFLAGS	= -DWIN32 -D__WINDRES__
+LFLAGS	= -Wl,--subsystem,windows
+
+ifdef DEBUG
+CFLAGS	+= -D_DEBUG -g
+RCFLAGS	+= -D_DEBUG
+LFLAGS	+= -g
+else
+CFLAGS	+= -DNDEBUG -Os
+RCFLAGS	+= -DNDEBUG
+LFLAGS	+= -s
+endif
+
+ifndef UNICODE
+UNICODE = 1
+endif
+
+ifeq ($(UNICODE),1)
+CFLAGS	+= -DUNICODE
+# LFLAGS+= -Wl,--entry,_wWinMain@16
+RCFLAGS += -DUNICODE
+endif
+
+CXXFLAGS = $(CFLAGS)
+
+EXEC_SUFFIX = .exe
+RES_SUFFIX = .coff
+
+VPATH = utility
+
+PROGRAM = ibrowser
+
+TARGET = $(PROGRAM)$(EXEC_SUFFIX)
+
+OBJECTS = \
+	utility.o \
+	window.o \
+	ibrowser.o \
+	webchild.o \
+	mainframe.o \
+	favorites.o \
+	xmlstorage.o
+
+LIBS = gdi32 comctl32 shell32 ole32 uuid oleaut32
+
+all: $(TARGET)
+
+$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) libexpat.dll
+	$(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS))
+
+ibrowser$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico
+	windres $(RCFLAGS) -o $@ $(PROGRAM)_intres.rc
+
+clean:
+	rm -f $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) \
+	desktop/*.o dialogs/*.o shell/*.o taskbar/*.o utility/*.o

Added: trunk/reactos/subsys/system/ibrowser/Makefile.PCH
--- trunk/reactos/subsys/system/ibrowser/Makefile.PCH	2005-01-26 00:03:05 UTC (rev 13301)
+++ trunk/reactos/subsys/system/ibrowser/Makefile.PCH	2005-01-26 00:12:33 UTC (rev 13302)
@@ -0,0 +1,72 @@
+#
+#  ROS Internet Web Browser
+#
+#  Makefile.PCH
+#
+#  MinGW Makefile with precompiled header support
+#
+
+CC = gcc
+CXX = g++
+LINK = g++
+
+CFLAGS	= -DWIN32 -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -fexceptions -Wall -I.
+RCFLAGS	= -DWIN32 -D__WINDRES__
+LFLAGS	= -Wl,--subsystem,windows
+
+ifdef DEBUG
+CFLAGS	+= -D_DEBUG -g
+RCFLAGS	+= -D_DEBUG
+LFLAGS	+= -g
+else
+CFLAGS	+= -DNDEBUG -Os -march=pentium4
+RCFLAGS	+= -DNDEBUG
+LFLAGS	+= -s
+endif
+
+ifndef UNICODE
+UNICODE = 1
+endif
+
+ifeq ($(UNICODE),1)
+CFLAGS	+= -DUNICODE
+# LFLAGS+= -Wl,--entry,_wWinMain@16
+RCFLAGS += -DUNICODE
+endif
+
+CXXFLAGS = $(CFLAGS)
+
+EXEC_SUFFIX = .exe
+RES_SUFFIX = .coff
+
+VPATH = utility
+
+PROGRAM = ibrowser
+
+TARGET = $(PROGRAM)$(EXEC_SUFFIX)
+
+OBJECTS = \
+	utility.o \
+	window.o \
+	ibrowser.o \
+	webchild.o \
+	mainframe.o \
+	favorites.o \
+	xmlstorage.o
+
+LIBS = gdi32 comctl32 shell32 ole32 oleaut32 uuid
+
+all: precomp.h.gch $(TARGET)
+
+precomp.h.gch: *.h utility/*.h
+	$(CXX) $(CFLAGS) precomp.h
+
+$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) libexpat.dll
+	$(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS))
+
+ibrowser$(RES_SUFFIX): $(PROGRAM)_intres.rc res/*.bmp res/*.ico
+	windres $(RCFLAGS) -o $@ $(PROGRAM)_intres.rc
+
+clean:
+	rm -f $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) precomp.h.gch \
+	utility/*.o

Copied: trunk/reactos/subsys/system/ibrowser/expat.license (from rev 13252, trunk/reactos/subsys/system/explorer/expat.license)

Copied: trunk/reactos/subsys/system/ibrowser/favorites.cpp (from rev 13256, trunk/reactos/subsys/system/explorer/taskbar/favorites.cpp)
--- trunk/reactos/subsys/system/explorer/taskbar/favorites.cpp	2005-01-24 22:02:09 UTC (rev 13256)
+++ trunk/reactos/subsys/system/ibrowser/favorites.cpp	2005-01-26 00:12:33 UTC (rev 13302)
@@ -0,0 +1,494 @@
+/*
+ * Copyright 2004 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+ //
+ // Explorer and Desktop clone
+ //
+ // favorites.cpp
+ //
+ // Martin Fuchs, 04.04.2004
+ //
+
+
+#include "precomp.h"
+
+
+String DecodeURLString(const char* s)
+{
+	TCHAR buffer[BUFFER_LEN];
+	LPTSTR o = buffer;
+
+	for(const char* p=s; *p; ++p)
+		if (*p == '%') {
+			if (!strncmp(p+1, "20", 2)) {
+				*o++ = ' ';
+				p += 2;
+			} else
+				*o++ = *p;
+		} else
+			*o++ = *p;
+
+	return String(buffer, o-buffer);
+}
+
+
+ /// read .URL file
+bool Bookmark::read_url(LPCTSTR path)
+{
+	char line[BUFFER_LEN];
+
+	tifstream in(path);
+
+	while(in.good()) {
+		in.getline(line, BUFFER_LEN);
+
+		const char* p = line;
+		while(isspace(*p))
+			++p;
+
+		const char* keyword = p;
+		const char* eq = strchr(p, '=');
+
+		if (eq) {
+			const char* cont = eq + 1;
+			while(isspace(*cont))
+				++cont;
+
+			if (!strnicmp(keyword, "URL", 3))
+				_url = DecodeURLString(cont);
+			else if (!strnicmp(keyword, "IconFile", 8))
+				_icon_path = DecodeURLString(cont);
+		}
+	}
+
+	return true;
+}
+
+ /// convert XBEL bookmark node
+bool Bookmark::read(const_XMLPos& pos)
+{
+	_url = pos.get("href").c_str();
+
+	if (pos.go_down("title")) {
+		_name = pos->get_content();
+		pos.back();
+	}
+
+	if (pos.go_down("desc")) {
+		_description = pos->get_content();
+		pos.back();
+	}
+
+	if (pos.go_down("info")) {
+		const_XMLChildrenFilter metadata(pos, "metadata");
+
+		for(const_XMLChildrenFilter::const_iterator it=metadata.begin(); it!=metadata.end(); ++it) {
+			const XMLNode& node = **it;
+			const_XMLPos sub_pos(&node);
+
+			if (node.get("owner") == "ros-explorer") {
+				if (sub_pos.go_down("icon")) {
+					_icon_path = sub_pos.get("path").c_str();
+					_icon_idx = XS_toi(sub_pos.get("index"));
+
+					sub_pos.back();	// </icon>
+				}
+			}
+		}
+
+		pos.back();	// </metadata>
+		pos.back();	// </info>
+	}
+
+	return !_url.empty();	// _url is mandatory.
+}
+
+ /// write XBEL bookmark node
+void Bookmark::write(XMLPos& pos) const
+{
+	pos.create("bookmark");
+
+	pos["href"] = _url.c_str();
+
+	if (!_name.empty()) {
+		pos.create("title");
+		pos->set_content(_name);
+		pos.back();
+	}
+
+	if (!_description.empty()) {
+		pos.create("desc");
+		pos->set_content(_description);
+		pos.back();
+	}
+
+	if (!_icon_path.empty()) {
+		pos.create("info");
+		pos.create("metadata");
+		pos["owner"] = "ros-explorer";
+		pos.create("icon");
+		pos["path"] = _icon_path.c_str();
+		pos["index"].printf(XS_TEXT("%d"), _icon_idx);
+		pos.back();	// </icon>
+		pos.back();	// </metadata>
+		pos.back();	// </info>
+	}
+
+	pos.back();
+}
+
+
+ /// read bookmark folder from XBEL formated XML tree
+void BookmarkFolder::read(const_XMLPos& pos)
+{
+	if (pos.go_down("title")) {
+		_name = pos->get_content();
+		pos.back();
+	}
+
+	if (pos.go_down("desc")) {
+		_description = pos->get_content();
+		pos.back();
+	}
+
+	_bookmarks.read(pos);
+}
+
+ /// write bookmark folder content from XBEL formated XML tree
+void BookmarkFolder::write(XMLPos& pos) const
+{
+	pos.create("folder");
+
+	if (!_name.empty()) {
+		pos.create("title");
+		pos->set_content(_name);
+		pos.back();
+	}
+
+	if (!_description.empty()) {
+		pos.create("desc");
+		pos->set_content(_description);
+		pos.back();
+	}
+
+	_bookmarks.write(pos);
+}
+
+
+BookmarkNode::BookmarkNode()
+ :	_type(BMNT_NONE)
+{
+	_pbookmark = NULL;
+}
+
+BookmarkNode::BookmarkNode(const Bookmark& bm)
+ :	_type(BMNT_BOOKMARK)
+{
+	_pbookmark = new Bookmark(bm);
+}
+
+BookmarkNode::BookmarkNode(const BookmarkFolder& bmf)
+ :	_type(BMNT_FOLDER)
+{
+	_pfolder = new BookmarkFolder(bmf);
+}
+
+BookmarkNode::BookmarkNode(const BookmarkNode& other)
+ :	_type(other._type)
+{
+	if (other._type == BMNT_BOOKMARK)
+		_pbookmark = new Bookmark(*other._pbookmark);
+	else if (other._type == BMNT_FOLDER)
+		_pfolder = new BookmarkFolder(*other._pfolder);
+	else
+		_pbookmark = NULL;
+}
+
+BookmarkNode::~BookmarkNode()
+{
+	if (_type == BMNT_BOOKMARK)
+		delete _pbookmark;
+	else if (_type == BMNT_FOLDER)
+		delete _pfolder;
+}
+
+BookmarkNode& BookmarkNode::operator=(const Bookmark& bm)
+{
+	clear();
+
+	_pbookmark = new Bookmark(bm);
+
+	return *this;
+}
+
+BookmarkNode& BookmarkNode::operator=(const BookmarkFolder& bmf)
+{
+	clear();
+
+	_pfolder = new BookmarkFolder(bmf);
+
+	return *this;
+}
+
+BookmarkNode& BookmarkNode::operator=(const BookmarkNode& other)
+{
+	clear();
+
+	_type = other._type;
+
+	if (other._type == BMNT_BOOKMARK)
+		_pbookmark = new Bookmark(*other._pbookmark);
+	else if (other._type == BMNT_FOLDER)
+		_pfolder = new BookmarkFolder(*other._pfolder);
+
+	return *this;
+}
+
+void BookmarkNode::clear()
+{
+	if (_type == BMNT_BOOKMARK) {
+		delete _pbookmark;
+		_pbookmark = NULL;
+	}
+	else if (_type == BMNT_FOLDER) {
+		delete _pfolder;
+		_pfolder = NULL;
+	}
+
+	_type = BMNT_NONE;
+}
+
+
+ /// read bookmark list from XBEL formated XML tree
+void BookmarkList::read(const_XMLPos& pos)
+{
+	const XMLNode::Children& children = pos->get_children();
+
+	for(XMLNode::Children::const_iterator it=children.begin(); it!=children.end(); ++it) {
+		const XMLNode& node = **it;
+		const_XMLPos sub_pos(&node);
+
+		if (node == "folder") {
+			BookmarkFolder folder;
+
+			folder.read(sub_pos);
+
+			push_back(folder);
+		} else if (node == "bookmark") {
+			Bookmark bookmark;
+
+			if (bookmark.read(sub_pos))
+				push_back(bookmark);
+		}
+	}
+}
+
+ /// write bookmark list into XBEL formated XML tree
+void BookmarkList::write(XMLPos& pos) const
+{
+	for(const_iterator it=begin(); it!=end(); ++it) {
+		const BookmarkNode& node = *it;
+
+		if (node._type == BookmarkNode::BMNT_FOLDER) {
+			const BookmarkFolder& folder = *node._pfolder;
+
+			folder.write(pos);
+
+			pos.back();
+		} else if (node._type == BookmarkNode::BMNT_BOOKMARK) {
+			const Bookmark& bookmark = *node._pbookmark;
+
+			if (!bookmark._url.empty())
+				bookmark.write(pos);
+		}
+	}
+}
+
+
+ /// fill treeview control with bookmark tree content
+void BookmarkList::fill_tree(HWND hwnd, HTREEITEM parent, HIMAGELIST himagelist, HDC hdc_wnd) const
+{
+	TV_INSERTSTRUCT tvi;
+
+	tvi.hParent = parent;
+	tvi.hInsertAfter = TVI_LAST;
+
+	TV_ITEM& tv = tvi.item;
+	tv.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM;
+
+	for(const_iterator it=begin(); it!=end(); ++it) {
+		const BookmarkNode& node = *it;
+
+		tv.lParam = (LPARAM)&node;
+
+		if (node._type == BookmarkNode::BMNT_FOLDER) {
+			const BookmarkFolder& folder = *node._pfolder;
+
+			tv.pszText = (LPTSTR)folder._name.c_str();
+			tv.iImage = 3;			// folder
+			tv.iSelectedImage = 4;	// open folder
+			HTREEITEM hitem = TreeView_InsertItem(hwnd, &tvi);
+
+			folder._bookmarks.fill_tree(hwnd, hitem, himagelist, hdc_wnd);
+		} else if (node._type == BookmarkNode::BMNT_BOOKMARK) {
+			const Bookmark& bookmark = *node._pbookmark;
+
+			tv.pszText = (LPTSTR)bookmark._name.c_str();
+			tv.iImage = 1;			// bookmark
+			tv.iSelectedImage = 2;	// selected bookmark
+
+			if (!bookmark._icon_path.empty()) {
+				const Icon& icon = g_icon_cache.extract(bookmark._icon_path, bookmark._icon_idx);
+
+				if ((ICON_ID)icon != ICID_NONE)
+					tv.iImage = tv.iSelectedImage = icon.add_to_imagelist(himagelist, hdc_wnd);
+			}
+
+			TreeView_InsertItem(hwnd, &tvi);
+		}
+	}
+}
+
+
+/*@@
+
+ /// import Internet Explorer bookmarks from Favorites folder into bookmark list
+void BookmarkList::import_IE_favorites(ShellDirectory& dir, HWND hwnd)
+{
+	TCHAR path[MAX_PATH], ext[_MAX_EXT];
+
+	dir.smart_scan(SORT_NAME, SCAN_FILESYSTEM);
+
+	for(Entry*entry=dir._down; entry; entry=entry->_next) {
+		if (entry->_shell_attribs & SFGAO_HIDDEN)	// ignore files like "desktop.ini"
+			continue;
+
+		String name;
+
+		if (entry->_etype == ET_SHELL)
+			name = dir._folder.get_name(static_cast<ShellEntry*>(entry)->_pidl);
+		else
+			name = entry->_display_name;
+
+		if (entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+			BookmarkFolder new_folder;
+
+			new_folder._name = DecodeXMLString(name);
+
+			if (entry->_etype == ET_SHELL) {
+				ShellDirectory new_dir(dir._folder, static_cast<ShellEntry*>(entry)->_pidl, hwnd);
+				new_folder._bookmarks.import_IE_favorites(new_dir, hwnd);
+			} else {
+				entry->get_path(path);
+				ShellDirectory new_dir(GetDesktopFolder(), path, hwnd);
+				new_folder._bookmarks.import_IE_favorites(new_dir, hwnd);
+			}
+
+			push_back(new_folder);
+		} else {
+			Bookmark bookmark;
+
+			bookmark._name = DecodeXMLString(name);
+
+			entry->get_path(path);
+			_tsplitpath(path, NULL, NULL, NULL, ext);
+
+			if (!_tcsicmp(ext, TEXT(".url"))) {
+				bookmark.read_url(path);
+				push_back(bookmark);
+			} else {
+				///@todo read shell links
+				//assert(0);
+			}
+		}
+	}
+}
+
+*/
+
+
+ /// read XBEL bookmark file
+bool Favorites::read(LPCTSTR path)
+{
+	XMLDoc xbel;
+
+	if (!xbel.read(path))
+		if (xbel._last_error == XML_ERROR_NO_ELEMENTS)
+			return false;
+		else
+			MessageBox(0/*@@g_Globals._hwndDesktop*/, String(xbel._last_error_msg.c_str()),
+						TEXT("ROS Explorer - reading bookmark file"), MB_OK);
+
+	const_XMLPos pos(&xbel);
+
+	if (!pos.go_down("xbel"))
+		return false;
+
+	super::read(pos);
+
+	pos.back();
+
+	return true;
+}
+
+ /// write XBEL bookmark file
+void Favorites::write(LPCTSTR path) const
+{
+	XMLDoc xbel;
+
+	XMLPos pos(&xbel);
+	pos.create("xbel");
+	super::write(pos);
+	pos.back();
+
+	xbel.write(path, XMLNode::FORMAT_SMART, XMLHeader("1.0", "UTF-8", "<!DOCTYPE xbel"
+		" PUBLIC \"+//IDN python.org//DTD XML Bookmark Exchange Language 1.0//EN//XML\"\n"
+		" \"http://www.python.org/topics/xml/dtds/xbel-1.0.dtd\">"));
+}
+
+
+/*@@
+
+ /// import Internet Explorer bookmarks from Favorites folder
+bool Favorites::import_IE_favorites(HWND hwnd)
+{
+	WaitCursor wait;
+
+	StartMenuShellDirs dirs;
+
+	try {
+		dirs.push_back(ShellDirectory(GetDesktopFolder(), SpecialFolderPath(CSIDL_COMMON_FAVORITES, hwnd), hwnd));
+		dirs.push_back(ShellDirectory(GetDesktopFolder(), SpecialFolderPath(CSIDL_FAVORITES, hwnd), hwnd));
+	} catch(COMException&) {
+	}
+
+	for(StartMenuShellDirs::iterator it=dirs.begin(); it!=dirs.end(); ++it) {
+		StartMenuDirectory& smd = *it;
+		ShellDirectory& dir = smd._dir;
+
+		try {
+			super::import_IE_favorites(dir, hwnd);
+		} catch(COMException&) {
+		}
+	}
+
+	return true;
+}
+
+*/

Copied: trunk/reactos/subsys/system/ibrowser/favorites.h (from rev 13256, trunk/reactos/subsys/system/explorer/taskbar/favorites.h)

Added: trunk/reactos/subsys/system/ibrowser/ibrowser.cpp
--- trunk/reactos/subsys/system/ibrowser/ibrowser.cpp	2005-01-26 00:03:05 UTC (rev 13301)
+++ trunk/reactos/subsys/system/ibrowser/ibrowser.cpp	2005-01-26 00:12:33 UTC (rev 13302)
@@ -0,0 +1,517 @@
+/*
+ * Copyright 2005 Martin Fuchs
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+ //
+ // ROS Internet Web Browser
+ //
+ // ibrowser.cpp
+ //
+ // Martin Fuchs, 24.01.2005
+ //
+
+
+#include "precomp.h"
+
+#include "ibrowser_intres.h"
+
+#include <locale.h>	// for setlocale()
+
+#ifndef __WINE__
+#include <io.h>		// for dup2()
+#include <fcntl.h>	// for _O_RDONLY
+#endif
+
+
+ // globals
+
+HINSTANCE g_hInstance;
+IconCache g_icon_cache;
+ATOM g_hframeClass;
+
+
+/*@@
+void ExplorerGlobals::read_persistent()
+{
+	 // read configuration file
+	_cfg_dir.printf(TEXT("%s\\ReactOS"), (LPCTSTR)SpecialFolderFSPath(CSIDL_APPDATA,0));
+	_cfg_path.printf(TEXT("%s\\ros-ibrowser-cfg.xml"), _cfg_dir.c_str());
+
+	if (!_cfg.read(_cfg_path)) {
+		if (_cfg._last_error != XML_ERROR_NO_ELEMENTS)
+			MessageBox(g_Globals._hwndDesktop, String(_cfg._last_error_msg.c_str()),
+						TEXT("ROS Explorer - reading user settings"), MB_OK);
+
+		_cfg.read(TEXT("ibrowser-cfg-template.xml"));
+	}
+
+	 // read bookmarks
+	_favorites_path.printf(TEXT("%s\\ros-ibrowser-bookmarks.xml"), _cfg_dir.c_str());
+
+	if (!_favorites.read(_favorites_path)) {
+		_favorites.import_IE_favorites(0);
+		_favorites.write(_favorites_path);
+	}
+}
+
+void ExplorerGlobals::write_persistent()
+{
+	 // write configuration file
+	RecursiveCreateDirectory(_cfg_dir);
+
+	_cfg.write(_cfg_path);
+	_favorites.write(_favorites_path);
+}
+
+
+XMLPos ExplorerGlobals::get_cfg()
+{
+	XMLPos cfg_pos(&_cfg);
+
+	cfg_pos.smart_create("ibrowser-cfg");
+
+	return cfg_pos;
+}
+
+XMLPos ExplorerGlobals::get_cfg(const char* path)
+{
+	XMLPos cfg_pos(&_cfg);
+
+	cfg_pos.smart_create("ibrowser-cfg");
+	cfg_pos.create_relative(path);
+
+	return cfg_pos;
+}
+*/
+
+
+Icon::Icon()
+ :	_id(ICID_UNKNOWN),
+	_itype(IT_STATIC),
+	_hicon(0)
+{
+}
+
+Icon::Icon(ICON_ID id, UINT nid)
+ :	_id(id),
+	_itype(IT_STATIC),
+	_hicon(SmallIcon(nid))
+{
+}
+
+Icon::Icon(ICON_TYPE itype, int id, HICON hIcon)
+ :	_id((ICON_ID)id),
+	_itype(itype),
+	_hicon(hIcon)
+{
+}
+
+Icon::Icon(ICON_TYPE itype, int id, int sys_idx)
+ :	_id((ICON_ID)id),
+	_itype(itype),
+	_sys_idx(sys_idx)
+{
+}
+
+void Icon::draw(HDC hdc, int x, int y, int cx, int cy, COLORREF bk_color, HBRUSH bk_brush) const
+{
+	if (_itype == IT_SYSCACHE)
+		ImageList_DrawEx(g_icon_cache.get_sys_imagelist(), _sys_idx, hdc, x, y, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL);
+	else
+		DrawIconEx(hdc, x, y, _hicon, cx, cy, 0, bk_brush, DI_NORMAL);
+}
+
+HBITMAP	Icon::create_bitmap(COLORREF bk_color, HBRUSH hbrBkgnd, HDC hdc_wnd) const
+{
+	if (_itype == IT_SYSCACHE) {
+		HIMAGELIST himl = g_icon_cache.get_sys_imagelist();
+
+		int cx, cy;
+		ImageList_GetIconSize(himl, &cx, &cy);
+
+		HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy);
+		HDC hdc = CreateCompatibleDC(hdc_wnd);
+		HBITMAP hbmp_old = SelectBitmap(hdc, hbmp);
+		ImageList_DrawEx(himl, _sys_idx, hdc, 0, 0, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL);
+		SelectBitmap(hdc, hbmp_old);
+		DeleteDC(hdc);
+
+		return hbmp;
+	} else
+		return create_bitmap_from_icon(_hicon, hbrBkgnd, hdc_wnd);
+}
+
+
+int Icon::add_to_imagelist(HIMAGELIST himl, HDC hdc_wnd, COLORREF bk_color, HBRUSH bk_brush) const
+{
+	int ret;
+
+	if (_itype == IT_SYSCACHE) {
+		HIMAGELIST himl = g_icon_cache.get_sys_imagelist();
+
+		int cx, cy;
+		ImageList_GetIconSize(himl, &cx, &cy);
+
+		HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy);
+		HDC hdc = CreateCompatibleDC(hdc_wnd);
+		HBITMAP hbmp_old = SelectBitmap(hdc, hbmp);
+		ImageList_DrawEx(himl, _sys_idx, hdc, 0, 0, cx, cy, bk_color, CLR_DEFAULT, ILD_NORMAL);
+		SelectBitmap(hdc, hbmp_old);
+		DeleteDC(hdc);
+
+		ret = ImageList_Add(himl, hbmp, 0);
+
+		DeleteObject(hbmp);
+	} else
+		ret = ImageList_AddAlphaIcon(himl, _hicon, bk_brush, hdc_wnd);
+
+	return ret;
+}
+
+HBITMAP create_bitmap_from_icon(HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd)
+{
+	int cx = GetSystemMetrics(SM_CXSMICON);
+	int cy = GetSystemMetrics(SM_CYSMICON);
+	HBITMAP hbmp = CreateCompatibleBitmap(hdc_wnd, cx, cy);
+
+	MemCanvas canvas;
+	BitmapSelection sel(canvas, hbmp);
+
+	RECT rect = {0, 0, cx, cy};
+	FillRect(canvas, &rect, hbrush_bkgnd);
+
+	DrawIconEx(canvas, 0, 0, hIcon, cx, cy, 0, hbrush_bkgnd, DI_NORMAL);
+
+	return hbmp;
+}
+
+int ImageList_AddAlphaIcon(HIMAGELIST himl, HICON hIcon, HBRUSH hbrush_bkgnd, HDC hdc_wnd)
+{
+	HBITMAP hbmp = create_bitmap_from_icon(hIcon, hbrush_bkgnd, hdc_wnd);
+
+	int ret = ImageList_Add(himl, hbmp, 0);
+
+	DeleteObject(hbmp);
+
+	return ret;
+}
+
+
+int IconCache::s_next_id = ICID_DYNAMIC;
+
+
+void IconCache::init()
+{
+	_icons[ICID_NONE]		= Icon(IT_STATIC, ICID_NONE, (HICON)0);
+
+	_icons[ICID_IBROWSER]	= Icon(ICID_IBROWSER,	IDI_IBROWSER);
+	_icons[ICID_BOOKMARK]	= Icon(ICID_BOOKMARK,	IDI_DOT_TRANS);
+}
+
+
+const Icon& IconCache::extract(const String& path)
+{
+	PathMap::iterator found = _pathMap.find(path);
+
+	if (found != _pathMap.end())
+		return _icons[found->second];
+
+	SHFILEINFO sfi;
+
+#if 1	// use system image list
+	HIMAGELIST himlSys = (HIMAGELIST) SHGetFileInfo(path, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX|SHGFI_SMALLICON);
+
+	if (himlSys) {
+		_himlSys = himlSys;
+
+		const Icon& icon = add(sfi.iIcon/*, IT_SYSCACHE*/);
+#else
+	if (SHGetFileInfo(path, 0, &sfi, sizeof(sfi), SHGFI_ICON|SHGFI_SMALLICON)) {
+		const Icon& icon = add(sfi.hIcon, IT_CACHED);
+#endif
+
+		///@todo limit cache size
+		_pathMap[path] = icon;
+
+		return icon;
+	} else
[truncated at 1000 lines; 8277 more skipped]