private void ParseFile(string filename, uint depth, ref System.Collections.Generic.List <string> outputfiles)
        {
            KRSrcWorkflow.WFFileType.FileType type = KRSrcWorkflow.WFFileType.GetFileType(filename);
            if (type == KRSrcWorkflow.WFFileType.FileType.OlePowerPoint)
            {
                uint fileidx = 0;

                System.Collections.Generic.List <string> pptfiles = new System.Collections.Generic.List <string>();
                DIaLOGIKa.b2xtranslator.StructuredStorage.Reader.StructuredStorageReader ssr = new DIaLOGIKa.b2xtranslator.StructuredStorage.Reader.StructuredStorageReader(filename);
                DIaLOGIKa.b2xtranslator.PptFileFormat.PowerpointDocument ppt = new DIaLOGIKa.b2xtranslator.PptFileFormat.PowerpointDocument(ssr);
                foreach (uint persistId in ppt.PersistObjectDirectory.Keys)
                {
                    UInt32 offset = ppt.PersistObjectDirectory[persistId];
                    ppt.PowerpointDocumentStream.Seek(offset, System.IO.SeekOrigin.Begin);
                    DIaLOGIKa.b2xtranslator.PptFileFormat.ExOleObjStgAtom obj = DIaLOGIKa.b2xtranslator.OfficeDrawing.Record.ReadRecord(ppt.PowerpointDocumentStream) as DIaLOGIKa.b2xtranslator.PptFileFormat.ExOleObjStgAtom;
                    if (obj != null)
                    {
                        string filedir = string.Format("{0}\\{1}", System.IO.Directory.GetParent(filename).FullName, KRSrcWorkflow.WFUtilities.GetNextDirectoryNumber(System.IO.Directory.GetParent(filename).FullName));
                        if (!System.IO.Directory.Exists(filedir))
                        {
                            System.IO.Directory.CreateDirectory(filedir);
                        }
                        if (System.IO.Directory.Exists(filedir))
                        {
                            byte[] data = obj.DecompressData();
                            System.IO.MemoryStream ms = new System.IO.MemoryStream(data);

                            KRSrcWorkflow.WFFileType.FileType oletype = KRSrcWorkflow.WFFileType.GetOleFileType(data);
                            if (oletype == WFFileType.FileType.OlePackage || oletype == WFFileType.FileType.OleContents)
                            {
                                using (OpenMcdf.CompoundFile cf = new OpenMcdf.CompoundFile(ms))
                                {
                                    WriteStorage(cf.RootStorage, filedir, depth, ref pptfiles);
                                }
                            }
                            else
                            {
                                string filenm = String.Format("{0}\\pptembed{1}", filedir, fileidx);
                                using (System.IO.FileStream fs = new System.IO.FileStream(filenm, System.IO.FileMode.Create, System.IO.FileAccess.Write))
                                {
                                    byte[] buffer = new byte[1024];
                                    int    len;
                                    while ((len = ms.Read(buffer, 0, buffer.Length)) > 0)
                                    {
                                        fs.Write(buffer, 0, len);
                                    }
                                    pptfiles.Add(filenm);
                                }
                                fileidx++;
                                ms.Close();
                                ms.Dispose();
                            }
                        }
                    }
                }
#if false
                foreach (DIaLOGIKa.b2xtranslator.PptFileFormat.ExOleEmbedContainer ole in ppt.OleObjects.Values)
                {
                    string filedir = string.Format("{0}\\{1}", System.IO.Directory.GetParent(filename).FullName, diridx++);
                    if (!System.IO.Directory.Exists(filedir))
                    {
                        System.IO.Directory.CreateDirectory(filedir);
                    }
                    if (System.IO.Directory.Exists(filedir))
                    {
                        string filenm = String.Format("{0}\\pptembed{1}", filedir, ole.SiblingIdx);
                        try
                        {
                            System.IO.FileStream fss = new System.IO.FileStream(filenm, System.IO.FileMode.Create, System.IO.FileAccess.Write);
                            byte[] data = ole.stgAtom.DecompressData();
                            fss.Write(data, 0, data.Length);
                            fss.Flush();
                            fss.Close();
                            fss.Dispose();

                            pptfiles.Add(filenm);
                        }
                        catch (Exception ex)
                        {
                        }
                    }
                }
#endif
                foreach (DIaLOGIKa.b2xtranslator.OfficeDrawing.Record record in ppt.PicturesContainer._pictures.Values)                 //.Where(x => x.TypeCode == 0xF01C || x.TypeCode == 0xF01D || x.TypeCode == 0xF01E || x.TypeCode == 0xF01F || x.TypeCode == 0xF029 || x.TypeCode == 0xF02A))
                {
                    string filedir = string.Format("{0}\\{1}", System.IO.Directory.GetParent(filename).FullName, "PPTPictures");        //, KRSrcWorkflow.WFUtilities.GetNextDirectoryNumber(System.IO.Directory.GetParent(filename).FullName));
                    if (!System.IO.Directory.Exists(filedir))
                    {
                        System.IO.Directory.CreateDirectory(filedir);
                    }
                    if (System.IO.Directory.Exists(filedir))
                    {
                        string extension = string.Empty;
                        int    skip      = 0;
                        switch (record.TypeCode)
                        {
                        case 0xF01A:
                            extension = ".emf";
                            break;

                        case 0xF01B:
                            extension = ".wmf";
                            break;

                        case 0xF01C:
                            extension = ".pict";
                            break;

                        case 0xF01D:
                        case 0xF02A:
                            extension = ".jpg";
                            skip      = 17;
                            break;

                        case 0xF01E:
                            extension = ".png";
                            skip      = 17;
                            break;

                        case 0xF01F:
                            extension = ".dib";
                            break;

                        case 0xF029:
                            extension = ".tiff";
                            break;
                        }
                        string filenm = String.Format("{0}\\pptembed{1}{2}", filedir, fileidx++, extension);
                        using (System.IO.FileStream fs = new System.IO.FileStream(filenm, System.IO.FileMode.Create, System.IO.FileAccess.Write))
                        {
                            // need to skip 17 byte header in raw data stream
                            byte[] data = ((extension == ".emf" || extension == ".wmf")) ? ((DIaLOGIKa.b2xtranslator.OfficeDrawing.MetafilePictBlip)record).Decrompress() : record.RawData.Skip(skip).ToArray();
                            fs.Write(data, 0, data.Length);
                            fs.Flush();
                            fs.Close();
                            fs.Dispose();

                            pptfiles.Add(filenm);
                        }
                    }
                }
                ssr.Close();
                ssr.Dispose();
                outputfiles.AddRange(pptfiles);
                depth--;
                if (depth > 0)
                {
                    foreach (string fn in pptfiles)
                    {
                        ParseFile(fn, depth, ref outputfiles);
                    }
                }
            }
            else
            {
                using (OpenMcdf.CompoundFile cf = new OpenMcdf.CompoundFile(filename))
                {
                    WriteStorage(cf.RootStorage, System.IO.Directory.GetParent(filename).FullName, depth, ref outputfiles);
                }
            }
        }
        private void ParseFile(string filename, uint depth, ref System.Collections.Generic.List<string> outputfiles)
        {
            SFWorkflow.WFFileType.FileType type = SFWorkflow.WFFileType.GetFileType(filename);
            if (type == SFWorkflow.WFFileType.FileType.OlePowerPoint)
            {
                uint fileidx = 0;

                System.Collections.Generic.List<string> pptfiles = new System.Collections.Generic.List<string>();
                DIaLOGIKa.b2xtranslator.StructuredStorage.Reader.StructuredStorageReader ssr = new DIaLOGIKa.b2xtranslator.StructuredStorage.Reader.StructuredStorageReader(filename);
                DIaLOGIKa.b2xtranslator.PptFileFormat.PowerpointDocument ppt = new DIaLOGIKa.b2xtranslator.PptFileFormat.PowerpointDocument(ssr);
                foreach (uint persistId in ppt.PersistObjectDirectory.Keys)
                {
                    UInt32 offset = ppt.PersistObjectDirectory[persistId];
                    ppt.PowerpointDocumentStream.Seek(offset, System.IO.SeekOrigin.Begin);
                    DIaLOGIKa.b2xtranslator.PptFileFormat.ExOleObjStgAtom obj = DIaLOGIKa.b2xtranslator.OfficeDrawing.Record.ReadRecord(ppt.PowerpointDocumentStream) as DIaLOGIKa.b2xtranslator.PptFileFormat.ExOleObjStgAtom;
                    if (obj != null)
                    {
                        string filedir = string.Format("{0}\\{1}", System.IO.Directory.GetParent(filename).FullName, SFWorkflow.WFUtilities.GetNextDirectoryNumber(System.IO.Directory.GetParent(filename).FullName));
                        if (!System.IO.Directory.Exists(filedir))
                            System.IO.Directory.CreateDirectory(filedir);
                        if (System.IO.Directory.Exists(filedir))
                        {
                            byte[] data = obj.DecompressData();
                            System.IO.MemoryStream ms = new System.IO.MemoryStream(data);

                            SFWorkflow.WFFileType.FileType oletype = SFWorkflow.WFFileType.GetOleFileType(data);
                            if (oletype == WFFileType.FileType.OlePackage || oletype == WFFileType.FileType.OleContents)
                            {
                                using (OpenMcdf.CompoundFile cf = new OpenMcdf.CompoundFile(ms))
                                {
                                    WriteStorage(cf.RootStorage, filedir, depth, ref pptfiles);
                                }
                            }
                            else
                            {
                                string filenm = String.Format("{0}\\pptembed{1}", filedir, fileidx);
                                using (System.IO.FileStream fs = new System.IO.FileStream(filenm, System.IO.FileMode.Create, System.IO.FileAccess.Write))
                                {
                                    byte[] buffer = new byte[1024];
                                    int len;
                                    while ((len = ms.Read(buffer, 0, buffer.Length)) > 0)
                                    {
                                        fs.Write(buffer, 0, len);
                                    }
                                    pptfiles.Add(filenm);
                                }
                                fileidx++;
                                ms.Close();
                                ms.Dispose();
                            }
                        }
                    }
                }
            #if false
                foreach (DIaLOGIKa.b2xtranslator.PptFileFormat.ExOleEmbedContainer ole in ppt.OleObjects.Values)
                {
                    string filedir = string.Format("{0}\\{1}", System.IO.Directory.GetParent(filename).FullName, diridx++);
                    if (!System.IO.Directory.Exists(filedir))
                        System.IO.Directory.CreateDirectory(filedir);
                    if (System.IO.Directory.Exists(filedir))
                    {
                        string filenm = String.Format("{0}\\pptembed{1}", filedir, ole.SiblingIdx);
                        try
                        {
                            System.IO.FileStream fss = new System.IO.FileStream(filenm, System.IO.FileMode.Create, System.IO.FileAccess.Write);
                            byte[] data = ole.stgAtom.DecompressData();
                            fss.Write(data, 0, data.Length);
                            fss.Flush();
                            fss.Close();
                            fss.Dispose();

                            pptfiles.Add(filenm);
                        }
                        catch (Exception ex)
                        {
                        }
                    }
                }
            #endif
                foreach (DIaLOGIKa.b2xtranslator.OfficeDrawing.Record record in ppt.PicturesContainer._pictures.Values) //.Where(x => x.TypeCode == 0xF01C || x.TypeCode == 0xF01D || x.TypeCode == 0xF01E || x.TypeCode == 0xF01F || x.TypeCode == 0xF029 || x.TypeCode == 0xF02A))
                {
                    string filedir = string.Format("{0}\\{1}", System.IO.Directory.GetParent(filename).FullName, "PPTPictures"); //, SFWorkflow.WFUtilities.GetNextDirectoryNumber(System.IO.Directory.GetParent(filename).FullName));
                    if (!System.IO.Directory.Exists(filedir))
                        System.IO.Directory.CreateDirectory(filedir);
                    if (System.IO.Directory.Exists(filedir))
                    {
                        string extension = string.Empty;
                        int skip = 0;
                        switch (record.TypeCode)
                        {
                            case 0xF01A:
                                extension = ".emf";
                                break;

                            case 0xF01B:
                                extension = ".wmf";
                                break;

                            case 0xF01C:
                                extension = ".pict";
                                break;

                            case 0xF01D:
                            case 0xF02A:
                                extension = ".jpg";
                                skip = 17;
                                break;

                            case 0xF01E:
                                extension = ".png";
                                skip = 17;
                                break;

                            case 0xF01F:
                                extension = ".dib";
                                break;

                            case 0xF029:
                                extension = ".tiff";
                                break;
                        }
                        string filenm = String.Format("{0}\\pptembed{1}{2}", filedir, fileidx++, extension);
                        using(System.IO.FileStream fs = new System.IO.FileStream(filenm, System.IO.FileMode.Create, System.IO.FileAccess.Write))
                        {
                            // need to skip 17 byte header in raw data stream
                            byte[] data = ((extension == ".emf" || extension == ".wmf")) ? ((DIaLOGIKa.b2xtranslator.OfficeDrawing.MetafilePictBlip)record).Decrompress() : record.RawData.Skip(skip).ToArray();
                            fs.Write(data, 0, data.Length);
                            fs.Flush();
                            fs.Close();
                            fs.Dispose();

                            pptfiles.Add(filenm);
                        }
                    }
                }
                ssr.Close();
                ssr.Dispose();
                outputfiles.AddRange(pptfiles);
                depth--;
                if (depth > 0)
                {
                    foreach(string fn in pptfiles)
                        ParseFile(fn, depth, ref outputfiles);
                }
            }
            else
            {
                using (OpenMcdf.CompoundFile cf = new OpenMcdf.CompoundFile(filename))
                {
                    WriteStorage(cf.RootStorage, System.IO.Directory.GetParent(filename).FullName, depth, ref outputfiles);
                }
            }
        }