Commit Graph

210 Commits

Author SHA1 Message Date
Vincent Torri 101dee79b0 eet: enhance error messages with libjpeg
@fix
2014-10-20 18:40:20 +02:00
Chidambar Zinnoury b473a56733 eet: add some more documentation. 2014-10-20 18:32:28 +02:00
Philippe Caseiro c03569e6a7 eet: update callback API documentation
Adding some documentation on callbacks typedefs for :
- Eet_Node_Walk
2014-10-20 18:20:58 +02:00
Philippe Caseiro 5bb7034774 eet: update callback API documentation.
Adding some documentation on callbacks typedefs for :
- Eet_Descriptor
- Eet_Dump
2014-10-20 18:19:42 +02:00
Jérémy Zurcher 2e5a5d6656 eet: call LOCK_CACHE before altering Eet_File
even if not necessary in this particular case,
do as in eet_mmap() and eet_open(),
lock the cache before altering Eet_File struct.

fix CID 1039366 1039367 1039368 1039369
2014-09-08 22:37:09 +02:00
Stefan Schmidt a65c531429 eet_dictionary: Remove now unused variable
Since 123bdc4342 found is now longer used here.
Remove it.
2014-08-27 16:40:16 +02:00
Carsten Haitzler d40de658a2 eet - fix unused pointer
fix CID 1039489
2014-08-27 16:58:37 +09:00
Carsten Haitzler b0adec349f eet - handle fcntl error
fix CID 1039691
2014-08-27 16:35:48 +09:00
Carsten Haitzler 123bdc4342 eet dictionary - remove impossible code
CID 1039464 knows full well our comments there are right - so remove
pointless code
2014-08-27 12:12:40 +09:00
Carsten Haitzler 190b404be2 eet - remove useless if at free 2014-08-27 12:11:11 +09:00
Carsten Haitzler d5e11fe840 eet - remove unused return val from decode
fixes CID 1039490
2014-08-25 13:03:50 +09:00
Stefan Schmidt 3fe554e0b6 build: Allow to use external liblz4 instead of embedded copy
While we are likely will keep the embedded copy for a while to avoid a really
new dependency we allow now to use the external liblz4. You need at least
revision r120 and a package that ships the pc file for it.

Personally I would like to get rid of it rather sooner than later due to the
security implications and a bunch of code we ship but have no idea about.
Reality is that it will need some time until this new lib is actually
packaged and shipped with releases for a a majority of people.

This patch was co-worked with Doug Newgard <scimmia22@outlook.com>
2014-08-22 16:27:28 +02:00
Carsten Haitzler 2bd42962e3 eet init - fix structurally dead code
CID 1039542
2014-08-14 20:17:16 +09:00
Cedric BAIL e5d841354d eet: fix possible ABI break. 2014-08-11 16:17:05 +02:00
Jean-Philippe Andre 68a8063f9a Eet: Add support for ETC1+Alpha
The TGV file format and GL engine now support ETC1 encoding
with alpha using an extra texture.
This commit adds similar support to the Eet encoder/decoder.

@feature
2014-07-11 16:40:34 +09:00
Jean-Philippe Andre 4efcd46cbf Eet: Add INF message about how slow ETC2 encoding is 2014-06-13 17:58:13 +09:00
Jean-Philippe Andre c21968bcd7 Eet: Add support for ETC2 encoding and decoding
Since we now have full support for ETC2, add the colorspaces
to Eet.

@feature
2014-06-13 17:14:56 +09:00
Jean-Philippe Andre 28ce791dfa Evas TGV: Fix distortion of TGV images (ETC1)
Due to some invalid geometry considerations, there was a
1 pixel distortion in images, varying with the lz4 compressed
macro-block size.

Anyhow, I couldn't wrap my head around Cedric's code. So I rewrote
the whole thing instead, fixed it and improved the block size
selection (based on the image size, to optimize lz4 compression).
2014-04-25 12:08:56 +09:00
Jean-Philippe Andre 7ff410b9f6 Edje: Fix ETC1 encoding with EET and Edje
There were a few critical issues:
- Invalid pointer arithmetics on the input data (char vs. int)
- Invalid logic in the pixel duplication code

