1b9056914e2627627ffdd615e078a9b6020ab1cf2philip.liard@gmail.com// Copyright (C) 2011 The Libphonenumber Authors
21ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
31ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Licensed under the Apache License, Version 2.0 (the "License");
41ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// you may not use this file except in compliance with the License.
51ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// You may obtain a copy of the License at
61ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
71ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// http://www.apache.org/licenses/LICENSE-2.0
81ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com//
91ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Unless required by applicable law or agreed to in writing, software
101ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// distributed under the License is distributed on an "AS IS" BASIS,
111ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// See the License for the specific language governing permissions and
131ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// limitations under the License.
141ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
151ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Author: Philippe Liard
161ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
171ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#ifndef I18N_PHONENUMBERS_LOGGER_H_
181ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#define I18N_PHONENUMBERS_LOGGER_H_
191ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
201ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include <cstdio>
211ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#include <string>
221ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
231ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comnamespace i18n {
241ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comnamespace phonenumbers {
251ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
261ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comusing std::string;
271ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
2867b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.comenum {
291ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  LOG_FATAL = 1,
301ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  LOG_ERROR,
311ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  LOG_WARNING,
321ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  LOG_INFO,
331ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  LOG_DEBUG,
341ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com};
351ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
361ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comenum {
371ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  DFATAL = LOG_FATAL,
381ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// ERROR seems to be defined on MSVC, therefore don't overwrite it.
391ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#ifndef ERROR
401ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  ERROR = LOG_ERROR,
411ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#endif
421ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  WARNING = LOG_WARNING,
431ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com};
441ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
451ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Subclass this abstract class to override the way logging is handled in the
461ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// library. You can then call the PhoneNumberUtil::SetLogger() method.
471ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comclass Logger {
481ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com public:
491ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  Logger() : level_(LOG_ERROR) {}
501ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  virtual ~Logger() {}
511ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
521ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Writes the message level to the underlying output stream.
531ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  virtual void WriteLevel() {}
541ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  // Writes the provided message to the underlying output stream.
551ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  virtual void WriteMessage(const string& msg) = 0;
561ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
5767b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  // Note that if set_verbosity_level has been used to set the level to a value
5867b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  // that is not represented by an enum, the result here will be a log
5967b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  // level that is higher than LOG_DEBUG.
6067b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  inline int level() const {
611ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return level_;
621ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
631ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
6467b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  inline void set_level(int level) {
651ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    level_ = level;
661ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
671ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
6867b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  // If you want to see verbose logs in addition to other logs, use this method.
6967b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  // This will result in all log messages at the levels above being shown, along
7067b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  // with calls to VLOG with the verbosity level set to this level or lower.
7167b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  // For example, set_verbosity_level(2) will show calls of VLOG(1) and VLOG(2)
7267b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  // but not VLOG(3), along with all calls to LOG().
7367b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  inline void set_verbosity_level(int verbose_logs_level) {
7467b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com    set_level(LOG_DEBUG + verbose_logs_level);
7567b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  }
7667b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com
77cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com  static inline Logger* set_logger_impl(Logger* logger) {
781ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    impl_ = logger;
79cbc255f39ceade5fc9d653e320c511a5f9c51e77philip.liard@gmail.com    return logger;
801ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
811ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
821ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  static inline Logger* mutable_logger_impl() {
831ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com    return impl_;
841ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  }
851ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
861ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com private:
871ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  static Logger* impl_;
8867b8ca8d34d2c1625c90af839309007b9c66f65alararennie@google.com  int level_;
891ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com};
901ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
911ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// Logger that does not log anything. It could be useful to "mute" the
921ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com// phonenumber library.
931ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.comclass NullLogger : public Logger {
941ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com public:
951ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  virtual ~NullLogger() {}
961ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
971ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com  virtual void WriteMessage(const string& /* msg */) {}
981ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com};
991ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1001ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}  // namespace phonenumbers
1011ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com}  // namespace i18n
1021ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com
1031ad5e5bc944bfb46689d87ace2773109cb54f5ephilip.liard@gmail.com#endif  // I18N_PHONENUMBERS_LOGGER_ADAPTER_H_
104