1//===- DIADataStream.cpp - DIA implementation of IPDBDataStream -*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm/DebugInfo/PDB/DIA/DIADataStream.h"
10#include "llvm/DebugInfo/PDB/DIA/DIAUtils.h"
11
12using namespace llvm;
13using namespace llvm::pdb;
14
15DIADataStream::DIADataStream(CComPtr<IDiaEnumDebugStreamData> DiaStreamData)
16    : StreamData(DiaStreamData) {}
17
18uint32_t DIADataStream::getRecordCount() const {
19  LONG Count = 0;
20  return (S_OK == StreamData->get_Count(&Count)) ? Count : 0;
21}
22
23std::string DIADataStream::getName() const {
24  return invokeBstrMethod(*StreamData, &IDiaEnumDebugStreamData::get_name);
25}
26
27std::optional<DIADataStream::RecordType>
28DIADataStream::getItemAtIndex(uint32_t Index) const {
29  RecordType Record;
30  DWORD RecordSize = 0;
31  StreamData->Item(Index, 0, &RecordSize, nullptr);
32  if (RecordSize == 0)
33    return std::nullopt;
34
35  Record.resize(RecordSize);
36  if (S_OK != StreamData->Item(Index, RecordSize, &RecordSize, &Record[0]))
37    return std::nullopt;
38  return Record;
39}
40
41bool DIADataStream::getNext(RecordType &Record) {
42  Record.clear();
43  DWORD RecordSize = 0;
44  ULONG CountFetched = 0;
45  StreamData->Next(1, 0, &RecordSize, nullptr, &CountFetched);
46  if (RecordSize == 0)
47    return false;
48
49  Record.resize(RecordSize);
50  if (S_OK ==
51      StreamData->Next(1, RecordSize, &RecordSize, &Record[0], &CountFetched))
52    return false;
53  return true;
54}
55
56void DIADataStream::reset() { StreamData->Reset(); }
57