All of these due to bad copy and paste :(

Also, use LZ4HC instead of LZ4 when compression is enabled.
ETC1 encoding is so damn slow you won't see the difference between
LZ4 and LZ4HC compression times.
2014-04-18 15:43:07 +09:00
Jean-Philippe Andre f7150570b0 Eet: Use medium quality for ETC1 by default
And remove  dithering.
This is the same as  07700a799c
2014-04-18 15:39:41 +09:00
Jean-Philippe Andre 60d144d963 ETC1 encoding: fix typo in TGV and EET savers
If quality is >30 && <=70 then choose medium params, not low.
Spotted by Snacker, thanks.
2014-04-08 15:58:58 +09:00
Cedric BAIL 83af91c8b8 eet: add negociation colorspace support to Eet. 2014-04-01 22:00:54 +09:00
Cedric BAIL b1e5760811 eet: add internal encoding to ETC1 as an alternate solution to Jpeg. 2014-04-01 22:00:15 +09:00
Felipe Magno de Almeida ab3eb4b2d3 eet-cxx: add implementation for eet C++.
Usage example:

  struct type
  {
    int foo;
    float bar;
  };

  type t0;

  auto descriptor = make_descriptor("type", &type::ofo, &type::bar);

  eet_data_write(file, descriptor.native_handle(), "type", &t0, false);

  std::unique_ptr<type> p = read_by_ptr(file, "type", descriptor);
  type t = read(file, "type", descriptor);

@feature

Reviewers: cedric, smohanty

Reviewed By: cedric

CC: savio, cedric

Differential Revision: https://phab.enlightenment.org/D659

Signed-off-by: Cedric BAIL <cedric.bail@free.fr>
2014-04-01 22:00:13 +09:00
Gustavo Sverzut Barbieri f2a1f14abd eet: fix tokenizer's escape logic.
Tokenizer's approach of looking back is horrible and breaks the
following simple case (bug I had that lead to this patch):

          "string\\"

As the parser would get the end quote and check the previous character
if it was a backslash and it was, but it was not escaping the quote,
but being escaped by the previous backslash.

The best approach is to first check for escape and then go to
quote. Escape is simple and only the following byte, so we enter
escape, process the byte and then are back to regular mode (be it
quote or unquote).

Added testcase so we avoid breaking it again.

@bugfix cherry-pick
2014-03-13 22:08:44 -03:00
Carsten Haitzler b11ccd9787 eet - dump - if group type is not a handled type, assume unknown
fixes CID 1039307
2014-02-13 20:08:59 +09:00
Albin Tonnerre 62efaed9dc comments: typo fix - s/dictionnary/dictionary
Reviewers: cedric

Reviewed By: cedric

CC: cedric

Differential Revision: https://phab.enlightenment.org/D533

Signed-off-by: Cedric BAIL <cedric.bail@samsung.com>
2014-02-10 10:40:12 +09:00
Carsten Haitzler 414b447f54 Revert "eet: do not load data when the file is open in read/write mode."
This reverts commit f8b0322704.

this breaks efreets icon cache. i have been noticing this since
yesterday across all my machines once i update just efl. i tracked it
down to this commit.
2014-01-21 09:18:52 +09:00
Gustavo Sverzut Barbieri 0d1d51f64e eet_data: guarantee double-word alignment for temporary stack buffer.
The code was giving enough memory to store doubles and longs, but they
could be unaligned as "unsigned char" allows 1-byte alignment, while
double may require 8 bytes.

By specifying the array as "long long" we force certain alignment in a
platform independent way. As this array is small enough and
short-lived, the number of items were not changed, this results in
more bytes on the stack but it shouldn't matter.
2014-01-20 21:44:42 -02:00
Cedric BAIL f8b0322704 eet: do not load data when the file is open in read/write mode.
I do think that it was a left over from previous file format. Removing
this memcpy should make Enlightenment startup faster and should reduce
by 500KB the memory it use.
2014-01-20 13:04:07 +09:00
Cedric BAIL 00d4f5cf1c eet: reduce memory usage of Eet internal structure by removing useless structure. 2014-01-20 13:04:06 +09:00
Daniel Juyung Seo 76d8532b54 efl: Unified eina critical manro to CRI.
Being annoyed by different types of eina critical macros - CRI, CRIT,
 CRITICAL -, I concluded to unify them to one. Discussed on IRC and
 finally, CRI was chosen to meet the consistency with other macros -
 ERR, WRN, INF, DBG - in terms of the number of characters.
If there is any missing bits, please let me know.
2013-12-26 12:27:13 +09:00
Carsten Haitzler f0ba71314e eet data encode - dont free data if its not separately allocated
in one case data is not separately allocated but is part of the
Eet_Variant_Unknow struct where it is allocated as extra space on the
end of the data blob. in this case don't free it, otherwise do (pass
in true) as before. this should fix CID 1039728
2013-12-11 20:44:51 +09:00
Vorobiov Vitalii c3bee34c3c eet: Stopped SPANKing the naughty programmer while deleting dictionary.
Function edje_edit_save_all cause lots of SPANK SPANK, because
eet_dictionary_free is trying to delete string that is actually not a stringshare.

