From a61264f5a69c6fea18289e2f085f02787c05472d Mon Sep 17 00:00:00 2001 From: Michael Bang Date: Sat, 14 Apr 2018 23:57:27 +0200 Subject: [PATCH 1/2] parser: expose copy of demo's header. --- parser.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/parser.go b/parser.go index b5d2f091..d4a0a961 100644 --- a/parser.go +++ b/parser.go @@ -58,6 +58,10 @@ func (p *Parser) Map() string { return p.header.MapName } +func (p *Parser) Header() common.DemoHeader { + return *p.header +} + // Participants returns all connected players. // This includes spectators. func (p *Parser) Participants() []*common.Player { From 3d7b0696d6747ac0b64305e493b9027b58fe0eae Mon Sep 17 00:00:00 2001 From: Markus Walther Date: Sun, 15 Apr 2018 20:47:04 +0200 Subject: [PATCH 2/2] DemoHeader clean up * Return header in ParseHeader() * Deprecated HeaderParsedEvent (GoDoc) * Deprecated Parser.Map() --- demoinfocs_test.go | 45 +++++++++++++++++++++++++++++++++++---------- events/events.go | 1 + parser.go | 2 ++ parsing.go | 7 ++++--- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/demoinfocs_test.go b/demoinfocs_test.go index d2c8790a..2af515a8 100644 --- a/demoinfocs_test.go +++ b/demoinfocs_test.go @@ -90,7 +90,7 @@ func TestCancelParseToEnd(t *testing.T) { } p := dem.NewParser(f, nil) - err = p.ParseHeader() + _, err = p.ParseHeader() if err != nil { t.Fatal(err) } @@ -114,11 +114,15 @@ func TestCancelParseToEnd(t *testing.T) { func TestConcurrent(t *testing.T) { var i int64 runner := func() { - f, _ := os.Open(defaultDemPath) + f, err := os.Open(defaultDemPath) + if err != nil { + t.Fatal(err) + } defer f.Close() p := dem.NewParser(f, nil) - err := p.ParseHeader() + + _, err = p.ParseHeader() if err != nil { t.Fatal(err) } @@ -127,7 +131,12 @@ func TestConcurrent(t *testing.T) { fmt.Printf("Starting runner %d\n", n) ts := time.Now() - p.ParseToEnd() + + err = p.ParseToEnd() + if err != nil { + t.Fatal(err) + } + fmt.Printf("Runner %d took %s\n", n, time.Since(ts)) } @@ -165,12 +174,15 @@ func TestDemoSet(t *testing.T) { }() p := dem.NewParser(f, nil) - err = p.ParseHeader() + _, err = p.ParseHeader() if err != nil { t.Fatal(err) } - p.ParseToEnd() + err = p.ParseToEnd() + if err != nil { + t.Fatal(err) + } }() } } @@ -186,12 +198,19 @@ func BenchmarkDemoInfoCs(b *testing.B) { } p := dem.NewParser(f, nil) - err = p.ParseHeader() + + _, err = p.ParseHeader() if err != nil { b.Fatal(err) } + ts := time.Now() - p.ParseToEnd() + + err = p.ParseToEnd() + if err != nil { + b.Fatal(err) + } + b.Logf("Took %s\n", time.Since(ts)) }() } @@ -218,13 +237,19 @@ func BenchmarkInMemory(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { p := dem.NewParser(bytes.NewReader(d), nil) - err = p.ParseHeader() + + _, err = p.ParseHeader() if err != nil { b.Fatal(err) } ts := time.Now() - p.ParseToEnd() + + err = p.ParseToEnd() + if err != nil { + b.Fatal(err) + } + b.Logf("Took %s\n", time.Since(ts)) } } diff --git a/events/events.go b/events/events.go index f37394d6..55053bd9 100644 --- a/events/events.go +++ b/events/events.go @@ -8,6 +8,7 @@ import ( ) // HeaderParsedEvent signals that the header has been parsed. +// Deprecated, use Parser.Header() instead. type HeaderParsedEvent struct { Header common.DemoHeader } diff --git a/parser.go b/parser.go index d4a0a961..c35878f3 100644 --- a/parser.go +++ b/parser.go @@ -54,10 +54,12 @@ type Parser struct { } // Map returns the map name. E.g. de_dust2 or de_inferno. +// Deprecated, use Header().MapName instead. func (p *Parser) Map() string { return p.header.MapName } +// Header returns the DemoHeader which contains the demo's metadata. func (p *Parser) Header() common.DemoHeader { return *p.header } diff --git a/parsing.go b/parsing.go index 334962b6..5195bf86 100644 --- a/parsing.go +++ b/parsing.go @@ -22,7 +22,7 @@ const ( // ParseHeader attempts to parse the header of the demo. // Returns error if the filestamp (first 8 bytes) doesn't match HL2DEMO. -func (p *Parser) ParseHeader() error { +func (p *Parser) ParseHeader() (common.DemoHeader, error) { var h common.DemoHeader h.Filestamp = p.bitReader.ReadCString(8) h.Protocol = p.bitReader.ReadSignedInt(32) @@ -37,7 +37,7 @@ func (p *Parser) ParseHeader() error { h.SignonLength = p.bitReader.ReadSignedInt(32) if h.Filestamp != "HL2DEMO" { - return errors.New("Invalid File-Type; expecting HL2DEMO in the first 8 bytes") + return h, errors.New("Invalid File-Type; expecting HL2DEMO in the first 8 bytes") } // Initialize queue if the buffer size wasn't specified, the amount of ticks @@ -47,8 +47,9 @@ func (p *Parser) ParseHeader() error { } p.header = &h + // TODO: Deprecated, remove this + HeaderParsedEvent in 1.0.0 p.eventDispatcher.Dispatch(events.HeaderParsedEvent{Header: h}) - return nil + return h, nil } // ParseToEnd attempts to parse the demo until the end.