16f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski/*
26f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Copyright (C) 2015 The Android Open Source Project
36f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
46f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
56f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * you may not use this file except in compliance with the License.
66f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * You may obtain a copy of the License at
76f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
86f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
96f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski *
106f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * Unless required by applicable law or agreed to in writing, software
116f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
126f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * See the License for the specific language governing permissions and
146f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski * limitations under the License.
156f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski */
166f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
176f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#ifndef AAPT_LOGGER_H
186f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#define AAPT_LOGGER_H
196f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
206f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include "Source.h"
216f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
226f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <memory>
236f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <ostream>
246f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <string>
256f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#include <utils/String8.h>
266f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
276f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskinamespace aapt {
286f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
296f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskistruct Log {
306f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    Log(std::ostream& out, std::ostream& err);
316f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    Log(const Log& rhs) = delete;
326f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
336f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::ostream& out;
346f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::ostream& err;
356f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski};
366f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
376f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiclass Logger {
386f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskipublic:
396f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    static void setLog(const std::shared_ptr<Log>& log);
406f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
416f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    static std::ostream& error();
426f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    static std::ostream& error(const Source& source);
436f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    static std::ostream& error(const SourceLine& sourceLine);
446f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
456f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    static std::ostream& warn();
466f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    static std::ostream& warn(const Source& source);
476f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    static std::ostream& warn(const SourceLine& sourceLine);
486f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
496f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    static std::ostream& note();
506f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    static std::ostream& note(const Source& source);
516f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    static std::ostream& note(const SourceLine& sourceLine);
526f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
536f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiprivate:
546f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    static std::shared_ptr<Log> sLog;
556f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski};
566f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
576f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiclass SourceLogger {
586f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskipublic:
596f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    SourceLogger(const Source& source);
606f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
616f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::ostream& error();
626f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::ostream& error(size_t line);
636f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
646f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::ostream& warn();
656f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::ostream& warn(size_t line);
666f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
676f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::ostream& note();
686f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    std::ostream& note(size_t line);
696f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
706f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiprivate:
716f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    Source mSource;
726f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski};
736f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
746f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinskiinline ::std::ostream& operator<<(::std::ostream& out, const std::u16string& str) {
756f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    android::String8 utf8(str.data(), str.size());
766f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski    return out.write(utf8.string(), utf8.size());
776f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski}
786f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
796f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski} // namespace aapt
806f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski
816f6ceb7e1456698b1f33e04536bfb3227f9fcfcbAdam Lesinski#endif // AAPT_LOGGER_H
82