Reviewers: cedric, seoz, raster

Reviewed By: cedric

CC: reutskiy.v.v, cedric

Differential Revision: https://phab.enlightenment.org/D322

Signed-off-by: Cedric Bail <cedric.bail@samsung.com>
2013-11-07 17:58:47 +09:00
Carsten Haitzler b07c0a76ce alpha1 release autofoo/build tree work to pass distcheck and actually work 2013-11-04 18:33:35 +09:00
Christophe Sadoine 6853dbcf23 eet: Adding EET_DATA_DESCRIPTOR_ADD_MAPPING_BASIC to add a basic type to a union.
I added EET_DATA_DESCRIPTOR_ADD_MAPPING_BASIC because I need basic types in unions, and EET_DATA_DESCRIPTOR_ADD_MAPPING is only for structs.
I also modified the example with a float and a string.

Reviewers: cedric

Reviewed By: cedric

Differential Revision: https://phab.enlightenment.org/D313

Signed-off-by: Cedric Bail <cedric.bail@samsung.com>
2013-11-04 15:35:41 +09:00
Cedric Bail 440471e599 eet: shutup a warning and use the right pointer source even if they are the same. 2013-11-04 12:46:48 +09:00
Cedric Bail 07c306a272 eet: let's use const Eina_File here to. 2013-11-04 11:28:56 +09:00
Cedric Bail 1a3c9d68d0 eet: help the kernel to actually load the eet file in memory more efficiently.
When you open a theme, it is very likely that most of the data in it will be needed
at some point, that's why it is a good idea to tell it in advance to the kernel so
it could load them if it has some spare ressource.

We can't just blindly turn EINA_FILE_WILLNEED on any file or a wrong eet file would
be loaded in memory when we don't need it. So we shall keep the sequential load until
we are sure that the file is correct and then explicitely tell the kernel that the
rest of the data should be loaded in ram.
2013-10-28 18:32:40 +09:00
Cedric Bail c718a41728 eet: log size of subtype added to an Eet_Data_Descriptor.
This is really useful to track down a leak of a memory piece allocated by an
eet_data function. If you know the size of the leaked structure (valgrind
give you the total allocated size and the number of structure in it, so you
need to divide before having the right number), you just need to do :
EINA_LOG_LEVELS=eet:3 my_app 2>&1 | grep the_size

And there will be very few line matching reducing what you should be looking at.
2013-10-11 14:43:35 +09:00
Cedric Bail b9d8a7af3a eet: use Eina_Spinlock instead of Eina_Lock for Eet_Dictionary. 2013-10-11 11:08:17 +09:00
Christophe Sadoine 87b17f1ce9 eet: added EET_DATA_DESCRIPTOR_ADD_SUB_NESTED(). 2013-09-24 15:10:44 +09:00
Stefan Schmidt d067c28e74 eet: Add comment about missing break in switch statement 2013-08-09 10:17:49 +01:00
Chris Michael cc0bbacb89 open() can fail for various reasons, so check for valid 'fd' return
before calling fdopen.

