Make PRS 500 driver thread safe. Fixes #4307 (PRS-500 not recognized in 0.6.30)

This commit is contained in:
Kovid Goyal 2009-12-27 15:05:32 -07:00
commit d7c24b9896
8 changed files with 8855 additions and 774 deletions

View File

@ -39,6 +39,7 @@ from tempfile import TemporaryFile
from array import array from array import array
from functools import wraps from functools import wraps
from StringIO import StringIO from StringIO import StringIO
from threading import RLock
from calibre.devices.interface import DevicePlugin from calibre.devices.interface import DevicePlugin
from calibre.devices.libusb import Error as USBError from calibre.devices.libusb import Error as USBError
@ -52,6 +53,7 @@ from calibre.devices.usbms.deviceconfig import DeviceConfig
# Protocol versions this driver has been tested with # Protocol versions this driver has been tested with
KNOWN_USB_PROTOCOL_VERSIONS = [0x3030303030303130L] KNOWN_USB_PROTOCOL_VERSIONS = [0x3030303030303130L]
lock = RLock()
class File(object): class File(object):
""" """
@ -161,36 +163,39 @@ class PRS500(DeviceConfig, DevicePlugin):
""" """
@wraps(func) @wraps(func)
def run_session(*args, **kwargs): def run_session(*args, **kwargs):
dev = args[0] with lock:
res = None dev = args[0]
try: res = None
if not dev.handle: try:
dev.open() if not hasattr(dev, 'in_session'):
if not getattr(dev, 'in_session', False): dev.reset()
dev.send_validated_command(BeginEndSession(end=False)) if not dev.handle:
dev.in_session = True dev.open()
res = func(*args, **kwargs) if not getattr(dev, 'in_session', False):
except ArgumentError: dev.send_validated_command(BeginEndSession(end=False))
dev.in_session = True
res = func(*args, **kwargs)
except ArgumentError:
if not kwargs.has_key("end_session") or kwargs["end_session"]:
dev.send_validated_command(BeginEndSession(end=True))
dev.in_session = False
raise
except USBError, err:
if "No such device" in str(err):
raise DeviceError()
elif "Connection timed out" in str(err):
dev.close()
raise TimeoutError(func.__name__)
elif "Protocol error" in str(err):
dev.close()
raise ProtocolError("There was an unknown error in the"+\
" protocol. Contact " + __author__)
dev.close()
raise
if not kwargs.has_key("end_session") or kwargs["end_session"]: if not kwargs.has_key("end_session") or kwargs["end_session"]:
dev.send_validated_command(BeginEndSession(end=True)) dev.send_validated_command(BeginEndSession(end=True))
dev.in_session = False dev.in_session = False
raise return res
except USBError, err:
if "No such device" in str(err):
raise DeviceError()
elif "Connection timed out" in str(err):
dev.close()
raise TimeoutError(func.__name__)
elif "Protocol error" in str(err):
dev.close()
raise ProtocolError("There was an unknown error in the"+\
" protocol. Contact " + __author__)
dev.close()
raise
if not kwargs.has_key("end_session") or kwargs["end_session"]:
dev.send_validated_command(BeginEndSession(end=True))
dev.in_session = False
return res
return run_session return run_session
@ -204,17 +209,18 @@ class PRS500(DeviceConfig, DevicePlugin):
If it is called with -1 that means that the If it is called with -1 that means that the
task does not have any progress information task does not have any progress information
""" """
self.device = get_device_by_id(self.VENDOR_ID, self.PRODUCT_ID) with lock:
# Handle that is used to communicate with device. Setup in L{open} self.device = get_device_by_id(self.VENDOR_ID, self.PRODUCT_ID)
self.handle = None # Handle that is used to communicate with device. Setup in L{open}
self.in_session = False self.handle = None
self.log_packets = log_packets self.in_session = False
self.report_progress = report_progress self.log_packets = log_packets
if len(key) > 8: self.report_progress = report_progress
key = key[:8] if len(key) > 8:
elif len(key) < 8: key = key[:8]
key += ''.join(['\0' for i in xrange(8 - len(key))]) elif len(key) < 8:
self.key = key key += ''.join(['\0' for i in xrange(8 - len(key))])
self.key = key
def reconnect(self): def reconnect(self):
""" Only recreates the device node and deleted the connection handle """ """ Only recreates the device node and deleted the connection handle """
@ -244,64 +250,66 @@ class PRS500(DeviceConfig, DevicePlugin):
Also initialize the device. Also initialize the device.
See the source code for the sequence of initialization commands. See the source code for the sequence of initialization commands.
""" """
if not hasattr(self, 'key'): with lock:
self.key = '-1\0\0\0\0\0\0' if not hasattr(self, 'key'):
self.device = get_device_by_id(self.VENDOR_ID, self.PRODUCT_ID) self.reset()
if not self.device: self.device = get_device_by_id(self.VENDOR_ID, self.PRODUCT_ID)
raise DeviceError() if not self.device:
configs = self.device.configurations raise DeviceError()
try: configs = self.device.configurations
self.handle = self.device.open()
config = configs[0]
try: try:
self.handle.set_configuration(configs[0]) self.handle = self.device.open()
except USBError: config = configs[0]
self.handle.set_configuration(configs[1]) try:
config = configs[1] self.handle.set_configuration(configs[0])
_id = config.interface.contents.altsetting.contents except USBError:
ed1 = _id.endpoint[0] self.handle.set_configuration(configs[1])
ed2 = _id.endpoint[1] config = configs[1]
if ed1.EndpointAddress == self.BULK_IN_EP: _id = config.interface.contents.altsetting.contents
red, wed = ed1, ed2 ed1 = _id.endpoint[0]
else: ed2 = _id.endpoint[1]
red, wed = ed2, ed1 if ed1.EndpointAddress == self.BULK_IN_EP:
self.bulk_read_max_packet_size = red.MaxPacketSize red, wed = ed1, ed2
self.bulk_write_max_packet_size = wed.MaxPacketSize else:
self.handle.claim_interface(self.INTERFACE_ID) red, wed = ed2, ed1
except USBError, err: self.bulk_read_max_packet_size = red.MaxPacketSize
raise DeviceBusy(str(err)) self.bulk_write_max_packet_size = wed.MaxPacketSize
# Large timeout as device may still be initializing self.handle.claim_interface(self.INTERFACE_ID)
res = self.send_validated_command(GetUSBProtocolVersion(), timeout=20000) except USBError, err:
if res.code != 0: raise DeviceBusy(str(err))
raise ProtocolError("Unable to get USB Protocol version.") # Large timeout as device may still be initializing
version = self._bulk_read(24, data_type=USBProtocolVersion)[0].version res = self.send_validated_command(GetUSBProtocolVersion(), timeout=20000)
if version not in KNOWN_USB_PROTOCOL_VERSIONS: if res.code != 0:
print >> sys.stderr, "WARNING: Usb protocol version " + \ raise ProtocolError("Unable to get USB Protocol version.")
hex(version) + " is unknown" version = self._bulk_read(24, data_type=USBProtocolVersion)[0].version
res = self.send_validated_command(SetBulkSize(\ if version not in KNOWN_USB_PROTOCOL_VERSIONS:
chunk_size = 512*self.bulk_read_max_packet_size, \ print >> sys.stderr, "WARNING: Usb protocol version " + \
unknown = 2)) hex(version) + " is unknown"
if res.code != 0: res = self.send_validated_command(SetBulkSize(\
raise ProtocolError("Unable to set bulk size.") chunk_size = 512*self.bulk_read_max_packet_size, \
res = self.send_validated_command(UnlockDevice(key=self.key))#0x312d)) unknown = 2))
if res.code != 0: if res.code != 0:
raise DeviceLocked() raise ProtocolError("Unable to set bulk size.")
res = self.send_validated_command(SetTime()) res = self.send_validated_command(UnlockDevice(key=self.key))#0x312d))
if res.code != 0: if res.code != 0:
raise ProtocolError("Could not set time on device") raise DeviceLocked()
res = self.send_validated_command(SetTime())
if res.code != 0:
raise ProtocolError("Could not set time on device")
def eject(self): def eject(self):
pass pass
def close(self): def close(self):
""" Release device interface """ """ Release device interface """
try: with lock:
self.handle.reset() try:
self.handle.release_interface(self.INTERFACE_ID) self.handle.reset()
except Exception, err: self.handle.release_interface(self.INTERFACE_ID)
print >> sys.stderr, err except Exception, err:
self.handle, self.device = None, None print >> sys.stderr, err
self.in_session = False self.handle, self.device = None, None
self.in_session = False
def _send_command(self, command, response_type=Response, timeout=1000): def _send_command(self, command, response_type=Response, timeout=1000):
""" """
@ -313,17 +321,18 @@ class PRS500(DeviceConfig, DevicePlugin):
@param timeout: The time to wait for a response from the @param timeout: The time to wait for a response from the
device, in milliseconds. If there is no response, a L{usb.USBError} is raised. device, in milliseconds. If there is no response, a L{usb.USBError} is raised.
""" """
if self.log_packets: with lock:
self.log_packet(command, "Command") if self.log_packets:
bytes_sent = self.handle.control_msg(0x40, 0x80, command) self.log_packet(command, "Command")
if bytes_sent != len(command): bytes_sent = self.handle.control_msg(0x40, 0x80, command)
raise ControlError(desc="Could not send control request to device\n"\ if bytes_sent != len(command):
+ str(command)) raise ControlError(desc="Could not send control request to device\n"\
response = response_type(self.handle.control_msg(0xc0, 0x81, \ + str(command))
Response.SIZE, timeout=timeout)) response = response_type(self.handle.control_msg(0xc0, 0x81, \
if self.log_packets: Response.SIZE, timeout=timeout))
self.log_packet(response, "Response") if self.log_packets:
return response self.log_packet(response, "Response")
return response
def send_validated_command(self, command, cnumber=None, \ def send_validated_command(self, command, cnumber=None, \
response_type=Response, timeout=1000): response_type=Response, timeout=1000):
@ -347,42 +356,43 @@ class PRS500(DeviceConfig, DevicePlugin):
@param packet_size: Size of packets to be sent to device. @param packet_size: Size of packets to be sent to device.
C{data} is broken up into packets to be sent to device. C{data} is broken up into packets to be sent to device.
""" """
def bulk_write_packet(packet): with lock:
self.handle.bulk_write(self.BULK_OUT_EP, packet) def bulk_write_packet(packet):
if self.log_packets: self.handle.bulk_write(self.BULK_OUT_EP, packet)
self.log_packet(Answer(packet), "Answer h->d") if self.log_packets:
self.log_packet(Answer(packet), "Answer h->d")
bytes_left = len(data) bytes_left = len(data)
if bytes_left + 16 <= packet_size: if bytes_left + 16 <= packet_size:
packet_size = bytes_left +16 packet_size = bytes_left +16
first_packet = Answer(bytes_left+16) first_packet = Answer(bytes_left+16)
first_packet[16:] = data first_packet[16:] = data
first_packet.length = len(data) first_packet.length = len(data)
else: else:
first_packet = Answer(packet_size) first_packet = Answer(packet_size)
first_packet[16:] = data[0:packet_size-16] first_packet[16:] = data[0:packet_size-16]
first_packet.length = packet_size-16 first_packet.length = packet_size-16
first_packet.number = 0x10005 first_packet.number = 0x10005
bulk_write_packet(first_packet) bulk_write_packet(first_packet)
pos = first_packet.length pos = first_packet.length
bytes_left -= first_packet.length bytes_left -= first_packet.length
while bytes_left > 0: while bytes_left > 0:
endpos = pos + packet_size if pos + packet_size <= len(data) \ endpos = pos + packet_size if pos + packet_size <= len(data) \
else len(data) else len(data)
bulk_write_packet(data[pos:endpos]) bulk_write_packet(data[pos:endpos])
bytes_left -= endpos - pos bytes_left -= endpos - pos
pos = endpos pos = endpos
res = Response(self.handle.control_msg(0xc0, 0x81, Response.SIZE, \ res = Response(self.handle.control_msg(0xc0, 0x81, Response.SIZE, \
timeout=5000)) timeout=5000))
if self.log_packets: if self.log_packets:
self.log_packet(res, "Response") self.log_packet(res, "Response")
if res.rnumber != 0x10005 or res.code != 0: if res.rnumber != 0x10005 or res.code != 0:
raise ProtocolError("Sending via Bulk Transfer failed with response:\n"\ raise ProtocolError("Sending via Bulk Transfer failed with response:\n"\
+str(res)) +str(res))
if res.data_size != len(data): if res.data_size != len(data):
raise ProtocolError("Unable to transfer all data to device. "+\ raise ProtocolError("Unable to transfer all data to device. "+\
"Response packet:\n"\ "Response packet:\n"\
+str(res)) +str(res))
def _bulk_read(self, bytes, command_number=0x00, packet_size=0x1000, \ def _bulk_read(self, bytes, command_number=0x00, packet_size=0x1000, \
@ -395,31 +405,32 @@ class PRS500(DeviceConfig, DevicePlugin):
@return: A list of packets read from the device. @return: A list of packets read from the device.
Each packet is of type data_type Each packet is of type data_type
""" """
msize = self.bulk_read_max_packet_size with lock:
def bulk_read_packet(data_type=Answer, size=0x1000): msize = self.bulk_read_max_packet_size
rsize = size def bulk_read_packet(data_type=Answer, size=0x1000):
if size % msize: rsize = size
rsize = size - size % msize + msize if size % msize:
data = data_type(self.handle.bulk_read(self.BULK_IN_EP, rsize)) rsize = size - size % msize + msize
if self.log_packets: data = data_type(self.handle.bulk_read(self.BULK_IN_EP, rsize))
self.log_packet(data, "Answer d->h") if self.log_packets:
if len(data) != size: self.log_packet(data, "Answer d->h")
raise ProtocolError("Unable to read " + str(size) + " bytes from "\ if len(data) != size:
"device. Read: " + str(len(data)) + " bytes") raise ProtocolError("Unable to read " + str(size) + " bytes from "\
return data "device. Read: " + str(len(data)) + " bytes")
return data
bytes_left = bytes bytes_left = bytes
packets = [] packets = []
while bytes_left > 0: while bytes_left > 0:
if packet_size > bytes_left: if packet_size > bytes_left:
packet_size = bytes_left packet_size = bytes_left
packet = bulk_read_packet(data_type=data_type, size=packet_size) packet = bulk_read_packet(data_type=data_type, size=packet_size)
bytes_left -= len(packet) bytes_left -= len(packet)
packets.append(packet) packets.append(packet)
self.send_validated_command(\ self.send_validated_command(\
AcknowledgeBulkRead(packets[0].number), \ AcknowledgeBulkRead(packets[0].number), \
cnumber=command_number) cnumber=command_number)
return packets return packets
@safe @safe
def get_device_information(self, end_session=True): def get_device_information(self, end_session=True):

View File

@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: calibre\n" "Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-12-25 04:54+0000\n" "POT-Creation-Date: 2009-12-26 16:57+0000\n"
"PO-Revision-Date: 2009-12-25 19:11+0000\n" "PO-Revision-Date: 2009-12-26 16:45+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n" "Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: Arabic <ar@li.org>\n" "Language-Team: Arabic <ar@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-12-26 04:31+0000\n" "X-Launchpad-Export-Date: 2009-12-27 04:31+0000\n"
"X-Generator: Launchpad (build Unknown)\n" "X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41 #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41
@ -64,8 +64,8 @@ msgstr "لا يفعل شيءً"
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:79 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:79
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:121 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:121
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:155 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:155
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:593 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:594
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:783 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:784
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:896 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:896
@ -132,7 +132,7 @@ msgstr "لا يفعل شيءً"
#: /home/kovid/work/calibre/src/calibre/library/server.py:645 #: /home/kovid/work/calibre/src/calibre/library/server.py:645
#: /home/kovid/work/calibre/src/calibre/library/server.py:717 #: /home/kovid/work/calibre/src/calibre/library/server.py:717
#: /home/kovid/work/calibre/src/calibre/library/server.py:764 #: /home/kovid/work/calibre/src/calibre/library/server.py:764
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:105 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:107
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77
@ -7361,10 +7361,18 @@ msgid "English (TH)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:103 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:103
msgid "Dutch (NL)" msgid "English (CY)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:104 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:104
msgid "German (AT)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:105
msgid "Dutch (NL)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:106
msgid "Dutch (BE)" msgid "Dutch (BE)"
msgstr "" msgstr ""

View File

@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: de\n" "Project-Id-Version: de\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-25 04:54+0000\n" "POT-Creation-Date: 2009-12-26 16:57+0000\n"
"PO-Revision-Date: 2009-12-25 21:08+0000\n" "PO-Revision-Date: 2009-12-26 20:24+0000\n"
"Last-Translator: S. Dorscht <Unknown>\n" "Last-Translator: S. Dorscht <Unknown>\n"
"Language-Team: American English <kde-i18n-doc@lists.kde.org>\n" "Language-Team: American English <kde-i18n-doc@lists.kde.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-12-26 04:32+0000\n" "X-Launchpad-Export-Date: 2009-12-27 04:31+0000\n"
"X-Generator: Launchpad (build Unknown)\n" "X-Generator: Launchpad (build Unknown)\n"
"Generated-By: pygettext.py 1.5\n" "Generated-By: pygettext.py 1.5\n"
@ -65,8 +65,8 @@ msgstr "Macht absolut gar nichts"
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:79 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:79
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:121 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:121
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:155 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:155
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:593 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:594
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:783 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:784
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:896 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:896
@ -133,7 +133,7 @@ msgstr "Macht absolut gar nichts"
#: /home/kovid/work/calibre/src/calibre/library/server.py:645 #: /home/kovid/work/calibre/src/calibre/library/server.py:645
#: /home/kovid/work/calibre/src/calibre/library/server.py:717 #: /home/kovid/work/calibre/src/calibre/library/server.py:717
#: /home/kovid/work/calibre/src/calibre/library/server.py:764 #: /home/kovid/work/calibre/src/calibre/library/server.py:764
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:105 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:107
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77
@ -8227,10 +8227,18 @@ msgid "English (TH)"
msgstr "Englisch (TH)" msgstr "Englisch (TH)"
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:103 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:103
msgid "English (CY)"
msgstr "Englisch (CY)"
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:104
msgid "German (AT)"
msgstr "Deutsch (AT)"
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:105
msgid "Dutch (NL)" msgid "Dutch (NL)"
msgstr "Holländisch (NL)" msgstr "Holländisch (NL)"
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:104 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:106
msgid "Dutch (BE)" msgid "Dutch (BE)"
msgstr "Holländisch (BE)" msgstr "Holländisch (BE)"

View File

@ -10,14 +10,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: es\n" "Project-Id-Version: es\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-25 04:54+0000\n" "POT-Creation-Date: 2009-12-26 16:57+0000\n"
"PO-Revision-Date: 2009-12-26 01:25+0000\n" "PO-Revision-Date: 2009-12-26 16:48+0000\n"
"Last-Translator: mosteo <alejandro@mosteo.com>\n" "Last-Translator: mosteo <alejandro@mosteo.com>\n"
"Language-Team: Spanish\n" "Language-Team: Spanish\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-12-26 04:33+0000\n" "X-Launchpad-Export-Date: 2009-12-27 04:32+0000\n"
"X-Generator: Launchpad (build Unknown)\n" "X-Generator: Launchpad (build Unknown)\n"
#: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41 #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:41
@ -67,8 +67,8 @@ msgstr "No hacer nada en absoluto"
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:79 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:79
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:121 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:121
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:155 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:155
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:593 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:594
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:783 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:784
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:896 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:896
@ -135,7 +135,7 @@ msgstr "No hacer nada en absoluto"
#: /home/kovid/work/calibre/src/calibre/library/server.py:645 #: /home/kovid/work/calibre/src/calibre/library/server.py:645
#: /home/kovid/work/calibre/src/calibre/library/server.py:717 #: /home/kovid/work/calibre/src/calibre/library/server.py:717
#: /home/kovid/work/calibre/src/calibre/library/server.py:764 #: /home/kovid/work/calibre/src/calibre/library/server.py:764
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:105 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:107
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77
@ -8181,10 +8181,18 @@ msgid "English (TH)"
msgstr "Inglés (TH)" msgstr "Inglés (TH)"
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:103 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:103
msgid "English (CY)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:104
msgid "German (AT)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:105
msgid "Dutch (NL)" msgid "Dutch (NL)"
msgstr "Neerlandés (NL)" msgstr "Neerlandés (NL)"
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:104 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:106
msgid "Dutch (BE)" msgid "Dutch (BE)"
msgstr "Neerlandés (BE)" msgstr "Neerlandés (BE)"

File diff suppressed because it is too large Load Diff

View File

@ -7,14 +7,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: calibre\n" "Project-Id-Version: calibre\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n" "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-12-25 04:54+0000\n" "POT-Creation-Date: 2009-12-26 16:57+0000\n"
"PO-Revision-Date: 2009-12-25 19:14+0000\n" "PO-Revision-Date: 2009-12-26 16:50+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n" "Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: Latvian <ivars_a@inbox.lv>\n" "Language-Team: Latvian <ivars_a@inbox.lv>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-12-26 04:32+0000\n" "X-Launchpad-Export-Date: 2009-12-27 04:31+0000\n"
"X-Generator: Launchpad (build Unknown)\n" "X-Generator: Launchpad (build Unknown)\n"
"X-Poedit-Country: LATVIA\n" "X-Poedit-Country: LATVIA\n"
"X-Poedit-Language: Latvian\n" "X-Poedit-Language: Latvian\n"
@ -66,8 +66,8 @@ msgstr "Pilnīgi neko nedara"
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:79 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:79
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:121 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:121
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:155 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:155
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:593 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:594
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:783 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:784
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:896 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:896
@ -134,7 +134,7 @@ msgstr "Pilnīgi neko nedara"
#: /home/kovid/work/calibre/src/calibre/library/server.py:645 #: /home/kovid/work/calibre/src/calibre/library/server.py:645
#: /home/kovid/work/calibre/src/calibre/library/server.py:717 #: /home/kovid/work/calibre/src/calibre/library/server.py:717
#: /home/kovid/work/calibre/src/calibre/library/server.py:764 #: /home/kovid/work/calibre/src/calibre/library/server.py:764
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:105 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:107
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77
@ -7354,10 +7354,18 @@ msgid "English (TH)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:103 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:103
msgid "Dutch (NL)" msgid "English (CY)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:104 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:104
msgid "German (AT)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:105
msgid "Dutch (NL)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:106
msgid "Dutch (BE)" msgid "Dutch (BE)"
msgstr "" msgstr ""

View File

@ -6,14 +6,14 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: calibre 0.4.55\n" "Project-Id-Version: calibre 0.4.55\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-25 04:54+0000\n" "POT-Creation-Date: 2009-12-26 16:57+0000\n"
"PO-Revision-Date: 2009-12-25 19:27+0000\n" "PO-Revision-Date: 2009-12-26 16:54+0000\n"
"Last-Translator: Kovid Goyal <Unknown>\n" "Last-Translator: Kovid Goyal <Unknown>\n"
"Language-Team: American English <kde-i18n-doc@lists.kde.org>\n" "Language-Team: American English <kde-i18n-doc@lists.kde.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2009-12-26 04:32+0000\n" "X-Launchpad-Export-Date: 2009-12-27 04:31+0000\n"
"X-Generator: Launchpad (build Unknown)\n" "X-Generator: Launchpad (build Unknown)\n"
"X-Poedit-Country: RUSSIAN FEDERATION\n" "X-Poedit-Country: RUSSIAN FEDERATION\n"
"X-Poedit-Language: Russian\n" "X-Poedit-Language: Russian\n"
@ -68,8 +68,8 @@ msgstr "Ничего не делает"
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:79 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:79
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:121 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:121
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:155 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:155
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:593 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:594
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:783 #: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:784
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:49
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51 #: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:51
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:896 #: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:896
@ -136,7 +136,7 @@ msgstr "Ничего не делает"
#: /home/kovid/work/calibre/src/calibre/library/server.py:645 #: /home/kovid/work/calibre/src/calibre/library/server.py:645
#: /home/kovid/work/calibre/src/calibre/library/server.py:717 #: /home/kovid/work/calibre/src/calibre/library/server.py:717
#: /home/kovid/work/calibre/src/calibre/library/server.py:764 #: /home/kovid/work/calibre/src/calibre/library/server.py:764
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:105 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:107
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:45
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:63
#: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77 #: /home/kovid/work/calibre/src/calibre/utils/podofo/__init__.py:77
@ -7760,10 +7760,18 @@ msgid "English (TH)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:103 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:103
msgid "Dutch (NL)" msgid "English (CY)"
msgstr "" msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:104 #: /home/kovid/work/calibre/src/calibre/utils/localization.py:104
msgid "German (AT)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:105
msgid "Dutch (NL)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/localization.py:106
msgid "Dutch (BE)" msgid "Dutch (BE)"
msgstr "" msgstr ""

File diff suppressed because it is too large Load Diff