146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/common/cloud_print/cloud_print_cdd_conversion.h"
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/cloud_devices/common/printer_description.h"
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "printing/backend/print_backend.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace cloud_print {
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)scoped_ptr<base::DictionaryValue> PrinterSemanticCapsAndDefaultsToCdd(
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const printing::PrinterSemanticCapsAndDefaults& semantic_info) {
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  using namespace cloud_devices::printer;
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  cloud_devices::CloudDeviceDescription description;
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ContentTypesCapability content_types;
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  content_types.AddOption("application/pdf");
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  content_types.SaveTo(&description);
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (semantic_info.collate_capable) {
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    CollateCapability collate;
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    collate.set_default_value(semantic_info.collate_default);
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    collate.SaveTo(&description);
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (semantic_info.copies_capable) {
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    CopiesCapability copies;
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    copies.SaveTo(&description);
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (semantic_info.duplex_capable) {
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DuplexCapability duplex;
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    duplex.AddDefaultOption(
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        NO_DUPLEX, semantic_info.duplex_default == printing::SIMPLEX);
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    duplex.AddDefaultOption(
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        LONG_EDGE, semantic_info.duplex_default == printing::LONG_EDGE);
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    duplex.AddDefaultOption(
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        SHORT_EDGE, semantic_info.duplex_default == printing::SHORT_EDGE);
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    duplex.SaveTo(&description);
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ColorCapability color;
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (semantic_info.color_default || semantic_info.color_changeable) {
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    Color standard_color(STANDARD_COLOR);
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    standard_color.vendor_id = base::IntToString(semantic_info.color_model);
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    color.AddDefaultOption(standard_color, semantic_info.color_default);
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!semantic_info.color_default || semantic_info.color_changeable) {
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    Color standard_monochrome(STANDARD_MONOCHROME);
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    standard_monochrome.vendor_id = base::IntToString(semantic_info.bw_model);
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    color.AddDefaultOption(standard_monochrome, !semantic_info.color_default);
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  color.SaveTo(&description);
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!semantic_info.papers.empty()) {
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    Media default_media(semantic_info.default_paper.display_name,
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        semantic_info.default_paper.vendor_id,
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        semantic_info.default_paper.size_um.width(),
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        semantic_info.default_paper.size_um.height());
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    default_media.MatchBySize();
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaCapability media;
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    bool is_default_set = false;
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for (size_t i = 0; i < semantic_info.papers.size(); ++i) {
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      gfx::Size paper_size = semantic_info.papers[i].size_um;
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      if (paper_size.width() > paper_size.height())
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        paper_size.SetSize(paper_size.height(), paper_size.width());
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      Media new_media(semantic_info.papers[i].display_name,
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      semantic_info.papers[i].vendor_id,
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      paper_size.width(),
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                      paper_size.height());
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      new_media.MatchBySize();
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      if (new_media.IsValid() && !media.Contains(new_media)) {
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        if (!default_media.IsValid())
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          default_media = new_media;
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        media.AddDefaultOption(new_media, new_media == default_media);
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        is_default_set = is_default_set || (new_media == default_media);
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      }
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!is_default_set && default_media.IsValid())
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      media.AddDefaultOption(default_media, true);
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (media.IsValid()) {
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      media.SaveTo(&description);
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    } else {
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      NOTREACHED();
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!semantic_info.dpis.empty()) {
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DpiCapability dpi;
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    Dpi default_dpi(semantic_info.default_dpi.width(),
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    semantic_info.default_dpi.height());
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    bool is_default_set = false;
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for (size_t i = 0; i < semantic_info.dpis.size(); ++i) {
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      Dpi new_dpi(semantic_info.dpis[i].width(),
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  semantic_info.dpis[i].height());
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      if (new_dpi.IsValid() && !dpi.Contains(new_dpi)) {
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        if (!default_dpi.IsValid())
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          default_dpi = new_dpi;
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        dpi.AddDefaultOption(new_dpi, new_dpi == default_dpi);
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        is_default_set = is_default_set || (new_dpi == default_dpi);
10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      }
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!is_default_set && default_dpi.IsValid())
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      dpi.AddDefaultOption(default_dpi, true);
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (dpi.IsValid()) {
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      dpi.SaveTo(&description);
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    } else {
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      NOTREACHED();
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  OrientationCapability orientation;
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  orientation.AddDefaultOption(PORTRAIT, true);
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  orientation.AddOption(LANDSCAPE);
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  orientation.AddOption(AUTO_ORIENTATION);
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  orientation.SaveTo(&description);
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return scoped_ptr<base::DictionaryValue>(description.root().DeepCopy());
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace cloud_print
126