Signed-off-by: Chris Michael <cp.michael@samsung.com>
2013-08-05 11:34:34 +01:00
Carsten Haitzler d12b6e6fa1 fix clang bad free complaint 2013-07-16 18:20:07 +09:00
Carsten Haitzler aaf5a55319 fir clang nonnull complaint 2013-07-16 16:55:03 +09:00
Cedric Bail dd4a641bab eet: quick fix for windows. 2013-07-16 16:20:50 +09:00
Cedric Bail d9aa0fccd9 eet: add support for EET_T_VALUE.
Add the moment, it only support simple type. Need iterator for more
complex type. It also expect a pointer to an Eina_Value and not directly
an Eina_Value, let me know if you prefer the opposite and maybe I
should rename it EET_T_PVALUE.
2013-07-15 17:04:34 +09:00
Stefan Schmidt 92de5dd3c6 evas/eet: Prevent libjpeg to redefine INT32.
The define prevents that INT32 gets redefined in libjpeg while it
already is defined for the mingw build.
2013-07-09 11:19:28 +01:00
Chris Michael 1054d49941 Fix missing unlock reported by Coverity
NB: Fixes Coverity CID1039384

Signed-off-by: Chris Michael <cp.michael@samsung.com>
2013-07-08 14:20:22 +01:00
Chris Michael 3891bdcb15 Fix missing unlock (reported by Coverity).
- Instead of just returning NULL, use the existing goto on_error to
handle the unlock and return NULL.

NB: Fixes Coverity CID1039383

Signed-off-by: Chris Michael <cp.michael@samsung.com>
2013-07-08 14:18:06 +01:00
Chris Michael e28f298dbd Fix memleak reported by Coverity: If we error out because we have a
hash with no key, then free the previously allocated data_stream.

NB: Fixes Coverity CID1039262

Signed-off-by: Chris Michael <cp.michael@samsung.com>
2013-07-08 11:34:58 +01:00
Chris Michael b72e694573 Fix memleak reported by Coverity
NB: Fixes Coverity CID1039261

Signed-off-by: Chris Michael <cp.michael@samsung.com>
2013-07-08 11:31:17 +01:00
Sebastian Dransfeld 336f6ec328 efl: formatting 2013-06-20 13:28:18 +02:00
Cedric Bail dba4a080d9 eet: for more safety let eet handle the reference to the file. 2013-06-04 15:04:19 +09:00
Stefan Schmidt f30af4969d eet_image: Free bigend_data in all error cases.
We have been leaking bigend_data if we hit any of the error cases.
2013-05-28 13:47:52 +01:00
Carsten Haitzler 95b91ad9b9 eet_mmap uses reader/writers caches for lookup.. but never ADDs to
these caches! bad bad bad!
2013-05-10 09:00:02 +09:00
Carsten Haitzler 425986b4fe do not make eet files get refcounts of 2 on eet_mmap so they then never free.
we set references to 1 then on success references++... thus ALWAYS
being on 2.
2013-05-10 08:54:50 +09:00
Cedric Bail ffba364857 eet: initialize it to zero. 2013-05-09 17:22:00 +09:00
Cedric Bail a299e0723a eet: more meaningful message. 2013-05-08 18:17:00 +09:00
Cedric Bail 8fc58ae405 eet: be picky and really use the correct format without shitty cast. 2013-04-10 14:55:24 +09:00
Tom Hacohen bf8a49d9a2 Eet: Pass the correct parameter to the correct format. 2013-04-09 15:19:40 +01:00
Cedric BAIL 359d7034ba eet: enable more debug information regarding memory allocation. 2013-04-05 12:20:37 +09:00
Cedric BAIL 5465eb3acc eet: remove use of prev to reduce memory usage (30KB on 32bits system). 2013-04-05 12:14:50 +09:00
Cedric BAIL f001cfac38 eet: do the correct math for allocation. 2013-04-05 11:50:54 +09:00
Cedric BAIL 4a4ab2bb48 eet: round above. 2013-04-04 15:12:40 +09:00
Cedric BAIL fa20ab7269 eet: another big boolean removed.
By merging all boolean in their own array I avoid loosing 2.9 bytes on
32bits and 6.9 bytes on 64bits system.
2013-04-04 12:01:07 +09:00
Cedric BAIL 2063e4353d efl: integrate eina_log_timing. 2013-03-27 21:43:45 +09:00
Daniel Willmann 1d8f06511c eet_cipher: Fix initialization of opened variable
In the error case we 'goto' the error path directly without passing
through the declaration and initialization of the variable.

This doesn't work so move the declaration/initialization to the start.
See this example (compile with -Wall for the warning):

-----
 #include <stdio.h>

 int main(void)
 {
   goto bar;

   int i = 15;

 bar:
   printf("Foo: %i\n", i);

   return 0;
 }
----

