First public commit default tip
authorDavid Caabeiro <david.caabeiro@seqpoint.com>
Fri, 25 Jun 2010 12:50:05 +0200
changeset 0 c316ab048e9d
First public commit
Doxyfile
SymbianSigned.txt
browser/data/Application.rls
browser/data/Application.rss
browser/data/Application_reg.rss
browser/engine/inc/Camera.h
browser/engine/inc/ConnectionManager.h
browser/engine/inc/ResetAndDestroy.h
browser/engine/inc/Screenshot.h
browser/engine/inc/SettingManager.h
browser/engine/src/Camera.cpp
browser/engine/src/ConnectionManager.cpp
browser/engine/src/Screenshot.cpp
browser/engine/src/SettingManager.cpp
browser/gfx/Application.svg
browser/gfx/ScreenshotButtonNormal.svg
browser/group/Application.mmp
browser/group/Button.mk
browser/group/Icon.mk
browser/ui/inc/ARContainer.h
browser/ui/inc/ARView.h
browser/ui/inc/AppUi.h
browser/ui/inc/Application.h
browser/ui/inc/Application.hrh
browser/ui/inc/Application.pan
browser/ui/inc/Document.h
browser/ui/inc/SplashContainer.h
browser/ui/inc/SplashView.h
browser/ui/src/ARContainer.cpp
browser/ui/src/ARView.cpp
browser/ui/src/AppUi.cpp
browser/ui/src/Application.cpp
browser/ui/src/Document.cpp
browser/ui/src/SplashContainer.cpp
browser/ui/src/SplashView.cpp
build/bld.inf
common/inc/HttpClient.h
common/inc/IconLoader.h
common/inc/Logger.h
common/inc/Matrix4d.h
common/inc/Scalar.h
common/inc/Vector3d.h
common/inc/Vector4d.h
common/src/HttpClient.cpp
common/src/IconLoader.cpp
common/src/Logger.cpp
interface/InterfaceUid.hrh
interface/object/POIObject.h
interface/object/POIObject.inl
interface/overlay/POIOverlay.h
interface/overlay/POIOverlay.inl
interface/provider/POIProvider.h
interface/provider/POIProvider.inl
plugin/poi/geonames/data/Geonames.rss
plugin/poi/geonames/ecom/inc/ImplementationUid.hrh
plugin/poi/geonames/ecom/src/Proxy.cpp
plugin/poi/geonames/group/Geonames.mmp
plugin/poi/geonames/object/inc/Object.h
plugin/poi/geonames/object/src/Object.cpp
plugin/poi/geonames/provider/inc/Entry.h
plugin/poi/geonames/provider/inc/Loader.h
plugin/poi/geonames/provider/inc/Provider.h
plugin/poi/geonames/provider/src/Entry.cpp
plugin/poi/geonames/provider/src/Loader.cpp
plugin/poi/geonames/provider/src/Provider.cpp
plugin/poi/landmarks/data/Landmarks.rss
plugin/poi/landmarks/ecom/inc/ImplementationUid.hrh
plugin/poi/landmarks/ecom/src/Proxy.cpp
plugin/poi/landmarks/group/Landmarks.mmp
plugin/poi/landmarks/group/LandmarksIcons.mk
plugin/poi/landmarks/object/gfx/Icon.svg
plugin/poi/landmarks/object/inc/Object.h
plugin/poi/landmarks/object/src/Object.cpp
plugin/poi/landmarks/overlay/inc/Accelerometer.h
plugin/poi/landmarks/overlay/inc/AutoRotation.h
plugin/poi/landmarks/overlay/inc/Magnetometer.h
plugin/poi/landmarks/overlay/inc/Manager.h
plugin/poi/landmarks/overlay/inc/Overlay.h
plugin/poi/landmarks/overlay/inc/Position.h
plugin/poi/landmarks/overlay/src/Accelerometer.cpp
plugin/poi/landmarks/overlay/src/AutoRotation.cpp
plugin/poi/landmarks/overlay/src/Magnetometer.cpp
plugin/poi/landmarks/overlay/src/Manager.cpp
plugin/poi/landmarks/overlay/src/Overlay.cpp
plugin/poi/landmarks/overlay/src/Position.cpp
plugin/poi/landmarks/provider/inc/Loader.h
plugin/poi/landmarks/provider/inc/Local.h
plugin/poi/landmarks/provider/inc/Provider.h
plugin/poi/landmarks/provider/inc/Remote.h
plugin/poi/landmarks/provider/src/Local.cpp
plugin/poi/landmarks/provider/src/Provider.cpp
plugin/poi/landmarks/provider/src/Remote.cpp
sis/License.txt
sis/OpenMAR_N97.pkg
sis/backup_registration.xml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Doxyfile	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,1417 @@
+# Doxyfile 1.5.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file 
+# that follow. The default is UTF-8 which is also the encoding used for all 
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
+# iconv built into libc) for the transcoding. See 
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = OpenMAR
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = 
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = doc
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, 
+# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), 
+# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, 
+# Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, 
+# and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = 
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member 
+# documentation.
+
+DETAILS_AT_TOP         = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Java. For instance, namespaces will be presented as packages, qualified 
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
+# sources. Doxygen will then generate output that is tailored for 
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
+# to include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
+# Doxygen will parse them like normal C++ but will assume all classes use public 
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter 
+# and setter methods for a property. Setting this option to YES (the default) 
+# will make doxygen to replace the get and set methods by a property in the 
+# documentation. This will only work if the methods are indeed getting or 
+# setting a simple type. If this is not the case, or you want to show the 
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
+# is documented as struct, union, or enum with the name of the typedef. So 
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
+# with name TypeT. When disabled the typedef will appear as a member of a file, 
+# namespace, or class. And the struct will be named TypeS. This can typically 
+# be useful for C code in case the coding convention dictates that all compound 
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be 
+# extracted and appear in the documentation as a namespace called 
+# 'anonymous_namespace{file}', where file will be replaced with the base 
+# name of the file that contains the anonymous namespace. By default 
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
+# hierarchy of group names into alphabetical order. If set to NO (the default) 
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the 
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
+# Namespaces page.  This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from 
+# the version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = 
+
+# This tag can be used to specify the character encoding of the source files 
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
+# also the default input encoding. Doxygen uses libiconv (or the iconv built 
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          = 
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the 
+# output. The symbol name can be a fully qualified name, a word, or if the 
+# wildcard * is used, a substring. Examples: ANamespace, AClass, 
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.  Otherwise they will link to the documentstion.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files 
+# will be generated that can be used as input for Apple's Xcode 3 
+# integrated development environment, introduced with OSX 10.5 (Leopard). 
+# To create a documentation set, doxygen will generate a Makefile in the 
+# HTML output directory. Running make will produce the docset in that 
+# directory and running "make install" will install the docset in 
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
+# it at startup.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
+# feed. A documentation feed provides an umbrella under which multiple 
+# documentation sets from a single provider (such as a company or product suite) 
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
+# should uniquely identify the documentation set bundle. This should be a 
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING     = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to FRAME, a side panel will be generated
+# containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
+# probably better off using the HTML help feature. Other possible values 
+# for this tag are: HIERARCHIES, which will generate the Groups, Directories,
+# and Class Hiererachy pages using a tree view instead of an ordered list;
+# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which
+# disables this behavior completely. For backwards compatibility with previous
+# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE
+# respectively.
+
+GENERATE_TREEVIEW      = NONE
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# Use this tag to change the font size of Latex formulas included 
+# as images in the HTML documentation. The default is 10. Note that 
+# when you change the font size after a successful doxygen run you need 
+# to manually remove any form_*.png images from the HTML output directory 
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see 
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
+# the mscgen tool resides. If left empty the tool is assumed to be found in the 
+# default search path.
+
+MSCGEN_PATH            = 
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# By default doxygen will write a font called FreeSans.ttf to the output 
+# directory and reference it in all dot files that doxygen generates. This 
+# font does not include all possible unicode characters however, so when you need 
+# these (or just want a differently looking font) you can specify the font name 
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font, 
+# which can be done by putting it in a standard location or by setting the 
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 
+# containing the font.
+
+DOT_FONTNAME           = FreeSans
+
+# By default doxygen will tell dot to use the output directory to look for the 
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a 
+# different font using DOT_FONTNAME you can set the path where dot 
+# can find it using this tag.
+
+DOT_FONTPATH           = 
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
+# doxygen will generate a call dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable call graphs 
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
+# doxygen will generate a caller dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable caller 
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the 
+# number of direct children of the root node in a graph is already larger than 
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is enabled by default, which results in a transparent 
+# background. Warning: Depending on the platform used, enabling this option 
+# may lead to badly anti-aliased labels on the edges of a graph (i.e. they 
+# become hard to read).
+
+DOT_TRANSPARENT        = YES
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be 
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SymbianSigned.txt	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,27 @@
+#Assigned UIDs
+
+0x2002E1AB	Main application
+0x2002E1AC	KOverlayInterfaceUidValue
+0x2002E1AD	KProviderInterfaceUidValue
+0x2002E1AE	KObjectInterfaceUidValue
+
+# Landmarks
+0x2002E1AF	KDllUidValue / KOverlayImplementationUidValue
+0x2002E1B0	KProviderImplementationUidValue
+0x2002E1B1	KObjectImplementationUidValue
+
+# Geonames
+0x2002E1B2	KDllUidValue / KProviderImplementationUidValue
+0x2002E1B3	KObjectImplementationUidValue
+
+0x2002E1B4
+0x2002E1B5
+0x2002E1B6
+0x2002E1B7
+0x2002E1B8
+0x2002E1B9
+0x2002E1BA
+0x2002E1BB
+0x2002E1BC
+0x2002E1BD
+0x2002E1BE
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/data/Application.rls	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,29 @@
+/*
+ * Name        : Application.rls 
+ * Description : Localisation strings
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+//  LOCALISATION STRINGS
+
+// Caption string for app.
+#define qtn_caption_string "OpenMAR"
+
+#define qtn_about "About"
+#define qtn_exit "Exit"
+
+#define qtn_loc_resource_file "\\resource\\apps\\OpenMAR_0x2002E1AB"
+
+#define qtn_about_dialog_title  "About"
+#define qtn_about_dialog_text   "OpenMAR Version 1.0.0\n\nSupport: support@OpenMAR.org\n\n(c) 2010 David Caabeiro"
+
+#define qtn_screenshot_text_ok      "Screenshot saved in %S"
+#define qtn_screenshot_text_error   "Screenshot error %d"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/data/Application.rss	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,218 @@
+/*
+ * Name        : Application.rss
+ * Description : Application resource file 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+NAME ARXX	// 4 letter ID
+
+//  INCLUDES
+#include <eikon.rh>
+#include <avkon.rsg>
+#include <avkon.rh>
+#include <appinfo.rh>
+
+#include "Application.hrh"
+#include "Application.rls"
+
+RESOURCE RSS_SIGNATURE
+{
+}
+
+RESOURCE TBUF r_default_document_name
+{
+}
+
+RESOURCE EIK_APP_INFO
+{
+//    cba = R_AVKON_SOFTKEYS_OPTIONS_EXIT;
+}
+
+RESOURCE AVKON_VIEW r_splash_view
+{
+}
+
+RESOURCE AVKON_VIEW r_ar_view
+{
+//    cba     = R_AVKON_SOFTKEYS_OPTIONS_EXIT;
+//    menubar = r_ar_menubar;
+//    toolbar = r_ar_toolbar;
+}
+
+RESOURCE MENU_BAR r_ar_menubar
+{
+    titles =
+    {
+        MENU_TITLE { menu_pane = r_ar_menu; }
+    };
+}
+
+RESOURCE MENU_PANE r_ar_menu
+{
+    items =
+    {
+        MENU_ITEM
+        {
+            command = EAbout;
+            txt = qtn_about;
+        },
+        MENU_ITEM
+        {
+            command = EAknSoftkeyExit;
+            txt = qtn_exit;
+        }
+    };
+}
+
+/*
+RESOURCE AVKON_TOOLBAR r_ar_toolbar
+{
+//    flags = KAknToolbarFixed | KAknToolbarDsaMode;
+    flags = KAknToolbarFixed;
+    items =
+    {
+        TBAR_CTRL
+        {
+            type = EAknCtButton;
+            id = EHelp;
+            control = AVKON_BUTTON
+            {
+                flags = KAknButtonNoFrame;
+                states =
+                {
+                    AVKON_BUTTON_STATE
+                    {
+                        txt = "Option1";
+                        helptxt = "";
+                    }
+                };
+            };
+        }
+        ,
+        TBAR_CTRL
+        {
+            type = EAknCtButton;
+            id = EHelp;
+            control = AVKON_BUTTON
+            {
+                flags = KAknButtonNoFrame;
+                states =
+                {
+                    AVKON_BUTTON_STATE
+                    {
+                        txt = "Option2";
+                        helptxt = "";
+                    }
+                };
+            };
+        }
+        ,
+        TBAR_CTRL
+        {
+            type = EAknCtButton;
+            id = EHelp;
+            control = AVKON_BUTTON
+            {
+                flags = KAknButtonNoFrame;
+                states =
+                {
+                    AVKON_BUTTON_STATE
+                    {
+                        txt = "Option3";
+                        helptxt = "";
+                    }
+                };
+            };
+        }
+        ,
+        TBAR_CTRL 
+        { 
+            type = EAknCtToolbarExtension; 
+            id = ECmdDataSource; 
+
+            control = AVKON_TOOLBAR_EXTENSION 
+            {
+                flags = KAknButtonNoFrame | KAknTbExtensionDsaMode | KAknTbExtensionTransparent;
+            };
+        }
+    };
+}
+*/
+
+
+
+RESOURCE DIALOG r_about_query_dialog
+{
+    flags = EGeneralQueryFlags | EEikDialogFlagNoBorder | EEikDialogFlagNoShadow;
+    buttons = R_AVKON_SOFTKEYS_OK_EMPTY;
+    items=
+    {
+        DLG_LINE
+        {
+            type = EAknCtPopupHeadingPane;
+            id = EAknMessageQueryHeaderId;
+            itemflags = EEikDlgItemNonFocusing;
+            control = AVKON_HEADING
+            {
+            };
+        },
+        DLG_LINE
+        {
+            type = EAknCtMessageQuery;
+            id = EAknMessageQueryContentId;
+            control = AVKON_MESSAGE_QUERY
+            {
+            };
+        }
+    };
+}
+
+RESOURCE DIALOG r_wait_dialog
+{
+    flags = EAknWaitNoteFlags;
+    buttons = R_AVKON_SOFTKEYS_CANCEL;
+    items =
+    {
+        DLG_LINE
+        {
+            type = EAknCtNote;
+            id = EDialogWait;
+            control = AVKON_NOTE
+            {
+                layout = EWaitLayout;
+                singular_label = qtn_wait_text;
+                animation = R_QGN_GRAF_WAIT_BAR_ANIM;
+            };
+        }
+    };
+}
+
+
+RESOURCE TBUF r_caption_string        { buf = qtn_caption_string; }
+RESOURCE TBUF r_about_dialog_title    { buf = qtn_about_dialog_title; }
+RESOURCE TBUF r_about_dialog_text     { buf = qtn_about_dialog_text; }
+
+RESOURCE TBUF r_screenshot_text_ok    { buf = qtn_screenshot_text_ok; }
+RESOURCE TBUF r_screenshot_text_error { buf = qtn_screenshot_text_error; }
+
+
+RESOURCE LOCALISABLE_APP_INFO r_localisable_app_info
+{
+    short_caption = qtn_caption_string;
+    caption_and_icon =
+    CAPTION_AND_ICON_INFO
+    {
+        caption = qtn_caption_string;
+
+        number_of_icons = 1;
+        icon_file = "\\resource\\apps\\OpenMAR_0x2002E1AB.mif";
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/data/Application_reg.rss	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,32 @@
+/*
+ * Name        : Application_reg.rss
+ * Description : Application registration file 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Application.hrh"
+#include "Application.rls"
+
+#include <appinfo.rh>
+#include <OpenMAR_0x2002E1AB.rsg>
+
+UID2 KUidAppRegistrationResourceFile
+UID3 _UID3
+
+RESOURCE APP_REGISTRATION_INFO
+{
+    app_file = "OpenMAR_0x2002E1AB";
+    localisable_resource_file = qtn_loc_resource_file;
+    localisable_resource_id = R_LOCALISABLE_APP_INFO;
+
+    embeddability = KAppNotEmbeddable;
+    newfile = KAppDoesNotSupportNewFile;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/engine/inc/Camera.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,77 @@
+/*
+ * Name        : Camera.h
+ * Description : Camera helper class
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef CAMERA_H_
+#define CAMERA_H_
+
+#include <ECam.h>
+
+class CFbsBitmap;
+
+/**
+ * @brief Wrapper class over CCamera
+ * 
+ * Implemented to use the minimum frame size 
+ */
+class CDigitalCamera : public CBase, 
+            public MCameraObserver,
+            public MCameraObserver2
+{
+public:
+    class MObserver
+    {
+    public:
+        virtual void CameraReady(TInt aError) = 0;
+        virtual void CameraFrame(CFbsBitmap& aFrame) = 0;
+        virtual void FocusReady(TInt aError) = 0;
+    };
+
+public:
+    static CDigitalCamera* NewL(MObserver& aObserver);
+    ~CDigitalCamera();
+
+protected:
+    CDigitalCamera(MObserver& aObserver);
+    void ConstructL();
+
+public:
+    void Start();
+    void Stop();
+
+    void StartFocus();
+
+    const TSize& ViewportSize() const { return iViewportSize; }
+
+protected:
+    // From MCameraObserver
+    void ReserveComplete(TInt aError);
+    void PowerOnComplete(TInt aError);
+    void ViewFinderFrameReady(CFbsBitmap& aFrame);
+    void ImageReady(CFbsBitmap* aBitmap, HBufC8* aData, TInt aError);
+    void FrameBufferReady(MFrameBuffer* aFrameBuffer, TInt aError);
+
+    // From MCameraObserver2
+    void HandleEvent(const TECAMEvent& aEvent);
+    void ViewFinderReady(MCameraBuffer& aCameraBuffer, TInt aError);
+    void ImageBufferReady(MCameraBuffer& aCameraBuffer, TInt aError);
+    void VideoBufferReady(MCameraBuffer& aCameraBuffer, TInt aError);
+
+private:
+    MObserver& iObserver;
+    CCamera* iCamera;
+    CCamera::CCameraAdvancedSettings* iCameraSetting;
+    TSize iViewportSize;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/engine/inc/ConnectionManager.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,65 @@
+/*
+ * Name        : ConnectionManager.h
+ * Description : Manages application connection 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef CONNECTIONMANAGER_H_
+#define CONNECTIONMANAGER_H_
+
+#include <e32base.h>
+#include <es_sock.h>
+#include <rconnmon.h>
+
+class CSettingManager;
+
+/**
+ * @brief Notifies the status of the started connection
+ */
+class MConnectionManager
+{
+public:
+    virtual void ConnectionStartedL(TInt aError) = 0;
+};
+
+/**
+ * @brief Initializes a working connection
+ * 
+ */
+class CConnectionManager : public CActive, public MConnectionMonitorObserver
+{
+public:
+    static CConnectionManager* NewL(MConnectionManager& aObserver, CSettingManager& aSetting);
+    ~CConnectionManager();
+
+protected:
+    CConnectionManager(MConnectionManager& aObserver, CSettingManager& aSetting);
+    void ConstructL();
+
+    // From CActive
+    void RunL();
+    void DoCancel();
+
+    // From MConnectionMonitorObserver
+    void EventL(const CConnMonEventBase& aEvent);
+
+private:
+    MConnectionManager& iObserver;
+    CSettingManager& iSetting;
+
+    RSocketServ iSocketServ;
+    RConnection iConnection;
+    RConnectionMonitor iMonitor;
+
+    TUint32 iIapId;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/engine/inc/ResetAndDestroy.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,27 @@
+/*
+ * Helper classes
+ */
+
+//#include <ecom/ImplementationInformation.h>
+
+/*
+ * Function passed in as a parameter to TCleanupItem constructor to reset and 
+ * destroy the received aPtr.
+ * @param aPtr A pointer to the object that is to be cleaned up
+ */
+inline void ResetAndDestroy(TAny* aPtr)
+{
+    reinterpret_cast<RImplInfoPtrArray*>(aPtr)->ResetAndDestroy();
+}
+
+/*
+ * Function that creates a cleanup item for aArray and specifies the cleanup
+ * function as ResetAndDestroy. When the item is removed from the cleanup stack
+ * the function ResetAndDestroy will be called on aArray.
+ * @param aArray The array to be destroyed.
+ */
+inline void CleanupResetAndDestroyPushL(RImplInfoPtrArray& aArray)
+{       
+    TCleanupItem item(ResetAndDestroy, &aArray);
+    CleanupStack::PushL(item);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/engine/inc/Screenshot.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,64 @@
+/*
+ * Name        : Screenshot.h
+ * Description : Performs screenshot and bitmap conversion
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef SCREENSHOT_H_
+#define SCREENSHOT_H_
+
+#include <e32base.h>
+#include <gdi.h>
+
+class TSize;
+
+class CFbsBitmap;
+class CFbsBitmapDevice;
+class CFbsBitGc;
+
+class CImageEncoder;
+
+class CScreenshot : public CActive
+{
+public:
+    class MObserver
+    {
+    public:
+        virtual void ScreenshotReadyL(TInt aError, const TDesC& aFilename) = 0;
+    };
+
+public:
+    static CScreenshot* NewL(MObserver& aObserver, const TSize& aSize, const TDisplayMode& aDisplayMode);
+    ~CScreenshot();
+
+protected:
+    CScreenshot(MObserver& aObserver);
+    void ConstructL(const TSize& aSize, const TDisplayMode& aDisplayMode);
+
+public:
+    void RequestL(const CFbsBitmap& aSourceBitmap, const TSize& aSize);
+
+protected:
+    void RunL();
+    void DoCancel();
+
+private:
+    MObserver& iObserver;
+
+    CFbsBitmap* iBitmap;
+    CFbsBitmapDevice* iBitmapDevice;
+    CFbsBitGc* iBitmapContext;
+
+    TFileName iFilename;
+    CImageEncoder* iEncoder;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/engine/inc/SettingManager.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,37 @@
+/*
+ * Name        : SettingManager.h
+ * Description : Manages application settings 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef SETTINGMANAGER_H_
+#define SETTINGMANAGER_H_
+
+#include <e32base.h>
+
+/**
+ * @brief Manages application global settings
+ * 
+ */
+class CSettingManager : public CBase
+{
+public:
+    static CSettingManager* NewL();
+    ~CSettingManager();
+
+protected:
+    CSettingManager();
+    void ConstructL();
+
+private:
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/engine/src/Camera.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,161 @@
+/*
+ * Name        : Camera.cpp
+ * Description : Camera helper class
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Camera.h"
+
+#include <ecamadvsettings.h>
+#include <fbs.h>
+
+#include "Logger.h"
+
+CDigitalCamera* CDigitalCamera::NewL(MObserver& aObserver)
+{
+    CDigitalCamera* self = new(ELeave) CDigitalCamera(aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CDigitalCamera::~CDigitalCamera()
+{
+    delete iCameraSetting;
+    delete iCamera;
+}
+
+CDigitalCamera::CDigitalCamera(MObserver& aObserver)
+    : iObserver(aObserver), iViewportSize(KMaxTInt, KMaxTInt)
+{}
+
+void CDigitalCamera::ConstructL()
+{
+    TInt cameraCount = CCamera::CamerasAvailable();
+
+    LOGARG("Camera count is %d", cameraCount);
+
+    // Use main camera (index 0)
+    iCamera = CCamera::New2L(*this, 0, 0);
+    iCameraSetting = CCamera::CCameraAdvancedSettings::NewL(*iCamera);
+
+    TCameraInfo cameraInfo;
+    iCamera->CameraInfo(cameraInfo);
+
+    LOGTXT("Camera capture sizes supported:");
+
+    for (TInt i = 0; i < cameraInfo.iNumImageSizesSupported; ++i)
+    {
+        TSize size;
+        iCamera->EnumerateCaptureSizes(size, i, CCamera::EFormatExif); 
+
+        if (iViewportSize.iWidth > size.iWidth && iViewportSize.iHeight > size.iHeight)
+            iViewportSize = size;
+
+        LOGARG("Index %d Size %d x %d", i, size.iWidth, size.iHeight);
+    }
+
+    LOGARG("Using smallest viewport: %d x %d", iViewportSize.iWidth, iViewportSize.iHeight);
+}
+
+void CDigitalCamera::Start()
+{
+    iCamera->Reserve();
+}
+
+void CDigitalCamera::Stop()
+{
+    iCamera->Release();
+}
+
+void CDigitalCamera::StartFocus()
+{
+    iCameraSetting->SetAutoFocusType(CCamera::CCameraAdvancedSettings::EAutoFocusTypeSingle);
+}
+
+void CDigitalCamera::ReserveComplete(TInt aError)
+{
+    if (aError)
+    {
+        LOGARG("Camera reserve complete error %d", aError);
+        iObserver.CameraReady(aError);
+    }
+    else
+        iCamera->PowerOn();
+}
+
+void CDigitalCamera::PowerOnComplete(TInt aError)
+{
+    TCameraInfo cameraInfo;
+    iCamera->CameraInfo(cameraInfo);
+
+    if ((aError == KErrNone) &&
+        (cameraInfo.iOptionsSupported & TCameraInfo::EViewFinderBitmapsSupported) &&
+        (cameraInfo.iOrientation == TCameraInfo::EOrientationOutwards))
+    {
+        TSize requestSize(iViewportSize);
+
+        LOGARG("Requesting viewfinder size %d x %d", requestSize.iWidth, requestSize.iHeight);
+        TRAPD(error, iCamera->StartViewFinderL(CCamera::EFormatFbsBitmapColor16MU, requestSize));
+        LOGARG("Obtaining viewfinder size %d x %d", requestSize.iWidth, requestSize.iHeight);
+
+        iObserver.CameraReady(error);
+    }
+    else
+    {
+        // Either power complete error or viewfinder bitmap unsupported 
+        iObserver.CameraReady(KErrNotSupported);
+    }
+}
+
+void CDigitalCamera::ViewFinderFrameReady(CFbsBitmap& aFrame)
+{
+    iObserver.CameraFrame(aFrame);
+}
+
+void CDigitalCamera::ImageReady(CFbsBitmap* /*aBitmap*/, HBufC8* /*aData*/, TInt /*aError*/)
+{}
+
+void CDigitalCamera::FrameBufferReady(MFrameBuffer* /*aFrameBuffer*/, TInt /*aError*/)
+{}
+
+void CDigitalCamera::HandleEvent(const TECAMEvent& aEvent)
+{
+    if (aEvent.iEventType == KUidECamEventReserveComplete)
+        ReserveComplete(aEvent.iErrorCode);
+    else if (aEvent.iEventType == KUidECamEventPowerOnComplete)
+        PowerOnComplete(aEvent.iErrorCode);
+    else if (aEvent.iEventType == KUidECamEventCameraSettingFocusRange || 
+            aEvent.iEventType == KUidECamEventCameraSettingFocusRange2)
+        ;
+    else if (aEvent.iEventType == KUidECamEventCameraSettingAutoFocusType ||
+            aEvent.iEventType == KUidECamEventCameraSettingAutoFocusType2)
+        ;
+    else if (aEvent.iEventType == KUidECamEventCameraSettingsOptimalFocus)
+        iObserver.FocusReady(aEvent.iErrorCode);
+
+    LOGARG("Camera event %x (error %d)", aEvent.iEventType, aEvent.iErrorCode);
+}
+
+void CDigitalCamera::ViewFinderReady(MCameraBuffer& aCameraBuffer, TInt /*aError*/)
+{
+    CFbsBitmap& bitmap = aCameraBuffer.BitmapL(0);
+    ViewFinderFrameReady(bitmap);
+    aCameraBuffer.Release();
+}
+
+void CDigitalCamera::ImageBufferReady(MCameraBuffer& /*aCameraBuffer*/, TInt /*aError*/)
+{}
+
+void CDigitalCamera::VideoBufferReady(MCameraBuffer& /*aCameraBuffer*/, TInt /*aError*/)
+{}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/engine/src/ConnectionManager.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,129 @@
+/*
+ * Name        : ConnectionManager.cpp
+ * Description : Manages application connection
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "ConnectionManager.h"
+
+#include "SettingManager.h"
+
+#include <CommDbConnPref.h>
+#include <es_enum.h>
+
+#include "Logger.h"
+
+CConnectionManager* CConnectionManager::NewL(MConnectionManager& aObserver, CSettingManager& aSetting)
+{
+    CConnectionManager* self = new(ELeave) CConnectionManager(aObserver, aSetting);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CConnectionManager::~CConnectionManager()
+{
+    Cancel();
+
+    iMonitor.Close();
+    iConnection.Close();
+    iSocketServ.Close();
+}
+
+CConnectionManager::CConnectionManager(MConnectionManager& aObserver, CSettingManager& aSetting)
+    : CActive(CActive::EPriorityStandard), iObserver(aObserver), iSetting(aSetting)
+{
+    CActiveScheduler::Add(this);
+}
+
+void CConnectionManager::ConstructL()
+{
+    LOGTXT("Initializing connection..");
+
+    User::LeaveIfError(iSocketServ.Connect());
+    User::LeaveIfError(iConnection.Open(iSocketServ));
+
+    iMonitor.ConnectL();
+    iMonitor.NotifyEventL(*this);
+
+//    _LIT8(KDefault, "/application/destination");
+    TUint destinationId = 0;
+//    iSettings.Get(KDefault, destinationId, EHex);
+
+    if (destinationId == 0)
+    {
+        // "Always ask"
+        TCommDbConnPref pref;
+        pref.SetDialogPreference(ECommDbDialogPrefPrompt);
+
+        iConnection.Start(pref, iStatus);
+    }
+    else
+    {
+        TConnSnapPref pref;
+        pref.SetSnap(destinationId);
+
+        iConnection.Start(pref, iStatus);
+    }
+
+    SetActive();
+}
+
+void CConnectionManager::RunL()
+{
+    _LIT(KIapId, "IAP\\Id");
+    iConnection.GetIntSetting(KIapId, iIapId);
+
+    LOGARG("Connected with iap %u", iIapId);
+
+    iObserver.ConnectionStartedL(iStatus.Int());
+}
+
+void CConnectionManager::DoCancel()
+{
+    // Unfortunately no RConnection::StartCancel() available..
+}
+
+void CConnectionManager::EventL(const CConnMonEventBase& aEvent)
+{
+    switch (aEvent.EventType())
+    {
+/*
+        case EConnMonConnectionStatusChange:
+        {
+            const CConnMonNetworkStatusChange& event = static_cast<const CConnMonNetworkStatusChange&>(aEvent);
+            break;
+        }
+*/
+        case EConnMonDeleteConnection:
+        {
+            TUint count = 0;
+            iConnection.EnumerateConnections(count);
+
+            if (count == 0)
+                LOGTXT("Connection dropped");
+
+/*
+                if (info().iIapId == iIapId)
+                {
+                    connFound = ETrue;
+                    break;
+                }
+*/
+            break;
+        }
+
+        default:
+            break;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/engine/src/Screenshot.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,103 @@
+/*
+ * Name        : Screenshot.cpp
+ * Description : Performs screenshot and bitmap conversion
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Screenshot.h"
+
+#include <eikenv.h>
+#include <fbs.h>
+#include <ImageConversion.h> 
+#include <PathInfo.h>
+#include <w32std.h>
+
+#include "Logger.h"
+
+CScreenshot* CScreenshot::NewL(MObserver& aObserver, const TSize& aSize, const TDisplayMode& aDisplayMode)
+{
+    CScreenshot* self = new(ELeave) CScreenshot(aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL(aSize, aDisplayMode);
+    CleanupStack::Pop();
+
+    return self;
+}
+
+CScreenshot::~CScreenshot()
+{
+    Cancel();
+
+    delete iEncoder;
+    
+    delete iBitmapContext;
+    delete iBitmapDevice;
+    delete iBitmap;
+}
+
+CScreenshot::CScreenshot(MObserver& aObserver)
+    :CActive(EPriorityStandard), iObserver(aObserver)
+{
+    CActiveScheduler::Add(this);
+}
+
+void CScreenshot::ConstructL(const TSize& aSize, const TDisplayMode& aDisplayMode)
+{
+    // Create bitmap where screen bitmap will be blitted
+    iBitmap = new(ELeave) CFbsBitmap;
+    iBitmap->Create(aSize, aDisplayMode);
+
+    iBitmapDevice = CFbsBitmapDevice::NewL(iBitmap);
+    User::LeaveIfError(iBitmapDevice->CreateContext(iBitmapContext));
+
+    LOGARG("Bitmap capture size is %d x %d", aSize.iWidth, aSize.iHeight);
+}
+
+void CScreenshot::RequestL(const CFbsBitmap& aSourceBitmap, const TSize& aSize)
+{
+    // Blit screen bitmap into internal bitmap
+    iBitmapContext->BitBlt(TPoint(0, 0), &aSourceBitmap, TRect(TPoint(0, 0), aSize));
+
+    // Generate file name
+    TTime time;
+    time.HomeTime();
+
+    TDateTime dateTime = time.DateTime();
+
+#if defined(__WINS__)
+    iFilename.Copy(PathInfo::PhoneMemoryRootPath());
+#else
+    iFilename.Copy(PathInfo::MemoryCardRootPath());
+#endif
+    iFilename.Append(PathInfo::ImagesPath());
+
+    _LIT(KFormat, "%04d%02d%02d%02d%02d%02d.png");
+    iFilename.AppendFormat(KFormat, dateTime.Year(), dateTime.Month() + 1, dateTime.Day() + 1, dateTime.Hour(), dateTime.Minute(), dateTime.Second());
+
+    // Convert to PNG
+    delete iEncoder;
+    iEncoder = 0;
+
+    iEncoder = CImageEncoder::FileNewL(CCoeEnv::Static()->FsSession(), iFilename, CImageEncoder::EOptionAlwaysThread, KImageTypePNGUid);
+    iEncoder->Convert(&iStatus, *iBitmap);
+    SetActive();
+}
+
+void CScreenshot::RunL()
+{   
+    iObserver.ScreenshotReadyL(iStatus.Int(), iFilename);
+}
+
+void CScreenshot::DoCancel()    
+{
+    if (iEncoder)
+        iEncoder->Cancel();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/engine/src/SettingManager.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,37 @@
+/*
+ * Name        : SettingManager.cpp
+ * Description : Manages application settings
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "SettingManager.h"
+
+CSettingManager* CSettingManager::NewL()
+{
+    CSettingManager* self = new(ELeave) CSettingManager;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CSettingManager::~CSettingManager()
+{
+}
+
+CSettingManager::CSettingManager()
+{
+}
+
+void CSettingManager::ConstructL()
+{
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/gfx/Application.svg	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%" viewBox="0 0 88 87.999">
+<g>
+<g>
+<g>
+<g>
+<rect fill="none" width="88" height="87.999"/>
+</g>
+</g>
+<g>
+<linearGradient id="XMLID_7_" gradientUnits="userSpaceOnUse" x1="12.3042" y1="18.3799" x2="63.4113" y2="79.287">
+<stop offset="0" style="stop-color:#B3DDFF"/>
+<stop offset="0.8146" style="stop-color:#084296"/>
+<stop offset="1" style="stop-color:#084296"/>
+</linearGradient>
+<path fill="url(#XMLID_7_)" d="M32.135,7.415L14.363,17.432v23.167c0,0,8.926,15.351,10.468,18.001       c-2.386,1.704-15.44,11.03-15.44,11.03l21.613,12.652c0,0,12.907-9.85,14.71-11.226c1.979,1.109,16.231,9.101,16.231,9.101       l16.664-15.132c0,0-14.066-6.929-16.888-8.318c1.467-3.01,10.531-21.604,10.531-21.604l-22.298-9.59       c0,0-1.486,3.173-2.093,4.467c-2.046-0.88-6.573-2.826-6.573-2.826s-3.713,2.463-5.696,3.778       c-0.327-0.744-0.542-1.233-0.657-1.495c0.007-0.824,0.213-23.72,0.213-23.72L32.135,7.415z"/>
+<linearGradient id="XMLID_8_" gradientUnits="userSpaceOnUse" x1="40.8276" y1="52.1914" x2="16.1997" y2="21.1353">
+<stop offset="0" style="stop-color:#5AA7E0"/>
+<stop offset="1" style="stop-color:#3366CC"/>
+</linearGradient>
+<polygon fill="url(#XMLID_8_)" points="59.051,57.621 69.536,36.111 50.944,28.115 48.852,32.581 41.493,29.418 34.719,33.911        32.932,29.849 33.117,9.157 16.363,18.601 16.363,40.06 27.476,59.169 13.064,69.463 30.856,79.879 45.546,68.669        61.667,77.708 75.089,65.521 "/>
+<linearGradient id="XMLID_9_" gradientUnits="userSpaceOnUse" x1="60.585" y1="31.876" x2="53.8582" y2="45.1125">
+<stop offset="0" style="stop-color:#5AA7E0"/>
+<stop offset="1" style="stop-color:#3366CC"/>
+</linearGradient>
+<polygon fill="url(#XMLID_9_)" points="41.26,48.783 50.944,28.115 69.536,36.111 59.051,57.621 "/>
+<polygon fill="#0046B7" points="16.363,40.06 27.476,59.169 41.26,48.783 32.932,29.849 "/>
+<polygon fill="#3366CC" points="16.363,40.06 16.363,18.601 33.117,9.157 32.932,29.849 "/>
+<polygon fill="#CFECFF" points="26.696,39.23 41.493,29.418 59.523,37.168 45.546,47.954 "/>
+<path fill="#5AA7E0" d="M41.954,55.286"/>
+<polygon fill="#3366CC" points="26.696,39.23 27.476,59.169 45.546,68.669 45.546,47.954 "/>
+<polygon fill="#5AA7E0" points="13.064,69.463 27.476,59.169 45.546,68.669 30.856,79.879 "/>
+<linearGradient id="XMLID_10_" gradientUnits="userSpaceOnUse" x1="29.2085" y1="63.6836" x2="48.7102" y2="56.1976">
+<stop offset="0" style="stop-color:#5AA7E0"/>
+<stop offset="0.0056" style="stop-color:#5AA7E0"/>
+<stop offset="0.85" style="stop-color:#3366CC"/>
+<stop offset="1" style="stop-color:#3366CC"/>
+</linearGradient>
+<polygon fill="url(#XMLID_10_)" points="43.423,46.971 27.476,59.169 45.546,68.669 45.546,47.954 "/>
+<polygon fill="#0046B7" points="45.546,47.954 45.546,68.669 59.051,57.621 59.523,37.168 "/>
+<linearGradient id="XMLID_11_" gradientUnits="userSpaceOnUse" x1="45.3936" y1="59.5186" x2="59.0508" y2="59.5186">
+<stop offset="0" style="stop-color:#0046B7"/>
+<stop offset="1" style="stop-color:#3366CC"/>
+</linearGradient>
+<polygon fill="url(#XMLID_11_)" points="45.394,50.368 45.546,68.669 59.051,57.621 "/>
+<linearGradient id="XMLID_12_" gradientUnits="userSpaceOnUse" x1="60.8945" y1="68.6807" x2="57.2953" y2="58.792">
+<stop offset="0" style="stop-color:#5AA7E0"/>
+<stop offset="0.4101" style="stop-color:#5AA7E0"/>
+<stop offset="1" style="stop-color:#3366CC"/>
+</linearGradient>
+<polygon fill="url(#XMLID_12_)" points="61.667,77.708 45.546,68.669 59.051,57.621 75.089,65.521 "/>
+</g>
+</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/gfx/ScreenshotButtonNormal.svg	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,288 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="64px" height="64px" viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve">
+<g>
+	<g id="XMLID_1_">
+		<g>
+			
+				<radialGradient id="SVGID_1_" cx="29.1748" cy="-122.2139" r="127.1615" gradientTransform="matrix(1 0 0 1.3425 0 41.8625)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_1_)" d="M63.62,22.46v21.78c0,5.55-3.36,10.05-7.49,10.05H8.09c-4.13,0-7.48-4.5-7.48-10.05V22.46
+				c0-5.55,3.35-10.05,7.48-10.05h1.95c0.01,0.82,0.17,1.46,2,1.49c0.22,0.05,0.52,0.08,0.91,0.08h4.81c0.42,0,0.74-0.03,0.97-0.09
+				c1.8-0.05,1.85-0.68,1.84-1.48h35.56C60.27,12.41,63.62,16.91,63.62,22.46z M62.05,44.97V25.25c0-1.34-0.3-2.61-0.819-3.69
+				c-0.311-3.77-2.521-6.8-5.101-6.8H8.09c-2.78,0-5.14,3.53-5.14,7.7v2.79v18.99v0.729c0,3.05,1.55,5.71,3.63,6.62
+				c0.08,0.04,0.17,0.08,0.25,0.101c0.11,0.05,0.22,0.09,0.34,0.119c0.3,0.091,0.61,0.131,0.92,0.131c0.02,0,0.05,0,0.07,0h35.3
+				h12.67h0.71C59.67,51.94,62.05,48.75,62.05,44.97z"/>
+			
+				<radialGradient id="SVGID_2_" cx="21.3496" cy="-52.5557" r="153.9519" gradientTransform="matrix(1 0 0 0.8933 0 -5.6061)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_2_)" d="M62.05,25.25v19.72c0,3.78-2.38,6.971-5.21,6.971h-0.71c2.79,0,5.14-3.53,5.14-7.7V22.46
+				c0-0.3-0.01-0.61-0.039-0.9C61.75,22.64,62.05,23.91,62.05,25.25z"/>
+			
+				<radialGradient id="SVGID_3_" cx="21.3496" cy="-52.5557" r="153.9519" gradientTransform="matrix(1 0 0 0.8933 0 -5.6061)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_3_)" d="M61.27,22.46v21.78c0,4.17-2.35,7.7-5.14,7.7H43.46V49.59c7.89,0,14.29-6.39,14.29-14.28
+				c0-7.89-6.4-14.29-14.29-14.29v-2.74h13.38c1.82,0,3.46,1.32,4.391,3.28C61.26,21.85,61.27,22.16,61.27,22.46z"/>
+			<radialGradient id="SVGID_4_" cx="35.4385" cy="8.1074" r="208.6478" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_4_)" d="M61.23,21.56c-0.931-1.96-2.57-3.28-4.391-3.28H43.46H8.16c-2.82,0-5.21,3.19-5.21,6.97v-2.79
+				c0-4.17,2.36-7.7,5.14-7.7h48.04C58.71,14.76,60.92,17.79,61.23,21.56z"/>
+			<radialGradient id="SVGID_5_" cx="42.1299" cy="-70.8301" r="113.5604" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_5_)" d="M43.46,21.02c7.89,0,14.29,6.4,14.29,14.29c0,7.891-6.4,14.28-14.29,14.28S29.18,43.2,29.18,35.31
+				C29.18,27.42,35.57,21.02,43.46,21.02z M55.4,35.31c0-6.58-5.36-11.939-11.94-11.939S31.52,28.73,31.52,35.31
+				c0,6.58,5.36,11.931,11.94,11.931S55.4,41.89,55.4,35.31z"/>
+			
+				<radialGradient id="SVGID_6_" cx="45.6123" cy="-7.9443" r="32.5273" gradientTransform="matrix(1 0 0 0.9792 0 -0.1651)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_6_)" d="M52.95,35.41c0.01,5.12-4.25,9.29-9.49,9.29c-5.229,0-9.49-4.17-9.49-9.29
+				c0-5.13,4.261-9.3,9.49-9.3C48.7,26.11,52.95,30.28,52.95,35.41z M51.36,35.8c0-4.05-3.38-7.34-7.53-7.34
+				c-4.14,0-7.521,3.29-7.521,7.34s3.381,7.34,7.521,7.34C47.98,43.14,51.36,39.85,51.36,35.8z"/>
+			<radialGradient id="SVGID_7_" cx="35.8291" cy="-22.8115" r="94.8253" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_7_)" d="M43.46,23.37c6.58,0,11.94,5.36,11.94,11.939c0,6.58-5.36,11.931-11.94,11.931
+				S31.52,41.89,31.52,35.31C31.52,28.73,36.88,23.37,43.46,23.37z M43.46,44.7c5.24,0,9.5-4.17,9.49-9.29c0-5.13-4.25-9.3-9.49-9.3
+				c-5.229,0-9.49,4.17-9.49,9.3C33.97,40.53,38.23,44.7,43.46,44.7z"/>
+			<path fill="#C7E7E2" d="M43.83,28.46c4.15,0,7.53,3.29,7.53,7.34s-3.38,7.34-7.53,7.34c-4.14,0-7.521-3.29-7.521-7.34
+				S39.69,28.46,43.83,28.46z M43.83,41.01c2.41,0,4.43-1.54,5.13-3.649c-1.32,0.949-3.13,1.529-5.13,1.529
+				c-1.99,0-3.8-0.58-5.12-1.529C39.4,39.47,41.43,41.01,43.83,41.01z M47.2,31.99c0-1.27-1.59-2.3-3.54-2.3s-3.54,1.03-3.54,2.3
+				c0,1.27,1.59,2.3,3.54,2.3S47.2,33.26,47.2,31.99z"/>
+			<radialGradient id="SVGID_8_" cx="43.46" cy="49.5918" r="24.4669" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#ECF3D7"/>
+				<stop  offset="0.118" style="stop-color:#ECF3D7"/>
+				<stop  offset="0.1687" style="stop-color:#E8F1D2"/>
+				<stop  offset="0.2376" style="stop-color:#DCEBC0"/>
+				<stop  offset="0.3169" style="stop-color:#C8E1A6"/>
+				<stop  offset="0.4041" style="stop-color:#ABD17D"/>
+				<stop  offset="0.4966" style="stop-color:#89BA4A"/>
+				<stop  offset="0.5562" style="stop-color:#6FA742"/>
+				<stop  offset="0.6403" style="stop-color:#649640"/>
+				<stop  offset="0.8093" style="stop-color:#456730"/>
+				<stop  offset="0.8315" style="stop-color:#435F2C"/>
+				<stop  offset="1" style="stop-color:#435F2C"/>
+			</radialGradient>
+			<path fill="url(#SVGID_8_)" d="M48.96,37.36c-0.7,2.109-2.72,3.649-5.13,3.649c-2.4,0-4.43-1.54-5.12-3.649
+				c1.32,0.949,3.13,1.529,5.12,1.529C45.83,38.89,47.64,38.31,48.96,37.36z"/>
+			
+				<radialGradient id="SVGID_9_" cx="43.6602" cy="29.6958" r="12.0249" gradientTransform="matrix(1 0 0 0.7648 0 6.9853)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#ECF3D7"/>
+				<stop  offset="0.118" style="stop-color:#ECF3D7"/>
+				<stop  offset="0.1687" style="stop-color:#E8F1D2"/>
+				<stop  offset="0.2376" style="stop-color:#DCEBC0"/>
+				<stop  offset="0.3169" style="stop-color:#C8E1A6"/>
+				<stop  offset="0.4041" style="stop-color:#ABD17D"/>
+				<stop  offset="0.4966" style="stop-color:#89BA4A"/>
+				<stop  offset="0.5562" style="stop-color:#6FA742"/>
+				<stop  offset="0.6403" style="stop-color:#649640"/>
+				<stop  offset="0.8093" style="stop-color:#456730"/>
+				<stop  offset="0.8315" style="stop-color:#435F2C"/>
+				<stop  offset="1" style="stop-color:#435F2C"/>
+			</radialGradient>
+			<path fill="url(#SVGID_9_)" d="M43.66,29.69c1.95,0,3.54,1.03,3.54,2.3c0,1.27-1.59,2.3-3.54,2.3s-3.54-1.03-3.54-2.3
+				C40.12,30.72,41.71,29.69,43.66,29.69z"/>
+			
+				<radialGradient id="SVGID_10_" cx="21.3496" cy="-52.5557" r="153.9519" gradientTransform="matrix(1 0 0 0.8933 0 -5.6061)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_10_)" d="M43.46,49.59v2.351H8.16c-0.02,0-0.05,0-0.07,0C7.77,51.93,7.47,51.89,7.17,51.81
+				C7.05,51.78,6.94,51.74,6.83,51.69c-0.09-0.03-0.17-0.061-0.25-0.101c-2.07-1-3.63-3.96-3.63-7.35V25.25
+				c0-3.78,2.39-6.97,5.21-6.97h35.3v2.74c-7.89,0-14.28,6.4-14.28,14.29C29.18,43.2,35.57,49.59,43.46,49.59z M22.91,25.23
+				c0-1.52-0.96-2.76-2.15-2.76h-9.39c-0.59,0-1.13,0.31-1.52,0.81s-0.63,1.19-0.63,1.95c0,1.52,0.96,2.76,2.15,2.76h9.39
+				C21.95,27.99,22.91,26.75,22.91,25.23z"/>
+			
+				<radialGradient id="SVGID_11_" cx="13.9121" cy="-10.2998" r="8.0314" gradientTransform="matrix(1 0 0 1.2812 0 2.8963)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_11_)" d="M20.76,22.47c1.19,0,2.15,1.24,2.15,2.76s-0.96,2.76-2.15,2.76h-9.39
+				c-1.19,0-2.15-1.24-2.15-2.76c0-0.76,0.24-1.45,0.63-1.95s0.93-0.81,1.52-0.81H20.76z M21.74,25.23c0-0.91-0.52-1.58-0.98-1.58
+				h-9.39c-0.46,0-0.98,0.67-0.98,1.58c0,0.9,0.52,1.58,0.98,1.58h9.39C21.22,26.81,21.74,26.13,21.74,25.23z"/>
+			<radialGradient id="SVGID_12_" cx="14.6943" cy="24.9346" r="205.8921" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_12_)" d="M20.76,23.65c0.46,0,0.98,0.67,0.98,1.58c0,0.9-0.52,1.58-0.98,1.58h-9.39
+				c-0.46,0-0.98-0.68-0.98-1.58c0-0.91,0.52-1.58,0.98-1.58H20.76z"/>
+			
+				<radialGradient id="SVGID_13_" cx="12.7402" cy="-9.3511" r="30.8866" gradientTransform="matrix(1 0 0 0.8122 0 -1.7558)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_13_)" d="M20.57,12.41c0.01,0.8-0.04,1.43-1.84,1.48c0.72-0.17,0.66-0.59,0.66-1.07
+				c0-0.15-0.04-0.28-0.12-0.41H20.57z"/>
+			
+				<radialGradient id="SVGID_14_" cx="12.7402" cy="-9.3511" r="30.8866" gradientTransform="matrix(1 0 0 0.8122 0 -1.7558)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_14_)" d="M20.57,12.18c0,0.07,0,0.15,0,0.23h-1.3c-0.25-0.44-0.97-0.74-2.23-0.74H14
+				c-0.87,0-1.54,0.13-1.99,0.33c-0.25,0.11-0.43,0.25-0.54,0.41h-1.43c0-0.07,0-0.15,0-0.23c0-0.48,0.32-0.91,0.9-1.22
+				c0.59-0.32,1.44-0.51,2.52-0.51h4.23C19.81,10.45,20.57,11.23,20.57,12.18z"/>
+			
+				<radialGradient id="SVGID_15_" cx="14.6938" cy="5.5679" r="17.8499" gradientTransform="matrix(1 0 0 0.7104 0 1.6123)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_15_)" d="M19.39,12.82c0,0.48,0.06,0.9-0.66,1.07c-0.09,0.01-0.19,0.01-0.29,0.01h-6.28
+				c-0.04,0-0.08,0-0.12,0c-0.72-0.18-0.72-0.59-0.72-1.08c0-0.15,0.05-0.28,0.15-0.41h7.8C19.35,12.54,19.39,12.67,19.39,12.82z"/>
+			
+				<radialGradient id="SVGID_16_" cx="14.6938" cy="5.5679" r="17.8499" gradientTransform="matrix(1 0 0 0.7104 0 1.6123)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_16_)" d="M19.27,12.41h-7.8c0.11-0.16,0.29-0.3,0.54-0.41c0.45-0.2,1.12-0.33,1.99-0.33h3.04
+				C18.3,11.67,19.02,11.97,19.27,12.41z"/>
+			
+				<radialGradient id="SVGID_17_" cx="14.6938" cy="5.5679" r="17.8499" gradientTransform="matrix(1 0 0 0.7104 0 1.6123)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_17_)" d="M18.44,13.9c0.1,0,0.2,0,0.29-0.01c-0.23,0.06-0.55,0.09-0.97,0.09h-4.81
+				c-0.39,0-0.69-0.03-0.91-0.08c0.04,0,0.08,0,0.12,0H18.44z"/>
+			
+				<radialGradient id="SVGID_18_" cx="12.7402" cy="-9.3511" r="30.8866" gradientTransform="matrix(1 0 0 0.8122 0 -1.7558)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_18_)" d="M11.32,12.82c0,0.49,0,0.9,0.72,1.08c-1.83-0.03-1.99-0.67-2-1.49h1.43
+				C11.37,12.54,11.32,12.67,11.32,12.82z"/>
+			<radialGradient id="SVGID_19_" cx="35.4385" cy="8.1074" r="208.6478" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_19_)" d="M7.17,51.81c0.3,0.08,0.6,0.12,0.92,0.131C7.78,51.94,7.47,51.9,7.17,51.81z"/>
+			
+				<radialGradient id="SVGID_20_" cx="21.3496" cy="-52.5557" r="153.9519" gradientTransform="matrix(1 0 0 0.8933 0 -5.6061)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_20_)" d="M6.58,51.59c0.08,0.04,0.16,0.07,0.25,0.101C6.75,51.67,6.66,51.63,6.58,51.59z"/>
+			
+				<radialGradient id="SVGID_21_" cx="21.3496" cy="-52.5557" r="153.9519" gradientTransform="matrix(1 0 0 0.8933 0 -5.6061)" gradientUnits="userSpaceOnUse">
+				<stop  offset="0" style="stop-color:#F9F9FA"/>
+				<stop  offset="0.2487" style="stop-color:#F6F6F6"/>
+				<stop  offset="0.4454" style="stop-color:#ECECEC"/>
+				<stop  offset="0.6244" style="stop-color:#DCDBDB"/>
+				<stop  offset="0.7929" style="stop-color:#C4C4C4"/>
+				<stop  offset="0.9525" style="stop-color:#A7A6A6"/>
+				<stop  offset="1" style="stop-color:#9B9B9B"/>
+			</radialGradient>
+			<path fill="url(#SVGID_21_)" d="M6.58,51.59c-2.08-0.91-3.63-3.57-3.63-6.62V44.24C2.95,47.63,4.51,50.59,6.58,51.59z"/>
+		</g>
+		<g>
+			<path fill="none" stroke="#FFFFFF" d="M20.76,26.81h-9.39c-0.46,0-0.98-0.68-0.98-1.58c0-0.91,0.52-1.58,0.98-1.58h9.39
+				c0.46,0,0.98,0.67,0.98,1.58C21.74,26.13,21.22,26.81,20.76,26.81z"/>
+		</g>
+	</g>
+</g>
+<line fill="none" x1="15.306" y1="4.5" x2="47.2" y2="4.5"/>
+<path fill="#EF4529" stroke="#000000" stroke-width="4" d="M31.52,35.31"/>
+<path fill="#EF4529" stroke="#000000" d="M19.392,29.69"/>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/group/Application.mmp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,123 @@
+/*
+ * Name        : Application.mmp
+ * Description : Project definition
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+TARGET          OpenMAR_0x2002E1AB.exe
+TARGETTYPE      exe
+UID             0x100039CE 0x2002E1AB
+
+EPOCSTACKSIZE   0x4000
+EPOCHEAPSIZE    0x100000 0x1000000
+
+MACRO           __DEBUG__
+
+SOURCEPATH      ..\ui\src
+SOURCE          Application.cpp
+SOURCE          AppUi.cpp
+SOURCE          Document.cpp
+
+SOURCE          SplashView.cpp
+SOURCE          SplashContainer.cpp
+
+SOURCE          ARView.cpp
+SOURCE          ARContainer.cpp
+
+SOURCEPATH      ..\engine\src
+SOURCE          Camera.cpp
+SOURCE          ConnectionManager.cpp
+SOURCE          Screenshot.cpp
+SOURCE          SettingManager.cpp
+
+SOURCEPATH      ..\..\common\src
+SOURCE          HttpClient.cpp
+SOURCE          IconLoader.cpp
+SOURCE          Logger.cpp
+
+
+SOURCEPATH      ..\data
+
+START RESOURCE  Application.rss
+HEADER
+TARGET OpenMAR_0x2002E1AB
+TARGETPATH resource\apps
+END //RESOURCE
+
+START RESOURCE	Application_reg.rss
+TARGET OpenMAR_0x2002E1AB_reg
+TARGETPATH 	  \private\10003a3f\apps
+END //RESOURCE
+
+USERINCLUDE     ..\..\common\inc
+USERINCLUDE	    ..\ui\inc
+USERINCLUDE     ..\engine\inc
+
+USERINCLUDE     ..\..\interface
+USERINCLUDE     ..\..\interface\overlay
+USERINCLUDE     ..\..\interface\provider
+
+SYSTEMINCLUDE	 \epoc32\include
+
+LIBRARY         euser.lib
+LIBRARY         apparc.lib
+LIBRARY         cone.lib
+LIBRARY         eikcore.lib
+LIBRARY         eikcoctl.lib
+LIBRARY         eikctl.lib
+LIBRARY         avkon.lib
+LIBRARY         commonengine.lib
+LIBRARY         efsrv.lib
+LIBRARY         estor.lib
+LIBRARY         aknnotify.lib
+
+LIBRARY         ws32.lib
+LIBRARY         gdi.lib
+LIBRARY         bitgdi.lib
+LIBRARY         fbscli.lib
+LIBRARY         egul.lib
+LIBRARY         ImageConversion.lib
+LIBRARY         AknIcon.lib
+
+LIBRARY         hal.lib
+LIBRARY         charconv.lib
+
+LIBRARY         ConnMon.lib
+LIBRARY         CommDb.lib
+LIBRARY         etel3rdparty.lib
+
+LIBRARY         esock.lib
+LIBRARY         http.lib
+LIBRARY         inetprotutil.lib
+LIBRARY         bafl.lib
+LIBRARY         PlatformEnv.lib
+
+LIBRARY         SenXml.lib
+LIBRARY         XmlFramework.lib
+
+LIBRARY         ecam.lib
+LIBRARY         ecamadvsettings.lib
+
+LIBRARY         ecom.lib
+
+LIBRARY         eposlandmarks.lib
+
+
+LANG SC
+
+VENDORID	  	0x700001D2
+SECUREID		0x2002E1AB
+CAPABILITY      LocalServices Location NetworkServices ReadUserData ReadDeviceData SwEvent UserEnvironment WriteDeviceData WriteUserData
+
+#ifdef ENABLE_ABIV2_MODE
+DEBUGGABLE
+#endif
+USERINCLUDE ..\..\interface\object
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/group/Button.mk	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,62 @@
+#/*
+# * Name        : Button.mk
+# * Description : Application buttons makefile
+# * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+# * Website     : http://OpenMAR.org
+# *
+# * Copyright (c) 2010 David Caabeiro
+# *
+# * All rights reserved. This program and the accompanying materials are made available 
+# * under the terms of the Eclipse Public License v1.0 which accompanies this 
+# * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+# *
+# */
+
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\Z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\Button_0x2002E1AB.mif
+
+HEADERDIR=$(EPOCROOT)epoc32\include
+HEADERFILENAME=$(HEADERDIR)\Button_0x2002E1AB.mbg
+
+ICONDIR=..\gfx
+
+do_nothing :
+	@rem do_nothing
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+CLEAN : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+# ----------------------------------------------------------------------------
+# NOTE: if you have JUSTINTIME enabled for your S60 3rd FP1 or newer SDK
+# and this command crashes, consider adding "/X" to the command line.
+# See <http://forum.nokia.com/document/Forum_Nokia_Technical_Library_v1_35/contents/FNTL/Build_process_fails_at_mif_file_creation_in_S60_3rd_Ed_FP1_SDK.htm>
+# ----------------------------------------------------------------------------
+
+RESOURCE : $(ICONTARGETFILENAME)
+
+$(ICONTARGETFILENAME) : 
+	mifconv $(ICONTARGETFILENAME) /h$(HEADERFILENAME) \
+		/c24,8 $(ICONDIR)\ScreenshotButtonNormal.svg
+
+FREEZE : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+	@echo $(HEADERFILENAME)&& \
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : do_nothing
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/group/Icon.mk	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,58 @@
+#/*
+# * Name        : Icon.mk
+# * Description : Application icon makefile
+# * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+# * Website     : http://OpenMAR.org
+# *
+# * Copyright (c) 2010 David Caabeiro
+# *
+# * All rights reserved. This program and the accompanying materials are made available 
+# * under the terms of the Eclipse Public License v1.0 which accompanies this 
+# * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+# *
+# */
+
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\Z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\OpenMAR_0x2002E1AB.mif
+
+ICONDIR=..\gfx
+
+do_nothing :
+	@rem do_nothing
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+CLEAN : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+# ----------------------------------------------------------------------------
+# NOTE: if you have JUSTINTIME enabled for your S60 3rd FP1 or newer SDK
+# and this command crashes, consider adding "/X" to the command line.
+# See <http://forum.nokia.com/document/Forum_Nokia_Technical_Library_v1_35/contents/FNTL/Build_process_fails_at_mif_file_creation_in_S60_3rd_Ed_FP1_SDK.htm>
+# ----------------------------------------------------------------------------
+
+RESOURCE : $(ICONTARGETFILENAME)
+
+$(ICONTARGETFILENAME) : $(ICONDIR)\Application.svg
+	mifconv $(ICONTARGETFILENAME)  \
+		 /c32 $(ICONDIR)\Application.svg
+
+FREEZE : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : do_nothing
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/inc/ARContainer.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,105 @@
+/*
+ * Name        : ARContainer.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef __ARCONTAINER_H__
+#define __ARCONTAINER_H__
+
+#include <coecntrl.h>
+#include <coecobs.h>
+#include <AknButton.h>
+
+#include "POIOverlay.h"
+#include "Camera.h"
+#include "Screenshot.h"
+
+class CAknView;
+
+/**
+ * @brief AR control class
+ * 
+ * This class provides the basic view and is in charge of initializing the camera, 
+ * which dictates the refresh rate of the overlays
+ */
+class CARContainer : public CCoeControl,
+            public MCoeControlObserver,
+            public MCoeForegroundObserver,
+            public CDigitalCamera::MObserver,
+            public CScreenshot::MObserver
+{
+public:
+    static CARContainer* NewL(CAknView& aView, const TRect& aRect);
+    ~CARContainer();
+
+private:
+    CARContainer(CAknView& aView);
+    void ConstructL(const TRect& aRect);
+
+    void CreateButtonGroupL();
+    void DeleteButtonGroup();
+
+    static TInt SensorStart(TAny* aPtr);
+    void DoSensorStart();
+
+    static TInt SensorStop(TAny* aPtr);
+    void DoSensorStop();
+
+    void ScreenshotStartL();
+    void ScreenshotStop();
+
+protected:
+    void SizeChanged();
+    void HandlePointerEventL(const TPointerEvent& aPointerEvent);
+    void HandleResourceChange(TInt aType);
+    void Draw(const TRect& aRect) const;
+
+    TInt CountComponentControls() const;
+    CCoeControl* ComponentControl(TInt aIndex) const;
+
+protected:
+    // From MCoeControlObserver
+    void HandleControlEventL(CCoeControl* aControl, TCoeEvent aEventType);
+
+    // From MCoeForegroundObserver
+    void HandleGainingForeground();
+    void HandleLosingForeground();
+
+    // From CDigitalCamera::MObserver
+    void CameraReady(TInt aError);
+    void CameraFrame(CFbsBitmap& aFrame);
+    void FocusReady(TInt aError);
+
+    // From CScreenshot::MObserver
+    void ScreenshotReadyL(TInt aError, const TDesC& aFilename);
+
+private:
+    CAknView& iView;
+    CAknButton* iScreenshotButton;
+
+    CFbsBitmap* iBitmap;
+    CFbsBitmapDevice* iBitmapDevice;
+    CFbsBitGc* iBitmapContext;
+
+    enum TButtonId {
+        EScreenshot,
+        ETotal
+    };
+
+private:
+    RPointerArray<OpenMAR::CPOIOverlay> iOverlayList;
+    CDigitalCamera* iCamera;
+    CScreenshot* iScreenshot;
+    CIdle* iSensorTask;
+};
+
+#endif // __ARCONTAINER_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/inc/ARView.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,54 @@
+/*
+ * Name        : ARView.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef __ARVIEW_H__
+#define __ARVIEW_H__
+
+#include <AknView.h>
+
+#include <AknToolbar.h>
+#include <AknToolbarExtension.h>
+#include <AknToolbarObserver.h>
+
+class CARContainer;
+
+/**
+ * @brief AR Avkon view
+ */
+class CARView : public CAknView, public MAknToolbarObserver
+{
+public:
+    static CARView* NewL();
+    ~CARView();
+
+protected:
+    CARView();
+    void ConstructL();
+
+protected:
+    TUid Id() const;
+    void DoActivateL(const TVwsViewId& aPrevViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage);
+    void DoDeactivate();
+
+    void DynInitToolbarL(TInt aResourceId, CAknToolbar* aToolbar);
+
+    void OfferToolbarEventL(TInt aCommand);
+    void HandleCommandL(TInt aCommand);
+
+private:
+    TVwsViewId iPrevViewId;
+    CARContainer* iRenderer;
+};
+
+#endif  // __ARVIEW_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/inc/AppUi.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,36 @@
+/*
+ * Name        : AppUi.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef __APPUI_H__
+#define __APPUI_H__
+
+#include <AknViewAppUi.h>
+
+class CSettingManager;
+
+class CAppUi : public CAknViewAppUi
+{
+public:
+    void ConstructL();
+    ~CAppUi();
+
+private:
+    void HandleCommandL(TInt aCommand);
+    CArrayFix<TCoeHelpContext>* HelpContextL() const;
+
+private:
+    CSettingManager* iSetting;
+};
+
+#endif // __APPUI_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/inc/Application.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,32 @@
+/*
+ * Name        : Application.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef __APPLICATION_H__
+#define __APPLICATION_H__
+
+#include <aknapp.h>
+#include "Application.hrh"
+
+const TUid KUidApplication = { _UID3 };
+
+class CApplication : public CAknApplication
+{
+public:
+    TUid AppDllUid() const;
+
+protected:
+    CApaDocument* CreateDocumentL();
+};
+
+#endif // __APPLICATION_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/inc/Application.hrh	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,36 @@
+/*
+ * Name        : Application.hrh
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef __APPLICATION_HRH__
+#define __APPLICATION_HRH__
+
+#define _UID3 0x2002E1AB
+
+enum TViewId {
+    ESplashView,
+    EARView
+};
+
+enum TDialogId
+{
+    EDialogWait = 0x3000
+};
+
+enum TCommandId
+{
+    EHelp = 0x6000,
+    EAbout
+};
+
+#endif // __APPLICATION_HRH__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/inc/Application.pan	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,29 @@
+/*
+ * Name        : Application.pan
+ * Description : Panic definitions
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef __APPLICATION_PAN__
+#define __APPLICATION_PAN__
+
+enum TApplicationPanic
+{
+
+};
+
+inline void Panic(TApplicationPanic aReason)
+{
+    _LIT(appName, "OpenMAR");
+    User::Panic(appName, aReason);
+}
+
+#endif // __APPLICATION_PAN__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/inc/Document.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,45 @@
+/*
+ * Name        : Document.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef __DOCUMENT_H__
+#define __DOCUMENT_H__
+
+#include <akndoc.h>
+
+class CAppUi;
+class CEikApplication;
+
+class CDocument : public CAknDocument
+{
+public:
+    static CDocument* NewL(CEikApplication& aApp);
+    static CDocument* NewLC(CEikApplication& aApp);
+    virtual ~CDocument();
+
+public:
+    /**
+     * CreateAppUiL
+     * From CEikDocument, CreateAppUiL.
+     * Create a CcamAppUi object and return a pointer to it.
+     * The object returned is owned by the Uikon framework.
+     * @return Pointer to created instance of AppUi.
+     */
+    CEikAppUi* CreateAppUiL();
+
+private:
+    void ConstructL();
+    CDocument(CEikApplication& aApp);
+};
+
+#endif // __DOCUMENT_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/inc/SplashContainer.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,46 @@
+/*
+ * Name        : SplashContainer.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef SPLASHCONTAINER_H_
+#define SPLASHCONTAINER_H_
+
+#include <coecntrl.h>
+#include <coemain.h>
+
+class CAknView;
+class CFbsBitmap;
+class CGulIcon;
+
+class CSplashContainer : public CCoeControl
+{
+public:
+    CSplashContainer(CAknView& aView);
+    ~CSplashContainer();
+    void ConstructL(const TRect& aRect, const CCoeControl* aParent = 0);
+
+protected:
+    void HandleResourceChange(TInt aType);
+    void Draw(const TRect& aRect) const;
+
+private:
+    CAknView& iView;
+
+    CFbsBitmap* iBitmap;
+    CFbsBitmapDevice* iBitmapDevice;
+    CFbsBitGc* iBitmapContext;
+
+    CGulIcon* iBackground;
+};
+
+#endif  // SPLASHCONTAINER_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/inc/SplashView.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,52 @@
+/*
+ * Name        : SplashView.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef SPLASHVIEW_H_
+#define SPLASHVIEW_H_
+
+#include <AknView.h>
+
+#include "ConnectionManager.h"
+
+class CSettingManager;
+class CSplashContainer;
+
+class CSplashView : public CAknView,
+        public MConnectionManager
+{
+public:
+    static CSplashView* NewL(CSettingManager& aSetting);
+    ~CSplashView();
+
+protected:
+    CSplashView(CSettingManager& aSetting);
+    void ConstructL();
+
+    // From MConnectionManager
+    void ConnectionStartedL(TInt aError);
+
+protected:
+    TUid Id() const;
+    void DoActivateL(const TVwsViewId& aPrevViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage);
+    void DoDeactivate();
+
+    void HandleCommandL(TInt aCommand);
+
+private:
+    CSettingManager& iSetting;
+    CConnectionManager* iConnection;
+    CSplashContainer* iContainer;
+};
+
+#endif  // SPLASHVIEW_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/src/ARContainer.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,371 @@
+/*
+ * Name        : ARContainer.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "ARContainer.h"
+
+#include <coemain.h>
+#include <eikenv.h>
+
+#include <AknButton.h>
+#include <AknNoteWrappers.h>
+#include <AknView.h>
+
+#include "Application.hrh"
+
+#include <OpenMAR_0x2002E1AB.rsg>
+#include <Button_0x2002E1AB.mbg>
+
+#include "IconLoader.h"
+#include "ResetAndDestroy.h"
+
+#include "Logger.h"
+
+// Constant definitions
+_LIT(KButtonFile, "\\resource\\apps\\Button_0x2002E1AB.mif");
+const TSize KButtonSize(36, 36);
+
+CARContainer* CARContainer::NewL(CAknView& aView, const TRect& aRect)
+{
+    CARContainer* self = new(ELeave) CARContainer(aView);
+    CleanupStack::PushL(self);
+    self->ConstructL(aRect);
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CARContainer::CARContainer(CAknView& aView)
+    : iView(aView)
+{}
+
+void CARContainer::ConstructL(const TRect& aRect)
+{
+    CreateWindowL();
+
+    CreateButtonGroupL();
+
+    // This bitmap will contain the camera frame and overlays
+    iBitmap = new(ELeave) CFbsBitmap;
+    iBitmap->Create(aRect.Size(), Window().DisplayMode());
+
+    iBitmapDevice = CFbsBitmapDevice::NewL(iBitmap);
+    User::LeaveIfError(iBitmapDevice->CreateContext(iBitmapContext));
+
+    // Make black background to be shown immediately to the user 
+    iBitmapContext->SetBrushColor(KRgbBlack);
+    iBitmapContext->SetBrushStyle(CFbsBitGc::ESolidBrush);
+    iBitmapContext->Clear();
+
+    SetRect(aRect);
+
+    LOGARG("Control rect size is %d x %d", aRect.Width(), aRect.Height());
+
+    iCoeEnv->AddForegroundObserverL(*this);
+
+#if defined(__MARM__)
+    iCamera = CDigitalCamera::NewL(*this);
+
+    // The rect will be the intersection between the camera frame
+    // and the window rect
+    TRect cameraRect(TPoint(0, 0), iCamera->ViewportSize());
+    cameraRect.Intersection(aRect);
+#else
+    TRect cameraRect(aRect);
+#endif
+
+    LOGARG("Viewport rect is (%d, %d, %d, %d)", 
+            cameraRect.iTl.iX, cameraRect.iTl.iY, cameraRect.iBr.iX, cameraRect.iBr.iY);
+
+    iScreenshot = CScreenshot::NewL(*this, cameraRect.Size(), Window().DisplayMode());
+
+    // Instantiate overlay implementations
+    RImplInfoPtrArray implementations;
+    REComSession::ListImplementationsL(TUid::Uid(KOverlayInterfaceUidValue), implementations);
+    CleanupResetAndDestroyPushL(implementations);
+
+    // Pass container window and rect size to each overlay
+    OpenMAR::CPOIOverlay::SParameter param = { Window(), cameraRect };
+
+    for (TInt i = 0; i < implementations.Count(); ++i)
+    {
+        const CImplementationInformation* info = implementations[i];
+        OpenMAR::CPOIOverlay* plugin = OpenMAR::CPOIOverlay::NewL(info->ImplementationUid(), param);
+        iOverlayList.AppendL(plugin);
+    }
+
+    CleanupStack::PopAndDestroy(&implementations);
+
+    // Start camera in low priority task
+    iSensorTask = CIdle::NewL(CActive::EPriorityIdle);
+
+    TCallBack sensorStart(SensorStart, this);
+    iSensorTask->Start(sensorStart);
+
+    ActivateL();
+}
+
+CARContainer::~CARContainer()
+{
+    DoSensorStop();
+
+    iOverlayList.ResetAndDestroy();
+    iOverlayList.Close();
+
+    delete iCamera;
+    delete iScreenshot;
+
+    iCoeEnv->RemoveForegroundObserver(*this);
+
+    delete iBitmapContext;
+    delete iBitmapDevice;
+    delete iBitmap;
+
+    DeleteButtonGroup();
+}
+
+void CARContainer::CreateButtonGroupL()
+{
+    // Screenshot button
+    CGulIcon* screenshotNormal = CreateIconL(KButtonFile, EMbmButton_0x2002e1abScreenshotbuttonnormal, EMbmButton_0x2002e1abScreenshotbuttonnormal_mask, KButtonSize);
+
+    iScreenshotButton = CAknButton::NewL(screenshotNormal, 0, 0, 0, KNullDesC, KNullDesC, KAknButtonNoFrame, 0);
+    iScreenshotButton->SetContainerWindowL(*this);
+    iScreenshotButton->SetObserver(this);
+}
+
+void CARContainer::DeleteButtonGroup()
+{
+    delete iScreenshotButton;
+}
+
+TInt CARContainer::SensorStart(TAny* aPtr)
+{
+    CARContainer* self = static_cast<CARContainer*>(aPtr);
+    self->DoSensorStart();
+    return KErrNone;
+}
+
+void CARContainer::DoSensorStart()
+{
+    LOGTXT("Starting sensors..");
+
+#if defined(__MARM__)
+    iCamera->Start();
+#endif
+
+    for (TInt i = 0; i < iOverlayList.Count(); ++i)
+        iOverlayList[i]->StartL();
+}
+
+TInt CARContainer::SensorStop(TAny* aPtr)
+{
+    CARContainer* self = static_cast<CARContainer*>(aPtr);
+    self->DoSensorStop();
+    return KErrNone;
+}
+
+void CARContainer::DoSensorStop()
+{
+    LOGTXT("Stopping sensors..");
+
+    for (TInt i = 0; i < iOverlayList.Count(); ++i)
+        iOverlayList[i]->Stop();
+
+#if defined(__MARM__)
+    iCamera->Stop();
+#endif
+}
+
+/*
+ * Before performing the screenshot, disable overlay and sensor activity.
+ * This way the screenshot image is generated fast.
+ */  
+
+void CARContainer::ScreenshotStartL()
+{
+    iScreenshotButton->SetDimmed(ETrue);
+
+    HandleLosingForeground();
+    iScreenshot->RequestL(*iBitmap, iBitmap->SizeInPixels());
+}
+
+/*
+ * Resume overlay and sensor activity.
+ */
+void CARContainer::ScreenshotStop()
+{
+    HandleGainingForeground();
+
+    iScreenshotButton->SetDimmed(EFalse);
+}
+
+void CARContainer::SizeChanged()
+{
+    TRect screenshotButtonRect(TPoint(0, 0), KButtonSize);
+    screenshotButtonRect.Move(TPoint(Rect().Width() - KButtonSize.iWidth, Rect().Height() - KButtonSize.iHeight));
+
+    iScreenshotButton->SetRect(screenshotButtonRect);
+}
+
+void CARContainer::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+{
+//    if (aPointerEvent.iType == TPointerEvent::EButton1Down && iCamera)
+//        iCamera->StartFocus();
+    CCoeControl::HandlePointerEventL(aPointerEvent);
+}
+
+void CARContainer::HandleResourceChange(TInt aType)
+{
+    LOGARG("CARContainer::HandleResourceChange(%d)", aType);
+
+    CCoeControl::HandleResourceChange(aType);
+/*
+    if (aType == KEikDynamicLayoutVariantSwitch)
+    {
+        TRect rect;
+        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EApplicationWindow, rect);
+        SetRect(rect);
+    }
+*/
+}
+
+void CARContainer::Draw(const TRect& /*aRect*/) const
+{
+    CWindowGc& gc = SystemGc();
+    gc.BitBlt(TPoint(0, 0), iBitmap);
+}
+
+TInt CARContainer::CountComponentControls() const
+{
+    return ETotal;
+}
+
+CCoeControl* CARContainer::ComponentControl(TInt aIndex) const
+{
+    switch (aIndex)
+    {
+        case EScreenshot:
+            return iScreenshotButton;
+
+        default:
+            return 0;
+    }
+}
+
+void CARContainer::HandleControlEventL(CCoeControl* aControl, TCoeEvent aEventType)
+{
+    if (aEventType == EEventStateChanged)
+    {
+        if (aControl == iScreenshotButton)
+        {
+            LOGTXT("Screenshot requested");
+
+            ScreenshotStartL();
+        }
+    }
+}
+
+void CARContainer::HandleGainingForeground()
+{
+    LOGTXT("Gaining ForegroundL");
+
+    // Clear bitmap to avoid showing screen capture when back
+    iBitmapContext->SetBrushColor(KRgbBlack);
+    iBitmapContext->SetBrushStyle(CGraphicsContext::ESolidBrush);
+    iBitmapContext->Clear();
+
+    iSensorTask->Cancel();
+    TCallBack sensor(SensorStart, this);
+    iSensorTask->Start(sensor);
+}
+
+void CARContainer::HandleLosingForeground()
+{
+    LOGTXT("Losing foreground");
+/*
+    iSensorTask->Cancel();
+    TCallBack sensor(SensorStop, this);
+    iSensorTask->Start(sensor);
+*/
+    DoSensorStop();
+}
+
+void CARContainer::CameraReady(TInt aError)
+{
+    LOGARG("Camera ready (error %d)", aError);
+
+    // Perform some error handling
+}
+
+void CARContainer::CameraFrame(CFbsBitmap& aFrame)
+{
+    // Use camera frame as background
+    iBitmapContext->BitBlt(TPoint(0, 0), &aFrame);
+
+    for (TInt i = 0; i < iOverlayList.Count(); ++i)
+    {
+        // Perform overlay rendering
+        const CFbsBitmap& overlay = iOverlayList[i]->RenderScene();
+        // Blend it with the background image
+        iBitmapContext->BitBlt(TPoint(0, 0), &overlay);
+    }
+
+    const CFont* font = iEikonEnv->LegendFont();
+    iBitmapContext->UseFont(font);
+
+    _LIT(KText, "Focus: %d");
+    TBuf<32> text;
+    text.Format(KText, iOverlayList[0]->GetFocusedPOI());
+
+    const TPoint pos(10, 20);
+
+    iBitmapContext->DrawText(text, pos);
+
+    // TODO: should call this every Nth frame
+    User::ResetInactivityTime();
+
+    DrawNow();
+}
+
+void CARContainer::FocusReady(TInt aError)
+{
+    if (aError == KErrNone)
+        LOGTXT("Focused correctly");
+//    else if (aError == KErrECamNotOptimalFocus)
+//        LOGTXT("Focus not optimal");
+}
+
+void CARContainer::ScreenshotReadyL(TInt aError, const TDesC& aFilename)
+{
+    ScreenshotStop();
+
+    TBuf<128> text;
+
+    if (aError)
+    {
+        CAknErrorNote* note = new(ELeave) CAknErrorNote;
+        HBufC* format = iEikonEnv->AllocReadResourceLC(R_SCREENSHOT_TEXT_ERROR);
+        text.Format(*format, aError);
+        CleanupStack::PopAndDestroy(format);
+        note->ExecuteLD(text);
+    }
+    else
+    {
+        CAknInformationNote* note = new(ELeave) CAknInformationNote;
+        HBufC* format = iEikonEnv->AllocReadResourceLC(R_SCREENSHOT_TEXT_OK);
+        text.Format(*format, &aFilename);
+        CleanupStack::PopAndDestroy(format);
+        note->ExecuteLD(text);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/src/ARView.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,108 @@
+/*
+ * Name        : ARView.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "ARView.h"
+
+#include <AknViewAppui.h>
+
+#include <OpenMAR_0x2002E1AB.rsg>
+
+#include "Application.hrh"
+
+#include "ARContainer.h"
+
+#include <AknUtils.h>
+
+#include "Logger.h"
+
+CARView* CARView::NewL()
+{
+    CARView* self = new(ELeave) CARView();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CARView::~CARView()
+{
+    DoDeactivate();
+}
+
+CARView::CARView()
+{}
+
+void CARView::ConstructL()
+{
+    BaseConstructL(R_AR_VIEW);
+}
+
+TUid CARView::Id() const
+{
+    return TUid::Uid(EARView);
+}
+
+void CARView::DoActivateL(const TVwsViewId& aPrevViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage)
+{
+    LOGTXT("CARView::DoActivateL()");
+
+    if (!iRenderer)
+    {
+        iPrevViewId = aPrevViewId;
+
+        // Make status pane invisible
+        CEikStatusPane* statusPane = StatusPane();
+        if (statusPane)
+            statusPane->MakeVisible(EFalse);
+
+        iRenderer = CARContainer::NewL(*this, AppUi()->ApplicationRect());
+
+        AppUi()->AddToStackL(*this, iRenderer);
+    }
+}
+
+void CARView::DoDeactivate()
+{
+    if (iRenderer)
+    {
+        AppUi()->RemoveFromViewStack(*this, iRenderer);
+
+        delete iRenderer;
+        iRenderer = 0;
+    }
+}
+
+void CARView::DynInitToolbarL(TInt aResourceId, CAknToolbar* aToolbar)
+{
+}
+
+void CARView::OfferToolbarEventL(TInt aCommand)
+{
+//    HandleCommandL(aCommand);
+}
+
+void CARView::HandleCommandL(TInt aCommand)
+{
+    switch (aCommand)
+    {
+        case EAknSoftkeyBack:
+            AppUi()->ActivateLocalViewL(iPrevViewId.iViewUid);
+            break;
+
+        default:
+            AppUi()->HandleCommandL(aCommand);
+            break;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/src/AppUi.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,120 @@
+/*
+ * Name        : AppUi.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "AppUi.h"
+
+#include <avkon.hrh>
+#include <AknMessageQueryDialog.h>
+#include <AknNoteWrappers.h>
+#include <stringloader.h>
+#include <hlplch.h>
+
+#include <OpenMAR_0x2002E1AB.rsg>
+
+#include "Application.hrh"
+#include "Application.pan"
+#include "Application.h"
+
+#include "SettingManager.h"
+
+#include "SplashView.h"
+#include "ARView.h"
+
+#include "Logger.h"
+
+void CAppUi::ConstructL()
+{
+    LOGTXT("Creating AppUi");
+
+    BaseConstructL(EAknEnableSkin | EAppOrientationLandscape);
+//    BaseConstructL(EAknEnableSkin);
+
+    iSetting = CSettingManager::NewL();
+
+    // Set up splash view and make it default
+    CAknView* splashView = CSplashView::NewL(*iSetting);
+    CleanupStack::PushL(splashView);
+    AddViewL(splashView);
+    CleanupStack::Pop(splashView);
+
+    SetDefaultViewL(*splashView);
+
+    CAknView* arView = CARView::NewL();
+    CleanupStack::PushL(arView);
+    AddViewL(arView);
+    CleanupStack::Pop(arView);
+}
+
+CAppUi::~CAppUi()
+{
+    delete iSetting;
+
+    REComSession::FinalClose();
+}
+
+void CAppUi::HandleCommandL(TInt aCommand)
+{
+    switch (aCommand)
+    {
+        case EEikCmdExit:
+        case EAknSoftkeyExit:
+            Exit();
+            break;
+/*
+        case EHelp:
+        {
+            CArrayFix<TCoeHelpContext>* buf = CCoeAppUi::AppHelpContextL();
+            HlpLauncher::LaunchHelpApplicationL(iEikonEnv->WsSession(), buf);
+        }
+        break;
+*/
+        case EAbout:
+        {
+            CAknMessageQueryDialog* dlg = new (ELeave)CAknMessageQueryDialog();
+            dlg->PrepareLC(R_ABOUT_QUERY_DIALOG);
+            HBufC* title = iEikonEnv->AllocReadResourceLC(R_ABOUT_DIALOG_TITLE);
+            dlg->QueryHeading()->SetTextL(*title);
+            CleanupStack::PopAndDestroy(title);
+            HBufC* msg = iEikonEnv->AllocReadResourceLC(R_ABOUT_DIALOG_TEXT);
+            dlg->SetMessageTextL(*msg);
+            CleanupStack::PopAndDestroy(msg);
+            dlg->RunLD();
+        }
+        break;
+
+        default:
+//            Panic();
+            break;
+    }
+}
+
+CArrayFix<TCoeHelpContext>* CAppUi::HelpContextL() const
+{
+#warning "Please see comment about help and UID3..."
+// Note: Help will not work if the application uid3 is not in the
+// protected range.  The default uid3 range for projects created
+// from this template (0xE0000000 - 0xEFFFFFFF) are not in the protected range so that they
+// can be self signed and installed on the device during testing.
+// Once you get your official uid3 from Symbian Ltd. and find/replace
+// all occurrences of uid3 in your project, the context help will
+// work.
+/*
+    CArrayFixFlat<TCoeHelpContext>* array = new(ELeave) CArrayFixFlat<TCoeHelpContext>(1);
+    CleanupStack::PushL(array);
+    array->AppendL(TCoeHelpContext(KUidApplication, KGeneral_Information));
+    CleanupStack::Pop(array);
+    return array;
+*/
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/src/Application.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,40 @@
+/*
+ * Name        : Application.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Application.h"
+
+#include <eikstart.h>
+
+#include "Application.hrh"
+#include "Document.h"
+
+CApaDocument* CApplication::CreateDocumentL()
+{
+    return CDocument::NewL(*this);
+}
+
+TUid CApplication::AppDllUid() const
+{
+    return KUidApplication;
+}
+
+LOCAL_C CApaApplication* NewApplication()
+{
+    return new CApplication;
+}
+
+GLDEF_C TInt E32Main()
+{
+    return EikStart::RunApplication(NewApplication);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/src/Document.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,53 @@
+/*
+ * Name        : Document.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Document.h"
+
+#include "AppUi.h"
+
+#include "Logger.h"
+
+CDocument* CDocument::NewL(CEikApplication& aApp)
+{
+    CDocument* self = NewLC(aApp);
+    CleanupStack::Pop(self);
+    return self;
+}
+
+CDocument* CDocument::NewLC(CEikApplication& aApp)
+{
+    CDocument* self = new(ELeave) CDocument(aApp);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+}
+
+void CDocument::ConstructL()
+{
+}
+
+CDocument::CDocument(CEikApplication& aApp)
+    : CAknDocument(aApp)
+{
+}
+
+CDocument::~CDocument()
+{
+    LOGCLOSE
+}
+
+CEikAppUi* CDocument::CreateAppUiL()
+{
+    return new(ELeave) CAppUi;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/src/SplashContainer.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,95 @@
+/*
+ * Name        : SplashContainer.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "SplashContainer.h"
+
+#include <AknDef.h>
+#include <AknUtils.h>
+#include <AknViewAppui.h>
+#include <AknView.h>
+
+#include <fbs.h>
+#include <GulIcon.h>
+
+//#include <Splash_0x2002E1AB.mbg>
+
+//#include "IconLoader.h"
+
+#include "Logger.h"
+
+CSplashContainer::CSplashContainer(CAknView& aView)
+    : iView(aView)
+{}
+
+CSplashContainer::~CSplashContainer()
+{
+    delete iBackground;
+
+    delete iBitmapContext;
+    delete iBitmapDevice;
+    delete iBitmap;
+}
+
+void CSplashContainer::ConstructL(const TRect& aRect, const CCoeControl* aParent)
+{
+    if (aParent)
+        SetContainerWindowL(*aParent);
+    else
+        CreateWindowL();
+
+    iBitmap = new(ELeave) CFbsBitmap;
+    iBitmap->Create(aRect.Size(), Window().DisplayMode());
+
+    iBitmapDevice = CFbsBitmapDevice::NewL(iBitmap);
+    User::LeaveIfError(iBitmapDevice->CreateContext(iBitmapContext));
+
+    iBitmapContext->SetBrushColor(KRgbBlue);
+    iBitmapContext->SetBrushStyle(CFbsBitGc::ESolidBrush);
+    iBitmapContext->Clear();
+
+    const CFont* font = iEikonEnv->LegendFont();
+    iBitmapContext->UseFont(font);
+
+    iBitmapContext->SetPenColor(KRgbWhite);
+    iBitmapContext->SetPenStyle(CFbsBitGc::ESolidPen);
+
+    _LIT(KPrimaryText, "Initializing..");
+    iBitmapContext->DrawText(KPrimaryText, TPoint(font->WidthZeroInPixels(), font->FontMaxHeight()));
+
+//    _LIT(KImageFile, "\\resource\\apps\\Splash_0x20026309.mif");
+//    iBackground = CreateIconL(KImageFile, EMbmSplash_0x20026309Splash, EMbmSplash_0x20026309Splash_mask, aRect.Size());
+
+    SetRect(aRect);
+    ActivateL();
+}
+
+void CSplashContainer::HandleResourceChange(TInt aType)
+{
+    LOGARG("CSplashContainer::HandleResourceChange(%d)", aType);
+
+    CCoeControl::HandleResourceChange(aType);
+
+    if (aType == KEikDynamicLayoutVariantSwitch)
+    {
+        TRect rect;
+        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EApplicationWindow, rect);
+        SetRect(rect);
+    }
+}
+
+void CSplashContainer::Draw(const TRect& aRect) const
+{
+    CWindowGc& gc = SystemGc();
+    gc.BitBlt(TPoint(0, 0), iBitmap);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser/ui/src/SplashView.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,114 @@
+/*
+ * Name        : SplashView.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "SplashView.h"
+
+#include <AknUtils.h>
+#include <AknViewAppui.h>
+
+#include <OpenMAR_0x2002E1AB.rsg>
+
+#include "Application.hrh"
+#include "SettingManager.h"
+#include "SplashContainer.h"
+
+#include "Logger.h"
+
+CSplashView* CSplashView::NewL(CSettingManager& aSetting)
+{
+    CSplashView* self = new(ELeave) CSplashView(aSetting);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CSplashView::~CSplashView()
+{
+    delete iContainer;
+    delete iConnection;
+}
+
+CSplashView::CSplashView(CSettingManager& aSetting)
+    : iSetting(aSetting)
+{}
+
+void CSplashView::ConstructL()
+{
+    BaseConstructL(R_SPLASH_VIEW);
+
+    LOGTXT("Initializing splash screen");
+
+    // Set up connection which should be used by other components
+    // (providers, etc) to enable faster connections
+    iConnection = CConnectionManager::NewL(*this, iSetting);
+}
+
+void CSplashView::ConnectionStartedL(TInt aError)
+{
+    LOGARG("Connection manager returned %d", aError);
+
+    if (aError)
+    {
+        // TODO: Handle error condition. Some kind of 'offline mode' should be allowed,
+        // thus enabling the use of the application in a restricted way 
+
+//        if (!AppUi()->IsAppShutterRunning())
+//            AppUi()->RunAppShutter();
+    }
+
+    // Perform other setup..
+
+    // Initial set up complete. Switch to main view 
+    AppUi()->ActivateLocalViewL(TUid::Uid(EARView));
+}
+
+TUid CSplashView::Id() const
+{
+    return TUid::Uid(ESplashView);
+}
+
+void CSplashView::DoActivateL(const TVwsViewId& aPrevViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage)
+{
+    if (!iContainer)
+    {
+        // Make status pane invisible
+        CEikStatusPane* statusPane = StatusPane();
+        if (statusPane)
+            statusPane->MakeVisible(EFalse);
+
+        iContainer = new(ELeave) CSplashContainer(*this);
+        iContainer->SetMopParent(this);
+        iContainer->ConstructL(AppUi()->ApplicationRect(), 0);
+
+        AppUi()->AddToStackL(*this, iContainer);
+    }
+}
+
+void CSplashView::DoDeactivate()
+{
+    if (iContainer)
+    {
+        AppUi()->RemoveFromViewStack(*this, iContainer);
+
+        delete iContainer;
+        iContainer = 0;
+    }
+}
+
+void CSplashView::HandleCommandL(TInt aCommand)
+{
+    AppUi()->HandleCommandL(aCommand);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/build/bld.inf	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,28 @@
+/*
+ * Name        : bld.inf
+ * Description : Component definition file
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+PRJ_PLATFORMS
+WINSCW GCCE
+
+PRJ_MMPFILES
+
+gnumakefile ..\browser\group\Icon.mk
+gnumakefile ..\browser\group\Button.mk
+
+..\browser\group\Application.mmp
+
+..\plugin\poi\landmarks\group\Landmarks.mmp
+gnumakefile ..\plugin\poi\landmarks\group\LandmarksIcons.mk
+
+..\plugin\poi\geonames\group\Geonames.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/inc/HttpClient.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,48 @@
+/*
+ * Name        : HttpClient.h
+ * Description : HTTP helper class
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef HTTPCLIENT_H_
+#define HTTPCLIENT_H_
+
+#include <http/RHttpSession.h>
+#include <http/MHttpTransactionCallback.h>
+
+#include <es_sock.h>
+
+class CHttpClient : public CBase
+{
+public:
+    static CHttpClient* NewL(MHTTPTransactionCallback& aCallback);
+    ~CHttpClient();
+
+protected:
+	CHttpClient(MHTTPTransactionCallback& aCallback);
+    void ConstructL();
+
+public:
+    RHTTPTransaction GetL(const TDesC8& aUri);
+    void Stop(RHTTPTransaction& aTransaction);
+
+protected:
+    void SetHeaderL(RHTTPHeaders aHeaders, TInt aHdrField, const TDesC8& aHdrValue);
+
+private:
+    MHTTPTransactionCallback& iCallback;
+
+    RHTTPSession iSession;
+    RSocketServ iSocketServ;
+    RConnection iConnection;
+};
+
+#endif  // HTTPSOURCE_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/inc/IconLoader.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,26 @@
+/*
+ * Name        : IconLoader.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef ICONLOADER_H_
+#define ICONLOADER_H_
+
+#include <e32def.h>
+#include <e32cmn.h>
+
+class CGulIcon;
+class TSize;
+
+CGulIcon* CreateIconL(const TDesC& aIconFile, TInt aBitmapId, TInt aMaskId, const TSize& aSize = TSize(-1, -1));
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/inc/Logger.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,57 @@
+/*
+ * Name        : Logger.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef LOGGER_H_
+#define LOGGER_H_
+
+#include <f32file.h>
+
+#if defined(__DEBUG__)
+
+#define LOGCLOSE                CLogger::Close();
+#define LOGARG(text,param...)   { _LIT8(KText, text); CLogger::Write(KText, param); }
+#define LOGTXT(text)            { _LIT8(KText, text); CLogger::Write(static_cast<const TDesC8&>(KText)); }
+
+#else
+
+#define LOGCLOSE
+#define LOGARG
+#define LOGTXT
+
+#endif
+
+class CLogger : public CBase
+{
+public:
+    static void Write(const TDesC8& aText);
+    static void Write(TRefByValue<const TDesC8> aFmt, ...);
+
+    static void Close();
+
+protected:
+    static CLogger& InstanceL();
+
+    void ConstructL();
+    ~CLogger();
+
+    void DoWrite(const TDesC8& aText);
+
+private:
+    RFs   iFs;
+    RFile iFile;
+
+    TBuf8<1024> iBuffer;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/inc/Matrix4d.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,106 @@
+/*
+ * Name        : Matrix4d.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef MATRIX4D_H_
+#define MATRIX4D_H_
+
+#include "Scalar.h"
+#include "Vector3d.h"
+#include "Vector4d.h"
+
+/**
+ * @brief Provides needed 4d-matrix functionality and operations
+ */
+class Matrix4d
+{
+public:
+    Matrix4d();
+    Matrix4d(Scalar m00, Scalar m01, Scalar m02, Scalar m03,
+             Scalar m10, Scalar m11, Scalar m12, Scalar m13,
+             Scalar m20, Scalar m21, Scalar m22, Scalar m23,
+             Scalar m30, Scalar m31, Scalar m32, Scalar m33);
+
+    const Vector4d operator*(const Vector4d& v) const;
+    const Matrix4d& operator*(Scalar s);
+
+    void Load(Scalar m00, Scalar m01, Scalar m02, Scalar m03,
+            Scalar m10, Scalar m11, Scalar m12, Scalar m13,
+            Scalar m20, Scalar m21, Scalar m22, Scalar m23,
+            Scalar m30, Scalar m31, Scalar m32, Scalar m33);
+
+    const Matrix4d Transpose() const;
+
+//private:
+    Scalar m[16];
+};
+
+inline Matrix4d::Matrix4d()
+{
+    m[0]  = 1; m[1]  = 0; m[2]  = 0; m[3]  = 0;
+    m[4]  = 0; m[5]  = 1; m[6]  = 0; m[7]  = 0;
+    m[8]  = 0; m[9]  = 0; m[10] = 1; m[11] = 0;
+    m[12] = 0; m[13] = 0; m[14] = 0; m[15] = 1;
+}
+
+inline Matrix4d::Matrix4d(Scalar m00, Scalar m01, Scalar m02, Scalar m03,
+                        Scalar m10, Scalar m11, Scalar m12, Scalar m13,
+                        Scalar m20, Scalar m21, Scalar m22, Scalar m23,
+                        Scalar m30, Scalar m31, Scalar m32, Scalar m33)
+{
+    Load(m00, m01, m02, m03,
+            m10, m11, m12, m13,
+            m20, m21, m22, m23,
+            m30, m31, m32, m33);
+}
+
+inline const Vector4d Matrix4d::operator*(const Vector4d& v) const
+{
+    return Vector4d(
+        m[0]  * v.mX + m[1]  * v.mY + m[2]  * v.mZ + m[3]  * v.mW,
+        m[4]  * v.mX + m[5]  * v.mY + m[6]  * v.mZ + m[7]  * v.mW,
+        m[8]  * v.mX + m[9]  * v.mY + m[10] * v.mZ + m[11] * v.mW,
+        m[12] * v.mX + m[13] * v.mY + m[14] * v.mZ + m[15] * v.mW
+    );
+}
+
+inline const Matrix4d& Matrix4d::operator*(Scalar s)
+{
+    for (TInt i = 0; i < 16; ++i)
+            m[i] *= s;
+
+    return *this;
+}
+
+inline void Matrix4d::Load(Scalar m00, Scalar m01, Scalar m02, Scalar m03,
+                        Scalar m10, Scalar m11, Scalar m12, Scalar m13,
+                        Scalar m20, Scalar m21, Scalar m22, Scalar m23,
+                        Scalar m30, Scalar m31, Scalar m32, Scalar m33)
+{
+    m[0]  = m00; m[1]  = m01; m[2]  = m02; m[3]  = m03;
+    m[4]  = m10; m[5]  = m11; m[6]  = m12; m[7]  = m13;
+    m[8]  = m20; m[9]  = m21; m[10] = m22; m[11] = m23;
+    m[12] = m30; m[13] = m31; m[14] = m32; m[15] = m33;
+}
+
+inline const Matrix4d Matrix4d::Transpose() const
+{
+    return Matrix4d(
+        m[0], m[4], m[8], m[12],
+        m[1], m[5], m[9], m[13],
+        m[2], m[6], m[10], m[14],
+        m[3], m[7], m[11], m[15]
+    );
+}
+
+#endif  // MATRIX4D_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/inc/Scalar.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,22 @@
+/*
+ * Name        : Scalar.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef SCALAR_H_
+#define SCALAR_H_
+
+#include <e32def.h>
+
+typedef TReal32 Scalar;
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/inc/Vector3d.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,61 @@
+/*
+ * Name        : Vector3d.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef VECTOR3D_H_
+#define VECTOR3D_H_
+
+#include <e32math.h>
+
+#include "Scalar.h"
+
+/**
+ * @brief Provides needed 3d-vector functionality and operations
+ */
+class Vector3d
+{
+public:
+    Vector3d(Scalar x = 0, Scalar y = 0, Scalar z = 0);
+
+    Scalar Norm() const;
+
+    static const Vector3d Cross(const Vector3d& lhs, const Vector3d& rhs);
+
+//private:
+    Scalar mX;
+    Scalar mY;
+    Scalar mZ;
+};
+
+inline Vector3d::Vector3d(Scalar x, Scalar y, Scalar z)
+    : mX(x), mY(y), mZ(z)
+{}
+
+inline Scalar Vector3d::Norm() const
+{
+    Scalar sm = mX * mX + mY * mY + mZ * mZ;
+
+    TReal norm = 0;
+    Math::Sqrt(norm, sm);
+
+    return norm;
+}
+
+inline const Vector3d Vector3d::Cross(const Vector3d& lhs, const Vector3d& rhs)
+{
+    return Vector3d(lhs.mY * rhs.mZ - lhs.mZ * rhs.mY,
+                    lhs.mZ * rhs.mX - lhs.mX * rhs.mZ,
+                    lhs.mX * rhs.mY - lhs.mY * rhs.mX);
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/inc/Vector4d.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,39 @@
+/*
+ * Name        : Vector4d.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef VECTOR4D_H_
+#define VECTOR4D_H_
+
+#include "Scalar.h"
+
+/**
+ * @brief Provides needed 4d-vector functionality and operations
+ */
+class Vector4d
+{
+public:
+    Vector4d(Scalar x = 0, Scalar y = 0, Scalar z = 0, Scalar w = 0);
+
+//private:
+    Scalar mX;
+    Scalar mY;
+    Scalar mZ;
+    Scalar mW;
+};
+
+inline Vector4d::Vector4d(Scalar x, Scalar y, Scalar z, Scalar w)
+    : mX(x), mY(y), mZ(z), mW(w)
+{}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/src/HttpClient.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,120 @@
+/*
+ * Name        : HttpClient.cpp
+ * Description : HTTP helper class
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "HttpClient.h"
+
+#include <Http.h>
+#include <http/RHttpHeaders.h>
+
+#include <cmmanager.h>
+#include <cmdestination.h>
+#include <CommDbConnPref.h> 
+
+#include <es_enum.h>
+
+#include "Logger.h"
+
+CHttpClient* CHttpClient::NewL(MHTTPTransactionCallback& aCallback)
+{
+    CHttpClient* self = new(ELeave) CHttpClient(aCallback);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CHttpClient::~CHttpClient()
+{
+    iSession.Close();
+    iConnection.Close();
+    iSocketServ.Close();
+}
+
+CHttpClient::CHttpClient(MHTTPTransactionCallback& aCallback)
+    : iCallback(aCallback)
+{
+}
+
+void CHttpClient::ConstructL()
+{
+    User::LeaveIfError(iSocketServ.Connect());
+
+    User::LeaveIfError(iConnection.Open(iSocketServ));
+
+    TUint connectionCount = 0;
+    TInt error = iConnection.EnumerateConnections(connectionCount);
+
+//    if (error || connectionCount < 1)
+
+    TPckgBuf<TConnectionInfo> connectionInfo;
+    error = iConnection.GetConnectionInfo(1, connectionInfo); // First connection
+
+//    if (error)
+//        LOGARG("Error %d retrieving connection info", error);
+
+    error = iConnection.Attach(connectionInfo, RConnection::EAttachTypeNormal);
+
+//    LOGARG("Connection attached %d", error);
+
+//    LOGTXT("Opening http session");
+
+    iSession.OpenL();
+
+    RStringPool strPool = iSession.StringPool();
+    RHTTPConnectionInfo connInfo = iSession.ConnectionInfo();
+    connInfo.SetPropertyL(strPool.StringF(HTTP::EHttpSocketServ,
+        RHTTPSession::GetTable()), THTTPHdrVal(iSocketServ.Handle()));
+    TInt connPtr = reinterpret_cast<TInt>(&iConnection);
+    connInfo.SetPropertyL(strPool.StringF(HTTP::EHttpSocketConnection,
+        RHTTPSession::GetTable()), THTTPHdrVal(connPtr));
+}
+
+RHTTPTransaction CHttpClient::GetL(const TDesC8& aUri)
+{
+    TUriParser8 uri;
+    uri.Parse(aUri);
+
+    LOGARG("URI submitted is %S", &aUri);
+
+    RStringPool strP = iSession.StringPool();
+    RStringF method = strP.StringF(HTTP::EGET, RHTTPSession::GetTable());
+
+    RHTTPTransaction transaction = iSession.OpenTransactionL(uri, iCallback, method);
+
+    _LIT8(KUserAgent, "OpenMAR/1.0 (Symbian)");
+    _LIT8(KAccept, "*/*");
+
+    RHTTPHeaders hdr = transaction.Request().GetHeaderCollection();
+    // Add headers appropriate to all methods
+    SetHeaderL(hdr, HTTP::EUserAgent, KUserAgent);
+    SetHeaderL(hdr, HTTP::EAccept, KAccept);
+
+    transaction.SubmitL();
+
+    return transaction;
+}
+
+void CHttpClient::Stop(RHTTPTransaction& aTransaction)
+{
+    aTransaction.Cancel();
+}
+
+void CHttpClient::SetHeaderL(RHTTPHeaders aHeaders, TInt aHdrField, const TDesC8& aHdrValue)
+{
+    RStringF valStr = iSession.StringPool().OpenFStringL(aHdrValue);
+    THTTPHdrVal val(valStr);
+    aHeaders.SetFieldL(iSession.StringPool().StringF(aHdrField, RHTTPSession::GetTable()), val);
+    valStr.Close();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/src/IconLoader.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,49 @@
+/*
+ * Name        : IconLoader.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "IconLoader.h"
+
+#include <AknIconUtils.h>
+#include <GulIcon.h>
+
+CGulIcon* CreateIconL(const TDesC& aIconFile, TInt aBitmapId, TInt aMaskId, const TSize& aSize)
+{
+    CFbsBitmap* bitmap = 0;
+    CFbsBitmap* mask = 0;
+
+    AknIconUtils::CreateIconL(bitmap, mask, aIconFile, aBitmapId, aMaskId); 
+
+    AknIconUtils::PreserveIconData(bitmap);
+
+    TSize size;
+
+    if (aSize.iHeight == -1 || aSize.iWidth == -1)
+        AknIconUtils::GetContentDimensions(bitmap, size);
+    else
+        size = aSize;
+
+    AknIconUtils::SetSize(bitmap, size, EAspectRatioPreserved);
+    AknIconUtils::SetSize(mask, size, EAspectRatioPreserved);
+
+    AknIconUtils::DestroyIconData(bitmap);
+
+    CleanupStack::PushL(bitmap);
+    CleanupStack::PushL(mask);
+
+    CGulIcon* icon = CGulIcon::NewL(bitmap, mask);
+
+    CleanupStack::Pop(2, bitmap);
+
+    return icon;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/src/Logger.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,97 @@
+/*
+ * Name        : Logger.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Logger.h"
+
+#include <bautils.h>
+#include <PathInfo.h>
+
+void CLogger::Write(const TDesC8& aText)
+{
+    CLogger::InstanceL().DoWrite(aText);
+}
+
+void CLogger::Write(TRefByValue<const TDesC8> aFmt, ...)
+{
+    VA_LIST list;
+    VA_START(list, aFmt);
+
+    CLogger::InstanceL().iBuffer.FormatList(aFmt, list);
+    CLogger::InstanceL().DoWrite(CLogger::InstanceL().iBuffer);
+
+    VA_END(list);
+}
+
+void CLogger::Close()
+{
+    delete static_cast<CLogger*>(UserSvr::DllTls(0));
+    UserSvr::DllFreeTls(0);
+}
+
+CLogger& CLogger::InstanceL()
+{
+    CLogger* self = static_cast<CLogger*>(UserSvr::DllTls(0));
+
+    if (self == 0)
+    {
+        self = new(ELeave) CLogger;
+        CleanupStack::PushL(self);
+        self->ConstructL();
+        CleanupStack::Pop(self);
+
+        UserSvr::DllSetTls(0, self);
+    }
+
+    return *self;
+}
+
+void CLogger::ConstructL()
+{
+    User::LeaveIfError(iFs.Connect());
+
+    TFileName logName(PathInfo::PhoneMemoryRootPath());
+    TPtrC appName(BaflUtils::ExtractAppNameFromFullName(RThread().FullName()));
+    logName.Append(appName);
+    _LIT(KLogFileExt, ".log");
+    logName.Append(KLogFileExt);
+
+    BaflUtils::EnsurePathExistsL(iFs, logName);
+    User::LeaveIfError(iFile.Replace(iFs, logName, EFileShareAny | EFileWrite));
+}
+
+CLogger::~CLogger()
+{
+    iFile.Close();
+    iFs.Close();
+}
+
+void CLogger::DoWrite(const TDesC8& aText)
+{
+    const TInt KTimeRecordSize = 12;
+    TBuf8<KTimeRecordSize> timeText;
+
+    TTime time;
+    time.HomeTime();
+    TDateTime dateTime = time.DateTime();
+
+    _LIT8(KTimeFormat,"%02d:%02d:%02d.%02d ");
+    timeText.Format(KTimeFormat, dateTime.Hour(), dateTime.Minute(), dateTime.Second(), dateTime.MicroSecond());
+
+    iFile.Write(timeText);
+    iFile.Write(aText);
+
+    _LIT8(KNewLine, "\r\n");
+    iFile.Write(KNewLine);
+//    iFile.Flush();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interface/InterfaceUid.hrh	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,22 @@
+/*
+ * Name        : InterfaceUid.hrh
+ * Description : ECOM interface UIDs
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef INTERFACEUID_HRH_
+#define INTERFACEUID_HRH_
+
+#define KOverlayInterfaceUidValue   0x2002E1AC
+#define KProviderInterfaceUidValue  0x2002E1AD
+#define KObjectInterfaceUidValue    0x2002E1AE
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interface/object/POIObject.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,85 @@
+/*
+ * Name        : POIObject.h
+ * Description : ECOM interface definition
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef POIOBJECT_H_
+#define POIOBJECT_H_
+
+#include "InterfaceUid.hrh"
+
+#include <ecom/ecom.h>
+
+#include <LbsPosition.h>
+
+#include "Vector3d.h"
+
+namespace OpenMAR {
+
+class CPOIProvider;
+
+/**
+ * @brief POI object interface definition
+ * 
+ * 
+ */
+class CPOIObject : public CBase
+{
+public:
+    static CPOIObject* NewL(const TDesC8& aMatch, const CPOIProvider& aProvider);
+    static CPOIObject* NewL(const TUid aImplementationUid, const CPOIProvider& aProvider);
+    ~CPOIObject();
+
+protected:
+    CPOIObject(const CPOIProvider& aProvider);
+
+public:
+    const TCoordinate& GetCoordinate() const;
+    void SetCoordinate(const TCoordinate& aCoordinate);
+
+    const Vector3d& GetPosition() const;
+    void SetPosition(const Vector3d& aPosition);
+
+    TUint32 GetIdentifier() const;
+    void SetIdentifier(TUint32 aIdentifier);
+
+    const TDesC& GetName() const;
+    void SetNameL(const TDesC& aName);
+/*
+    const TDesC& GetDescription() const;
+    void SetDescription(const TDesC& aName);
+
+    TReal32 GetCoverageRadius() const;
+    void SetCoverageRadius(TReal32 aCoverageRadius);
+*/
+    virtual void Render() const = 0;
+
+public:
+    static TBool IdentityRelation(const CPOIObject& aLeft, const CPOIObject& aRight);
+
+protected:
+    const CPOIProvider& iProvider;
+
+    TCoordinate iCoordinate;
+    Vector3d iPosition;
+    TUint32 iIdentifier;
+    HBufC* iName;
+
+private:
+    TUid iDtor_ID_Key;
+};
+
+#include "POIObject.inl"
+
+}
+
+#endif  // POIOBJECT_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interface/object/POIObject.inl	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,96 @@
+/*
+ * Name        : POIObject.inl
+ * Description : ECOM interface definition
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+inline CPOIObject* CPOIObject::NewL(const TDesC8& aMatch, const CPOIProvider& aProvider)
+{
+    const TUid KCPOIRendererInterfaceUid = { KObjectInterfaceUidValue };
+
+    TAny* param = const_cast<CPOIProvider*>(&aProvider);
+
+    TEComResolverParams resolverParams;
+    resolverParams.SetDataType(aMatch);
+    resolverParams.SetWildcardMatch(ETrue);
+
+    TAny* interface = REComSession::CreateImplementationL(KCPOIRendererInterfaceUid,
+        _FOFF(CPOIObject, iDtor_ID_Key), param, resolverParams);
+
+    return reinterpret_cast <CPOIObject*>(interface);
+}
+
+inline CPOIObject* CPOIObject::NewL(const TUid aImplementationUid, const CPOIProvider& aProvider)
+{
+    TAny* param = const_cast<CPOIProvider*>(&aProvider);
+
+    TAny* interface = REComSession::CreateImplementationL(aImplementationUid, 
+        _FOFF(CPOIObject, iDtor_ID_Key), param);
+
+    return reinterpret_cast <CPOIObject*>(interface);
+}
+
+inline CPOIObject::~CPOIObject()
+{
+    REComSession::DestroyedImplementation(iDtor_ID_Key);
+}
+
+inline CPOIObject::CPOIObject(const CPOIProvider& aProvider)
+    : iProvider(aProvider)
+{}
+
+inline const TCoordinate& CPOIObject::GetCoordinate() const
+{
+    return iCoordinate;
+}
+
+inline void CPOIObject::SetCoordinate(const TCoordinate& aCoordinate)
+{
+    iCoordinate = aCoordinate;
+}
+
+inline const Vector3d& CPOIObject::GetPosition() const
+{
+    return iPosition;
+}
+
+inline void CPOIObject::SetPosition(const Vector3d& aPosition)
+{
+    iPosition = aPosition;
+}
+
+inline TUint32 CPOIObject::GetIdentifier() const
+{
+    return iIdentifier;
+}
+
+inline void CPOIObject::SetIdentifier(TUint32 aIdentifier)
+{
+    iIdentifier = aIdentifier;
+}
+
+inline const TDesC& CPOIObject::GetName() const
+{
+    return iName? *iName : KNullDesC();
+}
+
+inline void CPOIObject::SetNameL(const TDesC& aName)
+{
+    delete iName;
+    iName = 0;
+
+    iName = aName.AllocL();
+}
+
+inline TBool CPOIObject::IdentityRelation(const CPOIObject& aLeft, const CPOIObject& aRight)
+{
+    return aLeft.GetIdentifier() == aRight.GetIdentifier();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interface/overlay/POIOverlay.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,62 @@
+/*
+ * Name        : POIOverlay.h
+ * Description : ECOM interface definition
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef POIOVERLAY_H_
+#define POIOVERLAY_H_
+
+#include "InterfaceUid.hrh"
+
+#include <ecom/ecom.h>
+
+class RWindow;
+class TRect;
+class CFbsBitmap;
+
+namespace OpenMAR {
+
+/**
+ * @brief POI overlay interface definition
+ * 
+ * The overlay is in charge of getting input from sensors for position and orientation
+ * estimation, and retrieving proper POIs from providers.
+ *
+ */
+class CPOIOverlay : public CBase
+{
+public:
+    struct SParameter {
+        RWindow& iWindow;
+        const TRect& iRect;
+    };
+
+public:
+    static CPOIOverlay* NewL(const TDesC8& aMatch, SParameter& aParam);
+    static CPOIOverlay* NewL(const TUid aImplementationUid, SParameter& aParam);
+    ~CPOIOverlay();
+
+    virtual void StartL() = 0;
+    virtual void Stop() = 0;
+    virtual const CFbsBitmap& RenderScene() = 0;
+
+    virtual TInt GetFocusedPOI() = 0;
+
+private:
+    TUid iDtor_ID_Key;
+};
+
+#include "POIOverlay.inl"
+
+}
+
+#endif  // POIOVERLAY_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interface/overlay/POIOverlay.inl	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,40 @@
+/*
+ * Name        : POIOverlay.inl
+ * Description : ECOM interface definition
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+inline CPOIOverlay* CPOIOverlay::NewL(const TDesC8& aMatch, SParameter& aParam)
+{
+    const TUid KCPOIOverlayInterfaceUid = { KOverlayInterfaceUidValue };
+
+    TEComResolverParams resolverParams;
+    resolverParams.SetDataType(aMatch);
+    resolverParams.SetWildcardMatch(ETrue);
+
+    TAny* interface = REComSession::CreateImplementationL(KCPOIOverlayInterfaceUid,
+        _FOFF(CPOIOverlay, iDtor_ID_Key), &aParam, resolverParams);
+
+    return reinterpret_cast <CPOIOverlay*>(interface);
+}
+
+inline CPOIOverlay* CPOIOverlay::NewL(const TUid aImplementationUid, SParameter& aParam)
+{
+    TAny* interface = REComSession::CreateImplementationL(aImplementationUid, 
+        _FOFF(CPOIOverlay, iDtor_ID_Key), &aParam);
+
+    return reinterpret_cast <CPOIOverlay*>(interface);
+}
+
+inline CPOIOverlay::~CPOIOverlay()
+{
+    REComSession::DestroyedImplementation(iDtor_ID_Key);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interface/provider/POIProvider.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,67 @@
+/*
+ * Name        : POIProvider.h
+ * Description : ECOM interface definition
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef POIPROVIDER_H_
+#define POIPROVIDER_H_
+
+#include "InterfaceUid.hrh"
+
+#include <ecom/ecom.h>
+#include <LbsPosition.h>
+
+namespace OpenMAR {
+
+class CPOIProvider;
+class CPOIObject;
+
+/**
+ * @brief POI provider notifier
+ */
+class MPOIProviderObserver
+{
+public:
+    virtual void POIProviderLoadedL(CPOIProvider* aProvider, TInt aError) = 0;
+    virtual void POIObjectCreatedL(CPOIObject* aPOIObject) = 0;
+    virtual void POIObjectUpdatedL(CPOIObject* aPOIObject) = 0;
+};
+
+/**
+ * @brief POI provider interface definition
+ * 
+ * Retrieves geolocated points of interest from a local or remote resource, 
+ * creating corresponding CPosLandmark objects
+ */
+class CPOIProvider : public CBase
+{
+public:
+    static CPOIProvider* NewL(const TDesC8& aMatch, const TDesC8& aProviderUri);
+    static CPOIProvider* NewL(const TUid aImplementationUid, const TDesC8& aProviderUri);
+    ~CPOIProvider();
+
+    void SetObserver(MPOIProviderObserver* aObserver);
+
+    virtual void RetrieveL(const TCoordinate& aCoordinate, TReal32 aRadius) = 0;
+
+protected:
+    MPOIProviderObserver* iObserver;
+
+private:
+    TUid iDtor_ID_Key;
+};
+
+#include "POIProvider.inl"
+
+}
+
+#endif  // POIPROVIDER_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interface/provider/POIProvider.inl	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,49 @@
+/*
+ * Name        : POIProvider.inl
+ * Description : ECOM interface definition
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+inline CPOIProvider* CPOIProvider::NewL(const TDesC8& aMatch, const TDesC8& aProviderUri)
+{
+    const TUid KCPOIProviderInterfaceUid = { KProviderInterfaceUidValue };
+
+    TDesC8& param = const_cast<TDesC8&>(aProviderUri);
+
+    TEComResolverParams resolverParams;
+    resolverParams.SetDataType(aMatch);
+    resolverParams.SetWildcardMatch(ETrue);
+
+    TAny* interface = REComSession::CreateImplementationL(KCPOIProviderInterfaceUid,
+        _FOFF(CPOIProvider, iDtor_ID_Key), &param, resolverParams);
+
+    return reinterpret_cast <CPOIProvider*>(interface);
+}
+
+inline CPOIProvider* CPOIProvider::NewL(const TUid aImplementationUid, const TDesC8& aProviderUri)
+{
+    TDesC8& param = const_cast<TDesC8&>(aProviderUri);
+
+    TAny* interface = REComSession::CreateImplementationL(aImplementationUid, 
+        _FOFF(CPOIProvider, iDtor_ID_Key), &param);
+
+    return reinterpret_cast <CPOIProvider*>(interface);
+}
+
+inline CPOIProvider::~CPOIProvider()
+{
+    REComSession::DestroyedImplementation(iDtor_ID_Key);
+}
+
+inline void CPOIProvider::SetObserver(MPOIProviderObserver* aObserver)
+{
+    iObserver = aObserver;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/geonames/data/Geonames.rss	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,66 @@
+/*
+ * Name        : Geonames.rss
+ * Description : Interface collection
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include <ecom/RegistryInfo.rh>
+
+#include "InterfaceUid.hrh"
+#include "ImplementationUid.hrh"
+
+RESOURCE REGISTRY_INFO theInfo
+{
+    // UID for the DLL
+    dll_uid = KDllUidValue;
+
+    // Declare array of interface info
+    interfaces =
+    {
+        INTERFACE_INFO
+        {
+            // UID of interface that is implemented
+            interface_uid = KProviderInterfaceUidValue;
+
+            implementations =
+            {
+                // Info for CProvider
+                IMPLEMENTATION_INFO
+                {
+                    implementation_uid = KProviderImplementationUidValue;
+                    version_no         = 1;
+                    display_name       = "Geonames Provider";
+                    default_data       = "geonames";
+                    opaque_data        = "";
+                }
+            };
+        }
+        ,
+        INTERFACE_INFO
+        {
+            // UID of interface that is implemented
+            interface_uid = KObjectInterfaceUidValue;
+
+            implementations =
+            {
+                // Info for CObject
+                IMPLEMENTATION_INFO
+                {
+                    implementation_uid = KObjectImplementationUidValue;
+                    version_no         = 1;
+                    display_name       = "Geonames Object";
+                    default_data       = "geonames";
+                    opaque_data        = "";
+                }
+            };
+        }
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/geonames/ecom/inc/ImplementationUid.hrh	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,23 @@
+/*
+ * Name        : ImplementationUid.hrh
+ * Description : ECOM implementation UIDs
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef IMPLEMENTATIONUID_HRH_
+#define IMPLEMENTATIONUID_HRH_
+
+#define KDllUidValue                    0x2002E1B2
+
+#define KProviderImplementationUidValue 0x2002E1B2
+#define KObjectImplementationUidValue   0x2002E1B3
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/geonames/ecom/src/Proxy.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,34 @@
+/*
+ * Name        : Proxy.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include <e32base.h>
+
+#include <ecom/implementationproxy.h>
+
+#include "ImplementationUid.hrh"
+#include "Provider.h"
+#include "Object.h"
+
+const TImplementationProxy ImplementationTable[] =
+{
+    IMPLEMENTATION_PROXY_ENTRY(KProviderImplementationUidValue, CProvider::NewL),
+    IMPLEMENTATION_PROXY_ENTRY(KObjectImplementationUidValue, Geonames::CObject::NewL),
+};
+
+// Function used to return an instance of the proxy table.
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+{
+    aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+    return ImplementationTable;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/geonames/group/Geonames.mmp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,94 @@
+/*
+ * Name        : Geonames.mmp
+ * Description : Project definition
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+TARGET Geonames_0x2002E1B2.dll
+TARGETTYPE PLUGIN
+
+UID 0x10009D8D 0x2002E1B2
+SECUREID 0x2002E1B2
+
+CAPABILITY  LocalServices Location NetworkServices ReadUserData ReadDeviceData SwEvent UserEnvironment WriteDeviceData WriteUserData //MultimediaDD
+
+MACRO       __DEBUG__
+
+SOURCEPATH  ..\ecom\src
+SOURCE      Proxy.cpp
+
+SOURCEPATH  ..\provider\src
+SOURCE      Provider.cpp
+SOURCE      Loader.cpp
+SOURCE      Entry.cpp
+
+SOURCEPATH  ..\object\src
+SOURCE      Object.cpp
+
+SOURCEPATH  ..\..\..\..\common\src
+SOURCE      HttpClient.cpp
+SOURCE      IconLoader.cpp
+SOURCE      Logger.cpp
+
+USERINCLUDE     ..\..\..\..\interface
+USERINCLUDE     ..\..\..\..\interface\provider
+USERINCLUDE     ..\..\..\..\interface\object 
+
+USERINCLUDE     ..\ecom\inc
+
+USERINCLUDE     ..\provider\inc
+USERINCLUDE     ..\object\inc 
+USERINCLUDE     ..\..\..\..\common\inc 
+
+SYSTEMINCLUDE   \epoc32\include
+
+SOURCEPATH  ..\data
+
+START RESOURCE  Geonames.rss
+    TARGET  Geonames_0x2002E1B2.rsc
+END
+
+LIBRARY         euser.lib
+LIBRARY         eikcore.lib
+LIBRARY         cone.lib
+LIBRARY         ecom.lib
+LIBRARY         avkon.lib
+
+LIBRARY         eposlandmarks.lib
+LIBRARY         hash.lib
+
+LIBRARY         efsrv.lib
+LIBRARY         bafl.lib
+LIBRARY         PlatformEnv.lib
+
+LIBRARY         SenXml.lib
+LIBRARY         XmlFramework.lib
+LIBRARY         charconv.lib
+
+LIBRARY         http.lib
+LIBRARY         inetprotutil.lib
+LIBRARY         esock.lib
+
+LIBRARY         libgles_cm.lib
+LIBRARY         ws32.lib
+
+LIBRARY         bitgdi.lib
+LIBRARY         fbscli.lib
+LIBRARY         gdi.lib
+LIBRARY         egul.lib
+LIBRARY         ImageConversion.lib
+LIBRARY         AknIcon.lib
+
+LIBRARY         CentralRepository.lib
+
+LIBRARY         lbs.lib
+LIBRARY         SensrvClient.lib
+LIBRARY         SensrvUtil.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/geonames/object/inc/Object.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,44 @@
+/*
+ * Name        : Object.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef OBJECT_H_
+#define OBJECT_H_
+
+#include "POIObject.h"
+
+namespace Geonames {
+
+/**
+ * @brief Implements basic rendering for geonames.org landmarks
+ */
+class CObject : public OpenMAR::CPOIObject
+{
+public:
+    static CObject* NewL(OpenMAR::CPOIProvider* aProvider);
+    ~CObject();
+
+protected:
+    CObject(OpenMAR::CPOIProvider* aProvider);
+    void ConstructL();
+
+public:
+    void Render() const;
+
+private:
+    TUint iTextureId;
+};
+
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/geonames/object/src/Object.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,175 @@
+/*
+ * Name        : Object.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Object.h"
+
+#include "Vector3d.h"
+
+#include <AknUtils.h>
+#include <bitdev.h>
+#include <bitstd.h>
+#include <fbs.h>
+#include <GLES/egl.h>
+
+#include "Logger.h"
+
+Geonames::CObject* Geonames::CObject::NewL(OpenMAR::CPOIProvider* aProvider)
+{
+    CObject* self = new(ELeave) Geonames::CObject(aProvider);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+Geonames::CObject::~CObject()
+{
+    ::glDeleteTextures(1, &iTextureId);
+}
+
+Geonames::CObject::CObject(OpenMAR::CPOIProvider* aProvider)
+    : OpenMAR::CPOIObject(*aProvider)
+{}
+
+/*
+ * Create texture to represent the object
+ */
+void Geonames::CObject::ConstructL()
+{
+    CFbsBitmap* bitmap = new(ELeave) CFbsBitmap;
+    CleanupStack::PushL(bitmap);
+
+    // Use a 64x64 bitmap
+    const TSize bitmapSize(64, 64);
+    User::LeaveIfError(bitmap->Create(bitmapSize, EColor16MA));
+
+    CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(bitmap);
+    CleanupStack::PushL(bitmapDevice);
+
+    CFbsBitGc* bitmapContext = 0;
+    User::LeaveIfError(bitmapDevice->CreateContext(bitmapContext));
+    CleanupStack::PushL(bitmapContext);
+
+    // Define colors to use
+    bitmapContext->SetBrushColor(KRgbBlue);
+    bitmapContext->SetBrushStyle(CFbsBitGc::ESolidBrush);
+
+    bitmapContext->SetPenColor(KRgbRed);
+    bitmapContext->SetPenStyle(CFbsBitGc::ESolidPen);
+
+    const CFont* font = AknLayoutUtils::FontFromId(ELatinPlain12, 0);
+    bitmapContext->UseFont(font);
+
+    bitmapContext->Clear();
+
+    const TRect bitmapRect(TPoint(0, 0), bitmapSize);
+    bitmapContext->DrawRect(bitmapRect);
+
+    // Set some text if needed
+    _LIT(KTitle, "Test");
+    TPoint titlePos(font->MaxNormalCharWidthInPixels(), font->HeightInPixels());
+    bitmapContext->DrawText(KTitle(), titlePos);
+
+    // Convert to GL_RGBA
+    const TInt dataSize = bitmapSize.iWidth * bitmapSize.iHeight * sizeof(TUint32);
+    TUint8* data = new(ELeave) TUint8[dataSize];
+
+    bitmap->LockHeap();
+
+    TUint8* rgb = reinterpret_cast<TUint8*>(bitmap->DataAddress());
+
+    for(TInt i = 0; i < dataSize; i += 4)
+    {
+        data[i + 0] = rgb[i + 2];
+        data[i + 1] = rgb[i + 1];
+        data[i + 2] = rgb[i + 0];
+        data[i + 3] = rgb[i + 3];
+    }
+
+    ::glGenTextures(1, &iTextureId); 
+    ::glBindTexture(GL_TEXTURE_2D, iTextureId);
+
+    ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+    ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+    ::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmapSize.iWidth, bitmapSize.iHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
+
+    bitmap->UnlockHeap();
+
+    delete data;
+
+    CleanupStack::PopAndDestroy(3, bitmap);
+}
+
+void Geonames::CObject::Render() const
+{
+    /*
+     * This is a special case for points or planes in space. Given that a usual POI
+     * does not provide of any transformation to be applied on it, we determine the
+     * angle in the XY plane with respect to the observer and apply that rotation to 
+     * the object.
+     *
+     * This way, all POIs will face the observer regardless their position. Other
+     * objects (3D Landmarks, etc) should provide their own transformations in some
+     * proper way.   
+     */
+
+    TReal angle = 0;
+    Math::ATan(angle, iPosition.mX, iPosition.mY);
+    angle *= -KRadToDeg;
+
+    /*
+     * We could also apply some scaling calculation to compensate the size of
+     * objects projected at a long distance from the camera.
+     * For now we just use a constant value
+     */
+
+    TReal scale = 128.0f;
+
+    // Apply transformations to the object and render it
+
+    const TInt unity = 1 << 16;
+
+    GLfixed vertices[] = {
+        -unity / 2, 0, 0,
+         unity / 2, 0, 0,
+        -unity / 2, 0, unity,
+         unity / 2, 0, unity,
+    };
+
+    GLfixed texCoords[] = {
+        0,      unity,
+        unity,  unity,
+        0,      0,
+        unity,  0
+    };
+
+    ::glPushMatrix();
+
+    ::glTranslatef(iPosition.mX, iPosition.mY, iPosition.mZ);
+    ::glRotatef(angle, 0, 0, 1);
+    ::glScalef(scale, 1.0f, scale);
+
+    ::glEnable(GL_TEXTURE_2D);
+    ::glBindTexture(GL_TEXTURE_2D, iTextureId);
+    ::glVertexPointer(3, GL_FIXED, 0, vertices);
+    ::glTexCoordPointer(2, GL_FIXED, 0, texCoords);
+    ::glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+    ::glDisable(GL_TEXTURE_2D);
+
+    ::glPopMatrix();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/geonames/provider/inc/Entry.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,66 @@
+/*
+ * Name        : Entry.h
+ * Description : Encapsulates a findNearbyWikipedia entry
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef ENTRY_H_
+#define ENTRY_H_
+
+#include <e32base.h>
+#include <EPos_CPosLandmark.h>
+
+class CEntry : public CBase
+{
+public:
+    static CEntry* NewL();
+    ~CEntry();
+
+protected:
+    CEntry();
+    void ConstructL();
+
+public:
+    void Reset();
+
+    void EnterState(const TDesC8& aTag);
+    void ExitState();
+    void FeedState(const TDesC8& aBytes);
+
+//    TBool IsValid() const;
+
+protected:
+
+private:
+    enum TState {
+        EUnknown,
+        ETitle,
+        ESummary,
+//        EFeature,
+        EElevation,
+        ELat,
+        ELng,
+        EWikipediaUrl
+    } iState;
+
+//private:
+public:
+    // Limits should be defined by provider (geonames.org)
+    TBuf8<KPosLmMaxTextFieldLength> iTitle;
+    TBuf8<KPosLmMaxDescriptionLength> iSummary;
+//    TBuf8<KPosLmMaxCategoryNameLength> iFeature;
+    TBuf8<KDefaultRealWidth> iElevation;
+    TBuf8<KDefaultRealWidth> iLat;
+    TBuf8<KDefaultRealWidth> iLng;
+    TBuf8<KPosLmMaxTextFieldLength> iWikipediaUrl;
+};
+
+#endif  // ENTRY_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/geonames/provider/inc/Loader.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,86 @@
+/*
+ * Name        : Loader.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef LOADER_H_
+#define LOADER_H_
+
+#include <e32base.h>
+#include <http/MHttpTransactionCallback.h>
+#include <xml/ContentHandler.h>
+#include <xml/Parser.h>
+
+#include <EPos_CPosLandmark.h>
+
+//class CPosLandmark;
+class TCoordinate;
+class CHttpClient;
+class CEntry;
+
+class MLandmarkLoaderObserver
+{
+public:
+    virtual void LandmarkLoaderOpenedL(TInt aError) = 0;
+    virtual void LandmarkLoaderItemCreatedL(const CPosLandmark& aLandmark) = 0;
+};
+
+class CLoader : public CBase, public MHTTPTransactionCallback, public Xml::MContentHandler
+{
+public:
+    static CLoader* NewL(MLandmarkLoaderObserver& aObserver);
+    ~CLoader();
+
+protected:
+    CLoader(MLandmarkLoaderObserver& aObserver);
+    void ConstructL();
+
+public:
+    void RequestL(const TCoordinate& aPosition, TReal32 aRadius);
+
+protected:
+    // From MHTTPTransactionCallback
+    void MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent);
+    TInt MHFRunError(TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& aEvent);
+
+protected:
+    // from MContentHandler
+    void OnStartDocumentL(const Xml::RDocumentParameters& aDocParam, TInt aErrorCode);
+    void OnEndDocumentL(TInt aErrorCode);
+    void OnStartElementL(const Xml::RTagInfo& aElement, const Xml::RAttributeArray& aAttributes, TInt aErrorCode);
+    void OnEndElementL(const Xml::RTagInfo& aElement, TInt aErrorCode);
+    void OnContentL(const TDesC8& aBytes, TInt aErrorCode);
+    void OnStartPrefixMappingL(const RString& aPrefix, const RString& aUri, TInt aErrorCode);
+    void OnEndPrefixMappingL(const RString& aPrefix, TInt aErrorCode);
+    void OnIgnorableWhiteSpaceL(const TDesC8& aBytes, TInt aErrorCode);
+    void OnSkippedEntityL(const RString& aName, TInt aErrorCode);
+    void OnProcessingInstructionL(const TDesC8& aTarget, const TDesC8& aData, TInt aErrorCode);
+    void OnError(TInt aErrorCode);
+    TAny* GetExtendedInterface(const TInt32 aUid);
+
+    void NotifyPOIEntryL();
+
+private:
+    MLandmarkLoaderObserver& iObserver;
+
+    CHttpClient* iClient;
+    Xml::CParser* iParser;
+
+    CEntry* iEntry;
+
+    enum TState {
+        EInvalid,
+        EValid
+    } iState;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/geonames/provider/inc/Provider.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,44 @@
+/*
+ * Name        : Provider.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef PROVIDER_H_
+#define PROVIDER_H_
+
+#include "POIProvider.h"
+#include "POIObject.h"
+
+#include "Loader.h"
+
+class CProvider : public OpenMAR::CPOIProvider, public MLandmarkLoaderObserver
+{
+public:
+    static CProvider* NewL();
+    ~CProvider();
+
+protected:
+    CProvider();
+    void ConstructL();
+
+    // From MLandmarkLoaderObserver
+    void LandmarkLoaderOpenedL(TInt aError);
+    void LandmarkLoaderItemCreatedL(const CPosLandmark& aLandmark);
+
+public:
+    void RetrieveL(const TCoordinate& aCoordinate, TReal32 aRadius);
+
+private:
+    CLoader* iLoader;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/geonames/provider/src/Entry.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,132 @@
+/*
+ * Name        : Entry.cpp
+ * Description : Encapsulates a findNearbyWikipedia entry
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Entry.h"
+
+CEntry* CEntry::NewL()
+{
+    CEntry* self = new(ELeave) CEntry;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CEntry::~CEntry()
+{}
+
+CEntry::CEntry()
+{}
+
+void CEntry::ConstructL()
+{}
+
+void CEntry::Reset()
+{
+    iTitle.Zero();
+    iSummary.Zero();
+    iElevation.Zero();
+    iLat.Zero();
+    iLng.Zero();
+    iWikipediaUrl.Zero();
+}
+
+void CEntry::EnterState(const TDesC8& aTag)
+{
+    _LIT8(KTitleTag, "title");
+    _LIT8(KSummaryTag, "summary");
+//    _LIT8(KFeatureTag, "feature");
+    _LIT8(KElevationTag, "elevation");
+    _LIT8(KLatTag, "lat");
+    _LIT8(KLngTag, "lng");
+    _LIT8(KWikipediaUrlTag, "wikipediaUrl");
+
+    if (aTag == KTitleTag)
+        iState = ETitle;
+    else if (aTag == KSummaryTag)
+        iState = ESummary;
+    else if (aTag == KElevationTag)
+        iState = EElevation;
+    else if (aTag == KLatTag)
+        iState = ELat;
+    else if (aTag == KLngTag)
+        iState = ELng;
+    else if (aTag == KWikipediaUrlTag)
+        iState = EWikipediaUrl;
+    else
+        iState = EUnknown;
+}
+
+void CEntry::ExitState()
+{
+    iState = EUnknown;
+}
+
+void CEntry::FeedState(const TDesC8& aBytes)
+{
+    switch (iState)
+    {
+        case ETitle:
+        {   
+            TInt space = iTitle.MaxLength() - iTitle.Length();
+            TInt min = Min(space, aBytes.Length());
+            iTitle.Append(aBytes.Left(min));
+            break;
+        }
+
+        case ESummary:
+        {
+            TInt space = iSummary.MaxLength() - iSummary.Length();
+            TInt min = Min(space, aBytes.Length());
+            iSummary.Append(aBytes.Left(min));
+            break;
+        }
+
+        case EElevation:
+        {
+            TInt space = iElevation.MaxLength() - iElevation.Length();
+            TInt min = Min(space, aBytes.Length());
+            iElevation.Append(aBytes.Left(min));
+            break;
+        }
+
+        case ELat:
+        {
+            TInt space = iLat.MaxLength() - iLat.Length();
+            TInt min = Min(space, aBytes.Length());
+            iLat.Append(aBytes.Left(min));
+            break;
+        }
+
+        case ELng:
+        {
+            TInt space = iLng.MaxLength() - iLng.Length();
+            TInt min = Min(space, aBytes.Length());
+            iLng.Append(aBytes.Left(min));
+            break;
+        }
+
+        case EWikipediaUrl:
+        {
+            TInt space = iWikipediaUrl.MaxLength() - iWikipediaUrl.Length();
+            TInt min = Min(space, aBytes.Length());
+            iWikipediaUrl.Append(aBytes.Left(min));
+            break;
+        }
+    
+        default:
+            break;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/geonames/provider/src/Loader.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,264 @@
+/*
+ * Name        : Loader.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Loader.h"
+
+#include "HttpClient.h"
+#include "Entry.h"
+
+#include <AknUtils.h>
+#include <LbsPositionInfo.h>
+#include <Http/mhttpdatasupplier.h>
+#include <HttpErr.h>
+
+#include <EPos_CPosLandmark.h>
+#include <utf.h>
+
+#include "Logger.h"
+
+CLoader* CLoader::NewL(MLandmarkLoaderObserver& aObserver)
+{
+    CLoader* self = new(ELeave) CLoader(aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CLoader::~CLoader()
+{
+    delete iEntry;
+    delete iParser;
+    delete iClient;
+}
+
+CLoader::CLoader(MLandmarkLoaderObserver& aObserver)
+    : iObserver(aObserver)
+{
+}
+
+void CLoader::ConstructL()
+{
+    LOGTXT("[GEONAMES] Creating POI loader");
+
+    iClient = CHttpClient::NewL(*this);
+
+    _LIT8(KXmlMimeType, "text/xml");
+    iParser = Xml::CParser::NewL(KXmlMimeType, *this);
+
+    iEntry = CEntry::NewL();
+}
+
+void CLoader::RequestL(const TCoordinate& aPosition, TReal32 aRadius)
+{
+    // Regardless of system locale, always use point as decimal separator character
+    // Also use a maximum of 6 chars to represent each float
+    TRealFormat realFormat;
+    realFormat.iPoint  = TChar('.');
+    realFormat.iWidth  = 8;
+    realFormat.iPlaces = 5;
+
+    TBuf8<KDefaultRealWidth> latitude;
+    latitude.Num(aPosition.Latitude(), realFormat);
+
+    TBuf8<KDefaultRealWidth> longitude;
+    longitude.Num(aPosition.Longitude(), realFormat);
+
+    // Convert to kilometers
+    const TInt radius = static_cast<TInt>(aRadius / 1000);
+
+    TBuf8<2> langCode;
+
+    // Use device's language to retrieve entries
+    HBufC* tag = AknLangUtils::DisplayLanguageTagL();
+    langCode.Copy(tag->Left(2));
+    delete tag;
+
+    // Set a limit to entries retrieved
+    const TInt maxRows = 20;
+
+    TBuf8<256> uri;
+    _LIT8(KUri, "http://ws.geonames.org/findNearbyWikipedia?lat=%S&lng=%S&radius=%d&lang=%S&maxRows=%d");
+    uri.Format(KUri, &latitude, &longitude, radius, &langCode, maxRows);
+
+    iClient->GetL(uri);
+}
+
+void CLoader::MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
+{
+    switch (aEvent.iStatus)
+    {
+        case THTTPEvent::EGotResponseHeaders:
+        {
+            RHTTPResponse resp = aTransaction.Response();
+            TInt status = resp.StatusCode();
+
+            // Treat any 2xx HTTP code as successful request
+            TInt error = HTTPStatus::IsSuccessful(status)? KErrNone : KErrGeneral;
+
+            if (error == KErrNone)
+                iParser->ParseBeginL();
+
+            iObserver.LandmarkLoaderOpenedL(error);
+
+            break;
+        }
+
+        case THTTPEvent::EGotResponseBodyData:
+        {
+            MHTTPDataSupplier* body = aTransaction.Response().Body();
+
+            TPtrC8 dataChunk;
+            body->GetNextDataPart(dataChunk);
+            iParser->ParseL(dataChunk);
+            body->ReleaseData();
+
+            break;
+        }
+
+        case THTTPEvent::EResponseComplete:
+            LOGTXT("[GEONAMES] HTTP response complete");
+
+            iParser->ParseEndL();
+            break ;
+
+        case THTTPEvent::ESucceeded:
+        case THTTPEvent::EFailed:
+        {
+            RHTTPResponse resp = aTransaction.Response();
+            TInt status = resp.StatusCode();
+
+            LOGARG("[GEONAMES] HTTP response status code %d", status);
+
+            aTransaction.Close();
+
+            break;
+        }
+
+        default:
+            LOGARG("[GEONAMES] HTTP unknown event %d", aEvent.iStatus);
+
+            iObserver.LandmarkLoaderOpenedL(KErrUnknown);
+
+            aTransaction.Close();
+            break;
+    }
+}
+
+TInt CLoader::MHFRunError(TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
+{
+    return KErrNone;
+}
+
+void CLoader::OnStartDocumentL(const Xml::RDocumentParameters& aDocParam, TInt aErrorCode)
+{}
+
+void CLoader::OnEndDocumentL(TInt aErrorCode)
+{}
+
+void CLoader::OnStartElementL(const Xml::RTagInfo& aElement, const Xml::RAttributeArray& aAttributes, TInt aErrorCode)
+{
+    _LIT8(KEntryTag, "entry");
+    if (aElement.LocalName().DesC() == KEntryTag)
+        iState = EValid;
+    else if (iState == EValid)
+        iEntry->EnterState(aElement.LocalName().DesC());
+}
+
+void CLoader::OnEndElementL(const Xml::RTagInfo& aElement, TInt aErrorCode)
+{
+    _LIT8(KEntryTag, "entry");
+    if (aElement.LocalName().DesC() == KEntryTag)
+    {
+        NotifyPOIEntryL();
+
+        iEntry->Reset();
+        iState = EInvalid;
+    }
+    else
+        iEntry->ExitState();
+}
+
+void CLoader::OnContentL(const TDesC8& aBytes, TInt aErrorCode)
+{
+    iEntry->FeedState(aBytes);
+}
+
+void CLoader::OnStartPrefixMappingL(const RString& /*aPrefix*/, const RString& /*aUri*/, TInt /*aErrorCode*/)
+{}
+
+void CLoader::OnEndPrefixMappingL(const RString& /*aPrefix*/, TInt /*aErrorCode*/)
+{}
+
+void CLoader::OnIgnorableWhiteSpaceL(const TDesC8& /*aBytes*/, TInt /*aErrorCode*/)
+{}
+
+void CLoader::OnSkippedEntityL(const RString& /*aName*/, TInt /*aErrorCode*/)
+{}
+
+void CLoader::OnProcessingInstructionL(const TDesC8& /*aTarget*/, const TDesC8& /*aData*/, TInt /*aErrorCode*/)
+{}
+
+void CLoader::OnError(TInt /*aErrorCode*/)
+{}
+
+TAny* CLoader::GetExtendedInterface(const TInt32 /*aUid*/)
+{
+    return 0;
+}
+
+/*
+ * Notify observer of new XML entry
+ */
+void CLoader::NotifyPOIEntryL()
+{
+    CPosLandmark* landmark = CPosLandmark::NewLC();
+
+    HBufC* title = CnvUtfConverter::ConvertToUnicodeFromUtf8L(iEntry->iTitle);
+    CleanupStack::PushL(title);
+    landmark->SetLandmarkNameL(*title);
+    CleanupStack::PopAndDestroy(title);
+
+    HBufC* description = CnvUtfConverter::ConvertToUnicodeFromUtf8L(iEntry->iSummary);
+    CleanupStack::PushL(description);
+    landmark->SetLandmarkDescriptionL(*description);
+    CleanupStack::PopAndDestroy(description);
+
+    TLex8 lex;
+
+    lex.Assign(iEntry->iLat);
+    TReal32 lat = 0;
+    lex.Val(lat);
+
+    lex.Assign(iEntry->iLng);
+    TReal32 lng = 0;
+    lex.Val(lng);
+
+    lex.Assign(iEntry->iElevation);
+    TReal32 elevation = 0;
+    lex.Val(elevation);
+
+    TCoordinate coordinate(lat, lng, elevation);
+    landmark->SetPositionL(TLocality(coordinate, 0, 0));
+
+    HBufC* url = HBufC::NewLC(iEntry->iWikipediaUrl.Length());
+    url->Des().Copy(iEntry->iWikipediaUrl);
+    landmark->SetPositionFieldL(EPositionFieldMediaLinksStart, url->Left(KPosLmMaxTextFieldLength));
+    CleanupStack::PopAndDestroy(url);
+
+    iObserver.LandmarkLoaderItemCreatedL(*landmark);
+
+    CleanupStack::PopAndDestroy(landmark);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/geonames/provider/src/Provider.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,127 @@
+/*
+ * Name        : Provider.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Provider.h"
+
+#include <Hash.h>
+#include <Uri8.h>
+
+#include "Logger.h"
+
+/*
+ * Generates a unique id using name and coordinates as a seed
+ */
+TUint32 GenerateIdL(const CPosLandmark& aLandmark)
+{
+    TPtrC name;
+    aLandmark.GetLandmarkName(name);
+
+    TLocality coordinate;
+    aLandmark.GetPosition(coordinate);
+
+    HBufC8* name8 = HBufC8::NewLC(name.Length());
+    name8->Des().Copy(name);
+
+    TRealFormat realFormat;
+    realFormat.iPoint  = TChar('.');    // Override TLocale::DecimalSeparator() as separator
+    realFormat.iWidth  = 8;             // Set max width of number
+    realFormat.iPlaces = 5;             // Set max width of decimal portion
+
+    TBuf8<KDefaultRealWidth> latitude;
+    latitude.Num(coordinate.Latitude(), realFormat);
+
+    TBuf8<KDefaultRealWidth> longitude;
+    longitude.Num(coordinate.Longitude(), realFormat);
+
+    CSHA1* hash = CSHA1::NewL();
+    CleanupStack::PushL(hash);
+    hash->Update(*name8);
+    hash->Update(latitude);
+    TPtrC8 result = hash->Final(longitude);
+
+    // Use only 32 bits from hash
+    const TUint32* ptr = reinterpret_cast<const TUint32*>(result.Ptr());
+    TUint32 value = *ptr;
+
+    CleanupStack::PopAndDestroy(2, name8);  // hash, name8
+
+    return value;
+}
+
+// Create instance of concrete ECOM interface implementation
+CProvider* CProvider::NewL()
+{
+    CProvider* self = new(ELeave) CProvider();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CProvider::~CProvider()
+{
+    delete iLoader;
+}
+
+CProvider::CProvider()
+{
+}
+
+void CProvider::ConstructL()
+{
+    iLoader = CLoader::NewL(*this);
+}
+
+void CProvider::LandmarkLoaderOpenedL(TInt aError)
+{
+    if (iObserver)
+        iObserver->POIProviderLoadedL(this, aError);
+}
+
+void CProvider::LandmarkLoaderItemCreatedL(const CPosLandmark& aLandmark)
+{
+    if (iObserver)
+    {
+        TPosLmItemId id = aLandmark.LandmarkId();
+
+        if (id == KPosLmNullItemId)
+            id = GenerateIdL(aLandmark);
+
+        _LIT8(KObject, "geonames");
+        OpenMAR::CPOIObject* object = OpenMAR::CPOIObject::NewL(KObject, *this);
+        CleanupStack::PushL(object);
+
+        object->SetIdentifier(id);
+
+        TLocality locality;
+        aLandmark.GetPosition(locality);
+        object->SetCoordinate(locality);
+
+        TPtrC name;
+        aLandmark.GetLandmarkName(name);
+        object->SetNameL(name);
+
+        iObserver->POIObjectCreatedL(object);   // Transfers ownership
+
+        CleanupStack::Pop(object);
+    }
+}
+
+void CProvider::RetrieveL(const TCoordinate& aCoordinate, TReal32 aRadius)
+{
+    LOGARG("[GEONAMES] Retrieving entries from %f %f %f", aCoordinate.Latitude(), aCoordinate.Longitude(), aCoordinate.Altitude());
+
+    iLoader->RequestL(aCoordinate, aRadius);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/data/Landmarks.rss	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,85 @@
+/*
+ * Name        : Landmarks.rss
+ * Description : Interface collection
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include <ecom/RegistryInfo.rh>
+
+#include "InterfaceUid.hrh"
+#include "ImplementationUid.hrh"
+
+RESOURCE REGISTRY_INFO theInfo
+{
+    // UID for the DLL. We use UID of first implementation
+    dll_uid = KDllUidValue;
+
+    // Declare array of interface info
+    interfaces =
+    {
+        INTERFACE_INFO
+        {
+            // UID of interface that is implemented
+            interface_uid = KOverlayInterfaceUidValue;
+
+            implementations =
+            {
+                // Info for COverlay
+                IMPLEMENTATION_INFO
+                {
+                    implementation_uid = KOverlayImplementationUidValue;
+                    version_no         = 1;
+                    display_name       = "Default Overlay";
+                    default_data       = "default";
+                    opaque_data        = "";
+                }
+            };
+        }
+        ,
+        INTERFACE_INFO
+        {
+            // UID of interface that is implemented
+            interface_uid = KProviderInterfaceUidValue;
+
+            implementations =
+            {
+                // Info for CProvider
+                IMPLEMENTATION_INFO
+                {
+                    implementation_uid = KProviderImplementationUidValue;
+                    version_no         = 1;
+                    display_name       = "LMX Provider";
+                    default_data       = "lmx";
+                    opaque_data        = "";
+                }
+            };
+        }
+        ,
+        INTERFACE_INFO
+        {
+            // UID of interface that is implemented
+            interface_uid = KObjectInterfaceUidValue;
+
+            implementations =
+            {
+                // Info for CRenderer
+                IMPLEMENTATION_INFO
+                {
+                    implementation_uid = KObjectImplementationUidValue;
+                    version_no         = 1;
+                    display_name       = "LMX Object";
+                    default_data       = "lmx";
+                    opaque_data        = "";
+                }
+            };
+        }
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/ecom/inc/ImplementationUid.hrh	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,24 @@
+/*
+ * Name        : ImplementationUid.hrh
+ * Description : ECOM implementation UIDs
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef IMPLEMENTATIONUID_HRH_
+#define IMPLEMENTATIONUID_HRH_
+
+#define KDllUidValue                    0x2002E1AF
+
+#define KOverlayImplementationUidValue  0x2002E1AF
+#define KProviderImplementationUidValue 0x2002E1B0
+#define KObjectImplementationUidValue   0x2002E1B1
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/ecom/src/Proxy.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,36 @@
+/*
+ * Name        : Proxy.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include <e32base.h>
+
+#include <ecom/implementationproxy.h>
+
+#include "ImplementationUid.hrh"
+#include "Overlay.h"
+#include "Provider.h"
+#include "Object.h"
+
+const TImplementationProxy ImplementationTable[] =
+{
+    IMPLEMENTATION_PROXY_ENTRY(KOverlayImplementationUidValue, COverlay::NewL),
+    IMPLEMENTATION_PROXY_ENTRY(KProviderImplementationUidValue, CProvider::NewL),
+    IMPLEMENTATION_PROXY_ENTRY(KObjectImplementationUidValue, CLMXObject::NewL),
+};
+
+// Function used to return an instance of the proxy table.
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+{
+    aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+    return ImplementationTable;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/group/Landmarks.mmp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,101 @@
+/*
+ * Name        : Landmarks.mmp
+ * Description : Project definition
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+TARGET Landmarks_0x2002E1AF.dll
+TARGETTYPE PLUGIN
+
+UID 0x10009D8D 0x2002E1AF
+SECUREID 0x2002E1AF
+
+CAPABILITY  LocalServices Location NetworkServices ReadUserData ReadDeviceData SwEvent UserEnvironment WriteDeviceData WriteUserData //MultimediaDD
+
+MACRO       __DEBUG__
+
+SOURCEPATH  ..\ecom\src
+SOURCE      Proxy.cpp
+
+SOURCEPATH  ..\overlay\src
+SOURCE      Accelerometer.cpp
+SOURCE      AutoRotation.cpp
+SOURCE      Magnetometer.cpp
+SOURCE      Overlay.cpp
+SOURCE      Manager.cpp
+SOURCE      Position.cpp
+
+SOURCEPATH  ..\provider\src
+SOURCE      Provider.cpp
+SOURCE      Local.cpp
+SOURCE      Remote.cpp
+
+SOURCEPATH  ..\object\src
+SOURCE      Object.cpp
+
+SOURCEPATH  ..\..\..\..\common\src
+SOURCE      HttpClient.cpp
+SOURCE      IconLoader.cpp
+SOURCE      Logger.cpp
+
+USERINCLUDE     ..\..\..\..\interface
+USERINCLUDE     ..\..\..\..\interface\overlay
+USERINCLUDE     ..\..\..\..\interface\provider
+USERINCLUDE     ..\..\..\..\interface\object
+
+USERINCLUDE     ..\ecom\inc
+
+USERINCLUDE     ..\overlay\inc
+USERINCLUDE     ..\provider\inc
+USERINCLUDE     ..\object\inc 
+USERINCLUDE     ..\..\..\..\common\inc 
+
+SYSTEMINCLUDE   \epoc32\include
+
+SOURCEPATH  ..\data
+START RESOURCE  Landmarks.rss
+    TARGET  Landmarks_0x2002E1AF.rsc
+END
+
+LIBRARY         euser.lib
+LIBRARY         eikcore.lib
+LIBRARY         cone.lib
+LIBRARY         ecom.lib
+
+LIBRARY         eposlandmarks.lib
+LIBRARY         hash.lib
+
+LIBRARY         efsrv.lib
+LIBRARY         bafl.lib
+LIBRARY         PlatformEnv.lib
+
+LIBRARY         SenXml.lib
+LIBRARY         XmlFramework.lib
+
+LIBRARY         http.lib
+LIBRARY         inetprotutil.lib
+LIBRARY         esock.lib
+
+LIBRARY         libgles_cm.lib
+LIBRARY         ws32.lib
+
+LIBRARY         bitgdi.lib
+LIBRARY         fbscli.lib
+LIBRARY         gdi.lib
+LIBRARY         egul.lib
+LIBRARY         ImageConversion.lib
+LIBRARY         AknIcon.lib
+
+LIBRARY         CentralRepository.lib
+
+LIBRARY         lbs.lib
+LIBRARY         SensrvClient.lib
+LIBRARY         SensrvUtil.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/group/LandmarksIcons.mk	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,63 @@
+#/*
+# * Name        : LandmarksIcon.mk
+# * Description : Icon makefile
+# * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+# * Website     : http://OpenMAR.org
+# *
+# * Copyright (c) 2010 David Caabeiro
+# *
+# * All rights reserved. This program and the accompanying materials are made available 
+# * under the terms of the Eclipse Public License v1.0 which accompanies this 
+# * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+# *
+# */
+
+ifeq (WINS,$(findstring WINS, $(PLATFORM)))
+ZDIR=$(EPOCROOT)epoc32\release\$(PLATFORM)\$(CFG)\Z
+else
+ZDIR=$(EPOCROOT)epoc32\data\z
+endif
+
+TARGETDIR=$(ZDIR)\resource\apps
+ICONTARGETFILENAME=$(TARGETDIR)\Landmarks_0x2002E1AF.mif
+
+HEADERDIR=$(EPOCROOT)epoc32\include
+HEADERFILENAME=$(HEADERDIR)\Landmarks_0x2002E1AF.mbg
+
+ICONDIR=..\renderer\gfx
+
+do_nothing :
+	@rem do_nothing
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+CLEAN : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+# ----------------------------------------------------------------------------
+# NOTE: if you have JUSTINTIME enabled for your S60 3rd FP1 or newer SDK
+# and this command crashes, consider adding "/X" to the command line.
+# See <http://forum.nokia.com/document/Forum_Nokia_Technical_Library_v1_35/contents/FNTL/Build_process_fails_at_mif_file_creation_in_S60_3rd_Ed_FP1_SDK.htm>
+# ----------------------------------------------------------------------------
+
+RESOURCE : $(ICONTARGETFILENAME)
+
+$(ICONTARGETFILENAME) : 
+	mifconv $(ICONTARGETFILENAME) /h$(HEADERFILENAME) \
+		/c24,8 $(ICONDIR)\Icon.svg
+
+FREEZE : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+	@echo $(HEADERFILENAME)&& \
+	@echo $(ICONTARGETFILENAME)
+
+FINAL : do_nothing
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/object/gfx/Icon.svg	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 14.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 43363)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Basic//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd">
+<svg version="1.1" baseProfile="basic" id="Layer_1"
+	 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="64px" height="64px"
+	 viewBox="0 0 64 64" xml:space="preserve">
+<g>
+	<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="32.4067" y1="65.9463" x2="32.4067" y2="-4.8316">
+		<stop  offset="0.2" style="stop-color:#EE2B24"/>
+		<stop  offset="0.4402" style="stop-color:#E02825"/>
+		<stop  offset="0.8306" style="stop-color:#C62225"/>
+		<stop  offset="1" style="stop-color:#B92025"/>
+	</linearGradient>
+	<path fill="url(#SVGID_1_)" d="M65.406,57.463c0,4.125-3.375,7.5-7.5,7.5H6.907c-4.125,0-7.5-3.375-7.5-7.5v-51
+		c0-4.125,3.375-7.5,7.5-7.5h50.999c4.125,0,7.5,3.375,7.5,7.5V57.463z"/>
+	
+		<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-598.5894" y1="-859.8691" x2="-598.5894" y2="-840.6924" gradientTransform="matrix(-1 0 0 -1 -566.1826 -800.8389)">
+		<stop  offset="0" style="stop-color:#F37554"/>
+		<stop  offset="0.0722" style="stop-color:#F36D4C"/>
+		<stop  offset="0.3089" style="stop-color:#F05437"/>
+		<stop  offset="0.5444" style="stop-color:#EF402B"/>
+		<stop  offset="0.7763" style="stop-color:#EE3125"/>
+		<stop  offset="1" style="stop-color:#EE2B24"/>
+	</linearGradient>
+	<path fill="url(#SVGID_2_)" d="M61.454,34.532v23.294c0,1.984-1.626,3.609-3.609,3.609H6.969c-1.985,0-3.609-1.625-3.609-3.609
+		V34.532H61.454z"/>
+	<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="32.4067" y1="5.7788" x2="32.4067" y2="31.9996">
+		<stop  offset="0.05" style="stop-color:#FBC0A8"/>
+		<stop  offset="0.2586" style="stop-color:#F7997A"/>
+		<stop  offset="0.5083" style="stop-color:#F37251"/>
+		<stop  offset="0.7242" style="stop-color:#F05135"/>
+		<stop  offset="0.8952" style="stop-color:#EE3727"/>
+		<stop  offset="1" style="stop-color:#EE2B24"/>
+	</linearGradient>
+	<path fill="url(#SVGID_3_)" d="M3.359,39.275V6.1c0-1.985,1.624-3.609,3.609-3.609h50.876c1.983,0,3.609,1.625,3.609,3.609v33.176
+		H3.359z"/>
+</g>
+<path fill="#FFFFFF" d="M41.168,44.279l-2.729-6.994H26.373l-2.728,6.994H41.168z M42.488,48.029H22.324l-2.421,6.126
+	c-0.04,0.114-0.022,0.241,0.048,0.341s0.185,0.158,0.306,0.158h24.3c0.122,0,0.236-0.059,0.307-0.158s0.088-0.227,0.047-0.341
+	L42.488,48.029z M30.196,26.432l-2.502,7.104h9.425l-2.502-7.101c1.537-0.806,2.602-2.396,2.602-4.248
+	c0-2.651-2.156-4.808-4.811-4.808c-2.651,0-4.811,2.156-4.811,4.808C27.597,24.035,28.659,25.626,30.196,26.432z M23.761,27.152
+	c0.407-0.354,0.45-0.97,0.097-1.377c-0.853-0.981-1.323-2.235-1.323-3.536c0-1.345,0.497-2.631,1.399-3.627
+	c0.363-0.398,0.333-1.014-0.067-1.377c-0.398-0.36-1.014-0.331-1.377,0.067c-1.228,1.356-1.904,3.108-1.904,4.937
+	c0,1.77,0.639,3.48,1.8,4.816C22.738,27.461,23.354,27.504,23.761,27.152z M42.279,22.239c0,1.298-0.472,2.555-1.326,3.536
+	c-0.353,0.407-0.309,1.022,0.098,1.377c0.405,0.352,1.021,0.309,1.375-0.097c1.163-1.339,1.803-3.05,1.803-4.816
+	c0-1.828-0.676-3.58-1.905-4.937c-0.36-0.398-0.979-0.428-1.377-0.067c-0.398,0.363-0.428,0.979-0.067,1.377
+	C41.781,19.608,42.279,20.895,42.279,22.239z M46.132,12.814c-0.363-0.398-0.979-0.428-1.377-0.064
+	c-0.398,0.36-0.428,0.979-0.064,1.377c2.021,2.221,3.135,5.104,3.135,8.112c0,2.962-1.084,5.81-3.053,8.016
+	c-0.357,0.401-0.322,1.018,0.079,1.377c0.402,0.357,1.02,0.322,1.377-0.079c2.288-2.563,3.547-5.871,3.547-9.313
+	C49.775,18.741,48.481,15.396,46.132,12.814z M49.896,8.092c-0.363-0.398-0.98-0.428-1.379-0.064
+	c-0.396,0.363-0.426,0.979-0.063,1.377c3.202,3.516,4.966,8.074,4.966,12.835c0,4.709-1.734,9.233-4.881,12.735
+	c-0.36,0.401-0.325,1.017,0.073,1.377c0.401,0.36,1.018,0.326,1.377-0.073c3.471-3.861,5.381-8.848,5.381-14.039
+	C55.371,16.989,53.427,11.965,49.896,8.092z M20.037,30.255c-1.967-2.209-3.051-5.057-3.051-8.016c0-3.012,1.115-5.892,3.139-8.112
+	c0.362-0.398,0.334-1.014-0.064-1.377s-1.015-0.334-1.377,0.064c-2.353,2.581-3.647,5.927-3.647,9.425
+	c0,3.439,1.26,6.746,3.545,9.313c0.359,0.401,0.976,0.437,1.377,0.079S20.396,30.658,20.037,30.255z M11.393,22.239
+	c0-4.764,1.764-9.322,4.967-12.835c0.362-0.398,0.334-1.014-0.064-1.377s-1.014-0.334-1.377,0.064
+	c-3.53,3.87-5.476,8.895-5.476,14.147c0,5.191,1.91,10.178,5.379,14.039c0.36,0.399,0.977,0.434,1.377,0.073
+	c0.401-0.36,0.434-0.976,0.073-1.377C13.126,31.472,11.393,26.949,11.393,22.239z"/>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/object/inc/Object.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,40 @@
+/*
+ * Name        : Object.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef OBJECT_H_
+#define OBJECT_H_
+
+#include "POIObject.h"
+
+/**
+ * @brief Implements basic object rendering for landmarks
+ */
+class CLMXObject : public OpenMAR::CPOIObject
+{
+public:
+    static CLMXObject* NewL(OpenMAR::CPOIProvider* aProvider);
+    ~CLMXObject();
+
+protected:
+    CLMXObject(OpenMAR::CPOIProvider* aProvider);
+    void ConstructL();
+
+public:
+    void Render() const;
+
+private:
+    TUint iTextureId;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/object/src/Object.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,213 @@
+/*
+ * Name        : Object.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Object.h"
+
+#include "IconLoader.h"
+#include "Vector3d.h"
+
+#include <bitdev.h>
+#include <bitstd.h>
+#include <fbs.h>
+#include <GulIcon.h>
+#include <GLES/egl.h>
+
+#include <Landmarks_0x2002E1AF.mbg>
+
+#include "Logger.h"
+
+CLMXObject* CLMXObject::NewL(OpenMAR::CPOIProvider* aProvider)
+{
+    CLMXObject* self = new(ELeave) CLMXObject(aProvider);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CLMXObject::~CLMXObject()
+{
+    ::glDeleteTextures(1, &iTextureId);
+}
+
+CLMXObject::CLMXObject(OpenMAR::CPOIProvider* aProvider)
+    : OpenMAR::CPOIObject(*aProvider)
+{}
+
+/*
+ * Landmark objects will make use of an SVG file for rendering (demo purposes)
+ */
+void CLMXObject::ConstructL()
+{
+    _LIT(KIconFile, "\\resource\\apps\\Landmarks_0x2002E1AF.mif");
+
+    CGulIcon* icon = CreateIconL(KIconFile, EMbmLandmarks_0x2002e1afIcon, EMbmLandmarks_0x2002e1afIcon_mask);
+    CleanupStack::PushL(icon);
+
+    CFbsBitmap* bitmap = icon->Bitmap();    // Ownership NOT transferred
+    CFbsBitmap* mask   = icon->Mask();      // Ownership NOT transferred
+
+    // Always expect 16M bitmap to make conversion to GL_RGBA easier 
+    if (bitmap->DisplayMode() != EColor16M)
+    {
+        bitmap = new(ELeave) CFbsBitmap;
+        CleanupStack::PushL(bitmap);
+
+        User::LeaveIfError(bitmap->Create(icon->Bitmap()->SizeInPixels(), EColor16M));
+
+        CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(bitmap);
+        CleanupStack::PushL(bitmapDevice);
+
+        CFbsBitGc* bitmapContext = 0;
+        User::LeaveIfError(bitmapDevice->CreateContext(bitmapContext));
+        CleanupStack::PushL(bitmapContext);
+
+        bitmapContext->BitBlt(TPoint(0, 0), icon->Bitmap());
+
+        CleanupStack::PopAndDestroy(2, bitmapDevice);
+
+        icon->SetBitmap(bitmap);    // Ownership transferred
+
+        CleanupStack::Pop(bitmap);
+    }
+
+    // Always expect 256 mask to make conversion to GL_RGBA easier 
+    if (mask->DisplayMode() != EGray256)
+    {
+        mask = new(ELeave) CFbsBitmap;
+        CleanupStack::PushL(mask);
+
+        User::LeaveIfError(mask->Create(icon->Mask()->SizeInPixels(), EGray256));
+
+        CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(mask);
+        CleanupStack::PushL(bitmapDevice);
+
+        CFbsBitGc* bitmapContext = 0;
+        User::LeaveIfError(bitmapDevice->CreateContext(bitmapContext));
+        CleanupStack::PushL(bitmapContext);
+
+        bitmapContext->BitBlt(TPoint(0, 0), icon->Mask());
+
+        CleanupStack::PopAndDestroy(2, bitmapDevice);
+
+        icon->SetMask(mask);    // Ownership transferred
+
+        CleanupStack::Pop(mask);
+    }
+
+    // Now bitmap and mask point to either original or converted bitmaps, 
+    // and ownership belongs to icon
+
+    const TSize bitmapSize = bitmap->SizeInPixels();
+
+    // sizeof(TUint32) == sizeof(RGBA)
+    const TInt dataSize = bitmapSize.iWidth * bitmapSize.iHeight * sizeof(TUint32);
+    TUint8* data = new(ELeave) TUint8[dataSize];
+
+    // Perform copy and conversion from BGR(A) to RGB(A)
+    bitmap->LockHeap();
+    mask->LockHeap();
+
+    // TODO: Alpha component removed, as it seems to be corrupted from
+    // subsequent reads from SVG file
+
+    TUint8* rgb = reinterpret_cast<TUint8*>(bitmap->DataAddress());
+//    TUint8* alpha = reinterpret_cast<TUint8*>(mask->DataAddress());
+
+    for(TInt i = 0, j = 0; i < dataSize; i += 4, j += 3)
+    {
+        data[i + 0] = rgb[j + 2];
+        data[i + 1] = rgb[j + 1];
+        data[i + 2] = rgb[j + 0];
+        data[i + 3] = 0xc0; //alpha[i / 4];
+    }
+
+    // Generate OpenGL texture
+    ::glGenTextures(1, &iTextureId); 
+    ::glBindTexture(GL_TEXTURE_2D, iTextureId);
+
+    ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+    ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+    ::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmapSize.iWidth, bitmapSize.iHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
+
+    mask->UnlockHeap();
+    bitmap->UnlockHeap();
+
+    delete data;
+
+    CleanupStack::PopAndDestroy(icon);
+}
+
+void CLMXObject::Render() const
+{
+    /*
+     * This is a special case for points or planes in space. Given that a usual POI
+     * does not provide of any transformation to be applied on it, we determine the
+     * angle in the XY plane with respect to the observer and apply that rotation to 
+     * the object.
+     *
+     * This way, all POIs will face the observer regardless their position. Other
+     * objects (3D Landmarks, etc) should provide their own transformations in some
+     * proper way.   
+     */
+
+    TReal angle = 0;
+    Math::ATan(angle, iPosition.mX, iPosition.mY);
+    angle *= -KRadToDeg;
+
+    /*
+     * We could also apply some scaling calculation to compensate the size of
+     * objects projected at a long distance from the camera.
+     * For now we just use a constant value
+     */
+
+    TReal scale = 64.0f;
+
+    // Apply transformations to the object and render it
+
+    const TInt unity = 1 << 16;
+
+    GLfixed vertices[] = {
+        -unity / 2, 0, 0,
+         unity / 2, 0, 0,
+        -unity / 2, 0, unity,
+         unity / 2, 0, unity,
+    };
+
+    GLfixed texCoords[] = {
+        0,      unity,
+        unity,  unity,
+        0,      0,
+        unity,  0
+    };
+
+    ::glPushMatrix();
+
+    ::glTranslatef(iPosition.mX, iPosition.mY, iPosition.mZ);
+    ::glRotatef(angle, 0, 0, 1);
+    ::glScalef(scale, 1.0f, scale);
+
+    ::glEnable(GL_TEXTURE_2D);
+    ::glBindTexture(GL_TEXTURE_2D, iTextureId);
+    ::glVertexPointer(3, GL_FIXED, 0, vertices);
+    ::glTexCoordPointer(2, GL_FIXED, 0, texCoords);
+    ::glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+    ::glDisable(GL_TEXTURE_2D);
+
+    ::glPopMatrix();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/overlay/inc/Accelerometer.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,62 @@
+/*
+ * Name        : Accelerometer.h
+ * Description : Accelerometer helper class
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef ACCELEROMETER_H_
+#define ACCELEROMETER_H_
+
+#include "Vector3d.h"
+
+#include <SensrvDataListener.h>
+
+class CSensrvChannel;
+
+/**
+ * @brief Wrapper class over sensor channel to retrieve data from 3-axis accelerometer
+ * 
+ * This class also implements a simple bandpass filter
+ */
+class CAccelerometer : public CBase, 
+            public MSensrvDataListener
+{
+public:
+    static CAccelerometer* NewL();
+    ~CAccelerometer();
+
+protected:
+    CAccelerometer();
+    void ConstructL();
+
+public:
+    void StartL();
+    void Stop();
+
+    const Vector3d GetValue() const { return Vector3d(iX1, iY1, iZ1); }
+
+protected:
+    // From MSensrvDataListener
+    void DataReceived(CSensrvChannel& aChannel, TInt aCount, TInt aDataLost);
+    void DataError(CSensrvChannel& aChannel, TSensrvErrorSeverity aError);
+    void GetDataListenerInterfaceL(TUid aInterfaceUid, TAny*& aInterface);
+
+private:
+    CSensrvChannel* iSensorChannel;
+
+    TReal iX1;
+    TReal iY1;
+    TReal iZ0;
+    TReal iZ1;
+    TReal iZ2;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/overlay/inc/AutoRotation.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,52 @@
+/*
+ * Name        : AutoRotation.h
+ * Description : Handles device autorotation setting
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef AUTOROTATION_H_
+#define AUTOROTATION_H_
+
+#include <e32base.h>
+
+class CRepository;
+
+/**
+ * @brief Handles device autorotation setting
+ * 
+ * The N97 has an issue where the compass gets uncalibrated if autorotation is enabled.
+ * 
+ */
+class CAutoRotation : public CActive
+{
+public:
+    static CAutoRotation* NewL();
+    ~CAutoRotation();
+
+protected:
+    CAutoRotation();
+    void ConstructL();
+
+    void RunL();
+    void DoCancel();
+
+    void Notify();
+
+public:
+    void ResetL();
+    void RestoreL();
+
+private:
+    CRepository* iRepository;
+    TInt iTurnCtrl;
+};
+
+#endif  // AUTOROTATION_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/overlay/inc/Magnetometer.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,79 @@
+/*
+ * Name        : Magnetometer.h
+ * Description : Magnetometer helper class
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef MAGNETOMETER_H_
+#define MAGNETOMETER_H_
+
+#include "Vector3d.h"
+
+#include <SensrvDataListener.h>
+#include <SensrvPropertyListener.h>
+
+class CSensrvChannel;
+
+/**
+ * @brief Wrapper class over sensor channel to retrieve data from 3-axis magnetometer
+ * 
+ * This class also implements a simple lowpass filter
+ */
+class CMagnetometer : public CBase,
+            public MSensrvDataListener,
+            public MSensrvPropertyListener
+{
+public:
+    static CMagnetometer* NewL();
+    ~CMagnetometer();
+
+protected:
+    CMagnetometer();
+    void ConstructL();
+
+public:
+    void StartL();
+    void Stop();
+
+    const Vector3d GetValue() const { return Vector3d(iX, iY, iZ); }
+
+    enum TCalibration {
+        ENone,
+        ELow,
+        EModerate,
+        EHigh
+    };
+
+    TCalibration Calibration() const { return iCalibration; }
+
+protected:
+    // From MSensrvDataListener
+    void DataReceived(CSensrvChannel& aChannel, TInt aCount, TInt aDataLost);
+    void DataError(CSensrvChannel& aChannel, TSensrvErrorSeverity aError);
+    void GetDataListenerInterfaceL(TUid aInterfaceUid, TAny*& aInterface);
+
+    // From MSensrvPropertyListener
+    void PropertyChanged(CSensrvChannel& aChannel, const TSensrvProperty& aChangedProperty);
+    void PropertyError(CSensrvChannel& aChannel, TSensrvErrorSeverity aError);
+    void SetPropertySuccessIndicationChanged(TSetPropertySuccessIndicator aIndication);
+    void GetPropertyListenerInterfaceL(TUid aInterfaceUid, TAny*& aInterface);
+
+private:
+    CSensrvChannel* iSensorChannel;
+
+    TReal iX;
+    TReal iY;
+    TReal iZ;
+
+    TCalibration iCalibration;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/overlay/inc/Manager.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,63 @@
+/*
+ * Name        : Manager.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef MANAGER_H_
+#define MANAGER_H_
+
+#include "POIProvider.h"
+#include "POIObject.h"
+
+#include "Vector3d.h"
+
+/**
+ * @brief Manages points of interest
+ * 
+ * The manager connects to a group of POI providers and manages a list of POIs
+ * A caching and filtering mechanism could be implemented
+ */
+class CManager : public CBase, public OpenMAR::MPOIProviderObserver
+{
+    friend class COverlay;
+
+public:
+    static CManager* NewL();
+    ~CManager();
+
+protected:
+    CManager();
+    void ConstructL();
+
+protected:
+    // From OpenMAR::MPOIProviderObserver
+    void POIProviderLoadedL(OpenMAR::CPOIProvider* aProvider, TInt aError);
+    void POIObjectCreatedL(OpenMAR::CPOIObject* aPOIObject);
+    void POIObjectUpdatedL(OpenMAR::CPOIObject* aPOIObject);
+
+protected:
+    const Vector3d Transform(const TCoordinate& aCoordinate);
+
+public:
+    void SetOrigin(const TCoordinate& aCoordinate);
+
+    void RequestL(const TCoordinate& aCoordinate);
+    void Render() const;
+
+private:
+    RPointerArray<OpenMAR::CPOIProvider> iProviderList;
+
+    TCoordinate iOrigin;
+    RPointerArray<OpenMAR::CPOIObject> iObjectList;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/overlay/inc/Overlay.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,86 @@
+/*
+ * Name        : Overlay.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef OVERLAY_H_
+#define OVERLAY_H_
+
+#include <e32base.h>
+#include <GLES/egl.h>
+
+#include "POIOverlay.h"
+
+#include "Matrix4d.h"
+#include "Position.h"
+
+class RWindow;
+class CWsBitmap;
+
+class CAccelerometer;
+class CMagnetometer;
+class CAutoRotation;
+class CManager;
+
+/**
+ * @brief Points of interest overlay
+ * 
+ * Uses orientation and position to request POIs around the current location 
+ */
+class COverlay : public OpenMAR::CPOIOverlay,
+            public MPositionObserver
+{
+public:
+    static COverlay* NewL(SParameter& aParameter);
+    ~COverlay();
+
+protected:
+    COverlay(SParameter& aParameter);
+    void ConstructL();
+
+public:
+    void StartL();
+    void Stop();
+    const CFbsBitmap& RenderScene();
+
+protected:
+    // From MPositionObserver
+    void PositionUpdateL(TInt aError, const TPosition& aPosition);
+
+public:
+    TInt GetFocusedPOI();
+
+private:
+    CPosition* iPosition;
+    CAccelerometer* iAccelerometer;
+    CMagnetometer* iMagnetometer;
+    CAutoRotation* iAutoRotation;
+
+    CManager* iManager;
+
+private:
+    RWindow& iWindow;
+    TRect iRect;
+
+    EGLDisplay  iEglDisplay;
+    EGLSurface  iEglSurface;
+    EGLConfig   iConfig;
+    EGLContext  iEglContext;
+
+    CWsBitmap*  iPixmap;
+
+private:
+    Matrix4d iProjection;
+    Matrix4d iModelView;
+};
+
+#endif  // OVERLAY_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/overlay/inc/Position.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,64 @@
+/*
+ * Name        : Position.h
+ * Description : Position helper class
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef POSITION_H_
+#define POSITION_H_
+
+#include <e32base.h>
+#include <Lbs.h>
+#include <LbsPositionInfo.h>
+
+class MPositionObserver
+{
+public:
+    virtual void PositionUpdateL(TInt aError, const TPosition& aPosition) = 0;
+};
+
+/**
+ * @brief 
+ * 
+ */
+class CPosition : public CActive
+{
+public:
+    static CPosition* NewL(MPositionObserver& aObserver);
+    ~CPosition();
+
+protected:
+    CPosition(MPositionObserver& aObserver);
+    void ConstructL();
+
+public:
+    void Request();
+
+protected:
+    void RunL();
+    void DoCancel();
+    TInt RunError(TInt aError);
+
+private:
+    MPositionObserver& iObserver;
+
+    RPositionServer iServer;
+    RPositioner iPositioner;
+    TPositionInfo iPositionInfo;
+
+    enum TState {
+        EUnknown,
+        ECache,
+        EGps
+    } iState;
+};
+
+#endif  // POSITION_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/overlay/src/Accelerometer.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,126 @@
+/*
+ * Name        : Accelerometer.cpp
+ * Description : Accelerometer helper class
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Accelerometer.h"
+
+#include <SensrvAccelerometerSensor.h>
+
+#include <SensrvChannel.h>
+#include <SensrvChannelFinder.h>
+#include <SensrvChannelInfo.h>
+
+CAccelerometer* CAccelerometer::NewL()
+{
+    CAccelerometer* self = new(ELeave) CAccelerometer;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CAccelerometer::~CAccelerometer()
+{
+    iSensorChannel->CloseChannel();
+}
+
+CAccelerometer::CAccelerometer()
+{}
+
+void CAccelerometer::ConstructL()
+{
+    CSensrvChannelFinder* sensorChannelFinder = CSensrvChannelFinder::NewLC();
+
+    RSensrvChannelInfoList channelInfoList;
+    CleanupClosePushL(channelInfoList);
+
+    TSensrvChannelInfo mySearchConditions;
+    mySearchConditions.iChannelType = KSensrvChannelTypeIdAccelerometerXYZAxisData;
+
+    sensorChannelFinder->FindChannelsL(channelInfoList, mySearchConditions);
+
+    TSensrvChannelInfo channelInfo;
+
+    if (channelInfoList.Count() > 0)
+        channelInfo = channelInfoList[0];
+    else
+        User::Leave(KErrNotFound);
+
+    CleanupStack::PopAndDestroy(&channelInfoList);
+    CleanupStack::PopAndDestroy(sensorChannelFinder);
+
+    iSensorChannel = CSensrvChannel::NewL(channelInfo);
+    iSensorChannel->OpenChannelL();
+}
+
+void CAccelerometer::StartL()
+{
+    iSensorChannel->StartDataListeningL(this, 1, 8, 0);
+}
+
+void CAccelerometer::Stop()
+{
+    iSensorChannel->StopDataListening();
+}
+
+void CAccelerometer::DataReceived(CSensrvChannel& aChannel, TInt aCount, TInt aDataLost)
+{
+    if (aChannel.GetChannelInfo().iChannelType ==  KSensrvChannelTypeIdAccelerometerXYZAxisData)
+    {
+        TPckgBuf<TSensrvAccelerometerAxisData> dataBuffer;
+        TSensrvAccelerometerAxisData data;
+
+        for (TInt i = 0; i < aCount; ++i)
+        {
+            aChannel.GetData(dataBuffer);
+
+            data = dataBuffer();
+            // Do something with the date in data variable
+            // data.iTimeStamp
+
+            // Compensate axis for landscape mode
+            TInt x = -data.iAxisY;
+            TInt y =  data.iAxisX;
+            TInt z =  data.iAxisZ;
+#if 0
+            TInt x = data.iAxisX;
+            TInt y = data.iAxisY;
+            TInt z = data.iAxisZ;
+#endif
+            const TReal K128 = 0.0078125;   // 1/128
+            const TReal KPole1 = 0.97;      // Pole of lowpass filter applied to X and Y
+            const TReal KPole2 = 0.90;      // Pole of lowpass filter applied to Z
+            const TReal KPole3 = 0.75;      // Pole of highpass filter applied to Z
+
+            // Single-pole lowpass-filtering of X and Y
+            iX1 = KPole1 * iX1 + ( 1.0 - KPole1 ) * ( K128 * x );
+            iY1 = KPole1 * iY1 + ( 1.0 - KPole1 ) * ( K128 * y );
+
+            // Single-pole lowpass-filtering of Z
+            iZ0 = KPole2 * iZ1 + ( 1.0 - KPole2 ) * ( K128 * z );
+            // 1st order highpass-filtering of Z (zero at 1)
+            iZ2 = KPole3 * iZ2 + ( 1.0 - KPole3 ) * ( iZ0 - iZ1 );
+
+            // Update variables for use at next sample
+            iZ1 = iZ0;
+        }
+    }
+}
+
+void CAccelerometer::DataError(CSensrvChannel& aChannel, TSensrvErrorSeverity aError)
+{
+}
+
+void CAccelerometer::GetDataListenerInterfaceL(TUid aInterfaceUid, TAny*& aInterface)
+{}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/overlay/src/AutoRotation.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,117 @@
+/*
+ * Name        : AutoRotation.cpp
+ * Description : Handles device autorotation setting
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "AutoRotation.h"
+
+#include "Logger.h"
+
+#include <CentralRepository.h>
+
+// Taken from SensorPluginDomainCrKeys.h
+const TUid KCRUidSensorSettings = { 0x10282DF0 };
+
+/*
+ * Bitmask of variated use cases for Turning interaction.
+ *
+ * Possible values:
+ *  0000 0000: No selected use cases, Turning interactions disabled
+ *  0000 0001: Only Silence calls use case enabled
+ *  0000 0010: Only Snooze alarm use case enabled
+ *  0000 0100: Only Display orientation use case enabled
+ *
+ * Bitmask may contain different variations of above selections
+ *
+ * Value is an integer.
+ *
+ * Default value: 7
+ */
+
+//const TUint32 KSenSetVariationTurnCtrl = 0x00100003;
+const TUint32 KSenSettingsTurnCtrl     = 0x00000003;
+
+CAutoRotation* CAutoRotation::NewL()
+{
+    CAutoRotation* self = new(ELeave) CAutoRotation;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CAutoRotation::~CAutoRotation()
+{
+    Cancel();
+}
+
+CAutoRotation::CAutoRotation()
+    : CActive(CActive::EPriorityStandard)
+{
+    CActiveScheduler::Add(this);
+}
+
+void CAutoRotation::ConstructL()
+{
+    LOGTXT("CAutoRotation::ConstructL()");
+
+    iRepository = CRepository::NewL(KCRUidSensorSettings);
+
+    RunL();
+}
+
+void CAutoRotation::RunL()
+{
+    // Store setting value upon any external change
+    User::LeaveIfError(iRepository->Get(KSenSettingsTurnCtrl, iTurnCtrl));
+
+    Notify();
+}
+
+void CAutoRotation::DoCancel()
+{
+    iRepository->NotifyCancel(KSenSettingsTurnCtrl);
+}
+
+void CAutoRotation::Notify()
+{
+    iRepository->NotifyRequest(KSenSettingsTurnCtrl, iStatus);
+    SetActive();
+}
+
+/*
+ * Turn autorotation off
+ */
+void CAutoRotation::ResetL()
+{
+    // We don't want to get notification of our own modifications
+    Cancel();
+
+    TInt turnCtrl = iTurnCtrl & 0xfffffffb;
+    User::LeaveIfError(iRepository->Set(KSenSettingsTurnCtrl, turnCtrl));
+
+    Notify();
+}
+
+/*
+ * Restore original value
+ */
+void CAutoRotation::RestoreL()
+{
+    // We don't want to get notification of our own modifications
+    Cancel();
+
+    User::LeaveIfError(iRepository->Set(KSenSettingsTurnCtrl, iTurnCtrl));
+
+    Notify();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/overlay/src/Magnetometer.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,155 @@
+/*
+ * Name        : Magnetometer.cpp
+ * Description : Magnetometer helper class
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Magnetometer.h"
+
+#include <SensrvMagnetometerSensor.h>
+
+#include <SensrvChannel.h>
+#include <SensrvChannelFinder.h>
+#include <SensrvChannelInfo.h>
+#include <SensrvProperty.h>
+
+CMagnetometer* CMagnetometer::NewL()
+{
+    CMagnetometer* self = new(ELeave) CMagnetometer;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CMagnetometer::~CMagnetometer()
+{
+    iSensorChannel->CloseChannel();
+}
+
+CMagnetometer::CMagnetometer()
+{}
+
+void CMagnetometer::ConstructL()
+{
+    CSensrvChannelFinder* sensorChannelFinder = CSensrvChannelFinder::NewLC();
+
+    RSensrvChannelInfoList channelInfoList;
+    CleanupClosePushL(channelInfoList);
+
+    TSensrvChannelInfo mySearchConditions;
+    mySearchConditions.iChannelType = KSensrvChannelTypeIdMagnetometerXYZAxisData;
+
+    sensorChannelFinder->FindChannelsL(channelInfoList, mySearchConditions);
+
+    TSensrvChannelInfo channelInfo;
+
+    if (channelInfoList.Count() > 0)
+        channelInfo = channelInfoList[0];
+    else
+        User::Leave(KErrNotFound);
+
+    CleanupStack::PopAndDestroy(&channelInfoList);
+    CleanupStack::PopAndDestroy(sensorChannelFinder);
+
+    iSensorChannel = CSensrvChannel::NewL(channelInfo);
+    iSensorChannel->OpenChannelL();
+
+    // Get current calibration value
+    TSensrvProperty property;
+    iSensorChannel->GetPropertyL(KSensrvPropCalibrationLevel, KSensrvItemIndexNone, property);
+    TInt calibration = 0;
+    property.GetValue(calibration);
+
+    iCalibration = calibration == 0? ENone :
+                   calibration == 1? ELow :
+                   calibration == 2? EModerate :
+                   calibration == 3? EHigh : ENone;
+
+    iSensorChannel->SetPropertyListenerL(this);
+}
+
+void CMagnetometer::StartL()
+{
+    iSensorChannel->StartDataListeningL(this, 1, 4, 0);
+}
+
+void CMagnetometer::Stop()
+{
+    iSensorChannel->StopDataListening();
+}
+
+void CMagnetometer::DataReceived(CSensrvChannel& aChannel, TInt aCount, TInt aDataLost)
+{
+    if (aChannel.GetChannelInfo().iChannelType ==  KSensrvChannelTypeIdMagnetometerXYZAxisData)
+    {
+        TPckgBuf<TSensrvMagnetometerAxisData> dataBuffer;
+        TSensrvMagnetometerAxisData data;
+
+        for (TInt i = 0; i < aCount; ++i)
+        {
+            aChannel.GetData(dataBuffer);
+
+            data = dataBuffer();
+            // Do something with the date in data variable
+            // data.iTimeStamp
+
+            // Compensate axis for landscape mode
+            TInt x = -data.iAxisYCalibrated;
+            TInt y =  data.iAxisXCalibrated;
+            TInt z =  data.iAxisZCalibrated;
+#if 0
+            TInt x = data.iAxisXCalibrated;
+            TInt y = data.iAxisYCalibrated;
+            TInt z = data.iAxisZCalibrated;
+#endif
+            const TReal KPole = 0.85;
+
+            iX = KPole * iX + (1.0 - KPole) * x;
+            iY = KPole * iY + (1.0 - KPole) * y;
+            iZ = KPole * iZ + (1.0 - KPole) * z;
+        }
+    }
+}
+
+void CMagnetometer::DataError(CSensrvChannel& aChannel, TSensrvErrorSeverity aError)
+{
+}
+
+void CMagnetometer::GetDataListenerInterfaceL(TUid aInterfaceUid, TAny*& aInterface)
+{}
+
+void CMagnetometer::PropertyChanged(CSensrvChannel& aChannel, const TSensrvProperty& aChangedProperty)
+{
+    TSensrvChannelInfo info = aChannel.GetChannelInfo();
+
+    if (info.iChannelType == KSensrvChannelTypeIdMagnetometerXYZAxisData &&
+            aChangedProperty.GetPropertyId() == KSensrvPropCalibrationLevel)
+    {
+        TInt calibration = 0;
+        aChangedProperty.GetValue(calibration);
+
+        iCalibration = calibration == 0? ENone :
+                       calibration == 1? ELow :
+                       calibration == 2? EModerate :
+                       calibration == 3? EHigh : ENone;
+    }
+}
+
+void CMagnetometer::PropertyError(CSensrvChannel& aChannel, TSensrvErrorSeverity aError)
+{}
+
+void CMagnetometer::SetPropertySuccessIndicationChanged(TSetPropertySuccessIndicator aIndication)
+{}
+
+void CMagnetometer::GetPropertyListenerInterfaceL(TUid aInterfaceUid, TAny*& aInterface)
+{}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/overlay/src/Manager.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,145 @@
+/*
+ * Name        : Manager.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Manager.h"
+
+#include <e32math.h>
+
+#include "Logger.h"
+
+CManager* CManager::NewL()
+{
+    CManager* self = new(ELeave) CManager;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CManager::~CManager()
+{
+    iObjectList.ResetAndDestroy();
+    iObjectList.Close();
+
+    iProviderList.ResetAndDestroy();
+    iProviderList.Close();
+}
+
+CManager::CManager()
+{}
+
+void CManager::ConstructL()
+{
+    _LIT8(KUri, "");
+
+    _LIT8(KLMXProvider, "lmx");
+    OpenMAR::CPOIProvider* lmx = OpenMAR::CPOIProvider::NewL(KLMXProvider, KUri);
+    lmx->SetObserver(this);
+    iProviderList.AppendL(lmx);
+
+    _LIT8(KGeonamesProvider, "geonames");
+    OpenMAR::CPOIProvider* geonames = OpenMAR::CPOIProvider::NewL(KGeonamesProvider, KUri);
+    geonames->SetObserver(this);
+    iProviderList.AppendL(geonames);
+}
+
+void CManager::POIProviderLoadedL(OpenMAR::CPOIProvider* aProvider, TInt aError)
+{
+    LOGARG("Landmark resource %x loaded with error %d", aProvider, aError);
+
+    // Handle error in some way
+}
+
+void CManager::POIObjectCreatedL(OpenMAR::CPOIObject* aPOIObject)
+{
+    CleanupStack::PushL(aPOIObject);
+
+    // Check if this POI already exists
+    TInt index = iObjectList.Find(aPOIObject, OpenMAR::CPOIObject::IdentityRelation);
+
+    if (index == KErrNotFound)
+    {
+        // Set world position
+        TCoordinate coordinate = aPOIObject->GetCoordinate();
+        aPOIObject->SetPosition(Transform(coordinate));
+
+        LOGARG("Appending new POI (%d)", aPOIObject->GetIdentifier());
+
+        iObjectList.AppendL(aPOIObject);
+
+        CleanupStack::Pop(aPOIObject);
+    }
+    else
+    {
+        LOGARG("POI already exists (%d). Destroying..", aPOIObject->GetIdentifier());
+
+        CleanupStack::PopAndDestroy(aPOIObject);
+    }
+}
+
+void CManager::POIObjectUpdatedL(OpenMAR::CPOIObject* aPOIObject)
+{}
+
+/**
+ * @brief Transform between WGS84 to Euclidean space
+ * 
+ * Our Euclidean space will be determined by:
+ * +X : tangential to the ground and pointing to the EAST
+ * +Y : tangential to the ground and pointing to the NORTH
+ * +Z : perpendicular to the ground (pointing to the sky)
+ */
+const Vector3d CManager::Transform(const TCoordinate& aCoordinate)
+{
+    TReal32 distance = 0;
+    iOrigin.Distance(aCoordinate, distance);
+
+    TReal32 bearing = 0;
+    iOrigin.BearingTo(aCoordinate, bearing);
+
+    TReal32 angle = bearing * KDegToRad;
+
+    TReal cos = 0;
+    TReal sin = 0;
+    Math::Cos(cos, angle);
+    Math::Sin(sin, angle);
+
+    // X = sin(bearing) * d = cos(90 - bearing) * d = sin(bearing) * d
+    // Y = cos(bearing) * d = sin(90 - bearing) * d = cos(bearing) * d
+
+    TReal x = sin * distance;
+    TReal y = cos * distance;
+    TReal z = aCoordinate.Altitude();
+
+    return Vector3d(x, y, z);
+}
+
+void CManager::SetOrigin(const TCoordinate& aCoordinate)
+{
+    iOrigin = aCoordinate;
+}
+
+void CManager::RequestL(const TCoordinate& aCoordinate)
+{
+    const TReal32 radius = 3000;
+
+    for (TInt i = 0; i < iProviderList.Count(); ++i)
+        iProviderList[i]->RetrieveL(aCoordinate, radius);
+}
+
+void CManager::Render() const
+{
+    for (TInt i = 0; i < iObjectList.Count(); ++i)
+        iObjectList[i]->Render();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/overlay/src/Overlay.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,384 @@
+/*
+ * Name        : Overlay.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Overlay.h"
+
+#include <coemain.h>
+#include <gdi.h>
+#include <w32std.h>
+
+#include "Vector3d.h"
+#include "Vector4d.h"
+
+#include "Accelerometer.h"
+#include "Magnetometer.h"
+#include "AutoRotation.h"
+
+#include "Logger.h"
+
+#include "Manager.h"
+
+COverlay* COverlay::NewL(SParameter& aParameter)
+{
+    COverlay* self = new(ELeave) COverlay(aParameter);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+COverlay::COverlay(SParameter& aParameter)
+    : iWindow(aParameter.iWindow), iRect(aParameter.iRect)
+{}
+
+void COverlay::ConstructL()
+{
+    LOGTXT("Initializing EGL..");
+
+    iEglDisplay = ::eglGetDisplay(EGL_DEFAULT_DISPLAY);
+
+    if (iEglDisplay == 0)
+    {
+        _LIT(KGetDisplayFailed, "eglGetDisplay failed");
+        User::Panic(KGetDisplayFailed, 0);
+    }
+
+    if (::eglInitialize(iEglDisplay, 0, 0) == EGL_FALSE)
+    {
+        _LIT(KInitializeFailed, "eglInitialize failed");
+        User::Panic(KInitializeFailed, 0);
+    }
+
+    EGLConfig* configList = 0;
+    EGLint configSize     = 0;
+    EGLint numOfConfigs   = 0;
+
+    // Get the number of possible EGLConfigs
+    if (::eglGetConfigs(iEglDisplay, configList, configSize, &numOfConfigs) == EGL_FALSE)
+    {
+        _LIT(KGetConfigsFailed, "eglGetConfigs failed");
+        User::Panic( KGetConfigsFailed, 0 );
+    }
+
+    configSize = numOfConfigs;
+
+    // Allocate memory for the configList
+    configList = (EGLConfig*) User::Alloc(sizeof(EGLConfig) * configSize);
+    if (configList == 0)
+    {
+        _LIT(KConfigAllocFailed, "Config alloc failed");
+        User::Panic(KConfigAllocFailed, 0);
+    }
+
+    /*
+     * Define properties for the wanted EGLSurface. To get the best possible 
+     * performance, choose an EGLConfig with a buffersize matching the current 
+     * window's display mode
+     */
+
+    TDisplayMode displayMode = iWindow.DisplayMode();
+    TInt bufferSize = 0;
+
+    switch (displayMode)
+    {
+        case EColor4K:
+            bufferSize = 12;
+            break;
+
+        case EColor64K:
+            bufferSize = 16;
+            break;
+
+        case EColor16M:
+            bufferSize = 24;
+            break;
+
+        case EColor16MU:
+        case EColor16MA:
+        case EColor16MAP:
+            bufferSize = 32;
+            break;
+
+        default:
+            _LIT(KDisplayModeError, "Unsupported display mode");
+            User::Panic(KDisplayModeError, 0);
+            break;
+    }
+
+    // Define properties for the wanted EGLSurface 
+    const EGLint attrib_list[] = { 
+            EGL_SURFACE_TYPE,       EGL_PBUFFER_BIT,
+//            EGL_TRANSPARENT_TYPE,   EGL_TRANSPARENT_RGB,
+            EGL_BUFFER_SIZE,        bufferSize,
+            EGL_NONE
+    };
+
+    // Choose an EGLConfig that best matches to the properties in attrib_list_fsaa
+    if (::eglChooseConfig(iEglDisplay, attrib_list, configList, configSize, &numOfConfigs) == EGL_FALSE)
+    {
+        _LIT( KChooseConfigFailed, "eglChooseConfig failed");
+        User::Panic(KChooseConfigFailed, 0);
+    }
+
+    iConfig = configList[0];    // Choose the best EGLConfig. EGLConfigs
+                                // returned by eglChooseConfig are sorted so
+                                // that the best matching EGLConfig is first in
+                                // the list.
+    User::Free(configList);
+
+    TInt width  = iRect.Size().iWidth;
+    TInt height = iRect.Size().iHeight;
+
+    LOGARG("Window size is %d x %d", width, height);
+
+    const EGLint attrib_list2[] = { 
+            EGL_WIDTH,  width,
+            EGL_HEIGHT, height,
+            EGL_NONE
+    };
+
+    // Create a window where the graphics are blitted
+    iEglSurface = ::eglCreatePbufferSurface(iEglDisplay, iConfig, attrib_list2);
+
+    if (iEglSurface == 0)
+    {
+        _LIT(KCreateWindowSurfaceFailed, "eglCreateWindowSurface failed");
+        User::Panic(KCreateWindowSurfaceFailed, 0);
+    }
+
+    // Create a rendering context
+    iEglContext = ::eglCreateContext(iEglDisplay, iConfig, EGL_NO_CONTEXT, 0);
+
+    if (iEglContext == 0)
+    {
+        _LIT(KCreateContextFailed, "eglCreateContext failed");
+        User::Panic(KCreateContextFailed, 0);
+    }
+
+    // Make the context current. Binds context to the current rendering thread and surface.
+    if (::eglMakeCurrent(iEglDisplay, iEglSurface, iEglSurface, iEglContext) == EGL_FALSE)
+    {
+        _LIT(KMakeCurrentFailed, "eglMakeCurrent failed");
+        User::Panic(KMakeCurrentFailed, 0);
+    }
+
+    // Create a Symbian bitmap where the graphics from the Pbuffer are copied
+    iPixmap = new(ELeave) CWsBitmap(CCoeEnv::Static()->WsSession());
+    iPixmap->Create(iRect.Size(), iWindow.DisplayMode());
+
+    // Manager is in charge of POIs from different providers
+    iManager = CManager::NewL();
+}
+
+COverlay::~COverlay()
+{
+    delete iManager;
+
+    delete iPixmap;
+    iPixmap = 0;
+
+    ::eglMakeCurrent(iEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+    ::eglDestroyContext(iEglDisplay, iEglContext);
+    ::eglDestroySurface(iEglDisplay, iEglSurface);
+    ::eglTerminate(iEglDisplay);
+}
+
+void COverlay::StartL()
+{
+    // First off we enable the position and orientation sensors
+    iPosition = CPosition::NewL(*this);
+    iPosition->Request();
+
+#if defined(__MARM__)
+    iAccelerometer = CAccelerometer::NewL();
+    iAccelerometer->StartL();
+
+    iMagnetometer = CMagnetometer::NewL();
+    iMagnetometer->StartL();
+
+    iAutoRotation = CAutoRotation::NewL();
+    iAutoRotation->ResetL();
+#endif
+
+    // We now calculate the view frustum and create the appropriate projection matrix
+    TReal near = 1.0f;
+    TReal far  = 3000.0f;
+
+    TReal fovy = 0;
+    Math::Tan(fovy, 45 * KDegToRad / 2);
+
+    TInt width  = iWindow.Size().iWidth;
+    TInt height = iWindow.Size().iHeight;
+    TReal aspectRatio = static_cast<TReal>(width) / height;
+
+    TReal top    = near * fovy;
+    TReal bottom = -top;
+    TReal left   = bottom * aspectRatio;
+    TReal right  = top * aspectRatio;
+
+    iProjection.Load(
+            2 * near / (right - left),       0,                               0,                            0,
+            0                        ,       2 * near / (top - bottom),       0,                            0,
+            (right + left) / (right - left), (top + bottom) / (top - bottom), -(far + near) / (far - near), -1,
+            0                              , 0                              , - 2 * far * near / (far - near), 0
+    );
+
+    ::glViewport(0, 0, width, height);
+    ::glMatrixMode(GL_PROJECTION);
+    ::glLoadMatrixf(iProjection.m);
+
+    ::glMatrixMode(GL_MODELVIEW);
+
+    ::glEnableClientState(GL_VERTEX_ARRAY);
+    ::glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+//    ::glEnableClientState(GL_NORMAL_ARRAY);
+
+    ::glEnable(GL_DEPTH_TEST);
+    ::glDepthFunc(GL_LESS);
+
+    // Set background transparency 
+    ::glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+}
+
+void COverlay::Stop()
+{
+    ::glDisable(GL_DEPTH_TEST);
+
+//    ::glDisableClientState(GL_NORMAL_ARRAY);
+    ::glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+    ::glDisableClientState(GL_VERTEX_ARRAY);
+
+#if defined(__MARM__)
+    iAutoRotation->RestoreL();
+    delete iAutoRotation;
+    iAutoRotation = 0;
+
+    iMagnetometer->Stop();
+    delete iMagnetometer;
+    iMagnetometer = 0;
+
+    iAccelerometer->Stop();
+    delete iAccelerometer;
+    iAccelerometer = 0;
+#endif
+
+    delete iPosition;
+    iPosition = 0;
+}
+
+const CFbsBitmap& COverlay::RenderScene()
+{
+    // Estimate orientation based on sensor data
+#if defined(__MARM__)
+/*
+ * +X is defined as the cross product Y.Z (it is tangential to
+ * the ground at the device's current location and roughly points East)
+ * +Y is tangential to the ground at the device's current location and
+ * points towards the magnetic North Pole
+ * +Z points towards the sky and is perpendicular to the ground
+ */
+    Vector3d A = iAccelerometer->GetValue();
+    Vector3d E = iMagnetometer->GetValue();
+
+    Vector3d H = Vector3d::Cross(E, A);
+    Scalar hNorm = H.Norm();
+    H.mX /= hNorm;
+    H.mY /= hNorm;
+    H.mZ /= hNorm;
+
+    Scalar aNorm = A.Norm();
+    A.mX /= aNorm;
+    A.mY /= aNorm;
+    A.mZ /= aNorm;
+
+    Vector3d M = Vector3d::Cross(A, H);
+
+    iModelView.Load(
+            H.mX, H.mY, H.mZ, 0,
+            M.mX, M.mY, M.mZ, 0,
+            A.mX, A.mY, A.mZ, 0,
+            0, 0, 0, 1
+    );
+    ::glLoadMatrixf(iModelView.m);
+#else
+    ::glLoadIdentity();
+#endif
+
+    ::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+    iManager->Render();
+
+    ::eglCopyBuffers(iEglDisplay, iEglSurface, iPixmap);
+
+    return *iPixmap;
+}
+
+/*
+ * Callback from position provider. We use current position to set up world's origin
+ * and make request to different providers
+ */
+void COverlay::PositionUpdateL(TInt aError, const TPosition& aPosition)
+{
+    LOGARG("Got position: lat=%f,lon=%f,alt=%f", aPosition.Latitude(), aPosition.Longitude(), aPosition.Altitude());
+
+    // Set the "world" origin
+    iManager->SetOrigin(aPosition);
+    // Request POIs for that position
+    iManager->RequestL(aPosition);
+}
+
+/*
+ * From the current list of POIs retrieved, find the one that is closest to the
+ * screen center.
+ * 
+ * We use both projection and modelview transforms to obtain screen coordinates.
+ * Note that both matrices are in column-major ordering, so we need to transpose them.
+ */
+TInt COverlay::GetFocusedPOI()
+{
+    const TPoint viewportCenter(iRect.Center());
+
+    TInt mostCentered = KMaxTInt; 
+    TInt focused = KErrNotFound;
+
+    for (TInt i = 0; i < iManager->iObjectList.Count(); ++i)
+    {
+        const Vector3d position(iManager->iObjectList[i]->GetPosition());
+
+        const Vector4d world(position.mX, position.mY, position.mZ, 1);
+        const Vector4d camera(iModelView.Transpose() * world);
+        const Vector4d projection(iProjection.Transpose() * camera);
+
+        // Screen transformation
+        TReal x = projection.mX / projection.mW;
+        TReal y = projection.mY / projection.mW;
+        TReal z = projection.mZ / projection.mW;
+
+        TReal screenX = viewportCenter.iX * (x + 1);
+        TReal screenY = viewportCenter.iY * (y + 1);
+//        TReal screenZ = (z + 1) / 2;
+
+        TBool visible = (x > -1 && x < 1) && (y > -1 && y < 1) && (z > -1 && z < 1);
+        TInt centered = (screenX - viewportCenter.iX) * (screenX - viewportCenter.iX) + (screenY - viewportCenter.iY) * (screenY - viewportCenter.iY);
+
+        if (visible && centered < mostCentered)
+        {
+            mostCentered = centered; 
+            focused = i;
+        }
+    }
+
+    return focused;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/overlay/src/Position.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,123 @@
+/*
+ * Name        : Position.cpp
+ * Description : Position helper class
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Position.h"
+
+#include "Logger.h"
+
+CPosition* CPosition::NewL(MPositionObserver& aObserver)
+{
+    CPosition* self = new(ELeave) CPosition(aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CPosition::~CPosition()
+{
+    Cancel();
+
+    iPositioner.Close();
+    iServer.Close();
+}
+
+CPosition::CPosition(MPositionObserver& aObserver)
+    : CActive(CActive::EPriorityStandard), iObserver(aObserver), iState(EUnknown)
+{
+    CActiveScheduler::Add(this);
+}
+
+void CPosition::ConstructL()
+{
+    User::LeaveIfError(iServer.Connect());
+    User::LeaveIfError(iPositioner.Open(iServer));
+
+    _LIT(KRequestor, "OpenMAR" );
+    User::LeaveIfError(iPositioner.SetRequestor(CRequestor::ERequestorService, CRequestor::EFormatApplication, KRequestor));
+
+    const TInt KSecond = 1000000;
+    TPositionUpdateOptions updateOptions;
+    updateOptions.SetUpdateInterval(TTimeIntervalMicroSeconds(10 * KSecond));
+    updateOptions.SetUpdateTimeOut(TTimeIntervalMicroSeconds(30 * KSecond));
+    updateOptions.SetMaxUpdateAge(TTimeIntervalMicroSeconds(1 * KSecond));
+    updateOptions.SetAcceptPartialUpdates(EFalse);
+
+    User::LeaveIfError(iPositioner.SetUpdateOptions(updateOptions));
+}
+
+void CPosition::Request()
+{
+    if (IsActive())
+        Cancel();
+
+    iPositioner.GetLastKnownPosition(iPositionInfo, iStatus);
+    SetActive();
+
+    iState = ECache;
+}
+
+void CPosition::RunL()
+{
+    TPosition position;
+    iPositionInfo.GetPosition(position);
+
+    TTime now;
+    now.UniversalTime();
+
+    TTimeIntervalSeconds interval = 0;
+    now.SecondsFrom(position.Time(), interval);
+
+    LOGARG("Interval between retrieved position and current time: %d secs", interval.Int());
+
+    // Compare that retrieved data is not outdated
+    if (iStatus == KErrNone && interval.Int() < 300)
+    {
+        iObserver.PositionUpdateL(iStatus.Int(), position);
+    }
+    else if (iStatus == KErrTimedOut)
+    {
+        iObserver.PositionUpdateL(iStatus.Int(), position);
+    }
+    else
+    {
+        iPositioner.NotifyPositionUpdate(iPositionInfo, iStatus);
+        SetActive();
+
+        iState = EGps;
+    }
+}
+
+void CPosition::DoCancel()
+{
+    switch (iState)
+    {
+        case ECache:
+            iPositioner.CancelRequest(EPositionerGetLastKnownPosition);
+            break;
+
+        case EGps:
+            iPositioner.CancelRequest(EPositionerNotifyPositionUpdate);
+            break;
+
+        default:
+            break;
+    };
+}
+
+TInt CPosition::RunError(TInt aError)
+{
+    return KErrNone;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/provider/inc/Loader.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,46 @@
+/*
+ * Name        : Loader.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef LOADER_H_
+#define LOADER_H_
+
+#include <e32base.h>
+
+class CPosLandmark;
+class TCoordinate;
+
+class MLandmarkLoaderObserver
+{
+public:
+    virtual void LandmarkLoaderOpenedL(TInt aError) = 0;
+    virtual void LandmarkLoaderItemCreatedL(const CPosLandmark& aLandmark) = 0;
+    virtual void LandmarkLoaderItemUpdatedL(const CPosLandmark& aLandmark) = 0;
+    virtual void LandmarkLoaderItemDeletedL(const CPosLandmark& aLandmark) = 0;
+};
+
+/**
+ * @brief Interface for landmark loader
+ */
+class MLandmarkLoader
+{
+public:
+    virtual ~MLandmarkLoader() = 0;
+
+    virtual void RequestL(const TCoordinate& aCoordinate, TReal32 aRadius) = 0;
+};
+
+inline MLandmarkLoader::~MLandmarkLoader()
+{}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/provider/inc/Local.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,54 @@
+/*
+ * Name        : Local.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef LOCAL_H_
+#define LOCAL_H_
+
+#include <e32base.h>
+#include <EPos_Landmarks.h>
+
+#include "Loader.h"
+
+class CPosLandmarkDatabase;
+class TCoordinate;
+
+/**
+ * @brief Retrieves landmarks from a local database
+ */
+class CLocalLoader : public CActive, public MLandmarkLoader
+{
+public:
+    static CLocalLoader* NewL(MLandmarkLoaderObserver& aObserver, const TDesC8& aProviderUri);
+    ~CLocalLoader();
+
+protected:
+    CLocalLoader(MLandmarkLoaderObserver& aObserver);
+    void ConstructL(const TDesC8& aProviderUri);
+
+    // From CActive
+    void RunL();
+    void DoCancel();
+
+public:
+    // From MLandmarkLoader
+    void RequestL(const TCoordinate& aCoordinate, TReal32 aRadius);
+
+private:
+    MLandmarkLoaderObserver& iObserver;
+
+    CPosLandmarkDatabase* iLandmarkDb;
+    TPosLmEvent iEvent;
+};
+
+#endif  // LOCAL_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/provider/inc/Provider.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,51 @@
+/*
+ * Name        : Provider.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef PROVIDER_H_
+#define PROVIDER_H_
+
+#include "POIProvider.h"
+#include "POIObject.h"
+
+#include "Loader.h"
+#include "Local.h"
+#include "Remote.h"
+
+/**
+ * @brief Provider implementation for local and remote landmarks (lmx)
+ */
+class CProvider : public OpenMAR::CPOIProvider, public MLandmarkLoaderObserver
+{
+public:
+    static CProvider* NewL(const TDesC8& aProviderUri);
+    ~CProvider();
+
+protected:
+    CProvider();
+    void ConstructL(const TDesC8& aProviderUri);
+
+    // From MLandmarkLoaderObserver
+    void LandmarkLoaderOpenedL(TInt aError);
+    void LandmarkLoaderItemCreatedL(const CPosLandmark& aLandmark);
+    void LandmarkLoaderItemUpdatedL(const CPosLandmark& aLandmark);
+    void LandmarkLoaderItemDeletedL(const CPosLandmark& aLandmark);
+
+public:
+    void RetrieveL(const TCoordinate& aCoordinate, TReal32 aRadius);
+
+private:
+    MLandmarkLoader* iLoader;
+};
+
+#endif  // PROVIDER_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/provider/inc/Remote.h	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,66 @@
+/*
+ * Name        : Remote.h
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#ifndef REMOTE_H_
+#define REMOTE_H_
+
+#include <e32base.h>
+#include <EPos_CPosLandmark.h>
+#include <EPos_CPosLandmarkParser.h>
+#include <http/MHttpTransactionCallback.h>
+
+#include "Loader.h"
+
+class TCoordinate;
+class CHttpClient;
+
+/**
+ * @brief Retrieves landmarks from a remote database
+ */
+
+class CRemoteLoader : public CActive, public MLandmarkLoader, public MHTTPTransactionCallback
+{
+public:
+    static CRemoteLoader* NewL(MLandmarkLoaderObserver& aObserver, const TDesC8& aProviderUri);
+    ~CRemoteLoader();
+
+protected:
+    CRemoteLoader(MLandmarkLoaderObserver& aObserver);
+    void ConstructL(const TDesC8& aProviderUri);
+
+    void RunL();
+    void DoCancel();
+
+public:
+    // From MLandmarkLoader
+    void RequestL(const TCoordinate& aCoordinate, TReal32 aRadius);
+
+protected:
+    // From MHTTPTransactionCallback
+    void MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent);
+    TInt MHFRunError(TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& aEvent);
+
+private:
+    MLandmarkLoaderObserver& iObserver;
+
+    HBufC8* iBaseUri;
+    CHttpClient* iClient;
+    RBuf8 iBuffer;
+
+    CPosLandmarkParser* iParser;
+    CPosLmOperation* iOperation;
+    TReal32 iProgress;
+};
+
+#endif  // REMOTE_H_
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/provider/src/Local.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,139 @@
+/*
+ * Name        : Local.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Local.h"
+
+#include <EPos_CPosLandmarkDatabase.h>
+#include <LbsPositionInfo.h>
+
+#include "Logger.h"
+
+CLocalLoader* CLocalLoader::NewL(MLandmarkLoaderObserver& aObserver, const TDesC8& aProviderUri)
+{
+    CLocalLoader* self = new(ELeave) CLocalLoader(aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL(aProviderUri);
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CLocalLoader::~CLocalLoader()
+{
+    Cancel();
+
+    delete iLandmarkDb;
+}
+
+CLocalLoader::CLocalLoader(MLandmarkLoaderObserver& aObserver)
+    : CActive(CActive::EPriorityStandard), iObserver(aObserver)
+{
+    CActiveScheduler::Add(this);
+}
+
+void CLocalLoader::ConstructL(const TDesC8& aProviderUri)
+{
+    LOGARG("[LANDMARKS] Creating local landmark loader: %S", &aProviderUri);
+
+    HBufC* uri = HBufC::NewLC(aProviderUri.Length());
+    uri->Des().Copy(aProviderUri);
+
+//    iLandmarkDb = CPosLandmarkDatabase::OpenL(*uri);
+    iLandmarkDb = CPosLandmarkDatabase::OpenL();
+
+    CleanupStack::PopAndDestroy(uri);
+
+    CPosLmOperation* initialization = iLandmarkDb->InitializeL();
+    ExecuteAndDeleteLD(initialization);
+
+    iLandmarkDb->NotifyDatabaseEvent(iEvent, iStatus);
+    SetActive();
+}
+
+void CLocalLoader::RunL()
+{
+    LOGARG("[LANDMARKS] Landmark event %d", iEvent.iEventType);
+
+    if (iStatus == KErrNone)
+        switch (iEvent.iEventType)
+        {
+            case EPosLmEventLandmarkCreated:
+            {
+                LOGTXT("[LANDMARKS] Got new landmark. Notifying observer");
+
+                CPosLandmark* landmark = iLandmarkDb->ReadLandmarkLC(iEvent.iLandmarkItemId);
+                iObserver.LandmarkLoaderItemCreatedL(*landmark);
+                CleanupStack::PopAndDestroy(landmark);
+
+                break;
+            }
+
+            case EPosLmEventLandmarkUpdated:
+            {
+                LOGTXT("[LANDMARKS] Got updated landmark. Notifying observer");
+
+                CPosLandmark* landmark = iLandmarkDb->ReadLandmarkLC(iEvent.iLandmarkItemId);
+                iObserver.LandmarkLoaderItemUpdatedL(*landmark);
+                CleanupStack::PopAndDestroy(landmark);
+
+                break;
+            }
+
+            case EPosLmEventLandmarkDeleted:
+            {
+                LOGTXT("[LANDMARKS] Landmark was deleted. Notifying observer");
+
+                CPosLandmark* landmark = CPosLandmark::NewLC();
+//                landmark->SetLandmarkIdL(iEvent.iLandmarkItemId);
+                iObserver.LandmarkLoaderItemDeletedL(*landmark);
+                CleanupStack::PopAndDestroy(landmark);
+
+                break;
+            }
+
+            case EPosLmEventNewDefaultDatabaseLocation:
+            case EPosLmEventMediaRemoved:
+            default:
+                break;
+        }
+
+    iLandmarkDb->NotifyDatabaseEvent(iEvent, iStatus);
+    SetActive();
+}
+
+void CLocalLoader::DoCancel()
+{
+    iLandmarkDb->CancelNotifyDatabaseEvent();
+}
+
+void CLocalLoader::RequestL(const TCoordinate& aCoordinate, TReal32 aRadius)
+{
+    iObserver.LandmarkLoaderOpenedL(KErrNone);
+
+    // TODO: Should use CPosLmAreaCriteria to filter
+
+    CPosLmItemIterator* landmarkIterator = iLandmarkDb->LandmarkIteratorL();
+    CleanupStack::PushL(landmarkIterator);
+
+    for (TPosLmItemId id = landmarkIterator->NextL();
+            id != KPosLmNullItemId;
+            id = landmarkIterator->NextL())
+    {
+        CPosLandmark* landmark = iLandmarkDb->ReadLandmarkLC(id);
+        iObserver.LandmarkLoaderItemCreatedL(*landmark);
+        CleanupStack::PopAndDestroy(landmark);
+    }
+
+    CleanupStack::PopAndDestroy(landmarkIterator);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/provider/src/Provider.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,141 @@
+/*
+ * Name        : Provider.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Provider.h"
+
+#include <Hash.h>
+#include <Uri8.h>
+
+#include "Logger.h"
+
+/*
+ * Generate a unique id using coordinate and name as seeds
+ * 
+ */
+
+TUint32 GenerateIdL(const CPosLandmark& aLandmark)
+{
+    TPtrC name;
+    aLandmark.GetLandmarkName(name);
+
+    TLocality coordinate;
+    aLandmark.GetPosition(coordinate);
+
+    HBufC8* name8 = HBufC8::NewLC(name.Length());
+    name8->Des().Copy(name);
+
+    TRealFormat realFormat;
+    realFormat.iPoint  = TChar('.');    // Override TLocale::DecimalSeparator() as separator
+    realFormat.iWidth  = 8;             // Set max width of number
+    realFormat.iPlaces = 5;             // Set max width of decimal portion
+
+    TBuf8<KDefaultRealWidth> latitude;
+    latitude.Num(coordinate.Latitude(), realFormat);
+
+    TBuf8<KDefaultRealWidth> longitude;
+    longitude.Num(coordinate.Longitude(), realFormat);
+
+    CSHA1* hash = CSHA1::NewL();
+    CleanupStack::PushL(hash);
+    hash->Update(*name8);
+    hash->Update(latitude);
+    TPtrC8 result = hash->Final(longitude);
+
+    const TUint32* ptr = reinterpret_cast<const TUint32*>(result.Ptr());
+    TUint32 value = *ptr;
+
+    CleanupStack::PopAndDestroy(2, name8);  // hash, name8
+
+    return value;
+}
+
+
+CProvider* CProvider::NewL(const TDesC8& aProviderUri)
+{
+    CProvider* self = new(ELeave) CProvider;
+    CleanupStack::PushL(self);
+    self->ConstructL(aProviderUri);
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CProvider::~CProvider()
+{
+    delete iLoader;
+
+    ReleaseLandmarkResources();
+}
+
+CProvider::CProvider()
+{}
+
+void CProvider::ConstructL(const TDesC8& aProviderUri)
+{
+    TUriParser8 uri;
+    uri.Parse(aProviderUri);
+
+    _LIT8(KHttpScheme, "http");
+
+    if (uri.IsSchemeValid() && uri.Extract(EUriScheme).Compare(KHttpScheme) == 0)
+        iLoader = CRemoteLoader::NewL(*this, aProviderUri);
+    else
+        iLoader = CLocalLoader::NewL(*this, aProviderUri);
+}
+
+void CProvider::LandmarkLoaderOpenedL(TInt aError)
+{
+    if (iObserver)
+        iObserver->POIProviderLoadedL(this, aError);
+}
+
+void CProvider::LandmarkLoaderItemCreatedL(const CPosLandmark& aLandmark)
+{
+    if (iObserver)
+    {
+        TPosLmItemId id = aLandmark.LandmarkId();
+
+        if (id == KPosLmNullItemId)
+            id = GenerateIdL(aLandmark);
+
+        _LIT8(KObject, "lmx");
+        OpenMAR::CPOIObject* object = OpenMAR::CPOIObject::NewL(KObject, *this);
+        CleanupStack::PushL(object);
+
+        object->SetIdentifier(id);
+
+        TLocality locality;
+        aLandmark.GetPosition(locality);
+        object->SetCoordinate(locality);
+
+        iObserver->POIObjectCreatedL(object);   // Transfers ownership
+
+        CleanupStack::Pop(object);
+    }
+}
+
+void CProvider::LandmarkLoaderItemUpdatedL(const CPosLandmark& aLandmark)
+{
+}
+
+void CProvider::LandmarkLoaderItemDeletedL(const CPosLandmark& aLandmark)
+{
+}
+
+void CProvider::RetrieveL(const TCoordinate& aCoordinate, TReal32 aRadius)
+{
+    LOGARG("[LANDMARKS] Retrieving landmarks from %f %f %f", aCoordinate.Latitude(), aCoordinate.Longitude(), aCoordinate.Altitude());
+
+    iLoader->RequestL(aCoordinate, aRadius);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugin/poi/landmarks/provider/src/Remote.cpp	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,195 @@
+/*
+ * Name        : Remote.cpp
+ * Description : 
+ * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+ * Website     : http://OpenMAR.org
+ *
+ * Copyright (c) 2010 David Caabeiro
+ *
+ * All rights reserved. This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 which accompanies this 
+ * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ */
+
+#include "Remote.h"
+
+#include "HttpClient.h"
+
+#include <AknUtils.h>
+#include <lbspositioninfo.h>
+#include <http/mhttpdatasupplier.h>
+#include <HttpErr.h>
+#include <utf.h>
+
+#include "Logger.h"
+
+CRemoteLoader* CRemoteLoader::NewL(MLandmarkLoaderObserver& aObserver, const TDesC8& aProviderUri)
+{
+    CRemoteLoader* self = new(ELeave) CRemoteLoader(aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL(aProviderUri);
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+CRemoteLoader::~CRemoteLoader()
+{
+    iBuffer.Close();
+
+    delete iParser;
+    delete iClient;
+    delete iBaseUri;
+}
+
+CRemoteLoader::CRemoteLoader(MLandmarkLoaderObserver& aObserver)
+    : CActive(CActive::EPriorityStandard), iObserver(aObserver)
+{
+    CActiveScheduler::Add(this);
+}
+
+void CRemoteLoader::ConstructL(const TDesC8& aProviderUri)
+{
+    LOGARG("[LANDMARKS] Creating remote landmark loader: %S", &aProviderUri);
+
+    iBaseUri = aProviderUri.AllocL();
+    iClient = CHttpClient::NewL(*this);
+
+    _LIT8(KMimeType, "application/vnd.nokia.landmarkcollection+xml");
+    iParser = CPosLandmarkParser::NewL(KMimeType);
+}
+
+void CRemoteLoader::RunL()
+{
+    if (iStatus == KPosLmOperationNotComplete || iStatus == KErrNone)
+    {
+        CPosLandmark* landmark = iParser->LandmarkLC();
+        iObserver.LandmarkLoaderItemCreatedL(*landmark);
+        CleanupStack::PopAndDestroy(landmark);
+    }
+
+    if (iStatus == KPosLmOperationNotComplete)
+    {
+        iOperation->NextStep(iStatus, iProgress);
+        SetActive();
+    }
+}
+
+void CRemoteLoader::DoCancel()
+{
+    // TODO: Add cancellation code
+}
+
+void CRemoteLoader::RequestL(const TCoordinate& aCoordinate, TReal32 aRadius)
+{
+    TRealFormat realFormat;
+    realFormat.iPoint  = TChar('.');    // Override TLocale::DecimalSeparator() as separator
+    realFormat.iWidth  = 8;             // Set max width of number
+    realFormat.iPlaces = 5;             // Set max width of decimal portion
+
+    TBuf8<KDefaultRealWidth> latitude;
+    latitude.Num(aCoordinate.Latitude(), realFormat);
+
+    TBuf8<KDefaultRealWidth> longitude;
+    longitude.Num(aCoordinate.Longitude(), realFormat);
+
+    // Convert to integer
+    TInt radius = static_cast<TInt>(aRadius);
+
+    TBuf8<256> uri(*iBaseUri);
+    _LIT8(KParam, "?lat=%S&lon=%S&radius=%d");
+    uri.AppendFormat(KParam, &latitude, &longitude, radius);
+
+    LOGARG("[LANDMARKS] Making http request %S", &uri);
+
+    iClient->GetL(uri);
+}
+
+void CRemoteLoader::MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
+{
+    switch (aEvent.iStatus)
+    {
+        case THTTPEvent::EGotResponseHeaders:
+        {
+            RHTTPResponse resp = aTransaction.Response();
+            TInt status = resp.StatusCode();
+
+            LOGARG("[LANDMARKS] HTTP response status %d", status);
+
+            break;
+        }
+
+        case THTTPEvent::EGotResponseBodyData:
+        {
+            MHTTPDataSupplier* body = aTransaction.Response().Body();
+
+            TPtrC8 dataChunk;
+            body->GetNextDataPart(dataChunk);
+
+            // Check if there is enough remaining space
+            const TInt newLength = iBuffer.Length() + dataChunk.Length();
+            if (iBuffer.MaxLength() < newLength)
+                iBuffer.ReAllocL(newLength);
+            iBuffer.Append(dataChunk);
+
+            body->ReleaseData();
+
+            break;
+        }
+
+        case THTTPEvent::EResponseComplete:
+            LOGTXT("[LANDMARKS] HTTP response complete");
+
+            break ;
+
+        case THTTPEvent::ESucceeded:
+        {
+            RHTTPResponse resp = aTransaction.Response();
+            TInt status = resp.StatusCode();
+
+            LOGARG("[LANDMARKS] HTTP response succeeded %d", status);
+
+            aTransaction.Close();
+
+            iObserver.LandmarkLoaderOpenedL(KErrNone);
+            
+            iParser->SetInputBuffer(iBuffer);
+
+            iOperation = iParser->ParseContentL();
+
+            iOperation->NextStep(iStatus, iProgress);
+            SetActive();
+
+            break;
+        }
+
+        case THTTPEvent::EFailed:
+        {
+            RHTTPResponse resp = aTransaction.Response();
+            TInt status = resp.StatusCode();
+
+            LOGARG("[LANDMARKS] HTTP response failed %d", status);
+
+            aTransaction.Close();
+
+            iObserver.LandmarkLoaderOpenedL(KErrCouldNotConnect);
+            break;
+        }
+
+        default:
+            LOGARG("[LANDMARKS] HTTP unknown event %d", aEvent.iStatus);
+
+            aTransaction.Close();
+
+            iObserver.LandmarkLoaderOpenedL(KErrUnknown);
+            break;
+    }
+}
+
+TInt CRemoteLoader::MHFRunError(TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& aEvent)
+{
+    iObserver.LandmarkLoaderOpenedL(aError);
+
+    return KErrNone;
+}
Binary file sis/License.txt has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sis/OpenMAR_N97.pkg	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,62 @@
+;/*
+; * Name        : 
+; * Description : 
+; * Project     : This file is part of OpenMAR, an Open Mobile Augmented Reality browser
+; * Website     : http://OpenMAR.org
+; *
+; * Copyright (c) 2010 David Caabeiro
+; *
+; * All rights reserved. This program and the accompanying materials are made available 
+; * under the terms of the Eclipse Public License v1.0 which accompanies this 
+; * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
+; *
+; */
+
+; Installation file for application
+;
+; This is an auto-generated PKG file by Carbide.
+; This file uses variables specific to Carbide builds that will not work
+; on command-line builds. If you want to use this generated PKG file from the
+; command-line tools you will need to modify the variables with the appropriate
+; values: $(EPOCROOT), $(PLATFORM), $(TARGET)
+;
+;Language - standard language definitions
+&EN
+
+; standard SIS file header
+#{"OpenMAR"},(0x2002E1AB),0,50,0
+
+;Localised Vendor name
+%{"Sequence Point Software S.L."}
+
+;Unique Vendor name
+:""
+
+;Supports N97
+[0x20014DDD],0,0,0,{"Nokia N97"}
+[0x20014DDE],0,0,0,{"Nokia N97"}
+[0x20023766],0,0,0,{"Nokia N97 Mini"}
+
+; Add any installation notes if applicable
+"License.txt"-"",FT,TA
+
+; Main application
+"$(EPOCROOT)Epoc32\release\$(PLATFORM)\$(TARGET)\OpenMAR_0x2002E1AB.exe"    -"!:\sys\bin\OpenMAR_0x2002E1AB.exe"
+"$(EPOCROOT)Epoc32\data\z\resource\apps\OpenMAR_0x2002E1AB.rsc"             -"!:\resource\apps\OpenMAR_0x2002E1AB.rsc"
+"$(EPOCROOT)Epoc32\data\z\private\10003a3f\apps\OpenMAR_0x2002E1AB_reg.rsc" -"!:\private\10003a3f\import\apps\OpenMAR_0x2002E1AB_reg.rsc"
+
+; Icon files
+"$(EPOCROOT)Epoc32\data\z\resource\apps\OpenMAR_0x2002E1AB.mif"             -"!:\resource\apps\OpenMAR_0x2002E1AB.mif"
+"$(EPOCROOT)Epoc32\data\z\resource\apps\Button_0x2002E1AB.mif"              -"!:\resource\apps\Button_0x2002E1AB.mif"
+
+; Required for application to be covered by backup/restore facility
+"..\sis\backup_registration.xml"                                            -"!:\private\2002E1AB\backup_registration.xml"
+
+;Plugins
+"$(EPOCROOT)Epoc32\release\$(PLATFORM)\$(TARGET)\Landmarks_0x2002E1AF.dll"  -"!:\sys\bin\Landmarks_0x2002E1AF.dll"
+"$(EPOCROOT)Epoc32\data\z\resource\plugins\Landmarks_0x2002E1AF.rsc"        -"!:\resource\plugins\Landmarks_0x2002E1AF.rsc"
+"$(EPOCROOT)Epoc32\data\z\resource\apps\Landmarks_0x2002E1AF.mif"           -"!:\resource\apps\Landmarks_0x2002E1AF.mif"
+
+"$(EPOCROOT)Epoc32\release\$(PLATFORM)\$(TARGET)\Geonames_0x2002E1B2.dll"   -"!:\sys\bin\Geonames_0x2002E1B2.dll"
+"$(EPOCROOT)Epoc32\data\z\resource\plugins\Geonames_0x2002E1B2.rsc"         -"!:\resource\plugins\Geonames_0x2002E1B2.rsc"
+;"$(EPOCROOT)Epoc32\data\z\resource\apps\Geonames_0x2002E1B2.mif"            -"!:\resource\apps\Geonames_0x2002E1B2.mif"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sis/backup_registration.xml	Fri Jun 25 12:50:05 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" standalone="yes"?>
+<backup_registration>
+  <system_backup/>
+  <restore requires_reboot = "no"/>
+</backup_registration>