[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
Re: UU code
Attached is trunk0305.diff file with the latest UU code.
Currently there are 3 working pages:
Registration: CspServletthemes_RegistrationView_csp
Login: CspServletthemes_LoginView_csp
Home: CspServletthemes_HomeView_csp
You can browse them using top header bar, you can try to register, login.
There is some error handling(stored procedures are not ready yet, I used
my own queries), some functions will be rewritten later to make them more
generic.
There are some short comments in the code. After successful
login/registration session parameters set to HttpSession, but
UUServlet::isUserLoggedIn() function is not working properly yet.
Currently I open DB connection in each Model class operation, it will be
changed later. Note that DSN string is hardcoded in User.cpp.
Index: libui/RegisterServlet.h
===================================================================
--- libui/RegisterServlet.h (revision 0)
+++ libui/RegisterServlet.h (revision 0)
@@ -0,0 +1,45 @@
+#ifndef REGISTERSERVLET_H
+#define REGISTERSERVLET_H
+
+#include <string>
+
+#include <servlet/ServletConfig.h>
+#include <servlet/HttpServletRequest.h>
+#include <servlet/HttpServletResponse.h>
+#include <servlet/RequestDispatcher.h>
+#include <servlet/HttpServlet.h>
+
+#include <boost/lexical_cast.hpp>
+#include "../libdm/User.h"
+#include "UUServlet.h"
+
+using boost::lexical_cast;
+using namespace std;
+using namespace servlet;
+
+
+/**
+This servlet:
+
+ Receives registration request.
+ Accesses User model object.
+ Stores results in request context.
+ Determines the language to render page in based on user preferences.
+ Forwards the request to the view object (HomeView.csp) if no errors.
+
+*/
+
+class RegisterServlet : public UUServlet
+{
+private:
+ typedef User uu;
+ typedef pair<bool, string> procPair;
+
+ procPair process(HttpServletRequest& request, HttpServletResponse &response);
+public:
+ void service(HttpServletRequest& request, HttpServletResponse &response);
+
+};
+
+#endif//REGISTERSERVLET_H
+
Index: libui/UUServlet.cpp
===================================================================
--- libui/UUServlet.cpp (revision 0)
+++ libui/UUServlet.cpp (revision 0)
@@ -0,0 +1,106 @@
+#include "UUServlet.h"
+
+using namespace std;
+using namespace servlet;
+
+// Constructors/Destructors
+//
+
+UUServlet::UUServlet ( ) { }
+
+UUServlet::~UUServlet ( ) { }
+
+
+void UUServlet::doGet(HttpServletRequest& req, HttpServletResponse& resp) {
+ string csp;
+ string cspRefer;
+ try{
+ csp = req.getAttribute<string>("csp");
+ cspRefer = req.getAttribute<string>("cspRefer");
+ cout<<"\n Inside of UUServlet................CSP = "<<csp<<"\n";
+ cout<<"\n REFERER CSP = "<<cspRefer<<"\n";
+ }catch(const exception& ex){
+ req.setAttribute<string>("error",ex.what());
+ }
+ bool isValid = isUserLoggedIn(req);
+ //isValid=false;
+ // Here I need to exclude pages like Login and Registration from validation, these pages should be accessed without logging in.
+
+ if(!isValid && cspRefer != "CspServletthemes_LoginView_csp" && cspRefer != "CspServletthemes_RegistrationView_csp") {
+ redirectToLogin(req, resp);
+ } else {
+ req.getRequestDispatcher(csp)->forward(req,resp);
+ }
+}
+
+
+//void UUServlet::doPost(HttpServletRequest& req, HttpServletResponse& resp, string& csp, attr_map) {
+// attr_map attributes;
+// doGet(req, resp, csp, attributes);
+//}
+
+
+/**
+ * Returns true if the request already has valid associated session, and that
+ * session contains valid User object
+ * @return bool
+ * @param req Request to check
+ */
+bool UUServlet::isUserLoggedIn (HttpServletRequest& req ) const {
+
+ bool hasValidLogin = false;
+ uuUser u;
+ string loginSession;
+ string loginName = "sergey";
+
+
+ HttpSession* session = req.getSession(false);
+
+ if(session) {
+ if(session->hasAttribute("login")){
+ typedef boost::shared_ptr<string> login_t;
+ login_t log;
+ log = boost::static_pointer_cast<string>(session->getAttribute("login"));
+ loginSession = *log;
+ cout<<"\nINSIDEEEEEEEEEEEEEEEEE = "<<loginSession<<"\n";
+
+ // Call u.isLoginPasswordValid() and pass login and password from session to check if session contains valid User
+ // will be implemented later
+
+ if(loginName == loginSession){
+ hasValidLogin = true;
+ } else {
+ hasValidLogin = false;
+ }
+ } else {
+ hasValidLogin = false;
+ }
+ } else {
+ hasValidLogin = false;
+ }
+ return hasValidLogin;
+
+}
+
+
+/**
+ * Redirects browser to login page
+ * @param resp send redirect through this response object
+ */
+void UUServlet::redirectToLogin (HttpServletRequest& req, HttpServletResponse& resp) {
+ cout<<"\n\nRedirecting to login .....\n\n\n\n";
+ req.setAttribute<string>("Message", "Please login first!");
+ req.getRequestDispatcher("CspServletthemes_LoginView_csp")->forward(req,resp);
+}
+
+
+/**
+ * @return User
+ * @param req
+ */
+User UUServlet::getCurrentUser (HttpServletRequest& req ) {
+ uuUser curUser;
+ return curUser;
+}
+
+
Index: libui/LoginServlet.h
===================================================================
--- libui/LoginServlet.h (revision 0)
+++ libui/LoginServlet.h (revision 0)
@@ -0,0 +1,45 @@
+#ifndef LOGINSERVLET_H
+#define LOGINSERVLET_H
+
+#include <string>
+
+#include <servlet/ServletConfig.h>
+#include <servlet/HttpServletRequest.h>
+#include <servlet/HttpServletResponse.h>
+#include <servlet/RequestDispatcher.h>
+#include <servlet/HttpServlet.h>
+
+#include <boost/lexical_cast.hpp>
+#include "../libdm/User.h"
+#include "UUServlet.h"
+
+using boost::lexical_cast;
+using namespace std;
+using namespace servlet;
+
+
+/**
+This servlet:
+
+ Receives login request.
+ Accesses User model object.
+ Stores results in request context.
+ Determines the language to render page in based on user preferences.
+ Forwards the request to the view object (HomeView.csp) if no errors.
+
+*/
+
+class LoginServlet : public UUServlet
+{
+private:
+ typedef User uu;
+ typedef pair<bool, string> procPair;
+
+ procPair process(HttpServletRequest& request, HttpServletResponse &response);
+public:
+ void service(HttpServletRequest& request, HttpServletResponse &response);
+
+};
+
+#endif//LOGINSERVLET_H
+
Index: libui/UUServlet.h
===================================================================
--- libui/UUServlet.h (revision 0)
+++ libui/UUServlet.h (revision 0)
@@ -0,0 +1,71 @@
+#ifndef UUSERVLET_H
+#define UUSERVLET_H
+
+#include <servlet/ServletConfig.h>
+#include <servlet/HttpServlet.h>
+#include <servlet/HttpServletRequest.h>
+#include <servlet/HttpServletResponse.h>
+#include <servlet/RequestDispatcher.h>
+
+#include "../libdm/User.h"
+
+#include <map>
+#include <string>
+
+/**
+ * class UUServlet
+ * This is base class of all UU servlets (both CSP and standard servlets). It
+ * imlements request handling functions (doGet, doPost, etc), which derived
+ * servlets should not touch,
+ * and provides basic login & ACL management.
+ */
+
+class UUServlet : public servlet::HttpServlet
+{
+public:
+
+ /**
+ * Empty Constructor
+ */
+ UUServlet ( );
+
+ /**
+ * Empty Destructor
+ */
+ virtual ~UUServlet ( );
+
+ // typedef std::map< std::string,std::vector<std::string> > attr_map;
+ typedef User uuUser;
+
+ public:
+ void doGet(servlet::HttpServletRequest& req, servlet::HttpServletResponse& resp);
+
+ // void doPost(servlet::HttpServletRequest& req, servlet::HttpServletResponse& resp, std::string& csp, attr_map);
+
+
+ /**
+ * Returns true if the request already has valid associated session, and that
+ * session contains valid User object
+ * @return bool
+ * @param req Request to check
+ */
+ bool isUserLoggedIn (servlet::HttpServletRequest& req ) const;
+
+
+ /**
+ * Redirects browser to login page
+ * @param resp send redirect through this response object
+ */
+ void redirectToLogin (servlet::HttpServletRequest& req, servlet::HttpServletResponse& resp);
+
+
+ /**
+ * @return User
+ * @param req
+ */
+ User getCurrentUser (servlet::HttpServletRequest& req );
+
+
+};
+
+#endif // UUSERVLET_H
Index: libui/RegisterServlet.cpp
===================================================================
--- libui/RegisterServlet.cpp (revision 0)
+++ libui/RegisterServlet.cpp (revision 0)
@@ -0,0 +1,67 @@
+#include "RegisterServlet.h"
+
+using boost::lexical_cast;
+using namespace std;
+using namespace servlet;
+
+
+RegisterServlet::procPair RegisterServlet::process(HttpServletRequest& request, HttpServletResponse&) {
+
+ try {
+ string login = request.getParameter("login");
+ string password = request.getParameter("passwd");
+ string passwordc = request.getParameter("passwdc");
+ int language = boost::lexical_cast<int>(request.getParameter("lang"));
+ string firstName = request.getParameter("name1");
+ string lastName = request.getParameter("name2");
+ string street = request.getParameter("street");
+ string city = request.getParameter("city");
+ string state = request.getParameter("state");
+ string zip = request.getParameter("zipcode");
+ int country = 1;// boost::lexical_cast<int>(request.getParameter("country"));
+ string email = request.getParameter("email");
+ string phone = request.getParameter("phone");
+ uu uuUser;
+ bool isSuccess = uuUser.setUserInfo(login, password, language, firstName, lastName, street, city, state, zip, country, email, phone);
+ string message;
+ if(isSuccess){
+ message="Welcome new customer "+firstName+" "+lastName+"!";
+ } else {
+ message = "Login name already exist";
+ }
+ return make_pair(isSuccess, message);
+ } catch (const std::exception& ex) {
+ std::cerr<<__PRETTY_FUNCTION__<<": "<<ex.what()<<std::endl;
+ return make_pair(false, "Unknown Error");
+ }
+
+}
+
+
+void RegisterServlet::service(HttpServletRequest& request, HttpServletResponse &response) {
+
+ try{
+ pair<bool, string> p = process(request, response);
+ bool isSuccess = p.first;
+ string message = p.second;
+ request.setAttribute<string>("Message",message);
+ request.setAttribute<string>("cspRefer", "CspServletthemes_RegistrationView_csp");
+ if(!isSuccess){
+ request.setAttribute<string>("csp", "CspServletthemes_RegistrationView_csp");
+ } else {
+ // Set session parameters after successfull registration
+ request.getSession(true);
+ request.getSession()->setAttribute("login", request.getParameter("login"));
+ request.getSession()->setAttribute("password", request.getParameter("passwd"));
+ request.setAttribute<string>("csp", "CspServletthemes_HomeView_csp");
+ }
+ }catch(const exception& ex) {
+ request.setAttribute<string>("error",ex.what());
+ }
+ doGet(request, response);
+
+}
+
+
+EXPORT_SERVLET(RegisterServlet);
+
Index: libui/Makefile.adon
===================================================================
--- libui/Makefile.adon (revision 82)
+++ libui/Makefile.adon (working copy)
@@ -0,0 +1,33 @@
+## libui Makefile
+
+CPP_SERVLETS:=RegisterServlet UUServlet LoginServlet
+CSP_SERVLETS:=
+
+CSP_COMPILE:=cxxsp_compile
+LOCAL_CPPFLAGS:=-I$(ADON_CURDIR)
+
+noinst_LTLIBRARIES:=libuu
+
+noinst_HEADERS:=../libdm/User.h UUServlet.h
+
+EXTRA_DIST:=Footer.csp Header.csp Sidebar.csp
+libuu_SOURCES:=../libdm/User.cpp UUServlet.cpp
+define CSP_TMPL
+$(1)_SOURCES:=$(1).cpp
+$(1)_LDFLAGS:=-lspdb3 -lsputil3 -luu
+$(1)_DEPS:=libuu
+CLEANFILES+=$(1).cpp
+EXTRA_DIST+=$(1).csp
+noinst_LTLIBRARIES+=$(1)
+endef
+define CPP_TMPL
+$(1)_SOURCES:=$(1).cpp
+$(1)_LDFLAGS:=-lspdb3 -lsputil3 -luu
+$(1)_DEPS:=libuu
+noinst_LTLIBRARIES+=$(1)
+endef
+
+$(foreach srv,$(CSP_SERVLETS),$(eval $(call CSP_TMPL,$(srv))))
+$(foreach srv,$(CPP_SERVLETS),$(eval $(call CPP_TMPL,$(srv))))
+
+ADON_SUBDIRS:=
Index: libui/LoginServlet.cpp
===================================================================
--- libui/LoginServlet.cpp (revision 0)
+++ libui/LoginServlet.cpp (revision 0)
@@ -0,0 +1,56 @@
+#include "LoginServlet.h"
+
+using boost::lexical_cast;
+using namespace std;
+using namespace servlet;
+
+
+LoginServlet::procPair LoginServlet::process(HttpServletRequest& request, HttpServletResponse&) {
+
+ try {
+ string login = request.getParameter("login");
+ string password = request.getParameter("CustPwd");
+ uu uuUser;
+ bool isSuccess = uuUser.isLoginPasswordValid(login, password);
+ string message;
+ if(isSuccess){
+ message="Welcome returning customer!";
+ } else {
+ message = "Login/password combination is invalid";
+ }
+ return make_pair(isSuccess, message);
+ } catch (const std::exception& ex) {
+ std::cerr<<__PRETTY_FUNCTION__<<": "<<ex.what()<<std::endl;
+ return make_pair(false, "Unknown Error");
+ }
+
+}
+
+
+void LoginServlet::service(HttpServletRequest& request, HttpServletResponse &response) {
+
+ try{
+ pair<bool, string> p = process(request, response);
+ bool isSuccess = p.first;
+ string message = p.second;
+ request.setAttribute<string>("Message",message);
+ request.setAttribute<string>("cspRefer", "CspServletthemes_LoginView_csp");
+ if(!isSuccess){
+ request.setAttribute<string>("csp", "CspServletthemes_LoginView_csp");
+ } else {
+ // Set session parameters after successfull login
+ request.getSession(true);
+ request.getSession()->setAttribute("login", request.getParameter("login"));
+ request.getSession()->setAttribute("password", request.getParameter("CustPwd"));
+ request.setAttribute<string>("csp", "CspServletthemes_HomeView_csp");
+ }
+ }catch(const exception& ex) {
+ request.setAttribute<string>("error",ex.what());
+ }
+ doGet(request, response);
+
+}
+
+
+EXPORT_SERVLET(LoginServlet);
+
Index: engine.xml
===================================================================
--- engine.xml (revision 0)
+++ engine.xml (revision 0)
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!--<listener protocol="tcp" host="localhost" port="9004"/>-->
+<!-- <num_threads value="1"/> -->
+<listener protocol="unix" path="/tmp/cppserv.sock"/>
+<app name="">
+ <servlet name="CspServletthemes_RegistrationView_csp" dso="./debug/themes/RegistrationView.so"/>
+ <servlet name="CspServletthemes_HomeView_csp" dso="./debug/themes/HomeView.so"/>
+ <servlet name="CspServletthemes_LoginView_csp" dso="./debug/themes/LoginView.so"/>
+ <servlet name="RegisterServlet" dso="./debug/libui/RegisterServlet.so"/>
+ <servlet name="LoginServlet" dso="./debug/libui/LoginServlet.so"/>
+</app>
Index: themes/Footer.csp
===================================================================
--- themes/Footer.csp (revision 0)
+++ themes/Footer.csp (revision 0)
@@ -0,0 +1,22 @@
+<%!
+/**
+ * Footer CSP
+ *
+ */
+%>
+
+
+</td>
+</tr>
+</table>
+ </TD>
+ </TR>
+ </TABLE>
+
+ </CENTER><br>
+<P ALIGN="CENTER">
+ <font face=verdana size=1><A HREF="http://www.total-knowledge.com/copyleft.shtml" TARGET="_new">
+ Authoright © Total Knowledge: 2001-2007</A></font>
+</P>
+</BODY>
+</HTML>
\ No newline at end of file
Index: themes/LoginView.csp
===================================================================
--- themes/LoginView.csp (revision 0)
+++ themes/LoginView.csp (revision 0)
@@ -0,0 +1,67 @@
+<!-- Login form view CSP -->
+
+<%@ include file="Header.csp" %>
+<%@ include file="Sidebar.csp" %>
+
+
+ <FORM ACTION="LoginServlet" METHOD="GET">
+
+ <TD ALIGN="center" valign="top" BGCOLOR="#DDEEFF" width="83%">
+
+<% if(request.hasAttribute("Message")) { %>
+<br>
+<font face=Courier size=2 color="#FF0033""><i><%= request.getAttribute<std::string>("Message") %></i></font>
+<% } %>
+
+<!-- Content -->
+
+<table width=100% cellpadding=4 cellspacing=4 border=0>
+<tr><td></td></tr>
+<TR>
+<TD ALIGN="center">
+<font face=Courier size=3 color="#003399"><b>Enter your membership data to login</B>
+</TD>
+</TR>
+<TR>
+<TD ALIGN="center" BGCOLOR="#DDEEFF">
+<table WIDTH="100%" bordercolor="#FF9900">
+<tr><td colspan="2"> </td></tr>
+<TR>
+<TD ALIGN="right">
+<font face=Courier size=2>Membership name:</font>
+</td>
+<td>
+<INPUT TYPE=TEXT NAME="login" VALUE="" SIZE=20 MAXLENGTH=50>
+</TD>
+</TR>
+<TR>
+<TD ALIGN="right">
+<font face=Courier size=2>Password:</font>
+</td>
+<td>
+<INPUT TYPE=PASSWORD NAME="CustPwd" SIZE=20 MAXLENGTH=50>
+</TD>
+</TR>
+<TR>
+<TD ALIGN="center" colspan="2">
+<BR><INPUT TYPE=SUBMIT NAME="OK" VALUE="Login" SIZE=10 style="background-color:#FFFFF8; color: #003399;">
+</TD>
+</TR>
+<tr><td colspan="2"> </td></tr>
+<TR>
+<TD ALIGN="center" colspan="2">
+<font face=verdana size=1><A HREF="#">Forgot Password?</A></font>
+</TD>
+</TR>
+</TABLE>
+</TD>
+</TR>
+
+
+
+</table>
+
+<!-- End Content -->
+
+<%@ include file="Footer.csp" %>
+
Index: themes/HomeView.csp
===================================================================
--- themes/HomeView.csp (revision 0)
+++ themes/HomeView.csp (revision 0)
@@ -0,0 +1,80 @@
+<!-- Home view CSP -->
+
+<%@ include file="Header.csp" %>
+<%@ include file="Sidebar.csp" %>
+
+
+ <TD ALIGN="center" valign="top" BGCOLOR="#DDEEFF" width="83%">
+
+
+<% if(request.hasAttribute("Message")) { %>
+<br>
+<font face=Courier size=2 color="#FF0033""><i><%= request.getAttribute<std::string>("Message") %></i></font>
+<% } %>
+
+
+<table width=100% cellpadding=4 cellspacing=4 border=0>
+<tr>
+<td valign="top" height="100" width="50%">
+<center><font face=Courier size=3 color="#003399"><b>My Courses</b></font></center><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Calculus</A></font><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Derivatives</A></font><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Math</A></font><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Trigonometry</A></font><br>
+<br>
+<center><font face=verdana size=1><A HREF="RepositoryCourses.html">View All</A></font></center>
+</td>
+</tr>
+
+<tr><td colspan=2><hr color="#99CCFF"></td></tr>
+
+<tr>
+<td valign="top" height="100">
+<center><font face=Courier size=3 color="#003399"><b>Courses I study</b></font></center><br>
+<font face=Courier size=2><A HREF="CourseView1.html">Astronomy</A></font><br>
+<!-- <font face=Courier size=2><A HREF="CourseView1.html">Geology</A></font><br> -->
+<font face=Courier size=2><A HREF="CourseView.html">Theology</A></font><br>
+<br>
+<center><font face=verdana size=1><A HREF="CatalogStudent.html">Get new course</A></font></center>
+<br>
+<br>
+<font face=verdana size=1><A HREF="StudentView.html">My info(as a student)</A></font>
+
+
+</td>
+
+</tr>
+
+<tr><td colspan=2><hr color="#99CCFF"></td></tr>
+
+
+
+<tr>
+<td valign="top" height="100">
+<center><font face=Courier size=3 color="#003399"><b>Courses I teach</b></font></center><br>
+<font face=Courier size=2><A HREF="CourseViewTeach1.html">Math</A></font><br>
+<br>
+<font face=verdana size=1><A HREF="CatalogCoursesTeach.html">Teach new course</A></font>
+<br><br>
+<br>
+<center><font face=Courier size=2 color="#003399"><b>My students</b></font></center><br>
+
+<font face=Courier size=2><A HREF="StudentView.html">Student 1 (359 points)</A></font><br>
+<font face=Courier size=2><A HREF="StudentView.html">Student 2 (412 points)</A></font><br>
+<font face=Courier size=2><A HREF="StudentView.html">Student 3 (87 points)</A></font><br>
+<font face=Courier size=2><A HREF="StudentView.html">Student 4 (210 points)</A></font><br>
+
+<br>
+
+<center><font face=verdana size=1><A HREF="ProblemsList.html">Get list of problems with outstanding solutions</A></font></center>
+<br>
+</td>
+
+</tr>
+
+<tr><td colspan=2><hr color="#99CCFF"></td></tr>
+
+
+</table>
+
+<%@ include file="Footer.csp" %>
Index: themes/RegistrationView.csp
===================================================================
--- themes/RegistrationView.csp (revision 0)
+++ themes/RegistrationView.csp (revision 0)
@@ -0,0 +1,137 @@
+<!-- Registration form view CSP -->
+
+<%@ include file="Header.csp" %>
+<%@ include file="Sidebar.csp" %>
+
+
+ <FORM ACTION="RegisterServlet" METHOD="GET">
+
+ <TD ALIGN="center" valign="top" BGCOLOR="#DDEEFF" width="83%">
+
+<% if(request.hasAttribute("Message")) { %>
+<br>
+<font face=Courier size=2 color="#FF0033""><i><%= request.getAttribute<std::string>("Message") %></i></font>
+<% } %>
+
+
+<!-- Content -->
+
+<table width=100% cellpadding=4 cellspacing=4 border=0>
+<tr><td COLSPAN="2"></td></tr>
+<TR>
+<TD ALIGN="center" COLSPAN="2">
+<font face=Courier size=3 color="#003399"><b>New Membership</B>
+</TD>
+</TR>
+<tr><td COLSPAN="2"></td></tr>
+<tr><td COLSPAN="2"></td></tr>
+ <TR>
+ <TD COLSPAN="2" BGCOLOR="#DDEEFF" ALIGN="center">
+ <font face=Courier size=2>*Membership name:</FONT><BR>
+ <INPUT NAME="login" VALUE="" SIZE=40 MAXLENGTH=40>
+ </TD>
+ </TR>
+ <TR>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center">
+ <font face=Courier size=2>*Password: </FONT><br>
+ <INPUT TYPE=PASSWORD NAME="passwd" SIZE=30>
+ </FONT></TD>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ <font face=Courier size=2>*Password confirmation: </FONT><BR>
+ <INPUT TYPE=PASSWORD NAME="passwdc" SIZE=30>
+ </TD>
+ </TR>
+<tr><td COLSPAN="2"></td></tr>
+ <TR>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ *First Name:<br>
+ <INPUT NAME="name1" VALUE="" SIZE=28 MAXLENGTH=30>
+ </FONT></TD>
+ <TD COLSPAN="2" BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ *Last Name:<br>
+ <INPUT NAME="name2" VALUE="" SIZE=28 MAXLENGTH=30>
+ </FONT></TD>
+ </TR>
+ <TR>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center" colspan=2><font face=Courier size=2>
+ *Street:<br>
+ <INPUT NAME="street" VALUE="" SIZE=62 MAXLENGTH=50>
+ </FONT></TD>
+ </TR>
+ <TR>
+ <TD COLSPAN="2" BGCOLOR="#DDEEFF" ALIGN="center">
+ <TABLE CELLPADDING=5 CELLSPACING=1 BORDER="0">
+ <TR>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ *City:<BR>
+ <INPUT NAME="city" VALUE="" SIZE=18 MAXLENGTH=60>
+ </FONT></TD>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ *State:<BR>
+ <SELECT name="state">
+ <OPTION value="" selected >Select a State</OPTION><OPTION value="AA">Armed Forces the Americas</OPTION><OPTION value="AE">Armed Forces Europe</OPTION><OPTION value="AK">Alaska</OPTION><OPTION value="AL">Alabama</OPTION><OPTION value="AP">Armed Forces Pacific</OPTION><OPTION value="AR">Arkansas</OPTION><OPTION value="AZ">Arizona</OPTION><OPTION value="CA">California</OPTION><OPTION value="CO">Colorado</OPTION><OPTION value="CT">Connecticut</OPTION><OPTION value="DC">District of Columbia</OPTION><OPTION value="DE">Delaware</OPTION><OPTION value="FL">Florida</OPTION><OPTION value="GA">Georgia</OPTION><OPTION value="GU">Guam</OPTION><OPTION value="HI">Hawaii</OPTION><OPTION value="IA">Iowa</OPTION><OPTION value="ID">Idaho</OPTION><OPTION value="IL">Illinois</OPTION><OPTION value="IN">Indiana</OPTION><OPTION value="KS">Kansas</OPTION><OPTION value="KY">Kentucky</OPTION><OPTION value="LA">Louisiana</OPTION><OPTION value="MA">Massachusettes</OPTION><OPTION value="MD">Maryland</OPTION><OPTION value="ME">Maine</OPTION><OPTION value="MI">Michigan</OPTION><OPTION value="MN">Minnesota</OPTION><OPTION value="MO">Missouri</OPTION><OPTION value="MS">Mississippi</OPTION><OPTION value="MT">Montana</OPTION><OPTION value="NC">North Carolina</OPTION><OPTION value="ND">North Dakota</OPTION><OPTION value="NE">Nebraska</OPTION><OPTION value="NH">New Hampshire</OPTION><OPTION value="NJ">New Jersey</OPTION><OPTION value="NM">New Mexico</OPTION><OPTION value="NV">Nevada</OPTION><OPTION value="NY">New York</OPTION><OPTION value="OH">Ohio</OPTION><OPTION value="OK">Oklahoma</OPTION><OPTION value="OR">Oregon</OPTION><OPTION value="PA">Pennsylvania</OPTION><OPTION value="PR">Puerto Rico</OPTION><OPTION value="RI">Rhode Island</OPTION><OPTION value="SC">South Carolina</OPTION><OPTION value="SD">South Dakota</OPTION><OPTION value="TN">Tennessee</OPTION><OPTION value="TX">Texas</OPTION><OPTION value="UT">Utah</OPTION><OPTION value="VA">Virginia</OPTION><OPTION value="VI">Virgin Islands</OPTION><OPTION value="VT">Vermont</OPTION><OPTION value="WA">Washington</OPTION><OPTION value="WI">Wisconsin</OPTION><OPTION value="WV">West Virginia</OPTION><OPTION value="WY">Wyoming</OPTION><OPTION value="MP">Micropolynesia</OPTION><OPTION value="FM">Federated States of Micronesia</OPTION>
+ </SELECT>
+ </FONT></TD>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ *Zip Code:<BR>
+ <INPUT NAME="zipcode" VALUE="" SIZE=12 MAXLENGTH=200>
+ </FONT></TD>
+ </TR>
+ </TABLE>
+ </TD>
+ </TR>
+ <TR>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ Country:<BR>
+
+<SELECT name="country">
+ <OPTION value="">Select a Country</OPTION><OPTION value="US" selected >United States</OPTION><OPTION value="AF">Afghanistan</OPTION><OPTION value="AL">Albania</OPTION><OPTION value="DZ">Algeria</OPTION><OPTION value="AS">American Samoa</OPTION><OPTION value="AD">Andorra</OPTION><OPTION value="AO">Angola</OPTION><OPTION value="AV">Anguila</OPTION><OPTION value="AI">Anguilla</OPTION><OPTION value="AQ">Antarctica</OPTION><OPTION value="AG">Antigua</OPTION><OPTION value="AR">Argentina</OPTION><OPTION value="AM">Armenia</OPTION><OPTION value="AW">Aruba</OPTION><OPTION value="AU">Australia</OPTION><OPTION value="AT">Austria</OPTION><OPTION value="AZ">Azerbaidjan</OPTION><OPTION value="BS">Bahamas</OPTION><OPTION value="BH">Bahrain</OPTION><OPTION value="BD">Bangladesh</OPTION><OPTION value="BB">Barbados</OPTION><OPTION value="BY">Belarus</OPTION><OPTION value="BE">Belgium</OPTION><OPTION value="BZ">Belize</OPTION><OPTION value="BJ">Benin</OPTION><OPTION value="BM">Bermuda</OPTION><OPTION value="BT">Bhutan</OPTION><OPTION value="BO">Bolivia</OPTION><OPTION value="BA">Bosnia and Herzegovina</OPTION><OPTION value="BW">Botswnan</OPTION><OPTION value="BV">Bouvet Island</OPTION><OPTION value="BR">Brazil</OPTION><OPTION value="IO">British Indian Ocean Territory</OPTION><OPTION value="BN">Brunei Darussalam</OPTION><OPTION value="BG">Bulgaria</OPTION><OPTION value="BF">Burkina Faso</OPTION><OPTION value="BI">Burundi</OPTION><OPTION value="KH">Cambodia</OPTION><OPTION value="CM">Cameroon</OPTION><OPTION value="CA">Canada</OPTION><OPTION value="CV">Cape Verde</OPTION><OPTION value="KY">Cayman Islands</OPTION><OPTION value="CF">Central African Republic</OPTION><OPTION value="TD">Chad</OPTION><OPTION value="CL">Chile</OPTION><OPTION value="CN">China</OPTION><OPTION value="CX">Christmas Island</OPTION><OPTION value="CC">Cocos</OPTION><OPTION value="CO">Columbia</OPTION><OPTION value="KM">Comoros</OPTION><OPTION value="CG">Congo</OPTION><OPTION value="CD">Congo, Domocratic Republic</OPTION><OPTION value="CK">Cook Islands</OPTION><OPTION value="CR">Costa Rica</OPTION><OPTION value="CI">Cote D'lvoire/Ivory Coast</OPTION><OPTION value="HR">Croatia</OPTION><OPTION value="CU">Cuba</OPTION><OPTION value="CY">Cyprus</OPTION><OPTION value="CZ">Czech Republic</OPTION><OPTION value="DK">Denmark</OPTION><OPTION value="DJ">Djibouti</OPTION><OPTION value="DO">Dominican Republic</OPTION><OPTION value="DM">Domonica</OPTION><OPTION value="TP">East Timor</OPTION><OPTION value="EC">Ecuador</OPTION><OPTION value="EG">Egypt</OPTION><OPTION value="SV">EL Salvador</OPTION><OPTION value="GQ">Equatorial Guinea</OPTION><OPTION value="ER">Eritrea</OPTION><OPTION value="EE">Estonia</OPTION><OPTION value="ET">Ethiopia</OPTION><OPTION value="FK">Falkland Islands (Malvinas)</OPTION><OPTION value="FO">Faroe Islands</OPTION><OPTION value="FJ">Fiji</OPTION><OPTION value="FI">Finland</OPTION><OPTION value="FR">France</OPTION><OPTION value="GF">French Guiana</OPTION><OPTION value="PF">French Polynesia</OPTION><OPTION value="TF">French Southern Territories</OPTION><OPTION value="GA">Gabon</OPTION><OPTION value="GM">Gambia</OPTION><OPTION value="GE">Georgia</OPTION><OPTION value="DE">Germany</OPTION><OPTION value="GH">Ghana</OPTION><OPTION value="GI">Gibraltar</OPTION><OPTION value="GB">Great Britian</OPTION><OPTION value="GR">Greece</OPTION><OPTION value="GL">Greenland</OPTION><OPTION value="GD">Grenada</OPTION><OPTION value="GP">Guadelopue</OPTION><OPTION value="GT">Guatemala</OPTION><OPTION value="GN">Guinea</OPTION><OPTION value="GW">Guinea-Bissau</OPTION><OPTION value="GY">Guyana</OPTION><OPTION value="HT">Haiti</OPTION><OPTION value="HM">Heard & McDonald Islands</OPTION><OPTION value="HN">Honduras</OPTION><OPTION value="HK">Hong Kong</OPTION><OPTION value="HU">Hungary</OPTION><OPTION value="IS">Iceland</OPTION><OPTION value="IN">India</OPTION><OPTION value="ID">Indonesia</OPTION><OPTION value="IR">Iran</OPTION><OPTION value="IQ">Iraq</OPTION><OPTION value="IE">Ireland</OPTION><OPTION value="IL">Israel</OPTION><OPTION value="IT">Italy</OPTION><OPTION value="JM">Jamaica</OPTION><OPTION value="JP">Japan</OPTION><OPTION value="JO">Jordan</OPTION><OPTION value="KZ">Kazakhstan</OPTION><OPTION value="KE">Kenya</OPTION><OPTION value="KI">Kiribati</OPTION><OPTION value="KW">Kuwait</OPTION><OPTION value="KG">Kyrgyzstan</OPTION><OPTION value="LA">Laos</OPTION><OPTION value="LV">Latvia</OPTION><OPTION value="LB">Lebanon</OPTION><OPTION value="LS">Lesotho</OPTION><OPTION value="LR">Liberia</OPTION><OPTION value="LY">Libya</OPTION><OPTION value="LI">Liechtenstein</OPTION><OPTION value="LT">Lithuania</OPTION><OPTION value="LU">Luxembourg</OPTION><OPTION value="MO">Macau</OPTION><OPTION value="MK">Macedonia</OPTION><OPTION value="MG">Madagascar</OPTION><OPTION value="MW">Malawi</OPTION><OPTION value="MY">Malaysia</OPTION><OPTION value="MV">Maldives</OPTION><OPTION value="ML">Mali</OPTION><OPTION value="MT">Malta</OPTION><OPTION value="MH">Marshall Islands</OPTION><OPTION value="MQ">Martinique</OPTION><OPTION value="MR">Mauritania</OPTION><OPTION value="MU">Mauritius</OPTION><OPTION value="YT">Mayotte</OPTION><OPTION value="MX">Mexico</OPTION><OPTION value="FM">Micronesia</OPTION><OPTION value="MD">Moldova</OPTION><OPTION value="MC">Monaco</OPTION><OPTION value="MN">Mongolia</OPTION><OPTION value="MS">Montserrat</OPTION><OPTION value="MA">Morocco</OPTION><OPTION value="MZ">Mozambique</OPTION><OPTION value="MM">Myanmar</OPTION><OPTION value="NA">Namibia</OPTION><OPTION value="NR">Nauru</OPTION><OPTION value="NP">Nepal</OPTION><OPTION value="NL">Netherlands</OPTION><OPTION value="AN">Netherlands Antilles</OPTION><OPTION value="NT">Neutral Zone</OPTION><OPTION value="NC">New Caledonia</OPTION><OPTION value="NZ">New Zealand</OPTION><OPTION value="NI">Nicaragua</OPTION><OPTION value="NE">Niger</OPTION><OPTION value="NG">Nigeria</OPTION><OPTION value="NU">Niue</OPTION><OPTION value="NF">Norfolk Island</OPTION><OPTION value="KP">North Korea</OPTION><OPTION value="MP">Northern Mariana Islands</OPTION><OPTION value="NO">Norway</OPTION><OPTION value="OM">Oman</OPTION><OPTION value="PK">Pakistan</OPTION><OPTION value="PW">Palau</OPTION><OPTION value="PA">Panama</OPTION><OPTION value="PG">Papua New Guinea</OPTION><OPTION value="PY">Paraguay</OPTION><OPTION value="PE">Peru</OPTION><OPTION value="PH">Philippines</OPTION><OPTION value="PN">Pitcaim</OPTION><OPTION value="PL">Poland</OPTION><OPTION value="PT">Portugal</OPTION><OPTION value="QA">Qatar</OPTION><OPTION value="RE">Reunion</OPTION><OPTION value="RO">Romania</OPTION><OPTION value="RU">Russia</OPTION><OPTION value="RW">Rwanda</OPTION><OPTION value="GS">S Georgia & S Sandwich Islands</OPTION><OPTION value="KN">Saint Kitts & Nevis</OPTION><OPTION value="LC">Saint Lucia</OPTION><OPTION value="VC">Saint Vicent & the Grenadines</OPTION><OPTION value="WS">Samoa</OPTION><OPTION value="SM">San Marino</OPTION><OPTION value="ST">Sao Tome and Principe</OPTION><OPTION value="SA">Saudi Arabia</OPTION><OPTION value="SN">Senegal</OPTION><OPTION value="SL">Serra Leone</OPTION><OPTION value="SC">Seychelles</OPTION><OPTION value="SG">Singapore</OPTION><OPTION value="SK">Slovak Republic</OPTION><OPTION value="SI">Slovenia</OPTION><OPTION value="SB">Solomon Islands</OPTION><OPTION value="SO">Somalia</OPTION><OPTION value="ZA">South Africa</OPTION><OPTION value="KR">South Korea</OPTION><OPTION value="ES">Spain</OPTION><OPTION value="LK">Sri Lanka</OPTION><OPTION value="SH">St. Helen</OPTION><OPTION value="PM">St. Pierre & Miquelon</OPTION><OPTION value="SD">Sudan</OPTION><OPTION value="SR">Suriname</OPTION><OPTION value="SJ">Svalbard & Jan Mayen Islands</OPTION><OPTION value="SZ">Swaziland</OPTION><OPTION value="SE">Sweden</OPTION><OPTION value="CH">Switzerland</OPTION><OPTION value="SY">Syria</OPTION><OPTION value="TW">Taiwan</OPTION><OPTION value="TJ">Tajikistan</OPTION><OPTION value="TZ">Tanzania</OPTION><OPTION value="TH">Thailand</OPTION><OPTION value="TG">Togo</OPTION><OPTION value="TK">Tokelau</OPTION><OPTION value="TO">Tonga</OPTION><OPTION value="TT">Trinidad and Tobago</OPTION><OPTION value="TN">Tunisia</OPTION><OPTION value="TR">Turkey</OPTION><OPTION value="TM">Turkmenistan</OPTION><OPTION value="TC">Turks and Caicos Islands</OPTION><OPTION value="TV">Tuvalu</OPTION><OPTION value="UG">Uganda</OPTION><OPTION value="UA">Ukraine</OPTION><OPTION value="AE">United Arab Emirates</OPTION><OPTION value="UK">United Kingdom</OPTION><OPTION value="UY">Uruguay</OPTION><OPTION value="UM">US Minor Outlying Islands</OPTION><OPTION value="UZ">Uzbekistan</OPTION><OPTION value="VU">Vanuatu</OPTION><OPTION value="VA">Vatican City State</OPTION><OPTION value="VE">Venezuela</OPTION><OPTION value="VN">Vietnam</OPTION><OPTION value="VG">Virgin Islands (British)</OPTION><OPTION value="WF">Wallis and Futuna Islands</OPTION><OPTION value="EH">Western Sahara</OPTION><OPTION value="YE">Yemen</OPTION><OPTION value="YU">Yugoslavia</OPTION><OPTION value="ZR">Zaire</OPTION><OPTION value="ZM">Zambia</OPTION><OPTION value="ZW">Zimbabwe</OPTION>
+ </SELECT>
+ </FONT></TD>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ *Phone:<BR>
+ <INPUT NAME="phone" VALUE="" SIZE=28 MAXLENGTH=40>
+ </FONT></TD>
+ </TR>
+ <TR VALIGN="bottom">
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ Language:<BR>
+ <select name="lang">
+ <option value="1" selected>English</option>
+ <option value="2">Spanish</option>
+ <option value="3">Russian</option>
+ <option value="4">French</option>
+ </select>
+ </FONT></TD>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ E-mail:<BR>
+ <INPUT NAME="email" VALUE="" SIZE=28 MAXLENGTH=200>
+ </FONT></TD>
+ </TR>
+
+ <TR>
+ <TD BGCOLOR="#DDEEFF" ALIGN="right">
+ <BR>
+ <INPUT TYPE=RESET VALUE=" Reset " style="background-color:#FFFFF8; color: #003399;"><BR></TD><TD BGCOLOR="#DDEEFF" ALIGN="left"><BR>
+ <INPUT TYPE=SUBMIT VALUE=" Register " style="background-color:#FFFFF8; color: #003399;"><BR>
+ </TD>
+ </TR>
+</form>
+ <TR>
+ <TD BGCOLOR="#DDEEFF" COLSPAN="2" ALIGN="center">
+ <font face=verdana size=1>
+ * indicates a required field.<BR></FONT>
+ </FONT></TD>
+ </TR>
+ <TR>
+ <TD COLSPAN="2" align="center">
+<font face=Courier size=2><A HREF="Agreement.html">Agreement</A></font>
+ </TD>
+ </TR>
+
+
+</table>
+
+<!-- End Content -->
+
+<%@ include file="Footer.csp" %>
Index: themes/Header.csp
===================================================================
--- themes/Header.csp (revision 0)
+++ themes/Header.csp (revision 0)
@@ -0,0 +1,54 @@
+<%!
+/**
+ * Header CSP
+ *
+ */
+%>
+
+
+
+<HTML>
+<HEAD>
+<link href="../style/styles.css" rel="stylesheet" media="screen">
+<TITLE>TEST</TITLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFF8" link="#003399" vlink="#003399">
+<CENTER><br>
+
+<!-- Header -->
+
+<TABLE width="770" border=0>
+<TR>
+<TD BGCOLOR="#3388FF" align="center">
+<table width="100%" border=1 cellpadding=1 cellspacing=0 class="st">
+
+<tr>
+<td align="center" width="16%" height="25">
+<FONT SIZE=2 face=verdana><a href="CspServletthemes_HomeView_csp" class="headerLink"><B>HOME<B></a></FONT>
+</td>
+<td align="center" width="20%">
+<FONT SIZE=2 face=verdana><a href="CspServletthemes_RegistrationView_csp" class="headerLinkOn"><B>REGISTRATION<B></a></FONT>
+</td>
+<td align="center" width="16%">
+<FONT SIZE=2 face=verdana><a href="CspServletthemes_LoginView_csp" class="headerLink"><B>LOGOUT<B></a></FONT>
+</td>
+<td align="center" width="16%">
+<FONT SIZE=2 face=verdana><a href="Intro.html" class="headerLink"><B>ABOUT US<B></a></FONT>
+</td>
+
+<td align="center" width="16%">
+<FONT SIZE=2 face=verdana><a href="Policies.html" class="headerLink"><B>POLICIES<B></a></FONT>
+</td>
+<td align="center" width="16%">
+<FONT SIZE=2 face=verdana><a href="Help.html" class="headerLink"><B>HELP<B></a></FONT>
+</td>
+</tr>
+</table>
+
+</TD>
+</TR>
+
+<!-- End Header -->
+
+
Index: themes/Makefile.adon
===================================================================
--- themes/Makefile.adon (revision 82)
+++ themes/Makefile.adon (working copy)
@@ -1 +1,39 @@
+## themes Makefile
+
+CPP_SERVLETS:=
+CSP_SERVLETS:= \
+ HomeView \
+ LoginView \
+ RegistrationView \
+
+CSP_COMPILE:=cxxsp_compile
+LOCAL_CPPFLAGS:=-I$(ADON_CURDIR)
+
+noinst_LTLIBRARIES:=
+noinst_HEADERS:=
+
+EXTRA_DIST:=Footer.csp Header.csp Sidebar.csp
+define CSP_TMPL
+$(1)_SOURCES:=$(1).cpp
+$(1)_LDFLAGS:=-lspdb3 -lsputil3 -luu
+$(1)_DEPS:=libuu
+CLEANFILES+=$(1).cpp
+EXTRA_DIST+=$(1).csp
+noinst_LTLIBRARIES+=$(1)
+endef
+define CPP_TMPL
+$(1)_SOURCES:=$(1).cpp
+$(1)_LDFLAGS:=-lspdb3 -lsputil3 -luu
+$(1)_DEPS:=libuu
+noinst_LTLIBRARIES+=$(1)
+endef
+
+$(foreach srv,$(CSP_SERVLETS),$(eval $(call CSP_TMPL,$(srv))))
+$(foreach srv,$(CPP_SERVLETS),$(eval $(call CPP_TMPL,$(srv))))
+
+
+%.cpp: %.csp
+ @echo "Parsing $< into $@"
+ $(Q)$(CSP_COMPILE) $< $@
+
ADON_SUBDIRS:=default
Index: themes/Sidebar.csp
===================================================================
--- themes/Sidebar.csp (revision 0)
+++ themes/Sidebar.csp (revision 0)
@@ -0,0 +1,95 @@
+<%!
+/**
+ * Sidebar CSP
+ *
+ */
+%>
+
+
+<!-- Side Bar -->
+
+ <TR>
+ <TD ALIGN="center" BGCOLOR="#DDEEFF">
+<table width="770" border=0 cellpadding=4 cellspacing=0>
+<TR>
+ <TD ALIGN="left" valign="top" BGCOLOR="#99CCFF" width="17%">
+<table width=100% cellpadding=4 cellspacing=4 border=0>
+<tr><form action="SearchResults.html" name="search">
+<td>
+<font face=verdana size=2 color="#003399"><b>Search</b></font><br>
+<font face=verdana size=2><input type="text" name="search" value="" size="4"></font> <font face=verdana size=2><input type="submit" name="go" value="go" style="background-color:#DDEEFF; color: #003399;"></font></td>
+
+</tr>
+<tr>
+<td>
+<font face=verdana size=1><A HREF="AdvancedSearch.html" class="navbarLink">Advanced Search</A></font><br>
+</td></form>
+</tr>
+
+
+<tr><td><hr color="#003399"></td></tr>
+<tr>
+<td>
+<font face=verdana size=2><A HREF="Repository.html" class="navbarLink"><b>My UMOs</b></A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryCourses.html" class="navbarLink">Courses</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryTopics.html" class="navbarLink">Topics</A></font><br>
+
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryProblems.html" class="navbarLink">Problems</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryExplanations.html" class="navbarLink">Explanations</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryTests.html" class="navbarLink">Tests</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryDialogs.html" class="navbarLink">Dialogs</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryTexts.html" class="navbarLink">Texts</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CustomEdit.html" class="navbarLink">Advertising</A></font><br><br>
+<font face=verdana size=2><A HREF="#" class="navbarLink"><b>Create New</b></A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CourseCreate.html" class="navbarLink">Course</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="TopicCreate.html" class="navbarLink">Topic</A></font><br>
+
+<font face=verdana size=1 color="#003399">• <A HREF="ProblemCreate.html" class="navbarLink">Problem</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="ExplanationCreate.html" class="navbarLink">Explanation</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="TestCreate.html" class="navbarLink">Test</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="DialogCreate.html" class="navbarLink">Dialog</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="TextCreate.html" class="navbarLink">Text</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CustomCreate.html" class="navbarLink">Custom UMO</A></font><br></td>
+</tr>
+
+
+<tr><td><hr color="#003399"></td></tr>
+<tr>
+
+<td>
+<font face=verdana size=2><A HREF="RepositoryAll.html" class="navbarLink"><b>All UMOs</b></A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryCourses.html" class="navbarLink">Courses</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryTopics.html" class="navbarLink">Topics</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryProblems.html" class="navbarLink">Problems</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryExplanations.html" class="navbarLink">Explanations</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryTests.html" class="navbarLink">Tests</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryDialogs.html" class="navbarLink">Dialogs</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryTexts.html" class="navbarLink">Texts</A></font><br>
+
+<br>
+
+<font face=verdana size=2><A HREF="SearchResults.html" class="navbarLink"><b>Catalog</b></A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CatalogCourses.html" class="navbarLink">Courses</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CatalogTopics.html" class="navbarLink">Topics</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CatalogProblems.html" class="navbarLink">Problems</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CatalogExplanations.html" class="navbarLink">Explanations</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CatalogTests.html" class="navbarLink">Tests</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CatalogDialogs.html" class="navbarLink">Dialogs</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CatalogTexts.html" class="navbarLink">Texts</A></font><br>
+
+
+</td>
+</tr>
+
+<tr><td><hr color="#003399"></td></tr>
+<tr>
+<td><font face=verdana size=2><A HREF="Basket.html" class="navbarLink"><b>My Basket</b></A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="Basket.html" class="navbarLink">3 UMOs</a></font><br><br>
+</td>
+</tr>
+</table>
+ </TD>
+
+<!-- End Side Bar -->
+
+
Index: libdm/User.cpp
===================================================================
--- libdm/User.cpp (revision 0)
+++ libdm/User.cpp (revision 0)
@@ -0,0 +1,121 @@
+#include "User.h"
+
+User::User() {}
+User::~User() {}
+
+/**
+ * Performs registration.
+ * @return bool
+ */
+
+
+/**
+ * Performs authentication.
+ * @return bool
+ */
+bool User::isLoginPasswordValid ( std::string login, std::string password ) {
+
+ CODBCDatabase db("DSN=PostgreSQL;UID=sergey;PWD=;DATABASE=uudb");
+ bool isValid = false;
+ int id;
+ string fname;
+ string lname;
+ try {
+ cout<<"\nOpenning database... \n";
+ db.open();
+ CQuery qrySelect(&db,"select pl_id, pl_first_name, pl_last_name from person_list where pl_login='"+login+"' and pl_password='"+password+"'");
+ qrySelect.open();
+ CField& idField = qrySelect[0];
+ CField& fnameField = qrySelect["pl_first_name"];
+ CField& lnameField = qrySelect["pl_last_name"];
+
+ while ( ! qrySelect.eof() ) {
+ isValid = true;
+ id = idField.asInteger();
+ fname = fnameField.asString();
+ lname = lnameField.asString();
+ qrySelect.fetch();
+ }
+ qrySelect.close();
+ cout<<"\nClosing database... \n";
+ db.close();
+ }
+ catch (exception& e) {
+ cout<<"\nError: " <<e.what();
+ return false;
+ }
+ return isValid;
+
+}
+
+
+/**
+ * Sets all user data during a registration process. Calls stored procedure "person_create" to insert user data into "person_list" table. If insert is successful, returns true. Otherwise returns false.
+ */
+bool User::setUserInfo ( std::string login, std::string password, int language, std::string firstName, std::string lastName, std::string street, std::string city, std::string state, std::string zip, int country, std::string email, std::string phone ) {
+ //Call stored procedure "person_create" here.
+
+ CODBCDatabase db("DSN=PostgreSQL;UID=sergey;PWD=;DATABASE=uudb");
+
+ try {
+ cout<<"\nOpenning database... \n";
+ db.open();
+ CQuery qryInsert(&db,"insert into person_list (pl_preferred_language, pl_first_name, pl_last_name, pl_street_address, pl_city, pl_state, pl_zip, pl_country, pl_email, pl_phone, pl_login, pl_password) values("+lexical_cast<string>(language)+", '"+firstName+"', '"+lastName+"', '"+street+"', '"+city+"', '"+state+"', '"+zip+"', "+lexical_cast<string>(country)+", '"+email+"', '"+phone+"', '"+login+"', '"+password+"')");
+ qryInsert.exec();
+ cout<<"\nClosing database... \n";
+ db.close();
+ }
+ catch (exception& e) {
+ cout<<"\nError: " <<e.what();
+ return false;
+ }
+ return true;
+
+}
+
+
+/**
+ * Updates user data. Will be used in My Account section where user can update his/her personal info. Calls stored procedure "person_update" to update user data in "person_list" table. If update is successful, returns true. Otherwise returns false.
+ */
+//bool User::updateUserInfo ( std:string userId, std::string login, std::string password, std::string language, std::string firstName, std::string lastName, std::string street, std::string city, std::string zip, std::string country, std::string email, std::string phone ) {
+ //Call stored procedure "person_update" here.
+//}
+
+
+/**
+ * Retrieves user data. Will be used whenever user's personal info needed. Calls stored procedure "person_select" to select user data from "person_list" table. Returns map containing "person_list" field names as a keys and field entries as a values.
+ */
+//std::map<std::string,std::string> User::getUserInfo (string login, string password) {
+ //Call stored procedure "person_select" here.
+
+ /**
+ CODBCDatabase db("DSN=PostgreSQL;UID=sergey;PWD=;DATABASE=uudb");
+
+ try {
+ cout<<"\nOpenning database... \n";
+ db.open();
+ CQuery qrySelect(&db,"select pl_id, pl_first_name, pl_last_name from person_list where pl_login='"+login+"' and pl_password='"+password+"'");
+ map<string, string> personData_map;
+ qrySelect.open();
+
+ CField& idField = qrySelect[0];
+ CField& fnameField = qrySelect["pl_first_name"];
+ CField& lnameField = qrySelect["pl_last_name"];
+
+ while ( ! qrySelect.eof() ) {
+ personData_map.insert
+ qrySelect.fetch();
+ }
+ qrySelect.close();
+ cout<<"\nClosing database... \n";
+ db.close();
+ }
+ catch (exception& e) {
+ cout<<"\nError: " <<e.what();
+ return false;
+ }
+ return true;
+ */
+
+//}
+
Index: libdm/User.h
===================================================================
--- libdm/User.h (revision 0)
+++ libdm/User.h (revision 0)
@@ -0,0 +1,60 @@
+#ifndef USER_H
+#define USER_H
+
+#include <string>
+#include <boost/lexical_cast.hpp>
+#include <map>
+
+#include <sptk3/CODBCDatabase.h>
+#include <sptk3/CException.h>
+#include <sptk3/CQuery.h>
+
+using namespace std;
+using namespace sptk;
+using namespace boost;
+
+/**
+This class:
+
+ Accesses and alters person_list table in DB.
+
+*/
+
+
+class User
+{
+public:
+ User();
+ virtual ~User();
+
+ std::string fname;
+ std::string login;
+ std::string password;
+
+ /**
+ * Performs user authentication
+ */
+ bool isLoginPasswordValid ( std::string login, std::string password);
+
+
+ /**
+ * Sets all user data during a registration process. Calls stored procedure "person_create" to insert user data into "person_list" table. If insert is successful, returns true. Otherwise returns false.
+ */
+ virtual bool setUserInfo ( std::string login, std::string password, int language, std::string firstName, std::string lastName, std::string street, std::string city, std::string state, std::string zip, int country, std::string email, std::string phone );
+
+
+ /**
+ * Updates user data. Will be used in My Account section where user can update his/her personal info. Calls stored procedure "person_update" to update user data in "person_list" table. If update is successful, returns true. Otherwise returns false.
+ */
+ //virtual bool updateUserInfo ( std::string userId, std::string login, std::string password, std::string language, std::string firstName, std::string lastName, std::string street, std::string city, std::string zip, std::string country, std::string email, std::string phone );
+
+
+ /**
+ * Retrieves user data. Will be used whenever user's personal info needed. Calls stored procedure "person_select" to select user data from "person_list" table. Returns map containing "person_list" field names as a keys and field entries as a values.
+ */
+ //virtual std::map<std::string,std::string> getUserInfo (std::string userId);
+
+
+};
+
+#endif // USER_H
Index: libdm/Makefile.adon
===================================================================
--- libdm/Makefile.adon (revision 82)
+++ libdm/Makefile.adon (working copy)
@@ -0,0 +1,2 @@
+## libdm Makefile
+
Index: env-tests/env-test-custom.mk
===================================================================
--- env-tests/env-test-custom.mk (revision 82)
+++ env-tests/env-test-custom.mk (working copy)
@@ -0,0 +1,15 @@
+#####################################################
+ifneq ($(strip $(shell $(CXX) -v 2>&1| grep '^gcc')),)
+$(eval $(call cxx_flag_kirpich,-W))
+$(eval $(call cxx_flag_kirpich,-Wall))
+$(eval $(call cxx_flag_kirpich,-Wextra))
+#$(eval $(call cxx_flag_kirpich,-Wold-style-cast))
+#$(eval $(call cxx_flag_kirpich,-Woverloaded-virtual))
+$(eval $(call cxx_flag_kirpich,-Wredundant-decls))
+#$(eval $(call cxx_flag_kirpich,-pedantic))
+$(eval $(call sptk_kirpich))
+$(eval $(call sptk_namespace_kirpich))
+$(eval $(call sptk_odbc_kirpich))
+$(eval $(call sptk_sqlite_kirpich))
+endif
+#####################################################
Index: Makefile.adon
===================================================================
--- Makefile.adon (revision 82)
+++ Makefile.adon (working copy)
@@ -1 +1,6 @@
+## trunk Makefile
+
ADON_SUBDIRS:=libdm libui themes admin
+EXTRA_DIST := README engine.xml
+export CPPSERV_TEST_HOST ?= sergey
+export CPPSERV_TEST_URLBASE ?= http://localhost/~sergey/csp
- Follow-Ups:
- Re: UU code
- From: sergey@total-knowledge.com
- Re: UU code
- From: "Ilya A. Volynets-Evenbakh" <ilya@total-knowledge.com>