Signed-off-by: Daniel Willmann <d.willmann@samsung.com>
2013-03-19 17:00:33 +00:00
Cedric Bail 3fe8098e9c include some header files conditionally add specific test for fcntl 2013-03-11 10:34:47 +09:00
Christopher Michael d33ddb5af9 Fix possible memory leak in eet_data_image_header_decode_cipher.
Dynamic memory stored in 'deciphered_d' allocated through function
'eet_decipher' at line 1385 can be lost at line 1408. Also there are 3
similar errors on line(s) 1427, 1430, 1450.

Signed-off-by: Christopher Michael <cp.michael@samsung.com>
2013-02-19 13:14:20 +00:00
Mike Blumenkrantz f9d80e493a add eet_data_descriptor_name_get()
SVN revision: 83546
2013-02-01 10:59:23 +00:00
Aharon Hillel dad5336272 eet: eet_connection.c fixed memory allocation Changed the usage of alloca() to malloc() to support big-mem-alloc This was required to support Clouseau
Signed-off-by: Aharon Hillel <a.hillel@samsung.com>

SVN revision: 83010
2013-01-20 08:43:29 +00:00
Gustavo Sverzut Barbieri 3701b41ac9 fix compile warnings.
the NULL is just to shut gcc being stupid.


SVN revision: 82774
2013-01-14 18:34:23 +00:00
Cedric BAIL 55bc6a16fb efl: fix endianness issue.
Patch by Albin Tonnerre <albin.tonnerre@gmail.com>.


