Skip to content

Commit 8b8c3fc

Browse files
lowellstewartAndrei AtanasiuMarkus Rudolph
authored
Master (#2)
* Merge Himanshu's fix into the repository: https://github.com/EricWhiteDev/Open-Xml-PowerTools/pull/15/files * Dispose opened stream * Fix similar bugs * Closed further leaks --------- Co-authored-by: Andrei Atanasiu <[email protected]> Co-authored-by: Markus Rudolph <[email protected]>
1 parent 0d34148 commit 8b8c3fc

File tree

3 files changed

+73
-20
lines changed

3 files changed

+73
-20
lines changed

OpenXmlPowerTools/ChartUpdater.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,8 @@ private static void UpdateEmbeddedWorkbook(ChartPart chartPart, ChartData chartD
400400
var embeddedSpreadsheet = chartPart.GetPartById(embeddedSpreadsheetRid);
401401
if (embeddedSpreadsheet != null)
402402
{
403-
using (SpreadsheetDocument sDoc = SpreadsheetDocument.Open(embeddedSpreadsheet.GetStream(), true))
403+
using (Stream spreadsheetStream = embeddedSpreadsheet.GetStream())
404+
using (SpreadsheetDocument sDoc = SpreadsheetDocument.Open(spreadsheetStream, true))
404405
{
405406
var workbookPart = sDoc.WorkbookPart;
406407
var wbRoot = workbookPart.GetXDocument().Root;

OpenXmlPowerTools/PresentationBuilder.cs

Lines changed: 65 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,10 @@ private static void CopyPresentationParts(PresentationDocument sourceDocument, P
336336
foreach (var legacyDocTextInfo in sourceDocument.PresentationPart.Parts.Where(p => p.OpenXmlPart.RelationshipType == "http://schemas.microsoft.com/office/2006/relationships/legacyDocTextInfo"))
337337
{
338338
LegacyDiagramTextInfoPart newPart = newDocument.PresentationPart.AddNewPart<LegacyDiagramTextInfoPart>();
339-
newPart.FeedData(legacyDocTextInfo.OpenXmlPart.GetStream());
339+
using (var stream = legacyDocTextInfo.OpenXmlPart.GetStream())
340+
{
341+
newPart.FeedData(stream);
342+
}
340343
}
341344

342345
var listOfRootChildren = newPresentation.Root.Elements().ToList();
@@ -383,7 +386,10 @@ private static XElement CreatedEmbeddedFontPart(PresentationDocument sourceDocum
383386
fpt = FontPartType.FontOdttf;
384387
var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
385388
var newFontPart = newDocument.PresentationPart.AddFontPart(fpt, newId);
386-
newFontPart.FeedData(oldFontPart.GetStream());
389+
using (var stream = oldFontPart.GetStream())
390+
{
391+
newFontPart.FeedData(stream);
392+
}
387393
newRegular = new XElement(fontXName,
388394
new XAttribute(R.id, newId));
389395
return newRegular;
@@ -931,12 +937,18 @@ private static void CopyRelatedPartsForContentParts(PresentationDocument newDocu
931937
if (oldPartIdPair9 != null)
932938
{
933939
CustomXmlPart newPart = newDocument.PresentationPart.AddCustomXmlPart(CustomXmlPartType.CustomXml);
934-
newPart.FeedData(oldPartIdPair9.OpenXmlPart.GetStream());
940+
using (var stream = oldPartIdPair9.OpenXmlPart.GetStream())
941+
{
942+
newPart.FeedData(stream);
943+
}
935944
foreach (var itemProps in oldPartIdPair9.OpenXmlPart.Parts.Where(p => p.OpenXmlPart.ContentType == "application/vnd.openxmlformats-officedocument.customXmlProperties+xml"))
936945
{
937946
var newId2 = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
938947
CustomXmlPropertiesPart cxpp = newPart.AddNewPart<CustomXmlPropertiesPart>("application/vnd.openxmlformats-officedocument.customXmlProperties+xml", newId2);
939-
cxpp.FeedData(itemProps.OpenXmlPart.GetStream());
948+
using (var stream = itemProps.OpenXmlPart.GetStream())
949+
{
950+
cxpp.FeedData(stream);
951+
}
940952
}
941953
var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
942954
newContentPart.CreateRelationshipToPart(newPart, newId);
@@ -1057,6 +1069,21 @@ private static void CopyChartObjects(ChartPart oldChart, ChartPart newChart)
10571069
dataReference.Attribute(R.id).Value = newChart.GetIdOfPart(newPart);
10581070
continue;
10591071
}
1072+
ExtendedPart extendedPart = oldPartIdPair.OpenXmlPart as ExtendedPart;
1073+
if (extendedPart != null)
1074+
{
1075+
ExtendedPart newPart = newChart.AddExtendedPart(extendedPart.RelationshipType, extendedPart.ContentType, ".dat");
1076+
using (Stream oldObject = extendedPart.GetStream(FileMode.Open, FileAccess.Read))
1077+
using (Stream newObject = newPart.GetStream(FileMode.Create, FileAccess.ReadWrite))
1078+
{
1079+
int byteCount;
1080+
byte[] buffer = new byte[65536];
1081+
while ((byteCount = oldObject.Read(buffer, 0, 65536)) != 0)
1082+
newObject.Write(buffer, 0, byteCount);
1083+
}
1084+
dataReference.Attribute(R.id).Value = newChart.GetIdOfPart(newPart);
1085+
continue;
1086+
}
10601087
EmbeddedObjectPart oldEmbeddedObjectPart = oldPartIdPair.OpenXmlPart as EmbeddedObjectPart;
10611088
if (oldEmbeddedObjectPart != null)
10621089
{
@@ -1350,7 +1377,10 @@ private static void CopyRelatedMedia(OpenXmlPart oldContentPart, OpenXmlPart new
13501377
var ct = oldPart.ContentType;
13511378
var ext = Path.GetExtension(oldPart.Uri.OriginalString);
13521379
MediaDataPart newPart = newContentPart.OpenXmlPackage.CreateMediaDataPart(ct, ext);
1353-
newPart.FeedData(oldPart.GetStream());
1380+
using (var stream = oldPart.GetStream())
1381+
{
1382+
newPart.FeedData(stream);
1383+
}
13541384
string id = null;
13551385
string relationshipType = null;
13561386

@@ -1490,7 +1520,10 @@ private static void CopyInkPart(OpenXmlPart oldContentPart, OpenXmlPart newConte
14901520
var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
14911521
CustomXmlPart newPart = newContentPart.AddNewPart<CustomXmlPart>("application/inkml+xml", newId);
14921522

1493-
newPart.FeedData(oldPart.GetStream());
1523+
using (var stream = oldPart.GetStream())
1524+
{
1525+
newPart.FeedData(stream);
1526+
}
14941527
contentPartReference.Attribute(attributeName).Value = newId;
14951528
}
14961529

@@ -1508,8 +1541,11 @@ private static void CopyActiveXPart(OpenXmlPart oldContentPart, OpenXmlPart newC
15081541

15091542
var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
15101543
EmbeddedControlPersistencePart newPart = newContentPart.AddNewPart<EmbeddedControlPersistencePart>("application/vnd.ms-office.activeX+xml", newId);
1511-
1512-
newPart.FeedData(oldPart.GetStream());
1544+
1545+
using (var stream = oldPart.GetStream())
1546+
{
1547+
newPart.FeedData(stream);
1548+
}
15131549
activeXPartReference.Attribute(attributeName).Value = newId;
15141550

15151551
if (newPart.ContentType == "application/vnd.ms-office.activeX+xml")
@@ -1521,8 +1557,11 @@ private static void CopyActiveXPart(OpenXmlPart oldContentPart, OpenXmlPart newC
15211557

15221558
var newId2 = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
15231559
EmbeddedControlPersistenceBinaryDataPart newPersistencePart = newPart.AddNewPart<EmbeddedControlPersistenceBinaryDataPart>("application/vnd.ms-office.activeX", newId2);
1524-
1525-
newPersistencePart.FeedData(oldPersistencePart.GetStream());
1560+
1561+
using (var stream = oldPersistencePart.GetStream())
1562+
{
1563+
newPersistencePart.FeedData(stream);
1564+
}
15261565
axc.Root.Attribute(R.id).Value = newId2;
15271566
newPart.PutXDocument();
15281567
}
@@ -1544,7 +1583,10 @@ private static void CopyLegacyDiagramText(OpenXmlPart oldContentPart, OpenXmlPar
15441583
var newId = "R" + Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
15451584
LegacyDiagramTextPart newPart = newContentPart.AddNewPart<LegacyDiagramTextPart>(newId);
15461585

1547-
newPart.FeedData(oldPart.GetStream());
1586+
using (var stream = oldPart.GetStream())
1587+
{
1588+
newPart.FeedData(stream);
1589+
}
15481590
textdataReference.Attribute(attributeName).Value = newId;
15491591
}
15501592

@@ -1714,7 +1756,10 @@ private static void CopyExtendedPart(OpenXmlPart oldContentPart, OpenXmlPart new
17141756
newPart = ((XmlSignaturePart)newContentPart).AddExtendedPart(oldPart.RelationshipType, oldPart.ContentType, fileInfo.Extension);
17151757

17161758
relId = newContentPart.GetIdOfPart(newPart);
1717-
newPart.FeedData(oldPart.GetStream());
1759+
using (Stream sourceStream = oldPart.GetStream())
1760+
{
1761+
newPart.FeedData(sourceStream);
1762+
}
17181763
extendedReference.Attribute(attributeName).Value = relId;
17191764
}
17201765
catch (ArgumentOutOfRangeException)
@@ -1778,7 +1823,10 @@ private static void CopyRelatedSound(PresentationDocument newDocument, OpenXmlPa
17781823
{
17791824
AudioReferenceRelationship temp = (AudioReferenceRelationship)oldContentPart.GetReferenceRelationship(relId);
17801825
MediaDataPart newSound = newDocument.CreateMediaDataPart(temp.DataPart.ContentType);
1781-
newSound.FeedData(temp.DataPart.GetStream());
1826+
using (var stream = temp.DataPart.GetStream())
1827+
{
1828+
newSound.FeedData(stream);
1829+
}
17821830
AudioReferenceRelationship newRel = null;
17831831

17841832
if (newContentPart is SlidePart)
@@ -1799,7 +1847,10 @@ private static void CopyRelatedSound(PresentationDocument newDocument, OpenXmlPa
17991847
{
18001848
MediaReferenceRelationship temp = (MediaReferenceRelationship)oldContentPart.GetReferenceRelationship(relId);
18011849
MediaDataPart newSound = newDocument.CreateMediaDataPart(temp.DataPart.ContentType);
1802-
newSound.FeedData(temp.DataPart.GetStream());
1850+
using (var stream = temp.DataPart.GetStream())
1851+
{
1852+
newSound.FeedData(stream);
1853+
}
18031854
MediaReferenceRelationship newRel = null;
18041855

18051856
if (newContentPart is SlidePart)

OpenXmlPowerTools/PtOpenXmlDocument.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -339,11 +339,12 @@ private static Type GetDocumentType(byte[] bytes)
339339

340340
public static void SavePartAs(OpenXmlPart part, string filePath)
341341
{
342-
Stream partStream = part.GetStream(FileMode.Open, FileAccess.Read);
343-
byte[] partContent = new byte[partStream.Length];
344-
partStream.Read(partContent, 0, (int)partStream.Length);
345-
346-
File.WriteAllBytes(filePath, partContent);
342+
using (Stream partStream = part.GetStream(FileMode.Open, FileAccess.Read))
343+
{
344+
byte[] partContent = new byte[partStream.Length];
345+
partStream.Read(partContent, 0, (int)partStream.Length);
346+
File.WriteAllBytes(filePath, partContent);
347+
}
347348
}
348349
}
349350

0 commit comments

Comments
 (0)