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