public void TestEmptyDocumentBug11744() { byte[] TestData = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; POIFSFileSystem fs = new POIFSFileSystem(); fs.CreateDocument(new MemoryStream(new byte[0]), "Empty"); fs.CreateDocument(new MemoryStream(TestData), "NotEmpty"); MemoryStream output = new MemoryStream(); fs.WriteFileSystem(output); // This line caused the error. fs = new POIFSFileSystem(new MemoryStream(output.ToArray())); DocumentEntry entry = (DocumentEntry)fs.Root.GetEntry("Empty"); Assert.AreEqual(0, entry.Size, "Expected zero size"); byte[] actualReadbackData; actualReadbackData = NStorage.Utility.IOUtils.ToByteArray(new DocumentInputStream(entry)); Assert.AreEqual(0, actualReadbackData.Length, "Expected zero read from stream"); entry = (DocumentEntry)fs.Root.GetEntry("NotEmpty"); actualReadbackData = NStorage.Utility.IOUtils.ToByteArray(new DocumentInputStream(entry)); Assert.AreEqual(TestData.Length, entry.Size, "Expected size was wrong"); Assert.IsTrue( Arrays.Equals(TestData, actualReadbackData), "Expected different data Read from stream"); }
public void TestDictionaryWithInvalidCodepage() { try { FileStream copy = File.Create(testContextInstance.TestDir + @"\Test-HPSF.ole2"); //copy.deleteOnExit(); /* Write: */ FileStream out1 = copy; POIFSFileSystem poiFs = new POIFSFileSystem(); MutablePropertySet ps1 = new MutablePropertySet(); MutableSection s = (MutableSection)ps1.Sections[0]; Hashtable m = new Hashtable(3, 1.0f); m[1] = "String 1"; m[2] = "String 2"; m[3] = "String 3"; s.Dictionary = (m); s.SetFormatID(SectionIDMap.DOCUMENT_SUMMARY_INFORMATION_ID1); int codepage = 12345; s.SetProperty(PropertyIDMap.PID_CODEPAGE, Variant.VT_I2, codepage); poiFs.CreateDocument(ps1.GetStream(), "Test"); poiFs.WriteFileSystem(out1); out1.Close(); Assert.Fail("This Testcase did not detect the invalid codepage value."); } catch (IllegalPropertySetDataException) { //Assert.IsTrue(true); } }
public void TestFail() { Stream is1 = HSSFTestDataSamples.OpenSampleFileStream("Simple.xls"); POIFSFileSystem fs = new POIFSFileSystem(is1); HSSFWorkbook wb = new HSSFWorkbook(fs); //set POIFS properties after constructing HSSFWorkbook //(a piece of code that used to work up to POI 3.0.2) SummaryInformation summary1 = (SummaryInformation)PropertySetFactory.Create(fs.CreateDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME)); summary1.Title = (title); //Write the modified property back to POIFS fs.Root.GetEntry(SummaryInformation.DEFAULT_STREAM_NAME).Delete(); fs.CreateDocument(summary1.ToInputStream(), SummaryInformation.DEFAULT_STREAM_NAME); //save the workbook and read the property MemoryStream out1 = new MemoryStream(); wb.Write(out1); out1.Close(); POIFSFileSystem fs2 = new POIFSFileSystem(new MemoryStream(out1.ToArray())); SummaryInformation summary2 = (SummaryInformation)PropertySetFactory.Create(fs2.CreateDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME)); //Assert.Failing assertion Assert.AreEqual(title, summary2.Title); }
public void TestOK() { Stream is1 = HSSFTestDataSamples.OpenSampleFileStream("Simple.xls"); POIFSFileSystem fs = new POIFSFileSystem(is1); //set POIFS properties before constructing HSSFWorkbook SummaryInformation summary1 = (SummaryInformation)PropertySetFactory.Create(fs.CreateDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME)); summary1.Title = (title); fs.Root.GetEntry(SummaryInformation.DEFAULT_STREAM_NAME).Delete(); fs.CreateDocument(summary1.ToInputStream(), SummaryInformation.DEFAULT_STREAM_NAME); HSSFWorkbook wb = new HSSFWorkbook(fs); MemoryStream out1 = new MemoryStream(); wb.Write(out1); out1.Close(); //read the property POIFSFileSystem fs2 = new POIFSFileSystem(new MemoryStream(out1.ToArray())); SummaryInformation summary2 = (SummaryInformation)PropertySetFactory.Create(fs2.CreateDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME)); Assert.AreEqual(title, summary2.Title); }
public void TestDictionaryWithInvalidCodepage() { try { using (FileStream copy = File.Create(@".\Test-HPSF.ole2")) { /* Write: */ POIFSFileSystem poiFs = new POIFSFileSystem(); MutablePropertySet ps1 = new MutablePropertySet(); MutableSection s = (MutableSection)ps1.Sections[0]; Hashtable m = new Hashtable(3, 1.0f); m[1] = "String 1"; m[2] = "String 2"; m[3] = "String 3"; s.Dictionary = m; s.SetFormatID(SectionIDMap.DOCUMENT_SUMMARY_INFORMATION_ID1); s.SetProperty(PropertyIDMap.PID_CODEPAGE, Variant.VT_I2, 12345); poiFs.CreateDocument(ps1.GetStream(), "Test"); poiFs.WriteFileSystem(copy); Assert.Fail("This Testcase did not detect the invalid codepage value."); } } catch (IllegalPropertySetDataException) { //Assert.IsTrue(true); } if (File.Exists(@".\Test-HPSF.ole2")) { File.Delete(@".\Test-HPSF.ole2"); } }
public void TestWriteEmptyPropertySet() { FileStream file = _samples.GetFile(POI_FS); //filename.deleteOnExit(); /* Create a mutable property Set and Write it to a POIFS: */ FileStream out1 = file; POIFSFileSystem poiFs = new POIFSFileSystem(); MutablePropertySet ps = new MutablePropertySet(); MutableSection s = (MutableSection)ps.Sections[0]; s.SetFormatID(SectionIDMap.SUMMARY_INFORMATION_ID); MemoryStream psStream = new MemoryStream(); ps.Write(psStream); psStream.Close(); byte[] streamData = psStream.ToArray(); poiFs.CreateDocument(new MemoryStream(streamData), SummaryInformation.DEFAULT_STREAM_NAME); poiFs.WriteFileSystem(out1); //out1.Close(); file.Position = 0; /* Read the POIFS: */ POIFSReader reader3 = new POIFSReader(); reader3.StreamReaded += new POIFSReaderEventHandler(reader3_StreamReaded); reader3.Read(file); file.Close(); //File.Delete(dataDir + POI_FS); }
public void TestCopyRecursively() { POIFSFileSystem fsD = new POIFSFileSystem(); POIFSFileSystem fs = new POIFSFileSystem(); DirectoryEntry dirA = fs.CreateDirectory("DirA"); DirectoryEntry dirB = fs.CreateDirectory("DirB"); DocumentEntry entryR = fs.CreateDocument(new ByteArrayInputStream(dataSmallA), "EntryRoot"); DocumentEntry entryA1 = dirA.CreateDocument("EntryA1", new ByteArrayInputStream(dataSmallA)); DocumentEntry entryA2 = dirA.CreateDocument("EntryA2", new ByteArrayInputStream(dataSmallB)); // Copy docs Assert.AreEqual(0, fsD.Root.EntryCount); EntryUtils.CopyNodeRecursively(entryR, fsD.Root); Assert.AreEqual(1, fsD.Root.EntryCount); Assert.IsNotNull(fsD.Root.GetEntry("EntryRoot")); EntryUtils.CopyNodeRecursively(entryA1, fsD.Root); Assert.AreEqual(2, fsD.Root.EntryCount); Assert.IsNotNull(fsD.Root.GetEntry("EntryRoot")); Assert.IsNotNull(fsD.Root.GetEntry("EntryA1")); EntryUtils.CopyNodeRecursively(entryA2, fsD.Root); Assert.AreEqual(3, fsD.Root.EntryCount); Assert.IsNotNull(fsD.Root.GetEntry("EntryRoot")); Assert.IsNotNull(fsD.Root.GetEntry("EntryA1")); Assert.IsNotNull(fsD.Root.GetEntry("EntryA2")); // Copy directories fsD = new POIFSFileSystem(); Assert.AreEqual(0, fsD.Root.EntryCount); EntryUtils.CopyNodeRecursively(dirB, fsD.Root); Assert.AreEqual(1, fsD.Root.EntryCount); Assert.IsNotNull(fsD.Root.GetEntry("DirB")); Assert.AreEqual(0, ((DirectoryEntry)fsD.Root.GetEntry("DirB")).EntryCount); EntryUtils.CopyNodeRecursively(dirA, fsD.Root); Assert.AreEqual(2, fsD.Root.EntryCount); Assert.IsNotNull(fsD.Root.GetEntry("DirB")); Assert.AreEqual(0, ((DirectoryEntry)fsD.Root.GetEntry("DirB")).EntryCount); Assert.IsNotNull(fsD.Root.GetEntry("DirA")); Assert.AreEqual(2, ((DirectoryEntry)fsD.Root.GetEntry("DirA")).EntryCount); // Copy the whole lot fsD = new POIFSFileSystem(); Assert.AreEqual(0, fsD.Root.EntryCount); EntryUtils.CopyNodes(fs, fsD, new List <String>()); Assert.AreEqual(3, fsD.Root.EntryCount); Assert.IsNotNull(fsD.Root.GetEntry(dirA.Name)); Assert.IsNotNull(fsD.Root.GetEntry(dirB.Name)); Assert.IsNotNull(fsD.Root.GetEntry(entryR.Name)); Assert.AreEqual(0, ((DirectoryEntry)fsD.Root.GetEntry("DirB")).EntryCount); Assert.AreEqual(2, ((DirectoryEntry)fsD.Root.GetEntry("DirA")).EntryCount); }
public void TestWriteSimplePropertySet() { String AUTHOR = "Rainer Klute"; String TITLE = "Test Document"; FileInfo fi = TempFile.CreateTempFile(POI_FS, ".doc"); FileStream file = new FileStream(fi.FullName, FileMode.Open, FileAccess.ReadWrite); FileStream out1 = file; POIFSFileSystem poiFs = new POIFSFileSystem(); MutablePropertySet ps = new MutablePropertySet(); MutableSection si = new MutableSection(); si.SetFormatID(SectionIDMap.SUMMARY_INFORMATION_ID); ps.Sections[0] = si; MutableProperty p = new MutableProperty(); p.ID = PropertyIDMap.PID_AUTHOR; p.Type = Variant.VT_LPWSTR; p.Value = AUTHOR; si.SetProperty(p); si.SetProperty(PropertyIDMap.PID_TITLE, Variant.VT_LPSTR, TITLE); poiFs.CreateDocument(ps.ToInputStream(), SummaryInformation.DEFAULT_STREAM_NAME); poiFs.WriteFileSystem(out1); poiFs.Close(); //out1.Close(); file.Position = 0; POIFSReader reader1 = new POIFSReader(); //reader1.StreamReaded += new POIFSReaderEventHandler(reader1_StreamReaded); POIFSReaderListener1 psl = new POIFSReaderListener1(); reader1.RegisterListener(psl); reader1.Read(file); Assert.IsNotNull(psa[0]); Assert.IsTrue(psa[0].IsSummaryInformation); Section s = (Section)(psa[0].Sections[0]); Object p1 = s.GetProperty(PropertyIDMap.PID_AUTHOR); Object p2 = s.GetProperty(PropertyIDMap.PID_TITLE); Assert.AreEqual(AUTHOR, p1); Assert.AreEqual(TITLE, p2); file.Close(); try { File.Delete(fi.FullName); } catch { } }
public void TestWriteTwoSections() { String STREAM_NAME = "PropertySetStream"; String SECTION1 = "Section 1"; String SECTION2 = "Section 2"; FileStream file = _samples.GetFile(POI_FS); //filename.deleteOnExit(); FileStream out1 = file; POIFSFileSystem poiFs = new POIFSFileSystem(); MutablePropertySet ps = new MutablePropertySet(); ps.ClearSections(); ClassID formatID = new ClassID(); formatID.Bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; MutableSection s1 = new MutableSection(); s1.SetFormatID(formatID); s1.SetProperty(2, SECTION1); ps.AddSection(s1); MutableSection s2 = new MutableSection(); s2.SetFormatID(formatID); s2.SetProperty(2, SECTION2); ps.AddSection(s2); poiFs.CreateDocument(ps.GetStream(), STREAM_NAME); poiFs.WriteFileSystem(out1); //out1.Close(); /* Read the POIFS: */ psa = new PropertySet[1]; POIFSReader reader2 = new POIFSReader(); reader2.StreamReaded += new POIFSReaderEventHandler(reader2_StreamReaded); reader2.Read(file); Assert.IsNotNull(psa[0]); Section s = (Section)(psa[0].Sections[0]); Assert.AreEqual(s.FormatID, formatID); Object p = s.GetProperty(2); Assert.AreEqual(SECTION1, p); s = (Section)(psa[0].Sections[1]); p = s.GetProperty(2); Assert.AreEqual(SECTION2, p); file.Close(); //File.Delete(dataDir + POI_FS); }
/** * Decrypt the Document-/SummaryInformation and other optionally streams. * Opposed to other crypto modes, cryptoapi is record based and can't be used * to stream-decrypt a whole file * * @see <a href="http://msdn.microsoft.com/en-us/library/dd943321(v=office.12).aspx">2.3.5.4 RC4 CryptoAPI Encrypted Summary Stream</a> */ public override InputStream GetDataStream(DirectoryNode dir) { POIFSFileSystem fsOut = new POIFSFileSystem(); DocumentNode es = (DocumentNode)dir.GetEntry("EncryptedSummary"); DocumentInputStream dis = dir.CreateDocumentInputStream(es); MemoryStream bos = new MemoryStream(); IOUtils.Copy(dis, bos); dis.Close(); SeekableMemoryStream sbis = new SeekableMemoryStream(bos.ToArray()); LittleEndianInputStream leis = new LittleEndianInputStream(sbis); int streamDescriptorArrayOffset = (int)leis.ReadUInt(); int streamDescriptorArraySize = (int)leis.ReadUInt(); sbis.Seek(streamDescriptorArrayOffset - 8, SeekOrigin.Current);// sbis.Skip(streamDescriptorArrayOffset - 8); sbis.SetBlock(0); int encryptedStreamDescriptorCount = (int)leis.ReadUInt(); StreamDescriptorEntry[] entries = new StreamDescriptorEntry[encryptedStreamDescriptorCount]; for (int i = 0; i < encryptedStreamDescriptorCount; i++) { StreamDescriptorEntry entry = new StreamDescriptorEntry(); entries[i] = entry; entry.streamOffset = (int)leis.ReadUInt(); entry.streamSize = (int)leis.ReadUInt(); entry.block = leis.ReadUShort(); int nameSize = leis.ReadUByte(); entry.flags = leis.ReadUByte(); bool IsStream = StreamDescriptorEntry.flagStream.IsSet(entry.flags); entry.reserved2 = leis.ReadInt(); entry.streamName = StringUtil.ReadUnicodeLE(leis, nameSize); leis.ReadShort(); Debug.Assert(entry.streamName.Length == nameSize); } foreach (StreamDescriptorEntry entry in entries) { sbis.Seek(entry.streamOffset); sbis.SetBlock(entry.block); Stream is1 = new BufferedStream(sbis, entry.streamSize); fsOut.CreateDocument(is1, entry.streamName); } leis.Close(); sbis = null; bos.Seek(0, SeekOrigin.Begin); //bos.Reset(); fsOut.WriteFileSystem(bos); _length = bos.Length; ByteArrayInputStream bis = new ByteArrayInputStream(bos.ToArray()); throw new NotImplementedException("ByteArrayInputStream should be derived from InputStream"); }
/** * Performs the check described in {@link #TestReCreate()} for a single * POI filesystem. * * @param f the POI filesystem to check */ private void TestRecreate(FileInfo f) { Console.WriteLine("Recreating file \"" + f.Name + "\""); /* Read the POI filesystem's property Set streams: */ POIFile[] psf1 = Util.ReadPropertySets(f); /* Create a new POI filesystem containing the origin file's * property Set streams: */ FileInfo copy = TempFile.CreateTempFile(f.Name, ""); //File.Create(Path.Combine(TestContext.CurrentContext.TestDirectory,f.Name)); //copy.deleteOnExit(); FileStream out1 = copy.OpenWrite(); POIFSFileSystem poiFs = new POIFSFileSystem(); for (int i = 0; i < psf1.Length; i++) { Stream in1 = new ByteArrayInputStream(psf1[i].GetBytes()); PropertySet psIn = PropertySetFactory.Create(in1); MutablePropertySet psOut = new MutablePropertySet(psIn); MemoryStream psStream = new MemoryStream(); psOut.Write(psStream); psStream.Close(); byte[] streamData = psStream.ToArray(); poiFs.CreateDocument(new ByteArrayInputStream(streamData), psf1[i].GetName()); poiFs.WriteFileSystem(out1); } poiFs.Close(); out1.Close(); /* Read the property Set streams from the POI filesystem just * Created. */ POIFile[] psf2 = Util.ReadPropertySets(copy); for (int i = 0; i < psf2.Length; i++) { byte[] bytes1 = psf1[i].GetBytes(); byte[] bytes2 = psf2[i].GetBytes(); Stream in1 = new ByteArrayInputStream(bytes1); Stream in2 = new ByteArrayInputStream(bytes2); PropertySet ps1 = PropertySetFactory.Create(in1); PropertySet ps2 = PropertySetFactory.Create(in2); /* Compare the property Set stream with the corresponding one * from the origin file and check whether they are equal. */ Assert.AreEqual(ps1, ps2, "Equality for file " + f.Name); } out1.Close(); }
public void TestNonZeroPadding_bug46987() { Record[] recs = { new BOFRecord(), new WriteAccessRecord(), // need *something* between BOF and EOF EOFRecord.instance, BOFRecord.CreateSheetBOF(), EOFRecord.instance, }; MemoryStream baos = new MemoryStream(); for (int i = 0; i < recs.Length; i++) { byte[] data = recs[i].Serialize(); baos.Write(data, 0, data.Length); } //simulate the bad padding at the end of the workbook stream in attachment 23483 of bug 46987 baos.WriteByte(0x00); baos.WriteByte(0x11); baos.WriteByte(0x00); baos.WriteByte(0x02); for (int i = 0; i < 192; i++) { baos.WriteByte(0x00); } POIFSFileSystem fs = new POIFSFileSystem(); Stream is1; fs.CreateDocument(new MemoryStream(baos.ToArray()), "dummy"); is1 = fs.Root.CreatePOIFSDocumentReader("dummy"); List <Record> outRecs; try { outRecs = RecordFactory.CreateRecords(is1); } catch (Exception e) { if (e.Message.Equals("Buffer underrun - requested 512 bytes but 192 was available")) { throw new AssertionException("Identified bug 46987"); } throw e; } Assert.AreEqual(5, outRecs.Count); }
/** * Performs the check described in {@link #TestReCreate()} for a single * POI filesystem. * * @param f the POI filesystem to check */ private void TestRecreate(FileStream f) { Console.WriteLine("Recreating file \"" + f + "\""); /* Read the POI filesystem's property Set streams: */ POIFile[] psf1 = Util.ReadPropertySets(f); /* Create a new POI filesystem containing the origin file's * property Set streams: */ FileInfo fi = new FileInfo(f.Name); FileStream copy = File.Create(testContextInstance.TestDir + "\\" + fi.Name); //copy.deleteOnExit(); FileStream out1 = copy; POIFSFileSystem poiFs = new POIFSFileSystem(); for (int i = 0; i < psf1.Length; i++) { Stream in1 = new MemoryStream(psf1[i].GetBytes()); PropertySet psIn = PropertySetFactory.Create(in1); MutablePropertySet psOut = new MutablePropertySet(psIn); MemoryStream psStream = new MemoryStream(); psOut.Write(psStream); psStream.Close(); byte[] streamData = psStream.ToArray(); poiFs.CreateDocument(new MemoryStream(streamData), psf1[i].GetName()); poiFs.WriteFileSystem(out1); } /* Read the property Set streams from the POI filesystem just * Created. */ POIFile[] psf2 = Util.ReadPropertySets(copy); for (int i = 0; i < psf2.Length; i++) { byte[] bytes1 = psf1[i].GetBytes(); byte[] bytes2 = psf2[i].GetBytes(); Stream in1 = new MemoryStream(bytes1); Stream in2 = new MemoryStream(bytes2); PropertySet ps1 = PropertySetFactory.Create(in1); PropertySet ps2 = PropertySetFactory.Create(in2); /* Compare the property Set stream with the corresponding one * from the origin file and check whether they are equal. */ Assert.IsTrue(ps1.Equals(ps2)); } out1.Close(); }
public void TestWithoutAFormatID() { FileInfo fi = TempFile.CreateTempFile(POI_FS, ".doc"); using (FileStream file = new FileStream(fi.FullName, FileMode.Open, FileAccess.ReadWrite)) { //FileStream filename = File.OpenRead(dataDir + POI_FS); //filename.deleteOnExit(); /* Create a mutable property Set with a section that does not have the * formatID Set: */ FileStream out1 = file; POIFSFileSystem poiFs = new POIFSFileSystem(); MutablePropertySet ps = new MutablePropertySet(); ps.ClearSections(); ps.AddSection(new MutableSection()); /* Write it to a POIFS and the latter to disk: */ try { MemoryStream psStream = new MemoryStream(); ps.Write(psStream); psStream.Close(); byte[] streamData = psStream.ToArray(); poiFs.CreateDocument(new MemoryStream(streamData), SummaryInformation.DEFAULT_STREAM_NAME); poiFs.WriteFileSystem(out1); out1.Close(); Assert.Fail("Should have thrown a NoFormatIDException."); } catch (Exception ex) { Assert.IsTrue(ex is NoFormatIDException); } finally { poiFs.Close(); out1.Close(); } } try { File.Delete(fi.FullName); } catch { } }
/// <summary> /// Writes out a given ProperySet /// </summary> /// <param name="name">the (POIFS Level) name of the property to Write.</param> /// <param name="Set">the PropertySet to Write out.</param> /// <param name="outFS">the POIFSFileSystem to Write the property into.</param> protected void WritePropertySet(String name, PropertySet Set, POIFSFileSystem outFS) { try { MutablePropertySet mSet = new MutablePropertySet(Set); MemoryStream bOut = new MemoryStream(); mSet.Write(bOut); byte[] data = bOut.ToArray(); MemoryStream bIn = new MemoryStream(data); outFS.CreateDocument(bIn, name); //logger.Log(POILogger.INFO, "Wrote property Set " + name + " of size " + data.Length); } catch (WritingNotSupportedException) { Console.Error.WriteLine("Couldn't Write property Set with name " + name + " as not supported by HPSF yet"); } }
public void TestDictionary() { FileStream copy = File.Create(testContextInstance.TestDir + @"\Test-HPSF.ole2"); //copy.deleteOnExit(); /* Write: */ FileStream out1 = copy; POIFSFileSystem poiFs = new POIFSFileSystem(); MutablePropertySet ps1 = new MutablePropertySet(); MutableSection s = (MutableSection)ps1.Sections[0]; Hashtable m = new Hashtable(3, 1.0f); m[1] = "String 1"; m[2] = "String 2"; m[3] = "String 3"; s.Dictionary = (m); s.SetFormatID(SectionIDMap.DOCUMENT_SUMMARY_INFORMATION_ID1); int codepage = (int)Constants.CP_UNICODE; s.SetProperty(PropertyIDMap.PID_CODEPAGE, Variant.VT_I2, codepage); poiFs.CreateDocument(ps1.GetStream(), "Test"); poiFs.WriteFileSystem(out1); /* Read back: */ POIFile[] psf = Util.ReadPropertySets(copy); Assert.AreEqual(1, psf.Length); byte[] bytes = psf[0].GetBytes(); Stream in1 = new MemoryStream(bytes); PropertySet ps2 = PropertySetFactory.Create(in1); /* Check if the result is a DocumentSummaryInformation stream, as * specified. */ Assert.IsTrue(ps2.IsDocumentSummaryInformation); /* Compare the property Set stream with the corresponding one * from the origin file and check whether they are equal. */ Assert.IsTrue(ps1.Equals(ps2)); out1.Close(); copy.Close(); File.Delete(testContextInstance.TestDir + @"\Test-HPSF.ole2"); }
public void TestDictionary() { using (FileStream copy = File.Create(@".\Test-HPSF.ole2")) { /* Write: */ POIFSFileSystem poiFs = new POIFSFileSystem(); MutablePropertySet ps1 = new MutablePropertySet(); MutableSection s = (MutableSection)ps1.Sections[0]; Dictionary <object, object> m = new Dictionary <object, object>(3); m[1] = "String 1"; m[2] = "String 2"; m[3] = "String 3"; s.Dictionary = (m); s.SetFormatID(SectionIDMap.DOCUMENT_SUMMARY_INFORMATION_ID1); int codepage = CodePageUtil.CP_UNICODE; s.SetProperty(PropertyIDMap.PID_CODEPAGE, Variant.VT_I2, codepage); poiFs.CreateDocument(ps1.ToInputStream(), "Test"); poiFs.WriteFileSystem(copy); /* Read back: */ POIFile[] psf = Util.ReadPropertySets(copy); Assert.AreEqual(1, psf.Length); byte[] bytes = psf[0].GetBytes(); Stream in1 = new ByteArrayInputStream(bytes); PropertySet ps2 = PropertySetFactory.Create(in1); /* Check if the result is a DocumentSummaryInformation stream, as * specified. */ Assert.IsTrue(ps2.IsDocumentSummaryInformation); /* Compare the property Set stream with the corresponding one * from the origin file and check whether they are equal. */ Assert.IsTrue(ps1.Equals(ps2)); } if (File.Exists(@".\Test-HPSF.ole2")) { File.Delete(@".\Test-HPSF.ole2"); } }
public void TestDictionaryWithInvalidCodepage() { using (FileStream copy = File.Create(@".\Test-HPSF.ole2")) { /* Write: */ POIFSFileSystem poiFs = new POIFSFileSystem(); MutablePropertySet ps1 = new MutablePropertySet(); MutableSection s = (MutableSection)ps1.Sections[0]; Hashtable m = new Hashtable(3, 1.0f); m[1] = "String 1"; m[2] = "String 2"; m[3] = "String 3"; try { Assert.Throws <IllegalPropertySetDataException>(() => { s.Dictionary = m; s.SetFormatID(SectionIDMap.DOCUMENT_SUMMARY_INFORMATION_ID1); s.SetProperty(PropertyIDMap.PID_CODEPAGE, Variant.VT_I2, 12345); poiFs.CreateDocument(ps1.ToInputStream(), "Test"); poiFs.WriteFileSystem(copy); }); } finally { poiFs.Close(); } } if (File.Exists(@".\Test-HPSF.ole2")) { File.Delete(@".\Test-HPSF.ole2"); } }
/** * Writes out the word file that is represented by an instance of this class. * * @param out The OutputStream to write to. * @throws IOException If there is an unexpected IOException from the passed * in OutputStream. */ public override void Write(Stream out1) { // Initialize our streams for writing. HWPFFileSystem docSys = new HWPFFileSystem(); HWPFStream mainStream = docSys.GetStream("WordDocument"); HWPFStream tableStream = docSys.GetStream("1Table"); //HWPFOutputStream dataStream = docSys.GetStream("Data"); int tableOffset = 0; // FileInformationBlock fib = (FileInformationBlock)_fib.Clone(); // clear the offSets and sizes in our FileInformationBlock. _fib.ClearOffsetsSizes(); // determine the FileInformationBLock size int fibSize = _fib.GetSize(); fibSize += POIFSConstants.SMALLER_BIG_BLOCK_SIZE - (fibSize % POIFSConstants.SMALLER_BIG_BLOCK_SIZE); // preserve space for the FileInformationBlock because we will be writing // it after we write everything else. byte[] placeHolder = new byte[fibSize]; mainStream.Write(placeHolder); int mainOffset = mainStream.Offset; // write out the StyleSheet. _fib.SetFcStshf(tableOffset); _ss.WriteTo(tableStream); _fib.SetLcbStshf(tableStream.Offset - tableOffset); tableOffset = tableStream.Offset; // get fcMin and fcMac because we will be writing the actual text with the // complex table. int fcMin = mainOffset; // write out the Complex table, includes text. _fib.SetFcClx(tableOffset); _cft.WriteTo(mainStream, tableStream); _fib.SetLcbClx(tableStream.Offset - tableOffset); tableOffset = tableStream.Offset; int fcMac = mainStream.Offset; // write out the CHPBinTable. _fib.SetFcPlcfbteChpx(tableOffset); _cbt.WriteTo(docSys, fcMin); _fib.SetLcbPlcfbteChpx(tableStream.Offset - tableOffset); tableOffset = tableStream.Offset; // write out the PAPBinTable. _fib.SetFcPlcfbtePapx(tableOffset); _pbt.WriteTo(mainStream, tableStream, _cft.GetTextPieceTable()); _fib.SetLcbPlcfbtePapx(tableStream.Offset - tableOffset); tableOffset = tableStream.Offset; /* * plcfendRef (endnote reference position table) Written immediately * after the previously recorded table if the document contains endnotes * * plcfendTxt (endnote text position table) Written immediately after * the plcfendRef if the document contains endnotes * * Microsoft Office Word 97-2007 Binary File Format (.doc) * Specification; Page 24 of 210 */ _endnotesTables.WriteRef(_fib, tableStream); _endnotesTables.WriteTxt(_fib, tableStream); tableOffset = tableStream.Offset; /* * plcffndRef (footnote reference position table) Written immediately * after the stsh if the document contains footnotes * * plcffndTxt (footnote text position table) Written immediately after * the plcffndRef if the document contains footnotes * * Microsoft Office Word 97-2007 Binary File Format (.doc) * Specification; Page 24 of 210 */ _footnotesTables.WriteRef(_fib, tableStream); _footnotesTables.WriteTxt(_fib, tableStream); tableOffset = tableStream.Offset; // write out the SectionTable. _fib.SetFcPlcfsed(tableOffset); _st.WriteTo(docSys, fcMin); _fib.SetLcbPlcfsed(tableStream.Offset - tableOffset); tableOffset = tableStream.Offset; // write out the list tables if (_lt != null) { _fib.SetFcPlcfLst(tableOffset); _lt.WriteListDataTo(tableStream); _fib.SetLcbPlcfLst(tableStream.Offset - tableOffset); } /* * plflfo (more list formats) Written immediately after the end of the * plcflst and its accompanying data, if there are any lists defined in * the document. This consists first of a PL of LFO records, followed by * the allocated data (if any) hanging off the LFOs. The allocated data * consists of the array of LFOLVLFs for each LFO (and each LFOLVLF is * immediately followed by some LVLs). * * Microsoft Office Word 97-2007 Binary File Format (.doc) * Specification; Page 26 of 210 */ if (_lt != null) { _fib.SetFcPlfLfo(tableStream.Offset); _lt.WriteListOverridesTo(tableStream); _fib.SetLcbPlfLfo(tableStream.Offset - tableOffset); tableOffset = tableStream.Offset; } /* * sttbfBkmk (table of bookmark name strings) Written immediately after * the previously recorded table, if the document contains bookmarks. * * Microsoft Office Word 97-2007 Binary File Format (.doc) * Specification; Page 27 of 210 */ if (_bookmarksTables != null) { _bookmarksTables.WriteSttbfBkmk(_fib, tableStream); tableOffset = tableStream.Offset; } // write out the saved-by table. if (_sbt != null) { _fib.SetFcSttbSavedBy(tableOffset); _sbt.WriteTo(tableStream); _fib.SetLcbSttbSavedBy(tableStream.Offset - tableOffset); tableOffset = tableStream.Offset; } // write out the revision mark authors table. if (_rmat != null) { _fib.SetFcSttbfRMark(tableOffset); _rmat.WriteTo(tableStream); _fib.SetLcbSttbfRMark(tableStream.Offset - tableOffset); tableOffset = tableStream.Offset; } // write out the FontTable. _fib.SetFcSttbfffn(tableOffset); _ft.WriteTo(docSys); _fib.SetLcbSttbfffn(tableStream.Offset - tableOffset); tableOffset = tableStream.Offset; // write out the DocumentProperties. _fib.SetFcDop(tableOffset); byte[] buf = new byte[_dop.GetSize()]; _fib.SetLcbDop(_dop.GetSize()); _dop.Serialize(buf, 0); tableStream.Write(buf); // set some variables in the FileInformationBlock. _fib.SetFcMin(fcMin); _fib.SetFcMac(fcMac); _fib.SetCbMac(mainStream.Offset); // make sure that the table, doc and data streams use big blocks. byte[] mainBuf = mainStream.ToArray(); if (mainBuf.Length < 4096) { byte[] tempBuf = new byte[4096]; Array.Copy(mainBuf, 0, tempBuf, 0, mainBuf.Length); mainBuf = tempBuf; } // write out the FileInformationBlock. //_fib.Serialize(mainBuf, 0); _fib.WriteTo(mainBuf, tableStream); byte[] tableBuf = tableStream.ToArray(); if (tableBuf.Length < 4096) { byte[] tempBuf = new byte[4096]; Array.Copy(tableBuf, 0, tempBuf, 0, tableBuf.Length); tableBuf = tempBuf; } byte[] dataBuf = _dataStream; if (dataBuf == null) { dataBuf = new byte[4096]; } if (dataBuf.Length < 4096) { byte[] tempBuf = new byte[4096]; Array.Copy(dataBuf, 0, tempBuf, 0, dataBuf.Length); dataBuf = tempBuf; } // spit out the Word document. POIFSFileSystem pfs = new POIFSFileSystem(); pfs.CreateDocument(new MemoryStream(mainBuf), "WordDocument"); pfs.CreateDocument(new MemoryStream(tableBuf), "1Table"); pfs.CreateDocument(new MemoryStream(dataBuf), "Data"); WriteProperties(pfs); pfs.WriteFileSystem(out1); }