diff options
Diffstat (limited to 'docs/doxygen/nel/load__form_8h-source.html')
-rw-r--r-- | docs/doxygen/nel/load__form_8h-source.html | 500 |
1 files changed, 500 insertions, 0 deletions
diff --git a/docs/doxygen/nel/load__form_8h-source.html b/docs/doxygen/nel/load__form_8h-source.html new file mode 100644 index 00000000..ad88e46b --- /dev/null +++ b/docs/doxygen/nel/load__form_8h-source.html @@ -0,0 +1,500 @@ +<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> +<HTML> +<HEAD> + <TITLE>nevrax.org : docs</TITLE> + <LINK REL=stylesheet TYPE="text/css" HREF="http://www.nevrax.org/inc/css/nevrax.css"> + <link href="doxygen.css" rel="stylesheet" type="text/css"> +</HEAD> +<BODY MARGINHEIGHT="0" MARGINWIDTH="0"> + +<!-- uplinks --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0> + <TR> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD WIDTH=140 BGCOLOR=#dddddd><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.org><b>Home</B></FONT></A> </TD> + <TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.com><b>nevrax.com</B></FONT></A> </TD> + </TR> +</TABLE> + +<!-- banner Nevrax --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%> + <TR><TD BGCOLOR="#000000" BACKGROUND="http://www.nevrax.org/inc/img/black_banner.jpg"><A HREF="http://www.nevrax.org"><IMG SRC="http://www.nevrax.org/inc/img/nevrax.gif" WIDTH="170" HEIGHT="45" BORDER=0 ALT="Nevrax" ></A></TD></TR> +</TABLE> + +<!-- main table --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 height=100%> + <TR> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="10" BORDER=0 ALT=""></TD> + <TD WIDTH=140 BGCOLOR=#dddddd VALIGN=TOP ALIGN=middle><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> + + <!------ Begin Box ------> + <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=black><TR><TD><TABLE border=0 cellspacing=2 cellpadding=0 width=120><tr><TD ALIGN=middle bgcolor=black> + <FONT COLOR=white FACE="sans-serif"><B>Nevrax.org</B></FONT></TD></TR><tr><td colspan=2 bgcolor=#FFFFFF> + <TABLE cellspacing=0 cellpadding=1 border=0> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/news/" TITLE="Rubrique news"><img width=13 height=15 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-news.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/news/" TITLE="News">News</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Rubrique mail"><img width=15 height=11 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-mail.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Mailing list archive">Mailing-list</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Rubrique docs"><img width=14 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-docs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Documentation">Documentation</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="Rubrique cvs"><img width=13 height=17 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-cvs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="CVS Web">CVS</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Rubrique bugs"><img width=20 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-bugs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Bugtracking">Bugs</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="Rubrique license"><img width=18 height=12 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-gpl.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="License">License</a></td></tr> + </TABLE> + </TD></TR></TABLE></TD></TR></TABLE> + <!------ End Box ------> + + </TD> + <TD WIDTH=15><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD ALIGN=left valign=top><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> + +<!-- title --> +<TABLE background="http://www.nevrax.org/inc/img/redline.gif" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td> +<A HREF="http://www.nevrax.org/docs/"><img src="http://www.nevrax.org/inc/img/t_docs.gif" ALT="Docs" HEIGHT=20 BORDER=0></A> +</td><td><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="1" HEIGHT="1" BORDER=0 ALT=""> +</td></tr></table> + + +<!-- block --> +<TABLE bgcolor="#dddddd" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td width=1% valign=middle><img width=6 height=14 hspace=2 vspace=2 src="http://www.nevrax.org/inc/img/reddots.gif"></TD> + <TD><B>Documentation</B></TD> + <TD ALIGN=RIGHT> </td> +</tr></table> +<!-- Generated by Doxygen 1.2.14 --> +<center> +<a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="namespacemembers.html">Namespace Members</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> <a class="qindex" href="pages.html">Related Pages</a> <a class="qindexRef" doxygen="_cgi:http://www.nevrax.org/cgi-bin/nel-search.cgi" href="http://www.nevrax.org/cgi-bin/nel-search.cgi">Search</a> </center> +<hr><h1>load_form.h</h1><a href="load__form_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 +00007 <font class="comment">/* Copyright, 2001 Nevrax Ltd.</font> +00008 <font class="comment"> *</font> +00009 <font class="comment"> * This file is part of NEVRAX NEL.</font> +00010 <font class="comment"> * NEVRAX NEL is free software; you can redistribute it and/or modify</font> +00011 <font class="comment"> * it under the terms of the GNU General Public License as published by</font> +00012 <font class="comment"> * the Free Software Foundation; either version 2, or (at your option)</font> +00013 <font class="comment"> * any later version.</font> +00014 <font class="comment"></font> +00015 <font class="comment"> * NEVRAX NEL is distributed in the hope that it will be useful, but</font> +00016 <font class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</font> +00017 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</font> +00018 <font class="comment"> * General Public License for more details.</font> +00019 <font class="comment"></font> +00020 <font class="comment"> * You should have received a copy of the GNU General Public License</font> +00021 <font class="comment"> * along with NEVRAX NEL; see the file COPYING. If not, write to the</font> +00022 <font class="comment"> * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,</font> +00023 <font class="comment"> * MA 02111-1307, USA.</font> +00024 <font class="comment"> */</font> +00025 +00026 <font class="preprocessor">#ifndef NL_LOAD_FORM_H</font> +00027 <font class="preprocessor"></font><font class="preprocessor">#define NL_LOAD_FORM_H</font> +00028 <font class="preprocessor"></font> +00029 <font class="preprocessor">#include "<a class="code" href="types__nl_8h.html">nel/misc/types_nl.h</a>"</font> +00030 +00031 <font class="preprocessor">#include <map></font> +00032 <font class="preprocessor">#include <string></font> +00033 <font class="preprocessor">#include <vector></font> +00034 +00035 <font class="preprocessor">#include "<a class="code" href="path_8h.html">nel/misc/path.h</a>"</font> +00036 <font class="preprocessor">#include "<a class="code" href="file_8h.html">nel/misc/file.h</a>"</font> +00037 +00038 <font class="preprocessor">#include "<a class="code" href="u__form__loader_8h.html">nel/georges/u_form_loader.h</a>"</font> +00039 <font class="preprocessor">#include "<a class="code" href="u__form_8h.html">nel/georges/u_form.h</a>"</font> +00040 <font class="preprocessor">#include "<a class="code" href="sheet__id_8h.html">nel/misc/sheet_id.h</a>"</font> +00041 +00099 <font class="keyword">template</font> <<font class="keyword">class</font> T> +<a name="l00100"></a><a class="code" href="load__form_8h.html#a0">00100</a> <font class="keywordtype">void</font> <a class="code" href="load__form_8h.html#a3">loadForm</a> (<font class="keyword">const</font> std::string &sheetFilter, <font class="keyword">const</font> std::string &packedFilename, std::map<NLMISC::CSheetId, T> &container, <font class="keywordtype">bool</font> updatePackedSheet=<font class="keyword">true</font>) +00101 { +00102 std::vector<std::string> vs; +00103 vs.push_back(sheetFilter); +00104 <a class="code" href="load__form_8h.html#a3">loadForm</a>(vs, packedFilename, container, updatePackedSheet); +00105 } +00106 +00112 <font class="keyword">template</font> <<font class="keyword">class</font> T> +<a name="l00113"></a><a class="code" href="load__form_8h.html#a1">00113</a> <font class="keywordtype">void</font> <a class="code" href="load__form_8h.html#a3">loadForm</a> (<font class="keyword">const</font> std::vector<std::string> &sheetFilters, <font class="keyword">const</font> std::string &packedFilename, std::map<NLMISC::CSheetId, T> &container, <font class="keywordtype">bool</font> updatePackedSheet=<font class="keyword">true</font>) +00114 { +00115 <font class="comment">// check the extension (i know that file like "foo.packed_sheetsbar" will be accepted but this check is enough...)</font> +00116 <a class="code" href="debug_8h.html#a6">nlassert</a> (packedFilename.find (<font class="stringliteral">".packed_sheets"</font>) != std::string::npos); +00117 +00118 std::string packedFilenamePath = <a class="code" href="classNLMISC_1_1CPath.html#d6">NLMISC::CPath::lookup</a>(packedFilename, <font class="keyword">false</font>); +00119 <font class="keywordflow">if</font> (packedFilenamePath.empty()) +00120 { +00121 packedFilenamePath = packedFilename; +00122 } +00123 +00124 <font class="comment">// make sure the CSheetId singleton has been properly initialised</font> +00125 <a class="code" href="classNLMISC_1_1CSheetId.html#d0">NLMISC::CSheetId::init</a>(updatePackedSheet); +00126 +00127 <font class="keywordtype">bool</font> olde, newe; +00128 <a class="code" href="classNLMISC_1_1IStream.html#d1">NLMISC::CIFile::getVersionException</a>(olde, newe); +00129 <font class="comment">// load the packed sheet if exists</font> +00130 <font class="keywordflow">try</font> +00131 { +00132 <a class="code" href="classNLMISC_1_1CIFile.html">NLMISC::CIFile</a> ifile; +00133 ifile.<a class="code" href="classNLMISC_1_1CIFile.html#a4">setCacheFileOnOpen</a>(<font class="keyword">true</font>); +00134 ifile.<a class="code" href="classNLMISC_1_1CIFile.html#a3">open</a> (packedFilenamePath); +00135 <font class="comment">// an exception will be launch if the file is not the good version or if the file is not found</font> +00136 +00137 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"loadForm(): Loading packed file '%s'"</font>, packedFilename.c_str()); +00138 +00139 uint32 nbEntries; +00140 ifile.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a> (nbEntries); +00141 ifile.<a class="code" href="classNLMISC_1_1IStream.html#d0">setVersionException</a> (<font class="keyword">true</font>, <font class="keyword">true</font>); +00142 uint ver = T::getVersion (); +00143 ifile.<a class="code" href="classNLMISC_1_1IStream.html#a29">serialVersion</a>(ver); +00144 ifile.<a class="code" href="classNLMISC_1_1IStream.html#a7">serialCont</a> (container); +00145 ifile.<a class="code" href="classNLMISC_1_1CIFile.html#a7">close</a> (); +00146 } +00147 <font class="keywordflow">catch</font> (<a class="code" href="classNLMISC_1_1Exception.html">NLMISC::Exception</a> &e) +00148 { +00149 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"loadForm(): Exception during reading the packed file, I'll reconstruct it (%s)"</font>, e.what()); +00150 <font class="comment">// clear the container because it can contains partially loaded sheet so we must clean it before continue</font> +00151 container.clear (); +00152 } +00153 <a class="code" href="classNLMISC_1_1IStream.html#d0">NLMISC::CIFile::setVersionException</a>(olde, newe); +00154 +00155 <font class="comment">// if we don't want to update packed sheet, we nothing more to do</font> +00156 <font class="keywordflow">if</font> (!updatePackedSheet) +00157 { +00158 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Don't update the packed sheet with real sheet"</font>); +00159 <font class="keywordflow">return</font>; +00160 } +00161 +00162 <font class="comment">// build a vector of the sheetFilters sheet ids (ie: "item")</font> +00163 std::vector<NLMISC::CSheetId> sheetIds; +00164 std::vector<std::string> filenames; +00165 <font class="keywordflow">for</font> (uint i = 0; i < sheetFilters.size(); i++) +00166 <a class="code" href="classNLMISC_1_1CSheetId.html#d3">NLMISC::CSheetId::buildIdVector</a>(sheetIds, filenames, sheetFilters[i]); +00167 +00168 <font class="comment">// if there s no file, nothing to do</font> +00169 <font class="keywordflow">if</font> (sheetIds.empty()) +00170 <font class="keywordflow">return</font>; +00171 +00172 <font class="comment">// set up the current sheet in container to remove sheet that are in the container and not in the directory anymore</font> +00173 std::map<NLMISC::CSheetId, bool> sheetToRemove; +00174 <font class="keywordflow">for</font> (<font class="keyword">typename</font> std::map<NLMISC::CSheetId, T>::iterator it = container.begin(); it != container.end(); it++) +00175 { +00176 sheetToRemove.insert (make_pair((*it).first, <font class="keyword">true</font>)); +00177 } +00178 +00179 <font class="comment">// check if we need to create a new .pitems or just read it</font> +00180 uint32 packedFiledate = <a class="code" href="structNLMISC_1_1CFile.html#d10">NLMISC::CFile::getFileModificationDate</a>(packedFilenamePath); +00181 +00182 <font class="keywordtype">bool</font> containerChanged = <font class="keyword">false</font>; +00183 +00184 <a class="code" href="classNLGEORGES_1_1UFormLoader.html">NLGEORGES::UFormLoader</a> *formLoader = NULL; +00185 +00186 std::vector<uint> NeededToRecompute; +00187 +00188 <font class="keywordflow">for</font> (uint k = 0; k < filenames.size(); k++) +00189 { +00190 std::string p = <a class="code" href="classNLMISC_1_1CPath.html#d6">NLMISC::CPath::lookup</a> (filenames[k], <font class="keyword">false</font>, <font class="keyword">false</font>); +00191 <font class="keywordflow">if</font> (p.empty()) <font class="keywordflow">continue</font>; +00192 uint32 d = <a class="code" href="structNLMISC_1_1CFile.html#d10">NLMISC::CFile::getFileModificationDate</a>(p); +00193 +00194 <font class="comment">// no need to remove this sheet</font> +00195 sheetToRemove[sheetIds[k]] = <font class="keyword">false</font>; +00196 +00197 <font class="keywordflow">if</font>( d > packedFiledate || container.find (sheetIds[k]) == container.end()) +00198 { +00199 NeededToRecompute.push_back(k); +00200 } +00201 } +00202 +00203 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"%d sheets checked, %d need to be recomputed"</font>, filenames.size(), NeededToRecompute.size()); +00204 +00205 NLMISC::TTime last = <a class="code" href="classNLMISC_1_1CTime.html#d1">NLMISC::CTime::getLocalTime</a> (); +00206 NLMISC::TTime start = <a class="code" href="classNLMISC_1_1CTime.html#d1">NLMISC::CTime::getLocalTime</a> (); +00207 +00208 <a class="code" href="classNLMISC_1_1CSmartPtr.html">NLMISC::CSmartPtr<NLGEORGES::UForm></a> form; +00209 +00210 <font class="keywordflow">for</font> (uint j = 0; j < NeededToRecompute.size(); j++) +00211 { +00212 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CTime.html#d1">NLMISC::CTime::getLocalTime</a> () > last + 5000) +00213 { +00214 last = <a class="code" href="classNLMISC_1_1CTime.html#d1">NLMISC::CTime::getLocalTime</a> (); +00215 <font class="keywordflow">if</font>(j>0) +00216 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"%.0f%% completed (%d/%d), %d seconds remaining"</font>, (<font class="keywordtype">float</font>)j*100.0/NeededToRecompute.size(),j,NeededToRecompute.size(), (NeededToRecompute.size()-j)*(last-start)/j/1000); +00217 } +00218 +00219 <font class="comment">// create the georges loader if necessary</font> +00220 <font class="keywordflow">if</font> (formLoader == NULL) +00221 { +00222 <a class="code" href="namespaceNLMISC.html#a9">WarningLog</a>->addNegativeFilter(<font class="stringliteral">"CFormLoader: Can't open the form file"</font>); +00223 formLoader = <a class="code" href="classNLGEORGES_1_1UFormLoader.html#d0">NLGEORGES::UFormLoader::createLoader</a> (); +00224 } +00225 +00226 <font class="comment">// Load the form with given sheet id</font> +00227 form = formLoader-><a class="code" href="classNLGEORGES_1_1UFormLoader.html#a0">loadForm</a> (sheetIds[NeededToRecompute[j]].toString().c_str ()); +00228 <font class="keywordflow">if</font> (form) +00229 { +00230 <font class="comment">/* if (packedFiledate > 0)</font> +00231 <font class="comment"> {</font> +00232 <font class="comment"> if (d > packedFiledate)</font> +00233 <font class="comment"> nlinfo ("loadForm(): the sheet '%s' is newer than the packed one, I reload it", p.c_str());</font> +00234 <font class="comment"> else</font> +00235 <font class="comment"> nlinfo ("loadForm(): the sheet '%s' is not in the packed sheets, I load it", p.c_str());</font> +00236 <font class="comment"> }*/</font> +00237 +00238 <font class="comment">// add the new creature, it could be already loaded by the packed sheets but will be overwrite with the new one</font> +00239 <font class="keyword">typedef</font> <font class="keyword">typename</font> std::map<NLMISC::CSheetId, T>::iterator TType1; +00240 <font class="keyword">typedef</font> <font class="keyword">typename</font> std::pair<TType1, bool> TType2; +00241 TType2 <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a> = container.insert(std::make_pair(sheetIds[NeededToRecompute[j]],T())); +00242 +00243 (*<a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>.first).second.readGeorges (form, sheetIds[NeededToRecompute[j]]); +00244 containerChanged = <font class="keyword">true</font>; +00245 } +00246 } +00247 +00248 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"%d seconds to recompute %d sheets"</font>, (uint32)(<a class="code" href="classNLMISC_1_1CTime.html#d1">NLMISC::CTime::getLocalTime</a>()-start)/1000, NeededToRecompute.size()); +00249 +00250 <font class="comment">// free the georges loader if necessary</font> +00251 <font class="keywordflow">if</font> (formLoader != NULL) +00252 { +00253 <a class="code" href="classNLGEORGES_1_1UFormLoader.html#d1">NLGEORGES::UFormLoader::releaseLoader</a> (formLoader); +00254 <a class="code" href="namespaceNLMISC.html#a9">WarningLog</a>->removeFilter (<font class="stringliteral">"CFormLoader: Can't open the form file"</font>); +00255 } +00256 +00257 <font class="comment">// we have now to remove sheet that are in the container and not exist anymore in the sheet directories</font> +00258 <font class="keywordflow">for</font> (std::map<NLMISC::CSheetId, bool>::iterator it2 = sheetToRemove.begin(); it2 != sheetToRemove.end(); it2++) +00259 { +00260 <font class="keywordflow">if</font>((*it2).second) +00261 { +00262 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"the sheet '%s' is not in the directory, remove it from container"</font>, (*it2).first.toString().c_str()); +00263 container.erase((*it2).first); +00264 containerChanged = <font class="keyword">true</font>; +00265 } +00266 } +00267 +00268 <font class="comment">// now, save the new container in the packedfile</font> +00269 <font class="keywordflow">try</font> +00270 { +00271 <font class="keywordflow">if</font>(containerChanged) +00272 { +00273 <a class="code" href="classNLMISC_1_1COFile.html">NLMISC::COFile</a> ofile; +00274 ofile.<a class="code" href="classNLMISC_1_1COFile.html#a3">open</a>(packedFilenamePath); +00275 uint ver = T::getVersion (); +00276 uint32 nbEntries = sheetIds.size(); +00277 ofile.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a> (nbEntries); +00278 ofile.<a class="code" href="classNLMISC_1_1IStream.html#a29">serialVersion</a>(ver); +00279 ofile.<a class="code" href="classNLMISC_1_1IStream.html#a7">serialCont</a>(container); +00280 ofile.<a class="code" href="classNLMISC_1_1COFile.html#a4">close</a> (); +00281 } +00282 } +00283 <font class="keywordflow">catch</font> (<a class="code" href="classNLMISC_1_1Exception.html">NLMISC::Exception</a> &e) +00284 { +00285 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"loadForm(): Exception during saving the packed file, it will be recreated next launch (%s)"</font>, e.what()); +00286 } +00287 +00288 <font class="comment">// housekeeping</font> +00289 sheetIds.clear (); +00290 filenames.clear (); +00291 } +00292 +00293 +00299 <font class="keyword">template</font> <<font class="keyword">class</font> T> +<a name="l00300"></a><a class="code" href="load__form_8h.html#a2">00300</a> <font class="keywordtype">void</font> <a class="code" href="load__form_8h.html#a3">loadForm</a> (<font class="keyword">const</font> std::string &sheetFilter, <font class="keyword">const</font> std::string &packedFilename, std::map<std::string, T> &container, <font class="keywordtype">bool</font> updatePackedSheet=<font class="keyword">true</font>) +00301 { +00302 std::vector<std::string> vs; +00303 vs.push_back(sheetFilter); +00304 <a class="code" href="load__form_8h.html#a3">loadForm</a>(vs, packedFilename, container, updatePackedSheet); +00305 } +00306 +00307 +00313 <font class="keyword">template</font> <<font class="keyword">class</font> T> +<a name="l00314"></a><a class="code" href="load__form_8h.html#a3">00314</a> <font class="keywordtype">void</font> <a class="code" href="load__form_8h.html#a3">loadForm</a> (<font class="keyword">const</font> std::vector<std::string> &sheetFilters, <font class="keyword">const</font> std::string &packedFilename, std::map<std::string, T> &container, <font class="keywordtype">bool</font> updatePackedSheet=<font class="keyword">true</font>) +00315 { +00316 <font class="comment">// check the extension (i know that file like "foo.packed_sheetsbar" will be accepted but this check is enough...)</font> +00317 <a class="code" href="debug_8h.html#a6">nlassert</a> (packedFilename.find (<font class="stringliteral">".packed_sheets"</font>) != std::string::npos); +00318 +00319 std::string packedFilenamePath = <a class="code" href="classNLMISC_1_1CPath.html#d6">NLMISC::CPath::lookup</a>(packedFilename, <font class="keyword">false</font>); +00320 <font class="keywordflow">if</font> (packedFilenamePath.empty()) +00321 { +00322 packedFilenamePath = packedFilename; +00323 } +00324 +00325 <font class="comment">// make sure the CSheetId singleton has been properly initialised</font> +00326 <font class="comment">// NLMISC::CSheetId::init(updatePackedSheet);</font> +00327 +00328 <font class="keywordtype">bool</font> olde, newe; +00329 <a class="code" href="classNLMISC_1_1IStream.html#d1">NLMISC::CIFile::getVersionException</a>(olde, newe); +00330 <font class="comment">// load the packed sheet if exists</font> +00331 <font class="keywordflow">try</font> +00332 { +00333 <a class="code" href="classNLMISC_1_1CIFile.html">NLMISC::CIFile</a> ifile; +00334 ifile.<a class="code" href="classNLMISC_1_1CIFile.html#a4">setCacheFileOnOpen</a>(<font class="keyword">true</font>); +00335 ifile.<a class="code" href="classNLMISC_1_1CIFile.html#a3">open</a> (packedFilenamePath); +00336 <font class="comment">// an exception will be launch if the file is not the good version or if the file is not found</font> +00337 +00338 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"loadForm(): Loading packed file '%s'"</font>, packedFilename.c_str()); +00339 +00340 uint32 nbEntries; +00341 ifile.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a> (nbEntries); +00342 ifile.<a class="code" href="classNLMISC_1_1IStream.html#d0">setVersionException</a> (<font class="keyword">true</font>, <font class="keyword">true</font>); +00343 uint ver = T::getVersion (); +00344 ifile.<a class="code" href="classNLMISC_1_1IStream.html#a29">serialVersion</a>(ver); +00345 ifile.<a class="code" href="classNLMISC_1_1IStream.html#a7">serialCont</a> (container); +00346 ifile.<a class="code" href="classNLMISC_1_1CIFile.html#a7">close</a> (); +00347 } +00348 <font class="keywordflow">catch</font> (<a class="code" href="classNLMISC_1_1Exception.html">NLMISC::Exception</a> &e) +00349 { +00350 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"loadForm(): Exception during reading the packed file, I'll reconstruct it (%s)"</font>, e.what()); +00351 <font class="comment">// clear the container because it can contains partially loaded sheet so we must clean it before continue</font> +00352 container.clear (); +00353 } +00354 <a class="code" href="classNLMISC_1_1IStream.html#d0">NLMISC::CIFile::setVersionException</a>(olde, newe); +00355 +00356 <font class="comment">// if we don't want to update packed sheet, we nothing more to do</font> +00357 <font class="keywordflow">if</font> (!updatePackedSheet) +00358 { +00359 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Don't update the packed sheet with real sheet"</font>); +00360 <font class="keywordflow">return</font>; +00361 } +00362 +00363 <font class="comment">// build a vector of the sheetFilters sheet ids (ie: "item")</font> +00364 <font class="comment">// std::vector<std::string> sheetNames;</font> +00365 std::vector<std::string> sheetNames; +00366 <font class="comment">// for (uint i = 0; i < sheetFilters.size(); i++)</font> +00367 <font class="comment">// NLMISC::CSheetId::buildIdVector(sheetIds, filenames, sheetFilters[i]);</font> +00368 { +00369 std::vector<std::string>::const_iterator first(sheetFilters.begin()), last(sheetFilters.end()); +00370 <font class="keywordflow">for</font> (; first != last; ++first) +00371 <a class="code" href="classNLMISC_1_1CPath.html#d16">NLMISC::CPath::getFileList</a>(*first, sheetNames); +00372 +00373 } +00374 +00375 <font class="comment">// if there s no file, nothing to do</font> +00376 <font class="keywordflow">if</font> (sheetNames.empty()) +00377 <font class="keywordflow">return</font>; +00378 +00379 <font class="comment">// set up the current sheet in container to remove sheet that are in the container and not in the directory anymore</font> +00380 std::map<std::string, bool> sheetToRemove; +00381 <font class="keywordflow">for</font> (<font class="keyword">typename</font> std::map<std::string, T>::iterator it = container.begin(); it != container.end(); ++it) +00382 { +00383 sheetToRemove.insert (make_pair((*it).first, <font class="keyword">true</font>)); +00384 } +00385 +00386 <font class="comment">// check if we need to create a new .pitems or just read it</font> +00387 uint32 packedFiledate = <a class="code" href="structNLMISC_1_1CFile.html#d10">NLMISC::CFile::getFileModificationDate</a>(packedFilenamePath); +00388 +00389 <font class="keywordtype">bool</font> containerChanged = <font class="keyword">false</font>; +00390 +00391 <a class="code" href="classNLGEORGES_1_1UFormLoader.html">NLGEORGES::UFormLoader</a> *formLoader = NULL; +00392 +00393 std::vector<uint> NeededToRecompute; +00394 +00395 <font class="keywordflow">for</font> (uint k = 0; k < sheetNames.size(); k++) +00396 { +00397 std::string p = <a class="code" href="classNLMISC_1_1CPath.html#d6">NLMISC::CPath::lookup</a> (sheetNames[k], <font class="keyword">false</font>, <font class="keyword">false</font>); +00398 <font class="keywordflow">if</font> (p.empty()) <font class="keywordflow">continue</font>; +00399 uint32 d = <a class="code" href="structNLMISC_1_1CFile.html#d10">NLMISC::CFile::getFileModificationDate</a>(p); +00400 +00401 <font class="comment">// no need to remove this sheet</font> +00402 sheetToRemove[sheetNames[k]] = <font class="keyword">false</font>; +00403 +00404 <font class="keywordflow">if</font>( d > packedFiledate || container.find (sheetNames[k]) == container.end()) +00405 { +00406 NeededToRecompute.push_back(k); +00407 } +00408 } +00409 +00410 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"%d sheets checked, %d need to be recomputed"</font>, sheetNames.size(), NeededToRecompute.size()); +00411 +00412 NLMISC::TTime lastTime = <a class="code" href="classNLMISC_1_1CTime.html#d1">NLMISC::CTime::getLocalTime</a> (); +00413 NLMISC::TTime start = <a class="code" href="classNLMISC_1_1CTime.html#d1">NLMISC::CTime::getLocalTime</a> (); +00414 +00415 <a class="code" href="classNLMISC_1_1CSmartPtr.html">NLMISC::CSmartPtr<NLGEORGES::UForm></a> form; +00416 +00417 <font class="keywordflow">for</font> (uint j = 0; j < NeededToRecompute.size(); j++) +00418 { +00419 <font class="keywordflow">if</font>(<a class="code" href="classNLMISC_1_1CTime.html#d1">NLMISC::CTime::getLocalTime</a> () > lastTime + 5000) +00420 { +00421 lastTime = <a class="code" href="classNLMISC_1_1CTime.html#d1">NLMISC::CTime::getLocalTime</a> (); +00422 <font class="keywordflow">if</font>(j>0) +00423 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"%.0f%% completed (%d/%d), %d seconds remaining"</font>, (<font class="keywordtype">float</font>)j*100.0/NeededToRecompute.size(),j,NeededToRecompute.size(), (NeededToRecompute.size()-j)*(lastTime-start)/j/1000); +00424 } +00425 +00426 <font class="comment">// create the georges loader if necessary</font> +00427 <font class="keywordflow">if</font> (formLoader == NULL) +00428 { +00429 <a class="code" href="namespaceNLMISC.html#a9">WarningLog</a>->addNegativeFilter(<font class="stringliteral">"CFormLoader: Can't open the form file"</font>); +00430 formLoader = <a class="code" href="classNLGEORGES_1_1UFormLoader.html#d0">NLGEORGES::UFormLoader::createLoader</a> (); +00431 } +00432 +00433 <font class="comment">// Load the form with given sheet id</font> +00434 form = formLoader-><a class="code" href="classNLGEORGES_1_1UFormLoader.html#a0">loadForm</a> (sheetNames[NeededToRecompute[j]].c_str ()); +00435 <font class="keywordflow">if</font> (form) +00436 { +00437 <font class="comment">/* if (packedFiledate > 0)</font> +00438 <font class="comment"> {</font> +00439 <font class="comment"> if (d > packedFiledate)</font> +00440 <font class="comment"> nlinfo ("loadForm(): the sheet '%s' is newer than the packed one, I reload it", p.c_str());</font> +00441 <font class="comment"> else</font> +00442 <font class="comment"> nlinfo ("loadForm(): the sheet '%s' is not in the packed sheets, I load it", p.c_str());</font> +00443 <font class="comment"> }*/</font> +00444 +00445 <font class="comment">// add the new creature, it could be already loaded by the packed sheets but will be overwrite with the new one</font> +00446 <font class="keyword">typedef</font> <font class="keyword">typename</font> std::map<std::string, T>::iterator TType1; +00447 <font class="keyword">typedef</font> <font class="keyword">typename</font> std::pair<TType1, bool> TType2; +00448 TType2 <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a> = container.insert(std::make_pair(sheetNames[NeededToRecompute[j]],T())); +00449 +00450 (*<a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>.first).second.readGeorges (form, sheetNames[NeededToRecompute[j]]); +00451 containerChanged = <font class="keyword">true</font>; +00452 } +00453 } +00454 +00455 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"%d seconds to recompute %d sheets"</font>, (uint32)(<a class="code" href="classNLMISC_1_1CTime.html#d1">NLMISC::CTime::getLocalTime</a>()-start)/1000, NeededToRecompute.size()); +00456 +00457 <font class="comment">// free the georges loader if necessary</font> +00458 <font class="keywordflow">if</font> (formLoader != NULL) +00459 { +00460 <a class="code" href="classNLGEORGES_1_1UFormLoader.html#d1">NLGEORGES::UFormLoader::releaseLoader</a> (formLoader); +00461 <a class="code" href="namespaceNLMISC.html#a9">WarningLog</a>->removeFilter (<font class="stringliteral">"CFormLoader: Can't open the form file"</font>); +00462 } +00463 +00464 <font class="comment">// we have now to remove sheet that are in the container and not exist anymore in the sheet directories</font> +00465 <font class="keywordflow">for</font> (std::map<std::string, bool>::iterator it2 = sheetToRemove.begin(); it2 != sheetToRemove.end(); it2++) +00466 { +00467 <font class="keywordflow">if</font>((*it2).second) +00468 { +00469 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"the sheet '%s' is not in the directory, remove it from container"</font>, (*it2).first.c_str()); +00470 <font class="comment">// informe the contained object that it is no more needed.</font> +00471 container.find((*it2).first)->second.removed(); +00472 container.erase((*it2).first); +00473 containerChanged = <font class="keyword">true</font>; +00474 } +00475 } +00476 +00477 <font class="comment">// now, save the new container in the packedfile</font> +00478 <font class="keywordflow">try</font> +00479 { +00480 <font class="keywordflow">if</font>(containerChanged) +00481 { +00482 <a class="code" href="classNLMISC_1_1COFile.html">NLMISC::COFile</a> ofile; +00483 ofile.<a class="code" href="classNLMISC_1_1COFile.html#a3">open</a>(packedFilenamePath); +00484 uint ver = T::getVersion (); +00485 uint32 nbEntries = sheetNames.size(); +00486 ofile.<a class="code" href="classNLMISC_1_1IStream.html#a5">serial</a> (nbEntries); +00487 ofile.<a class="code" href="classNLMISC_1_1IStream.html#a29">serialVersion</a>(ver); +00488 ofile.<a class="code" href="classNLMISC_1_1IStream.html#a7">serialCont</a>(container); +00489 ofile.<a class="code" href="classNLMISC_1_1COFile.html#a4">close</a> (); +00490 } +00491 } +00492 <font class="keywordflow">catch</font> (<a class="code" href="classNLMISC_1_1Exception.html">NLMISC::Exception</a> &e) +00493 { +00494 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"loadForm(): Exception during saving the packed file, it will be recreated next launch (%s)"</font>, e.what()); +00495 } +00496 +00497 <font class="comment">// housekeeping</font> +00498 <font class="comment">// sheetIds.clear ();</font> +00499 sheetNames.clear (); +00500 } +00501 <font class="preprocessor">#endif // NL_LOAD_FORM_H</font> +00502 <font class="preprocessor"></font> +00503 <font class="comment">/* End of load_form.h */</font> +</pre></div> + +<!-- footer --> +<BR><FONT Size=+5> </FONT> +</TD> +<TD WIDTH=15><IMG SRC=http://www.nevrax.org/inc/img/pixel.gif WIDTH=15 HEIGHT=15 BORDER=0 ALT=""></TD> +</TR> +</TABLE> +</BODY> +</HTML> |