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

#include "chrome/browser/icon_loader.h"

#include "base/basictypes.h"
#include "base/bind.h"
#include "content/public/browser/browser_thread.h"

using content::BrowserThread;

IconLoader::IconLoader(const base::FilePath& file_path,
                       IconSize size,
                       Delegate* delegate)
    : target_message_loop_(NULL),
      file_path_(file_path),
      icon_size_(size),
      delegate_(delegate) {}

IconLoader::~IconLoader() {
}

void IconLoader::Start() {
  target_message_loop_ = base::MessageLoopProxy::current();

  BrowserThread::PostTaskAndReply(BrowserThread::FILE, FROM_HERE,
      base::Bind(&IconLoader::ReadGroup, this),
      base::Bind(&IconLoader::OnReadGroup, this));
}

void IconLoader::ReadGroup() {
  group_ = ReadGroupIDFromFilepath(file_path_);
}

void IconLoader::OnReadGroup() {
  if (IsIconMutableFromFilepath(file_path_) ||
      !delegate_->OnGroupLoaded(this, group_)) {
    BrowserThread::PostTask(ReadIconThreadID(), FROM_HERE,
        base::Bind(&IconLoader::ReadIcon, this));
  }
}

void IconLoader::NotifyDelegate() {
  // If the delegate takes ownership of the Image, release it from the scoped
  // pointer.
  if (delegate_->OnImageLoaded(this, image_.get(), group_))
    ignore_result(image_.release());  // Can't ignore return value.
}
