summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/util/path_helpers.h
blob: c212fa8e5e7f36aa73f7e5e93c7429e162dfc9de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Copyright (c) 2009 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.

#ifndef CHROME_BROWSER_SYNC_UTIL_PATH_HELPERS_H_
#define CHROME_BROWSER_SYNC_UTIL_PATH_HELPERS_H_

#include <algorithm>
#include <iterator>
#include <string>

#include "base/file_path.h"
#include "chrome/browser/sync/util/sync_types.h"

extern const char kPathSeparator[];

template <typename StringType>
class PathSegmentIterator : public std::iterator<std::forward_iterator_tag,
                                                 StringType> {
 public:
  explicit PathSegmentIterator(const StringType& path) :
  path_(path), segment_begin_(0), segment_end_(0) {
    ++(*this);
  }

  PathSegmentIterator() : segment_begin_(0), segment_end_(0) { }

  // Default copy constructors, constructors, etc. will all do the right thing.
  PathSegmentIterator& operator ++() {
    segment_begin_ =
        std::min(path_.size(),
                 path_.find_first_not_of(kPathSeparator, segment_end_));
    segment_end_ =
        std::min(path_.size(),
                 path_.find_first_of(kPathSeparator, segment_begin_));
    value_.assign(path_, segment_begin_, segment_end_ - segment_begin_);
    return *this;
  }

  PathSegmentIterator operator ++(int) {
    PathSegmentIterator i(*this);
    return ++i;
  }

  const StringType& operator * () const {
    return value_;
  }
  const StringType* operator -> () const {
    return &value_;
  }

  // If the current value and remaining path are equal, then we
  // call the iterators equal.
  bool operator == (const PathSegmentIterator& i) const {
    return 0 == path_.compare(segment_begin_,
      path_.size() - segment_begin_,
      i.path_, i.segment_begin_, i.path_.size() - i.segment_begin_);
  }

  bool operator != (const PathSegmentIterator& i) const {
    return !(*this == i);
  }

 protected:
  StringType path_;
  typename StringType::size_type segment_begin_;
  typename StringType::size_type segment_end_;
  StringType value_;
};

// Makes a path component legal for your OS, but doesn't handle collisions
// with other files in the same directory. it can do this by removing
// illegal characters and adding ~1 before the first '.' in the filename.
// returns PSTR("") if the name is fine as-is
// on mac/linux we let names stay unicode normalization form C in the system
// and convert to another normal form in fuse handlers. but, if a '/' is in
// a filename, we handle it here.
std::string MakePathComponentOSLegal(const std::string& component);

#endif  // CHROME_BROWSER_SYNC_UTIL_PATH_HELPERS_H_