1402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll// Use of this source code is governed by a BSD-style license that can be
3402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll// found in the LICENSE file.
4402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
5402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#ifndef CHROME_INSTALLER_UTIL_LZMA_UTIL_H_
6402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#define CHROME_INSTALLER_UTIL_LZMA_UTIL_H_
7402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
8402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#include <windows.h>
9402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
10402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#include <set>
11402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#include <string>
12402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
13402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#include "base/basictypes.h"
14402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
15402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollnamespace base {
16402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollclass FilePath;
17402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
18402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
19402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll// This is a utility class that acts as a wrapper around LZMA SDK library
20402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollclass LzmaUtil {
21402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll public:
22402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  // Utility method that does the job of calling OpenArchive(), UnPack()
23402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  // and CloseArchive() in order. Returns error code (NO_ERROR if successful).
24402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  static int32 UnPackArchive(const std::wstring& archive,
25402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll                             const std::wstring& output_dir,
26402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll                             std::wstring* output_file);
27402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
28402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  LzmaUtil();
29402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  ~LzmaUtil();
30402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
31402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  DWORD OpenArchive(const std::wstring& archivePath);
32402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
33402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  // Unpacks the archive to the given location
34402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  DWORD UnPack(const std::wstring& location);
35402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
36402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  // Unpacks the archive to the given location and returns the last file
37402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  // extracted from archive. |single_file| is set to true iff only a single
38402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  // file is extracted from archive.
39402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  DWORD UnPack(const std::wstring& location,
40402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll               std::wstring* output_file);
41402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
42402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  void CloseArchive();
43402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
44402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll protected:
45402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  bool CreateDirectory(const base::FilePath& dir);
46402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
47402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll private:
48402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  HANDLE archive_handle_;
49402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  std::set<std::wstring> directories_created_;
50402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
51402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll  DISALLOW_COPY_AND_ASSIGN(LzmaUtil);
52402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll};
53402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
54402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll#endif  // CHROME_INSTALLER_UTIL_LZMA_UTIL_H_
55402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll