void SubtitleFile::Parse(InputStream& s) { m_segments.RemoveAll(); __super::Parse(s, s_predef); // TODO: check file.format == "ssf" and file.version == 1 CAtlList<Definition*> defs; GetRootRef()->GetChildDefs(defs, L"subtitle"); StringMapW<float> offset; POSITION pos = defs.GetHeadPosition(); while(pos) { Definition* pDef = defs.GetNext(pos); try { Definition::Time time; if(pDef->GetAsTime(time, offset) && (*pDef)[L"@"].IsValue()) { m_segments.Insert(time.start.value, time.stop.value, pDef); } } catch(Exception&) { } } }
void SubtitleFile::Append(InputStream& s, float start, float stop, bool fSetTime) { Reference* pRootRef = GetRootRef(); ParseDefs(s, pRootRef); CAtlList<Definition*> defs; GetNewDefs(defs); POSITION pos = defs.GetHeadPosition(); while(pos) { Definition* pDef = defs.GetNext(pos); if(pDef->m_parent == pRootRef && pDef->m_type == L"subtitle" && (*pDef)[L"@"].IsValue()) { m_segments.Insert(start, stop, pDef); if(fSetTime) { try { Definition::Time time; StringMapW<float> offset; pDef->GetAsTime(time, offset); if(time.start.value == start && time.stop.value == stop) continue; } catch(Exception&) { } CStringW str; str.Format(L"%.3f", start); pDef->SetChildAsNumber(L"time.start", str, L"s"); str.Format(L"%.3f", stop); pDef->SetChildAsNumber(L"time.stop", str, L"s"); } } } Commit(); }