##
## image.py
## Login : <uli@pu.smp.net>
## Started on  Mon Apr 25 12:32:42 2011 Uli Fouquet
## $Id$
## 
## Copyright (C) 2011 Uli Fouquet
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
## 
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
## 
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##
"""
Components for handling image files.
"""
import os
from ZODB.blob import Blob
from hurry.file import HurryFile
from zope.interface import implements
from waeup.sirp.image.interfaces import IWAeUPImageFile

class WAeUPImageFile(HurryFile):
    """A file prepared for storing image files.

    This file type is built upon :class:`hurry.file.HurryFile`. It
    stores the file contents given by `data` in a ZODB Blob.

    The `filename` passed can be retrieved later as the `filename`
    attribute although the contents of this parameter makes no
    difference for us.
    """
    implements(IWAeUPImageFile)

    def __init__(self, filename, data):
        self.filename = filename
        self._file = Blob(data)
        self.headers = {}

    def __del__(self):
        """Remove the real filesystem file bound to the blob.

        Blob content is initially written to some real filesystem
        file. This file might linger around in temporary dirs when
        :class:`WAeUPImageFile` instances are created without storing
        them in ZODB afterwards. This often happens in tests.

        We remove that file too when we are about to be deleted.
        """
        if self._p_oid is not None or self._file._p_oid is not None:
            # Don't mess up internal ZODB structure
            return
        f = self._file.open('r')
        name = getattr(f, 'name', None)
        f.close()
        if name is not None and os.path.exists(name) and os.path.isfile(name):
            os.unlink(name)
        return

    def _getFile(self):
        return self._file.open('r')

    #: A Python file-object already openend for reading containing the
    #: stored file.
    file = property(_getFile)

    @property
    def size(self):
        """The size of the stored file in bytes.
        """
        f = self._file.open('r')
        size = int(os.fstat(f.fileno()).st_size)
        f.close()
        return size

    @property
    def data(self):
        """The contents of the stored file.
        """
        f = self._file.open('r')
        result = f.read()
        f.close()
        return result
