diff --git a/CHANGES.txt b/CHANGES.txt index 0a8b277..25dc20c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,11 +1,12 @@ Feb 03, 2014 - Removed support for Python 2.6. Added write support for - JP2 Palette and Component Mapping boxes, JPX Association and - NumberList boxes. Added read support for JPX free, number list, - data reference, fragment table, and fragment list boxes. Palette - box now a 2D numpy array instead of a list of 1D arrays. JP2 - super box constructors now take optional box list argument. - Fixed bug where JPX files with more than one codestream but - advertising jp2 compatibility were not being read. + JP2 DataEntryURL, Palette and Component Mapping boxes, JPX + Association and NumberList boxes. Added read support for JPX + free, number list, data reference, fragment table, and fragment + list boxes. Palette box now a 2D numpy array instead of a list + of 1D arrays. JP2 super box constructors now take optional box + list argument. Fixed bug where JPX files with more than one + codestream but advertising jp2 compatibility were not being + read. Jan 28, 2014 - v0.5.10 Fixed bad warning when reader requirements box mask length is unsupported. diff --git a/glymur/jp2box.py b/glymur/jp2box.py index ca1d973..47cfa30 100644 --- a/glymur/jp2box.py +++ b/glymur/jp2box.py @@ -2518,6 +2518,18 @@ class DataEntryURLBox(Jp2kBox): self.length = length self.offset = offset + def write(self, fptr): + """Write a data entry url box to file. + """ + length = 8 + 1 + 3 + len(self.url.encode()) + write_buffer = struct.pack('>I4sBBBB', + length, self.box_id.encode(), + self.version, + self.flag[0], self.flag[1], self.flag[2]) + fptr.write(write_buffer) + fptr.write(self.url.encode()) + + def __repr__(self): msg = "glymur.jp2box.DataEntryURLBox({0}, {1}, '{2}')" msg = msg.format(self.version, self.flag, self.url) diff --git a/glymur/test/test_jp2box.py b/glymur/test/test_jp2box.py index 0a3b24a..a4930a9 100644 --- a/glymur/test/test_jp2box.py +++ b/glymur/test/test_jp2box.py @@ -52,6 +52,34 @@ def load_tests(loader, tests, ignore): tests.addTests(doctest.DocTestSuite('glymur.jp2box')) return tests +@unittest.skipIf(os.name == "nt", "Temporary file issue on window.") +class TestDataEntryURL(unittest.TestCase): + """Test suite for DataEntryURL boxes.""" + def setUp(self): + self.jp2file = glymur.data.nemo() + + def test_basic_url(self): + """Just your most basic URL box.""" + # Wrap our j2k file in a JP2 box along with an interior url box. + jp2 = Jp2k(self.jp2file) + + url = 'http://glymur.readthedocs.org' + deurl = glymur.jp2box.DataEntryURLBox(0, (0, 0, 0), url) + boxes = [box for box in jp2.box if box.box_id != 'uuid'] + boxes.append(deurl) + with tempfile.NamedTemporaryFile(suffix=".jp2") as tfile: + jp22 = jp2.wrap(tfile.name, boxes=boxes) + import shutil + shutil.copyfile(tfile.name, '/Users/jevans/a.jp2') + + actdata = [box.box_id for box in jp22.box] + expdata = ['jP ', 'ftyp', 'jp2h', 'jp2c', 'url '] + self.assertEqual(actdata, expdata) + self.assertEqual(jp22.box[4].version, 0) + self.assertEqual(jp22.box[4].flag, (0, 0, 0)) + self.assertEqual(jp22.box[4].url, url) + + @unittest.skipIf(glymur.version.openjpeg_version_tuple[0] < 2 or OPENJP2_IS_V2_OFFICIAL, "Not supported until 2.0+.")