// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef TRUNKS_TSS_TSP_CONTEXT_H_
#define TRUNKS_TSS_TSP_CONTEXT_H_

#include <map>
#include <base/macros.h>

#include "resource_manager.h"
#include "tss/tss_error.h"
#include "tss/tss_typedef.h"

namespace trunks {

// Defines an object representing a client-side context for applications
// interfacing with Trunks. A context is responsible for:
//  - handling connections to the TCS (which directly interfaces with the TPM).
//  - handling and maintaining any resources (BYTE arrays) associated with it.
class TspContext {
 public:
  TspContext(TSS_HCONTEXT handle) : handle_(handle) {}
  virtual ~TspContext() {}

  // Gets a 32-bit attribute of the context object (see p.187, 173).
  //  attribFlag: Flag indicating the attribute to be retrieved.
  //  subFlag: Sub flag indicating the attribute to be retrieved.
  //  pulAttrib: Returns value of the specified attribute.
  virtual TSS_RESULT GetAttribUint32(TSS_FLAG attribFlag,
                                     TSS_FLAG subFlag,
                                     UINT32* pulAttrib);

  // Sets a 32-bit attribute of the context object (see p.185, 171).
  //  attribFlag: Flag indicating the attribute to be set.
  //  subFlag: Sub flag indicating the attribute to be set.
  //  pulAttrib: Value to be set for the specified attribute.
  virtual TSS_RESULT SetAttribUint32(TSS_FLAG attribFlag,
                                     TSS_FLAG subFlag,
                                     UINT32 ulAttrib);

  // Gets a non 32-bit attribute of the context object (see p.190, 176).
  //  attribFlag: Flag indicating the attribute to be retrieved.
  //  subFlag: Sub flag indicating the attribute to be retrieved.
  //  pulAttribDataSize: Returns the size of the value for the attribute.
  //  prgbAttribData: Returns the value for the specified attribute.
  virtual TSS_RESULT GetAttribData(TSS_FLAG attribFlag,
                                   TSS_FLAG subFlag,
                                   UINT32* pulAttribDataSize,
                                   BYTE** prgbAttribData);

  // Gets a non 32-bit attribute of the context object (see p.189).
  //  attribFlag: Flag indicating the attribute to be set.
  //  subFlag: Sub flag indicating the attribute to be set.
  //  ulAttribDataSize: Indicates the size of the value for the attribute.
  //  rgbAttribData: Value to be set for the specified attribute.
  virtual TSS_RESULT SetAttribData(TSS_FLAG attribFlag,
                                   TSS_FLAG subFlag,
                                   UINT32 ulAttribDataSize,
                                   BYTE* rgbAttribData);

  // Gets the resource manager for this context.
  virtual ResourceManager* GetResourceManager() { return &resource_manager_; }

  // Gets the context handle for this context.
  TSS_HCONTEXT GetContextHandle() { return handle_; }

 private:
  // The context handle.
  TSS_HCONTEXT handle_;

  // The resource manager.
  ResourceManager resource_manager_;

  DISALLOW_COPY_AND_ASSIGN(TspContext);
};

}  // namespace trunks

#endif  // TRUNKS_TSS_TSP_CONTEXT_H_
