1/****************************************************************************
2*
3*                       wxWindows HTML Applet Package
4*
5*               Copyright (C) 1991-2001 SciTech Software, Inc.
6*                            All rights reserved.
7*
8*  ========================================================================
9*
10*    The contents of this file are subject to the wxWindows License
11*    Version 3.0 (the "License"); you may not use this file except in
12*    compliance with the License. You may obtain a copy of the License at
13*    http://www.wxwindows.org/licence3.txt
14*
15*    Software distributed under the License is distributed on an
16*    "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
17*    implied. See the License for the specific language governing
18*    rights and limitations under the License.
19*
20*  ========================================================================
21*
22* Language:		ANSI C++
23* Environment:	Any
24*
25* Description:  Implementation of wxEchoVariable Class, Dynamically constructed
26* objects representing variables in SSI #echo directive
27*
28****************************************************************************/
29
30// For compilers that support precompilation
31
32#include "wx/applet/echovar.h"
33#include "wx/msgdlg.h"
34#include "wx/html/forcelnk.h"
35
36// Include private headers
37
38/*---------------------------- Global variables ---------------------------*/
39
40static wxEchoVariable   *wxEchoVariable::sm_first = NULL;
41static wxHashTable      *wxEchoVariable::sm_varTable = NULL;
42
43/*----------------------------- Implementation ----------------------------*/
44
45/****************************************************************************
46PARAMETERS:
47varName         - The String name of the class
48getValueFn      - Pointer to the function that returns the echo variable value
49
50REMARKS:
51Constructor for the wxEchoVariable class that self registers itself with
52the list of all echo variables when the static class instance is created
53at program init time (remember all the constructors get called before
54the main program function!).
55****************************************************************************/
56wxEchoVariable::wxEchoVariable(
57    const char *varName,
58    wxEchoVariableGetValueFn getValueFn)
59{
60    m_varName = varName;
61    m_getValueFn = getValueFn;
62    m_next = sm_first;
63    sm_first = this;
64}
65
66/****************************************************************************
67REMARKS:
68Initializes parent pointers and hash table for fast searching for echo
69variables.
70****************************************************************************/
71void wxEchoVariable::Initialize()
72{
73    wxEchoVariable::sm_varTable = new wxHashTable(wxKEY_STRING);
74
75    // Index all class infos by their class name
76    wxEchoVariable *info = sm_first;
77    while (info) {
78        if (info->m_varName)
79            sm_varTable->Put(info->m_varName, info);
80        info = info->m_next;
81        }
82}
83
84/****************************************************************************
85REMARKS:
86Clean up echo variable hash tables on application exit.
87****************************************************************************/
88void wxEchoVariable::CleanUp()
89{
90    delete wxEchoVariable::sm_varTable;
91    wxEchoVariable::sm_varTable = NULL;
92}
93
94/****************************************************************************
95PARAMETERS:
96varName         - The String name of the class
97parms           - Parameter string for the echo variable
98
99REMARKS:
100Constructor for the wxEchoVariable class that self registers itself with
101the list of all echo variables when the static class instance is created
102at program init time (remember all the constructors get called before
103the main program function!).
104****************************************************************************/
105wxString wxEchoVariable::GetValue(
106    const wxChar *varName,
107    const wxChar *parms)
108{
109    wxEchoVariable *info = wxEchoVariable::FindVariable(varName);
110    if (info)
111        return info->m_getValueFn(parms);
112#ifdef CHECKED
113    wxMessageBox(wxString("wxHTML #echo error: Class is not a valid echo variable (") + varName + wxString(")."),"Error",wxICON_ERROR);
114#endif
115    return wxString("");
116}
117
118/****************************************************************************
119PARAMETERS:
120varName       - The String name of the class
121
122RETURNS:
123True if the echo variable exists, false if not.
124****************************************************************************/
125bool wxEchoVariable::Exists(
126    const wxChar *varName)
127{
128    return wxEchoVariable::FindVariable(varName) != NULL;
129}
130
131/*------------------------ Macro Documentation ---------------------------*/
132
133// Here we declare some fake functions to get doc-jet to properly document the macros
134
135#undef ECHO_PARM
136/****************************************************************************
137RETURNS:
138The value of the parameter string from the HTML parm= field
139
140REMARKS:
141This is a macro to retrieve the parameter string passed in the parm= field.
142Use this macro to get the correct variable within a BEGIN_ECHO_VARIABLE and
143END_ECHO_VARIABLE block.
144
145SEE ALSO:
146wxEchoVariable, wxEchoPrep, BEGIN_ECHO_VARIABLE, END_ECHO_VARIABLE
147****************************************************************************/
148wxString ECHO_PARM();
149
150
151#undef BEGIN_ECHO_VARIABLE
152/****************************************************************************
153PARAMETERS:
154name    - The name of the variable to create
155
156REMARKS:
157This macro is used to create variables for use by the #echo directive
158the HTML preprocessor.
159To create a new variable include the code necessary to get the value of the
160variable between a block of BEGIN_ECHO_VARIABLE and END_ECHO_VARIABLE macros.
161Use the ECHO_PARM macro to grab the optional parameter string passed from the
162'parm=' field in the html file.
163
164EXAMPLE:
165BEGIN_ECHO_VARIABLE(UserName)
166	// Get username from nucleus
167	wxString tmp = GA_GetUserName();
168END_ECHO_VARIABLE(UserName, tmp)
169
170SEE ALSO:
171wxEchoVariable, wxEchoPrep, END_ECHO_VARIABLE, ECHO_PARM, STRING_ECHO_VARIABLE
172****************************************************************************/
173void BEGIN_ECHO_VARIABLE(
174    const char *name);
175
176#undef END_ECHO_VARIABLE
177/****************************************************************************
178PARAMETERS:
179name        - The name of the variable to end
180returnval   - The value which should be sent back as the value of the variable
181
182REMARKS:
183This macro is used to create variables for use by the #echo directive
184the HTML preprocessor.
185To create a new variable include the code necessary to get the value of the
186variable between a block of BEGIN_ECHO_VARIABLE and END_ECHO_VARIABLE macros.
187
188EXAMPLE:
189BEGIN_ECHO_VARIABLE(UserName)
190	// Get username from nucleus
191	wxString tmp = GA_GetUserName();
192END_ECHO_VARIABLE(UserName, tmp)
193
194SEE ALSO:
195wxEchoVariable, wxEchoPrep, BEGIN_ECHO_VARIABLE, ECHO_PARM, STRING_ECHO_VARIABLE
196****************************************************************************/
197void END_ECHO_VARIABLE(
198    const char *name,
199    wxString returnval);
200
201#undef STRING_ECHO_VARIABLE
202/****************************************************************************
203PARAMETERS:
204name        - The name of the variable
205returnval   - String to return as the value of the variable
206
207REMARKS:
208This macro is used to create constant string variables for use by the #echo
209directive in the HTML preprocessor.
210This MACRO creates a variable that simply returns the given string and is
211not modifiable.
212
213SEE ALSO:
214wxEchoVariable, wxEchoPrep, BEGIN_ECHO_VARIABLE, END_ECHO_VARIABLE
215****************************************************************************/
216void STRING_ECHO_VARIABLE(
217    const char *name,
218    wxString string);
219
220// hack to make this file link
221FORCE_LINK_ME(echovar)
222
223