DCL 3.7.4
Loading...
Searching...
No Matches
HtmlPage.cpp
Go to the documentation of this file.
1#include <dcl/Config.h>
2
3#ifdef __WINNT__
4#include <windows.h>
5#endif
6
7#include <dcl/Writer.h>
8
9#include "ServletMain.h"
10#include "HtmlView.h"
11#include "HtmlPage.h"
12
13#if __DCL_HAVE_THIS_FILE__
14#undef __THIS_FILE__
15static const char_t __THIS_FILE__[] = __T("fastpage/HtmlPage.cpp");
16#endif
17
18__DCL_BEGIN_NAMESPACE
19
21{
23 return __pSite;
24}
25
26HtmlPage::HtmlPage(int nPageID, const SiteContext* pSite)
27{
28 __strPageID = String::valueOf(nPageID);
29 __nPageID = nPageID;
30 __nPermID = 0;
31 __pSite = pSite;
32}
33
35{
36 for(size_t i = 0; i < __views.size(); i++)
37 delete __views[i];
38}
39
42{
43#ifdef __DCL_DEBUG
45#endif
46 q.prepare(L""
47 "SELECT P.PERM_ID, P.TYPE, P.CHARSET, P.LANGUAGE,"
48 "P.TITLE, P.UPDATE_TIME"
49 "\n FROM DCL_PAGE AS P"
50 "\n WHERE P.PAGE_ID = :PAGE_ID"
51 );
52 q.params()[0].setValue(__nPageID);
53 q.execute();
54 q.fetch();
55 if (q.eof())
56 return false;
57 else {
58 SQLFields& fields = q.fields();
59 __nPermID = fields[0].asInteger();
60 if (!fields[1].isNull())
61 __strType = fields[1].asString();
62 if (!fields[2].isNull())
63 __strCharset = fields[2].asString();
64 if (!fields[3].isNull())
65 __strLanguage = fields[3].asString();
66 if (!fields[4].isNull())
67 __strTitle = fields[4].asString();
68 __dtUpdate = fields[5].asDateTime();
69 }
70
71 q.prepare(L""
72 "SELECT V.NO, V.CLASS_ID, V.USER_ID, V.DS_ID, V.SKIN_FILE, V.PARAMETERS"
73 "\n , D.DS_NAME, DS_TYPE, D.TABLE_ID, D.REPLY_DEPTH, D.SEQUENCE"
74 "\nFROM DCL_VIEW V"
75 "\n INNER JOIN DCL_DATA_SOURCE D"
76 "\n ON (V.USER_ID = D.USER_ID AND V.DS_ID = D.DS_ID)"
77 "\n WHERE V.PAGE_ID = :PAGE_ID"
78 "\n ORDER BY V.NO"
79 );
80 q.params()[0].setValue(__nPageID);
81 q.execute();
82 q.fetch();
83 for(size_t i = 0; !q.eof(); i++) {
84 SQLFields& fields = q.fields();
86 this,
87 fields.byName(L"CLASS_ID").asInteger(),
88 i
89 );
90 if (pView) {
91 pView->init(fields);
92 __views.add(pView);
93 }
94
95 q.fetch();
96 }
97 __DCL_TRACE1(L"init: %ls\n", (DateTime::getCurrentLocalTime() - dtStart).toString().data());
98 return true;
99}
100
103{
104 session.__ctx.setContentType(
105 __strType,
106 __strCharset.isEmpty() ? NULL : __strCharset.data()
107 );
108
109 if (!__strLanguage.isEmpty())
110 session.__ctx.addHeader(HttpHeader(L"Content-Language", __strLanguage));
111
112 Writer& out = session.__ctx.writer();
113
114 if (!(__views.size() > 0
115#ifdef __DCL_NO_RTTI
116 && (__views[0]->isKindOf(CLASSINFO(HeadView))
117 || __views[0]->isKindOf(CLASSINFO(HeadSignMenuForm)))
118#else
119 && (dynamic_cast<HeadView*>(__views[0]) != NULL
120 || dynamic_cast<HeadSignMenuForm*>(__views[0]) != NULL)
121#endif
122 )) {
123 String strCharset = L"utf-8";
124 String strEncoding = L"UTF-8";
125 String strLang = L"ko-KR";
126
127 if (!__strCharset.isEmpty()) {
128 strCharset = __strCharset;
129 strEncoding = strCharset.toUpperCase();
130 }
131 if (!__strLanguage.isEmpty())
132 strLang = __strLanguage;
133
134 out << L""
135 "<!DOCTYPE html>\r\n"
136 "<html lang=\"" << strLang << L"\">\r\n"
137 "<head>\r\n"
138 "<title>" << __strTitle << L"</title>\r\n"
139 "<meta charset=\"" << strCharset << L"\">\r\n"
140 "<meta name=\"Generator\" content=\"DCL FastPage 1.1\">\r\n"
141 "</head>\r\n<body>\r\n";
142 }
143
144 for(size_t i = 0; i < __views.size(); i++) {
145#ifdef __DCL_DEBUG
147#endif
148 __views[i]->onPrint(session);
149 __DCL_TRACE2(L"view:%d: %ls\n", i + 1, (DateTime::getCurrentLocalTime() - dtStart).toString().data());
150 }
151
152}
153
156{
157 HttpServletContextEx& ctx = session.__ctx;
158 int nViewIndex = -1;
159
160 ListedStringToStringArrayMap::ConstIterator it =
161 ctx.__queryMap.find(L"view");
162 if (it != ctx.__queryMap.end()) {
163 // HTTP 요청에서 특정 뷰가 지정되었다.
164 // v=1, ...
165 if (!((*it).value.isEmpty()))
166 nViewIndex = Integer::parse((*it).value[0], 10, nViewIndex) - 1;
167
168 if (!(0 <= nViewIndex && nViewIndex < (int)__views.size())) {
169 // 인덱스가 잘못되었다.
170 ctx.setStatusCode(HTTP_STATUS_NOT_FOUND);
171 return;
172 }
173 }
174
175 switch(ctx.methodNo()) {
176 case HTTP_METHOD_GET: {
177 if (nViewIndex < 0) // == -1
178 print(session);
179 else {
180 // Content-Type, Content-Length는 뷰에서 설정한다.
181 __views[nViewIndex]->onGet(session);
182 }
183 break;
184 }
185 case HTTP_METHOD_POST: {
186 if (nViewIndex < 0) { // == -1
187 // POST에서는 반드시 뷰 인덱스가 지졍되어야 한다.
188 ctx.setStatusCode(HTTP_STATUS_NOT_FOUND);
189 }
190 else {
191 __views[nViewIndex]->onPost(session);
192 }
193 break;
194 }
195 default: {
196 ctx.setStatusCode(HTTP_STATUS_NOT_IMPLEMENTED);
197 }
198 }
199}
200
202 Session& session,
203 const String& strURI,
204 unsigned int nAfterSecond
205) const __DCL_THROWS1(Exception*)
206{
207 HttpServletContextEx& ctx = session.__ctx;
208
209 ctx.setContentType(L"text/html");
210 Writer& out = ctx.writer();
211 out << L"<html>\r\n<head>\r\n"
212 "<meta http-equiv=\"Refresh\" content=\"" << nAfterSecond << L";";
213
214 out << L" url=" << strURI << L"\">\r\n"
215 "</head>\r\n<body>\r\n";
216}
217
219 Session& session,
220 const String& strTitle,
221 const String& strMessage
222)
223{
225 HtmlPage errorPage(
226 __pSite->nErrorPageID,
227 __pSite
228 );
229
230 errorPage.init(session.__query);
231 errorPage.__strTitle = strTitle;
232
233 HtmlView* pErrorView = NULL;
234 for(size_t i = 0; i < errorPage.__views.size(); i++) {
235#ifdef __DCL_NO_RTTI
236 if (errorPage.__views[i]->isKindOf(CLASSINFO(ErrorView))) {
237 pErrorView = errorPage.__views[i];
238 break;
239 }
240#else
241 pErrorView = dynamic_cast<ErrorView*>(errorPage.__views[i]);
242 if (pErrorView != NULL)
243 break;
244#endif
245 }
246
247 if (pErrorView) {
248 pErrorView->assign(L"ERROR_TITLE", strTitle);
249 pErrorView->assign(L"ERROR_MESSAGE", strMessage);
250 }
251
252 errorPage.print(session);
253}
254
255__DCL_END_NAMESPACE
#define __THIS_FILE__
Definition _trace.h:14
#define NULL
Definition Config.h:312
wchar_t char_t
Definition Config.h:247
#define __DCL_THROWS1(e)
Definition Config.h:152
@ HTTP_METHOD_POST
@ HTTP_METHOD_GET
@ HTTP_STATUS_NOT_IMPLEMENTED
@ HTTP_STATUS_NOT_FOUND
#define __DCL_TRACE1(fmt, arg1)
Definition Object.h:399
#define CLASSINFO(class_name)
Definition Object.h:226
#define __DCL_ASSERT(expr)
Definition Object.h:394
#define __T(str)
Definition Object.h:60
#define __DCL_TRACE2(fmt, arg1, arg2)
Definition Object.h:400
size_t size() const
Definition ArrayT.h:197
static DateTime getCurrentLocalTime()
Definition DateTime.cpp:954
int __nPermID
Definition HtmlPage.h:33
String __strPageID
Definition HtmlPage.h:31
void refresh(Session &session, const String &strURI, unsigned int nAfterSecond=0) const __DCL_THROWS1(Exception *)
Definition HtmlPage.cpp:201
void invoke(Session &session) __DCL_THROWS1(Exception *)
Definition HtmlPage.cpp:154
virtual ~HtmlPage()
Definition HtmlPage.cpp:34
void print(Session &session) __DCL_THROWS1(Exception *)
Definition HtmlPage.cpp:101
int __nPageID
Definition HtmlPage.h:32
String __strLanguage
Definition HtmlPage.h:36
String __strCharset
Definition HtmlPage.h:35
const SiteContext * site() const
Definition HtmlPage.cpp:20
HtmlPage(int nPageID, const SiteContext *pSite)
Definition HtmlPage.cpp:26
String __strTitle
Definition HtmlPage.h:37
String __strType
Definition HtmlPage.h:34
void printError(Session &session, const String &strTitle, const String &strMessage)
Definition HtmlPage.cpp:218
const SiteContext * __pSite
Definition HtmlPage.h:46
bool init(SQLQuery &q) __DCL_THROWS1(SQLException *)
Definition HtmlPage.cpp:40
HtmlViewPArray __views
Definition HtmlPage.h:47
DateTime __dtUpdate
Definition HtmlPage.h:38
static HtmlView * createObject(HtmlPage *pPage, int nClassID, int nIndex)
Definition HtmlView.cpp:126
virtual void init(SQLFields &fields) __DCL_THROWS1(Exception *)
Definition HtmlView.cpp:298
StringWriter & writer()
static int parse(const wchar_t *_number, unsigned _base=10) __DCL_THROWS1(NumericConvertException *)
Definition Numeric.inl:36
virtual String toString() const
Definition Object.cpp:187
_CONST SQLField & byName(const wchar_t *_name) _CONST __DCL_THROWS1(InvalidIndexException *)
Definition SQLQuery.cpp:77
SQLQuery & __query
Definition Session.h:42