// 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_CONTEXT_MANAGER_H_
#define TRUNKS_TSS_CONTEXT_MANAGER_H_

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

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

namespace trunks {

// Manages generic contexts in Trunks.
template <class T>
class ContextManager {
 public:
  ContextManager() : last_handle_(0) {}
  virtual ~ContextManager() {
    CloseAllContexts();
  }

  // Creates a new context with the corresponding handle.
  // Returns TSS_SUCCESS on successful Context object creation, handle
  //  assignment and writing the handle to |context_handle|.
  virtual TSS_RESULT OpenContext(TSS_HCONTEXT* context_handle) {
    last_handle_++;
    T* context = new T(last_handle_);
    std::tr1::shared_ptr<T> context_ptr(context);
    contexts_[last_handle_] = context_ptr;
    *context_handle = last_handle_;
    return TSS_SUCCESS;
  }

  // Closes a context referenced by the handle (if possible) and releases all
  //  the resources assigned to that context.
  // Returns TSS_SUCCESS if |context_handle| is a valid context handle and the
  //  corresponding TspContext is deleted.
  // Returns TSS_E_INVALID_HANDLE if |context_handle| is not a valid context
  //  handle.
  virtual TSS_RESULT CloseContext(TSS_HCONTEXT context_handle) {
      std::tr1::shared_ptr<T> context = GetContext(context_handle);
      if (!context)
        return TSS_E_INVALID_HANDLE;
      contexts_.erase(context_handle);
      return TSS_SUCCESS;
  }

  // Closes all contexts currently maintained by the context manager.
  virtual void CloseAllContexts() {
    contexts_.clear();
  }

  // Gets the pointer for a context object given the context handle.
  // Returns a valid shared_ptr to the Context object if |context_handle|
  //  is valid.
  // Returns a blank shared_ptr if |context_handle| is invalid.
  virtual std::tr1::shared_ptr<T> GetContext(TSS_HCONTEXT context_handle) {
    if (contexts_.count(context_handle) == 1)
      return contexts_[context_handle];
    return std::tr1::shared_ptr<T>();
  }

  // Gets the total count of contexts currently maintained by this context
  //  manager.
  virtual UINT32 GetNumContexts() {
    return contexts_.size();
  }

 private:
  // The counter for context handles.
  TSS_HCONTEXT last_handle_;

  // A map that maps all context handles to context objects.
  std::map<TSS_HCONTEXT, std::tr1::shared_ptr<T> > contexts_;

  DISALLOW_COPY_AND_ASSIGN(ContextManager);
};

}  // namespace trunks

#endif  // TRUNKS_TSS_CONTEXT_MANAGER_H_
