"""zodb2ext

Given a file or image, converts to Silva Image/File
vsbabu-removethis@vsbabu.org - 11/25/01
modified by lorenz textor to support Silva assets instead of ExtFiles - 02/16/07
"""
from StringIO import StringIO
#  cStringIO doesn't work! Need to see why
__version__ = '0.0.1'

def make_stream(o):
    """makes a StringIO stream for a given zodb object o
    
    shameless copy from lib/python/OFS/Image.py , index_html
    """
    (start,end) = (0,o.getSize())
    data = o.data
    if type(data) is type(''): #StringType
        infile = StringIO(data[start:end])
    else:
        pos = 0
        infile = StringIO(data.data)
        while data is not None:
            l =  len(data.data)
            pos = pos + l
            if pos > start:
                # We are within the range
                lstart = l - (pos - start)

                if lstart < 0: lstart = 0
                
                # find the endpoint
                if end <= pos:
                    lend = l - (pos - end)
                    
                    infile.write(data[lstart:lend])
                    break

                # Not yet at the end, transmit what we have.
                infile.write(data[lstart:])

            data = data.next
    infile.seek(0)
    return infile

def zodb2ext(self,o):
    """ Given a file or image, converts to ExtFile or ExtImage """
    if o.meta_type not in ['Silva File','Silva Image']:
        return 'Object should be File or Image'
    metadata_system = self.service_metadata
    binding = metadata_system.getMetadata(o)
    if o.meta_type == 'Silva File':
        nid = o.getId()
        ct = o.content_type()
        title = o.get_title()
        infile = make_stream(o._file)
        self.manage_delObjects([nid])
        self.manage_addProduct['Silva'].manage_addFile(id=nid, title=title, file=infile)
        infile.close()
        obj = getattr(self,nid)
        obj._file.content_type = ct
    elif o.meta_type == 'Silva Image':
        nid = o.getId()
        ct = o.content_type()
        title = o.get_title()
        web_format = o.getWebFormat()
        web_scale = o.getWebScale()
        web_crop = o.getWebCrop()
        infile = make_stream(o.hires_image)
        self.manage_delObjects([nid])
        self.manage_addProduct['Silva'].manage_addImage(id=nid, title=title, file=infile)
        infile.close()
        obj = getattr(self,nid)
        obj.image.content_type = ct
        obj.set_web_presentation_properties(web_format, web_scale, web_crop)
    # set metadata
    bindingNew = metadata_system.getMetadata(obj)
    for set in binding.getSetNames():
        values = {}
        for element in binding.getElementNames(set):
            e = binding.get(set,element,acquire=0,no_defaults=1)
            try:
                e = e.encode('utf-8')
            except:
                pass
            if e:
                values[element] = e
        bindingNew.setValues(set, values)
    if o.meta_type == 'Silva File':
        return 'File %s converted (title: %s, mime type: %s).' % (o.absolute_url_path(),title,ct)
    else:
        return 'Image %s converted (title: %s, mime type: %s).' % (o.absolute_url_path(),title,ct)