SVN revision: 82743
2013-01-14 03:54:47 +00:00
Lucas De Marchi 06ff74834f efl: remove checks for socket.h, net/*, arpa/*
SVN revision: 82585
2013-01-10 20:26:02 +00:00
Lucas De Marchi db395ef7eb efl: Remove check for unistd.h
* unistd.h: is very useful, very old and very standard.



SVN revision: 82577
2013-01-10 20:25:26 +00:00
Gustavo Sverzut Barbieri 0a2d116119 efl: eina_alloca.h to simplify alloca() usage.
having to replicate 18 lines per file just to access alloca() is
insane. Let's do that in Eina.h and avoid that crap :-/



SVN revision: 82082
2013-01-03 15:10:34 +00:00
Cedric BAIL 59ebafcb85 efl: rename eet_map to eet_mmap.
SVN revision: 82051
2013-01-03 09:18:05 +00:00
Cedric BAIL 42b877cace efl: fix potential segv.
SVN revision: 81972
2013-01-02 06:21:43 +00:00
Cedric BAIL 663d56e498 efl: add eet_map and use it.
SVN revision: 81970
2013-01-02 02:46:05 +00:00
Gustavo Sverzut Barbieri 66ebe6a3f8 efl: remove checks for EINA_HAVE_THREADS
SVN revision: 81937
2012-12-31 17:31:17 +00:00
Gustavo Sverzut Barbieri 2608f68571 efl/docs: clean-up and make it more uniform.
now unified docs are bit more uniform in their start pages, overall
improved but much to do :-(



SVN revision: 81851
2012-12-28 23:26:05 +00:00
Jonas M. Gastal 22a6966653 efl: Created Eet group and added existing Eet groups to it.
SVN revision: 81289
2012-12-18 18:38:19 +00:00
Jonas M. Gastal d41d76ca38 efl: Modified section names as doxygen reuses titles for same named sections in different pages.
SVN revision: 81279
2012-12-18 16:18:28 +00:00
Jonas M. Gastal 93cdccf144 efl: Give different names for example pages in different libs.
SVN revision: 81278
2012-12-18 16:18:24 +00:00
Jonas M. Gastal 65a7188905 efl: Unifying authors page.
SVN revision: 81277
2012-12-18 16:18:19 +00:00
Jonas M. Gastal 6ecaa33f22 efl: Adding a unified main page that links to the "mainpage" of libs.
SVN revision: 81273
2012-12-18 16:12:56 +00:00
Daniel Willmann e9bd0b7a27 eet: Fix possible buffer overflow in functions relying on EET_T_LAST.
Issue reported by Klocwork. Backport, ChangeLog, NEWS included

Signed-off-by: Daniel Willmann <d.willmann@samsung.com>

SVN revision: 80767
2012-12-12 14:49:49 +00:00
Cedric BAIL 0d1b29e5e1 eet: fix memory leak with OpenSSL.
Reported by Leandro Santiago <leandrosansilva@gmail.com>.


SVN revision: 80648
2012-12-11 11:52:53 +00:00
Gustavo Sverzut Barbieri 511d8e8672 efl/eet: bumped requirement for gnutls >= 2.11 thus remove legacy code.
SVN revision: 80287
2012-12-05 23:44:45 +00:00
Daniel Zaoui 5f875d92f0 Increased MAX_MSG_SIZE for support of Clouseau - needed for next
Clouseau commit (screenshots)

Signed-off-by: Daniel Zaoui <daniel.zaoui@samsung.com>

SVN revision: 79744
2012-11-27 14:36:12 +00:00
Christopher Michael 10567cca05 Add missing UNLOCK_CACHE in eet_open function.
Change-Id: I79db6bedf49c27499f3caa63d04dc6bb3ecfee60

SVN revision: 79290
2012-11-14 11:52:25 +00:00
Vincent Torri 109efca5cb merge: move lz4 to src/static_libs/lz4 (same will hold for evas' linebreak), ignore++--
SVN revision: 78807
2012-11-01 16:58:56 +00:00
Vincent Torri 58a9a0ad57 merge: don't use recursive subdirs. Compilation should be faster.
Please check.

note1: Only lib and bin for now, but should be extended to other stuff
note2: distcheck does not work because eo_suite is failing.


SVN revision: 78758
2012-11-01 12:56:52 +00:00
Cedric BAIL cf8a61527f efl: backport r78689.
SVN revision: 78690
2012-10-31 05:58:50 +00:00
Vincent Torri 124e0d4afd merge: add a holdall variable
SVN revision: 78503
2012-10-26 06:57:11 +00:00
Vincent Torri aac3e95ccf merge: -Wl,--enable-auto-import is useless with recent versions of gcc on Windows
SVN revision: 78495
2012-10-25 22:01:28 +00:00
Vincent Torri 77d90bd45e merge: pass directly to the preprocessor the Windows macro instead of using autotools
SVN revision: 78350
2012-10-23 05:43:57 +00:00
Zbigniew Kosinski 2499d34087 From: Zbigniew Kosinski <z.kosinski@samsung.com>
Subject: Re: [E-devel] Add Null checking routine

I prepared patch - check eet file pointer parameter in
eet_identity_signature, eet_identity_x509 and eet_identity_sha1 functions.
Please take a look at attached files.



SVN revision: 77977
2012-10-15 06:26:48 +00:00
Carsten Haitzler d6b7e8f740 well ok - always on then, no option, until 2.0
SVN revision: 77843
2012-10-11 03:04:57 +00:00
Gustavo Sverzut Barbieri f963219626 efl: remove option to enable old EET format.
It's disabled. If user wants to enable, give
-DEET_OLD_EET_FILE_FORMAT=1 to CFLAGS.



SVN revision: 77790
2012-10-10 19:30:17 +00:00
Vincent Torri 7fe3d35994 merge: __UNUSED__ --> EINA_UNUSED and some fixes in eo.
SVN revision: 77542
2012-10-05 20:09:47 +00:00
Daniel Juyung Seo 91f0f4ee8e backport r77494 and r77495.
SVN revision: 77498
2012-10-05 06:35:06 +00:00
Vincent Torri 079b6c94c3 Eet: Update lz4 code to rev. 77. This fix compilation on NetBSD 5.0
SVN revision: 77449
2012-10-04 17:25:48 +00:00
Carsten Haitzler 36ef0cdc92 and esnure we have all the right include paths.
SVN revision: 77121
2012-09-27 04:08:48 +00:00
Carsten Haitzler e0e6fd9201 port null check over to efl tree.
SVN revision: 77118
2012-09-27 03:56:20 +00:00
Carsten Haitzler be48742a4e port eet fix to efl tree
SVN revision: 76944
2012-09-21 08:43:49 +00:00
Vincent Torri ab144cb474 merge: fix compilation when no EFL is installed...
tested on linux and windows.
And disable valgrind as there's a link problem in eet binary,
i'll check that later


SVN revision: 76938
2012-09-21 08:15:58 +00:00
Vincent Torri 8abaff3bdf merge: add eet
SVN revision: 76768
2012-09-17 16:35:38 +00:00