DCL 3.7.4
Loading...
Searching...
No Matches
HtmlView.cpp
Go to the documentation of this file.
1#include <dcl/Config.h>
2
3#ifdef __WINNT__
4#include <windows.h>
5#include <process.h>
6#define getpid _getpid
7#else
8#include <unistd.h>
9#endif
10
11#include <time.h>
12#include <stdlib.h> // bsearch
13
14#include <dcl/Numeric.h>
15#include <dcl/Files.h>
16
17#include <dcl/URI.h>
18
19#include "ServletMain.h"
20#include "HtmlPage.h"
21#include "HtmlView.h"
22#include "Menu.h"
23#include "DataSource.h"
24#include "Page.h"
25#include "User.h"
26#include "MessageView.h"
27#include "Version.h"
28
29#if __DCL_HAVE_THIS_FILE__
30#undef __THIS_FILE__
31static const char_t __THIS_FILE__[] = __T("fastpage/HtmlView.cpp");
32#endif
33
34__DCL_BEGIN_NAMESPACE
35
36#define __CLASS(class_name) \
37 __DCL_NAMESPACE_STRING # class_name, class_name::createObject
38
39const HtmlView::CLASS_INFO HtmlView::__aClasses[] =
40{
41 {DS_NONE, HTML_ONLY, __CLASS(HtmlView), L"스킨을 사용하지 않는 단순 HTML" },
42 {DS_NONE, ERROR_VIEW, __CLASS(ErrorView), L"실행중의 에러를 표시합니다" },
43 {DS_NONE, PERM_DENIED_VIEW, __CLASS(PermDeniedView), L"페이지 접근에대한 권한없음을 표시합니다" },
44 {DS_NONE, DIALOG_WRAPPER, __CLASS(DialogWrapper), L"POST가 가능한 대화상자를 만듭니다" },
45 {DS_NONE, HEAD_VIEW, __CLASS(HeadView), L"사용자정의 HTML 헤더를 표시합니다" },
46 {DS_NONE, SIGN_FORM, __CLASS(SignForm), L"로그인/로그아웃폼을 표시하고 처리합니다" },
47 {DS_NONE, MENU_VIEW, __CLASS(MenuView), L"동적인 메뉴를 표시합니다"},
48 {DS_NONE, HEAD_SIGN_MENU_FORM, __CLASS(HeadSignMenuForm), L"사용자 HTML 헤더, 로그인/로그아웃 처리, 메뉴를 표시합니다" },
49 {DS_NONE, CLASS_LIST_VIEW, __CLASS(ClassListView), L"스킨을 처리하는 클래스의 목록을 표시합니다" },
50 {DS_NONE, DATA_SOURCE_LIST_VIEW, __CLASS(DataSourceListView), L"데이터원본의 목록을 표시합니다" },
51 {DS_NONE, DATA_SOURCE_WRITE_FORM, __CLASS(DataSourceWriteForm), L"데이터원본를 생성/수정합니다"},
52 {DS_NONE, DATA_SOURCE_DETAIL_VIEW, __CLASS(DataSourceDetailView), L"데이터원본의 설정내용을 자세히 표시합니다" },
53 {DS_NONE, PAGE_CATEGORY_FORM, __CLASS(PageCategoryForm), L"페이지 분류를 추가/수정합니다"},
54 {DS_NONE, PAGE_LIST_VIEW, __CLASS(PageListView), L"페이지 구성 목록을 표시합니다"},
55 {DS_NONE, PAGE_WRITE_FORM, __CLASS(PageWriteForm), L"페이지 구성을 생성/수정합니다"},
56 {DS_NONE, PAGE_DETAIL_VIEW, __CLASS(PageDetailView), L"페이지 구성을 자세히 표시합니다" },
57 {DS_NONE, ZIPCODE_LIST_VIEW, __CLASS(ZipCodeListView), L"우편번호를 검색하고 선택합니다" },
58 {DS_NONE, SIGN_CHECK_FORM, __CLASS(SignCheckForm), L"사용자 계정의 사용 가능여부를 검색하고 선택합니다" },
59 {DS_NONE, USER_LIST_VIEW, __CLASS(UserListView), L"사용자의 목록을 표시합니다" },
60 {DS_NONE, USER_WRITE_FORM, __CLASS(UserWriteForm), L"사용자 정보를 등록/수정합니다" },
61 {DS_NONE, USER_DETAIL_VIEW, __CLASS(UserDetailView), L"사용자 등록정보를 자세히 표시합니다" },
62 {DS_NONE, USER_SEARCH_FORM, __CLASS(UserSearchForm), L"사용자를 검색하고 목록을 표시합니다" },
63 {DS_NONE, USER_ACTIVITY_VIEW, __CLASS(UserActivityView), L"사용자/그룹의 활동상태를 표시합니다" },
64/* {DS_NONE, GROUP_LIST_VIEW, __CLASS(GroupListView), L"그룹의 목록을 표시합니다" },
65 {DS_NONE, GROUP_WRITE_FORM, __CLASS(GroupWriteForm), L"그룹을 등록/수정합니다" },
66 {DS_NONE, GROUP_DETAIL_VIEW, __CLASS(GroupDetailView), L"그룹의 등록정보를 자세히 표시합니다" },
67 {DS_NONE, GROUP_SEARCH_FORM, __CLASS(GroupSearchForm), L"그룹을 검색하고 목록을 표시합니다" },
68 {DS_NONE, GROUP_ACTIVITY_VIEW, __CLASS(GroupActivityView), L"그룹의 활동상태를 합니다" },
69*/ {DS_BOARD, MESSAGE_LIST_VIEW, __CLASS(MessageListView), L"메시지의 목록을 표시합니다" },
70 {DS_BOARD, MESSAGE_WRITE_FORM, __CLASS(MessageWriteForm), L"메시지를 작성/수정 합니다" },
71 {DS_BOARD, MESSAGE_DETAIL_VIEW,__CLASS(MessageDetailView), L"메시지의 본문을 표시합니다" }
72};
73
74const int HtmlView::__nClassCount
75 = sizeof(HtmlView::__aClasses) / sizeof(HtmlView::CLASS_INFO);
76
84
85static int __compare(const void* key, const void* element)
86{
87 int nClassID = (int)(size_t)key;
88 const HtmlView::CLASS_INFO* pInfo = (const HtmlView::CLASS_INFO*)element;
89 return nClassID - pInfo->nClassID;
90}
91
92const HtmlView::CLASS_INFO* HtmlView::getClassInfo(int nClassID)
93{
94 /*
95 for(int i = 0; i < __nClassCount; i++)
96 {
97 if (__aClasses[i].nClassID == nClassID)
98 return &__aClasses[i];
99 }
100 return NULL;
101 */
102
103 return (const HtmlView::CLASS_INFO*)bsearch(
104 (void*)(size_t)nClassID,
105 __aClasses,
106 __nClassCount,
107 sizeof(HtmlView::CLASS_INFO),
108 __compare
109 );
110}
111
112const wchar_t* HtmlView::CLASS_INFO::className() const
113{
114 return pszClassName;
115}
116
117const wchar_t* HtmlView::className(int nClassID)
118{
119 const CLASS_INFO* pInfo = getClassInfo(nClassID);
120 if (pInfo)
121 return pInfo->pszClassName;
122
123 return L"Invalid ClassID";
124}
125
126HtmlView* HtmlView::createObject(HtmlPage* pPage, int nClassID, int nIndex)
128{
129 const CLASS_INFO* pInfo = getClassInfo(nClassID);
130 if (!pInfo) {
131 // invalid nClassID
132 __DCL_TRACE1(L"nClassID: %d\n", nClassID);
133 pInfo = &__aClasses[0];
134 }
135
136 HtmlView* pNew = pInfo->pfnCreateObject(pPage);
137 pNew->__nClassID = nClassID;
138 pNew->__nIndex = nIndex;
139
140 return pNew;
141}
142
143size_t HtmlView::split(const String& str, StringStringArray& v)
144{
145 StringArray list;
146 if (str.split(L';', list) > 0) {
147 StringArray::Iterator it = list.begin();
148 for(; it != list.end(); it++) {
149 StringArray pair;
150 if ((*it).split(L'=', pair) == 2) {
151 StringArray::Iterator itPair = pair.begin();
152 String strName = *itPair++;
153 String strValue = *itPair;
154
155 strName.trim();
156 strValue.trim();
157 v.add(StringString(strName, strValue));
158 }
159 }
160 }
161 return v.size();
162}
163
165{
166 HttpServletContextEx& ctx = session.__ctx;
167 Writer& out = ctx.writer();
168
169 out << L"<pre>\n";
170
171 out << L"PID : " << getpid() << L"\n";
172
173/*
174 out << L"SERVER CONFIG\n";
175 out << L"fileName : " << session.__pServlet->__strFileName << L"\n";
176 out << L"configDir : " << session.__pServlet->__strConfigDir << L"\n";
177 out << L"tempDir : " << session.__pServlet->__strTempDir << L"\n";
178 out << L"\n\n";
179*/
180 out << L"CONTEXT INFO\n";
181 if (ctx.remoteAddr())
182 out << L"remoteAddr : " << ctx.remoteAddr() << L"\n";
183 out << L"remotePort : " << (int)ctx.remotePort() << L"\n";
184 if (ctx.method())
185 out << L"method : " << ctx.method() << L"\n";
186 out << L"remoteMethodNo : " << (int)ctx.methodNo() << L"\n";
187 if (ctx.path())
188 out << L"path : " << ctx.path() << L"\n";
189 if (ctx.queryString())
190 out << L"queryString : " << ctx.queryString() << L"\n";
191 if (ctx.contentType())
192 out << L"contentType : " << ctx.contentType() << L"\n";
193 out << L"contentLength: " << ctx.contentLength() << L"\n";
194 out << L"\n\n";
195
196 out << L"CGI VARIABLES\n"
197 << ctx.getCgiVariable((const wchar_t*)NULL)
198 << L"\n\n";
199
200 out << L"REQUEST HTTP HEADERS\n"
201 << ctx.getHttpHeader((const wchar_t*)NULL)
202 << L"\n\n";
203
204 out << L"COOKIES\n";
205 if (!ctx.__cookieMap.isEmpty()) {
206 ListedStringToStringMap::Iterator it = ctx.__cookieMap.begin();
207 for(; it != ctx.__cookieMap.end(); it++) {
208 out << (*it).key << L":" << (*it).value << L"\n";
209 }
210 }
211 out << L"\n\n";
212
213 out << L"QUERY_STRING\n";
214 if (!ctx.__queryMap.isEmpty()) {
215 ListedStringToStringArrayMap::Iterator it = ctx.__queryMap.begin();
216 for( ; it != ctx.__queryMap.end(); it++) {
217 out << (*it).key << L":"
218 << String::join((*it).value, L',', true)
219 << L"\n";
220 }
221 }
222 out << L"\n\n";
223
224 out << L"FORM_DATA\n";
225 if (!ctx.__formMap.isEmpty()) {
226 ListedStringToStringArrayMap::Iterator it = ctx.__formMap.begin();
227 for( ; it != ctx.__formMap.end(); it++) {
228 out << (*it).key << L":"
229 << String::join((*it).value, L',', true)
230 << L"\n";
231 }
232 }
233 out << L"\n\n";
234
235 out << L"FILES\n";
236 if (!ctx.__formFileMap.isEmpty()) {
237 for(size_t i = 0; i < ctx.__formFileMap.size(); i++) {
238 StoredHttpFormData::FileInfoArray& v = ctx.__formFileMap[i];
239 out << v.name() << L":";
240 for(size_t j = 0; j < v.size(); j++) {
241 StoredHttpFormData::FileInfo& info = v[j];
242 out << L"\n\tfilename: " << info.filename
243 << L"\n\tfilesize: " << info.fileSize
244 << L"\n\tContent-Type: " << info.contentType
245 << L"\n\tContent-Transfer-Encoding: " << info.transferEncoding
246 << L"\n\ttemp filename: " << info.tempFilename
247 << L"\n";
248 }
249 }
250 }
251 out << L"\n\n";
252
253 out << L"</pre>\n";
254}
255
256String HtmlView::getDefault(ListedStringToStringArrayMap& map,
257 const String& strKey)
258{
259 String strResult;
260 ListedStringToStringArrayMap::ConstIterator it = map.find(strKey);
261 if (it != map.end() && (*it).value.size() > 0)
262 strResult = (*it).value[0];
263 return strResult;
264}
265
266size_t HtmlView::getShortString(SQLField& field, size_t nMbLength,
267 String& strLong, String& strShort)
268{
269 __DCL_ASSERT(nMbLength > 0);
270 __DCL_ASSERT(field.dataType() == SQL::typeText
271 || field.dataType() == SQL::typeLongText
272 || field.dataType() == SQL::typeClob);
273
274 if (field.isNull() || field.dataSize() == 0)
275 return 0;
276
277 strLong = field.asString();
278 size_t nResult = strLong.length();
279 if (nResult > nMbLength)
280 strShort = strLong.left(nMbLength) + L"...";
281 else
282 strShort = strLong;
283
284 return nResult;
285}
286
287String HtmlView::SELF() const
288{
289 return L"page=" + String::valueOf(__pPage->__nPageID)
290 + L"&view=" + VNO();
291}
292
293String HtmlView::VNO() const
294{
295 return String::valueOf(__nIndex + 1);
296}
297
300{
301 const String& strSkinDir = __pPage->site()->strSkinDir;
302
303#ifdef __DCL_DEBUG
305#endif
306 SQLField& fSKIN_FILE = fields.byName(L"SKIN_FILE");
307 if (!fSKIN_FILE.isNull()) {
308 String filename = strSkinDir + fSKIN_FILE.asString();
309 UTF8Decoder dec;
310 TextTemplate::parse(Files::readText(filename, dec));
311 }
312 __DCL_TRACE2(L"skin:%d: %ls\n", __nIndex, (DateTime::getCurrentLocalTime() - dtStart).toString().data());
313
314#ifdef __DCL_DEBUG
315 __strParams.clear();
316#endif
317 SQLField& fPARAMS = fields.byName(L"PARAMETERS");
318 if (!fPARAMS.isNull()) {
319 String strParams = fPARAMS.asString();
320#ifdef __DCL_DEBUG
321 __strParams = strParams;
322#endif
323 StringArray rList;
324 if (strParams.split(L';', rList) > 0) {
325// __mapParams.initBuckets(rList.size());
326 StringArray::Iterator itList = rList.begin();
327 for(; itList != rList.end(); itList++) {
328 String strName;
329 String strValue;
330
331 StringArray rPair;
332 (*itList).split(L'=', rPair);
333 StringArray::Iterator itPair = rPair.begin();
334 if (itPair != rPair.end())
335 strName = *itPair++;
336 if (itPair != rPair.end())
337 strValue = *itPair;
338
339 strName.trim();
340 strValue.trim();
341
342 if (!strName.isEmpty())
343 __mapParams[strName.toUpperCase()] = strValue;
344 }
345 }
346 }
347}
348
351{
352 assign(L"_TITLE", __pPage->__strTitle);
353 assign(L"_PAGE", __pPage->__strPageID);
354 assign(L"VNO", VNO());
355
356 assign(L"VERSION",
357 String::format(L"DCL %d.%d / HSE %d.%d / FastPage %d.%d",
361 )
362 );
363#ifdef __DCL_DEBUG
364 assign(L"_CLASS", Object::className());
365 assign(L"_PARAMS", __strParams);
366#endif
367
368 TextTemplate::printTo(
369 session.__ctx.writer()
370 );
371}
372
375{
376 // 파생된 클래스에서 오버라이드 하지 않았다.
377 session.__ctx.setStatusCode(HTTP_STATUS_NOT_FOUND);
378}
379
380// true ==> redirect
383{
384 // 파생된 클래스에서 오버라이드 하지 않았다.
385 session.__ctx.setStatusCode(HTTP_STATUS_NOT_FOUND);
386}
387
389
390FormView::FormView(HtmlPage* pPage)
391 : HtmlView(pPage)
392{
393}
394
395void FormView::onPrint(Session& session)
397{
398 HttpServletContextEx& ctx = session.__ctx;
399
400 StringBuilder strNext;
401 ListedStringToStringArrayMap::ConstIterator it = ctx.__queryMap.find(L"next");
402 if (it != ctx.__queryMap.end() && (*it).value.size() > 0)
403 strNext = L"&next=" + URLEncoder::encode((*it).value[0]);
404
405 __DCL_TRACE1(L"next [%ls]\n", strNext.data());
406
407 it = ctx.__queryMap.find(L"list");
408 if (it != ctx.__queryMap.end())
409 strNext += L"&list=" + URLEncoder::encode((*it).value[0]);
410
411 String strReferer;
412 ListedStringToStringArrayMap::ConstIterator itForm = ctx.__formMap.find(L"REFERER");
413 if (itForm != ctx.__formMap.end() && (*itForm).value.size() > 0)
414 strReferer = (*itForm).value[0];
415 else
416 strReferer = ctx.getHttpHeader(L"Referer");
417
418 // <input type="hidden" name="REFERER" value="$REFERER">
419 assign(L"REFERER", strReferer);
420
421 // <form ... action="?$SELF$ACTION">
422 assign(L"SELF", SELF());
423 if (!strNext.isEmpty())
424 append(L"ACTION", strNext);
425
426 HtmlView::onPrint(session);
427}
428
429void FormView::onPost(Session& session) __DCL_THROWS1(Exception*)
430{
431 HttpServletContextEx& ctx = session.__ctx;
432
433 String strNext;
434 ListedStringToStringArrayMap::ConstIterator it = ctx.__queryMap.find(L"next");
435 if (it != ctx.__queryMap.end() && (*it).value.size() > 0)
436 strNext = (*it).value[0];
437 else {
438 it = ctx.__formMap.find(L"REFERER");
439 if (it != ctx.__formMap.end() && (*it).value.size() > 0)
440 strNext = (*it).value[0];
441 else
442 strNext = L"?";
443 }
444
445 __pPage->refresh(session, strNext);
446}
447
449
450ErrorView::ErrorView(HtmlPage* pPage)
451 : HtmlView(pPage)
452{
453}
454
456
457PermDeniedView::PermDeniedView(HtmlPage* pPage)
458 : HtmlView(pPage)
459{
460}
461
462void PermDeniedView::onPrint(Session& session)
464{
465 HttpServletContextEx& ctx = session.__ctx;
466
467 StringBuilder strNext = L"?";
468 if (ctx.queryString())
469 strNext += ctx.queryString();
470
471 assign(L"NEXT", URLEncoder::encode(strNext));
472
473 HtmlView::onPrint(session);
474}
475
477
478HeadView::HeadView(HtmlPage* pPage)
479 : HtmlView(pPage)
480{
481}
482
483void HeadView::onPrint(Session& session)
485{
486 __onPrint(this);
487 HtmlView::onPrint(session);
488}
489
490void HeadView::__onPrint(HtmlView* pView)
492{
493 __DCL_ASSERT(pView != NULL);
494
495 const HtmlPage* pPage = pView->page();
496
497 String strCharset = L"utf-8";
498 String strEncoding = L"UTF-8";
499 String strLang = L"ko";
500
501 if (!(pPage->__strCharset.isEmpty())) {
502 strCharset = pPage->__strCharset;
503 strEncoding = strCharset.toUpperCase();
504 }
505 if (!(pPage->__strLanguage.isEmpty()))
506 strLang = pPage->__strLanguage;
507
508 pView->assign(L"ENCODING", strEncoding);
509 pView->assign(L"TYPE", pPage->__strType);
510 pView->assign(L"CHARSET", strCharset);
511 pView->assign(L"LANG", strLang);
512 pView->assign(L"TITLE", pPage->__strTitle);;
513}
514
516
517SignForm::SignForm(HtmlPage* pPage)
518 : FormView(pPage)
519{
520}
521
522void SignForm::onPrint(Session& session)
524{
525 SignForm::__onPrint(this, session);
526 FormView::onPrint(session);
527}
528
529void SignForm::onGet(Session& session)
531{
532 SignForm::__onGet(this, session);
533}
534
535static const wchar_t* P_LOGIN_ID = L"LOGIN_ID";
536static const wchar_t* P_PASSWORD = L"PASSWORD";
537void SignForm::onPost(Session& session)
539{
540 SignForm::__onPost(this, session);
541 FormView::onPost(session); // redirect
542}
543
544void SignForm::__onPrint(HtmlView* pView, Session& session)
546{
547 __DCL_ASSERT(pView != NULL);
548 TextTemplate& SIGN_IN = (*pView)[L"SIGN_IN"];
549 TextTemplate& SIGN_OUT = (*pView)[L"SIGN_OUT"];
550 if (session.isSysGuest())
551 pView->assign(L"SIGN_IN", SIGN_IN);
552 else {
553 StringBuilder strUserName = session.__strUserName;
554 if (session.isSysAdmin())
555 strUserName += L"(" + session.__strRoleName + L")";
556 SIGN_OUT.assign(L"USER_NAME", strUserName);
557// SIGN_OUT.assign(L"ROLE_NAME", session.__strRoleName);
558 SIGN_OUT.assign(L"SELF", pView->SELF());
559 pView->assign(L"SIGN_OUT", SIGN_OUT);
560 }
561}
562
563void SignForm::__onGet(HtmlView* pView, Session& session)
565{
566 const HtmlPage* pPage = pView->page();
567 session.logout();
568 pPage->refresh(session, L"?page=", 0);
569}
570
571void SignForm::__onPost(HtmlView* pView, Session& session)
573{
574 const HtmlPage* pPage = pView->page();
575 HttpServletContextEx& ctx = session.__ctx;
576
577 ListedStringToStringArrayMap::ConstIterator it =
578 ctx.__formMap.find(P_LOGIN_ID);
579 if (it != ctx.__formMap.end()) {
580 // sign in
581 String strLoginID;
582 String strPassword;
583
584 if ((*it).value.size() > 0)
585 strLoginID = (*it).value[0].toLowerCase();
586
587 strPassword = HtmlView::getDefault(ctx.__formMap, P_PASSWORD);
588
589 if (!strLoginID.isEmpty()) {
590 if (session.login(strLoginID, strPassword)) {
592 L"LOGIN_ID: %ls, PASSWORD: %ls\n",
593 strLoginID.data(),
594 strPassword.data()
595 );
596 }
597 }
598 }
599 else {
600 session.logout();
601 }
602}
603
605
607 : HtmlView(pPage)
608{
609 __strHeight = __strWidth = L"100%";
610}
611
614{
615 HtmlView::init(fields);
616
617 String rValue;
618 if (__mapParams.lookup(L"WIDTH", rValue) && !rValue.isEmpty())
619 __strWidth = rValue;
620
621 if (__mapParams.lookup(L"HEIGHT", rValue) && !rValue.isEmpty())
622 __strHeight = rValue;
623
624 if (__mapParams.lookup(L"INNER", rValue))
625 __strInnerPageID = rValue;
626}
627
630{
631 assign(L"PAGE_ID", __strInnerPageID);
632 assign(L"WIDTH", __strWidth);
633 assign(L"HEIGHT", __strHeight);
634
635 HtmlView::onPrint(session);
636 /*
637 OutputStream& out = session.__ctx.writer();
638 out << L"<iframe src=\"?p="
639 << __nInnerPageID
640 << L"\" width=\""
641 << __nWidth
642 << L"\" height=\""
643 << __nHeight
644 << L"\" frameborder=\"0\" scrolling=\"no\"></iframe>\n";
645 */
646}
647
648__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
#define __CLASS(class_name)
Definition HtmlView.cpp:36
#define IMPLEMENT_CLASSINFO_EX(class_name, base_class_name)
Definition HtmlView.h:37
@ DS_BOARD
Definition HtmlView.h:28
@ DS_NONE
Definition HtmlView.h:27
@ HTTP_STATUS_NOT_FOUND
#define __DCL_TRACE1(fmt, arg1)
Definition Object.h:399
#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
static DateTime getCurrentLocalTime()
Definition DateTime.cpp:954
DialogWrapper(HtmlPage *pPage)
virtual void init(SQLFields &fields) __DCL_THROWS1(Exception *)
Definition HtmlView.cpp:612
virtual void onPrint(Session &session) __DCL_THROWS1(Exception *)
Definition HtmlView.cpp:628
static String readText(const String &_filename) __DCL_THROWS1(IOException *)
Definition Files.cpp:435
void refresh(Session &session, const String &strURI, unsigned int nAfterSecond=0) const __DCL_THROWS1(Exception *)
Definition HtmlPage.cpp:201
String __strLanguage
Definition HtmlPage.h:36
String __strCharset
Definition HtmlPage.h:35
String __strTitle
Definition HtmlPage.h:37
String __strType
Definition HtmlPage.h:34
String VNO() const
Definition HtmlView.cpp:293
virtual void onPost(Session &session) __DCL_THROWS1(Exception *)
Definition HtmlView.cpp:381
HtmlView(HtmlPage *pPage)
virtual void onGet(Session &session) __DCL_THROWS1(Exception *)
Definition HtmlView.cpp:373
int __nClassID
Definition HtmlView.h:110
int __nIndex
Definition HtmlView.h:109
StringToStringMap __mapParams
Definition HtmlView.h:112
static void dump(Session &session)
Definition HtmlView.cpp:164
String SELF() const
Definition HtmlView.cpp:287
virtual void onPrint(Session &session) __DCL_THROWS1(Exception *)
Definition HtmlView.cpp:349
static String getDefault(ListedStringToStringArrayMap &map, const String &strKey)
Definition HtmlView.cpp:256
static HtmlView * createObject(HtmlPage *pPage, int nClassID, int nIndex)
Definition HtmlView.cpp:126
static size_t split(const String &str, StringStringArray &v)
Definition HtmlView.cpp:143
virtual void init(SQLFields &fields) __DCL_THROWS1(Exception *)
Definition HtmlView.cpp:298
static size_t getShortString(SQLField &field, size_t _len, String &strLong, String &strShort)
Definition HtmlView.cpp:266
HtmlPage * __pPage
Definition HtmlView.h:108
StringWriter & writer()
virtual String toString() const
Definition Object.cpp:187
String className() const
Definition Object.cpp:163
Definition SQL.h:48
@ typeClob
Definition SQLCore.h:77
@ typeText
Definition SQLCore.h:73
@ typeLongText
Definition SQLCore.h:75
HttpServletContextEx & __ctx
Definition Session.h:41
static ByteString encode(const ByteString &_str)
Definition URI.cpp:82
#define DCL_FASTPAGE_VERSION
#define DCL_HTTP_VERSION
#define __VERSION_MINOR(_x)
#define __VERSION_MAJOR(_x)
#define DCL_VERSION