12ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel/*
22ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Copyright (c) 2014, 2016, The Linux Foundation. All rights reserved.
32ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*
42ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Redistribution and use in source and binary forms, with or without modification, are permitted
52ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* provided that the following conditions are met:
62ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*    * Redistributions of source code must retain the above copyright notice, this list of
72ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      conditions and the following disclaimer.
82ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*    * Redistributions in binary form must reproduce the above copyright notice, this list of
92ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      conditions and the following disclaimer in the documentation and/or other materials provided
102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      with the distribution.
112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*    * Neither the name of The Linux Foundation nor the names of its contributors may be used to
122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      endorse or promote products derived from this software without specific prior written
132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*      permission.
142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*
152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*/
242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <stdarg.h>
262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <stdio.h>
272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <string.h>
282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/constants.h>
292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "dump_impl.h"
312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace sdm {
332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDumpImpl* DumpImpl::dump_list_[] = { 0 };
352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudeluint32_t DumpImpl::dump_count_ = 0;
362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError DumpInterface::GetDump(char *buffer, uint32_t length) {
382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (!buffer || !length) {
392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return kErrorParameters;
402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  buffer[0] = '\0';
432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DumpImpl::AppendString(buffer, length, "\n-------- Snapdragon Display Manager --------");
442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  for (uint32_t i = 0; i < DumpImpl::dump_count_; i++) {
452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    DumpImpl::dump_list_[i]->AppendDump(buffer, length);
462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DumpImpl::AppendString(buffer, length, "\n\n");
482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return kErrorNone;
502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDumpImpl::DumpImpl() {
532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  Register(this);
542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDumpImpl::~DumpImpl() {
572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  Unregister(this);
582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid DumpImpl::AppendString(char *buffer, uint32_t length, const char *format, ...) {
612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  uint32_t filled = UINT32(strlen(buffer));
622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  // Reserve one byte for null terminating character
632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if ((filled + 1) >= length) {
642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    return;
652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  buffer += filled;
672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  va_list list;
692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  va_start(list, format);
702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  vsnprintf(buffer, length - filled -1, format, list);
712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// Every object is created or destroyed through display core only, which itself protects the
742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// the access, so no need to protect registration or de-registration.
752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid DumpImpl::Register(DumpImpl *dump_impl) {
762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (dump_count_ < kMaxDumpObjects) {
772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    dump_list_[dump_count_] = dump_impl;
782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    dump_count_++;
792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid DumpImpl::Unregister(DumpImpl *dump_impl) {
832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  for (uint32_t i = 0; i < dump_count_; i++) {
842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    if (dump_list_[i] == dump_impl) {
852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      dump_count_--;
862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      for (; i < dump_count_; i++) {
872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        dump_list_[i] = dump_list_[i + 1];
882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      }
892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    }
902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}  // namespace sdm
942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
95