1 //
2 // Copyright (C) 2012 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #ifndef SHILL_ERROR_H_
18 #define SHILL_ERROR_H_
19 
20 #include <memory>
21 #include <string>
22 
23 #include <base/location.h>
24 #include <base/macros.h>
25 
26 namespace DBus {
27 class Error;
28 }  // namespace DBus
29 
30 namespace brillo {
31 class Error;
32 using ErrorPtr = std::unique_ptr<Error>;
33 }  // namespace brillo
34 
35 namespace shill {
36 
37 class Error {
38  public:
39   enum Type {
40     kSuccess = 0,  // No error.
41     kOperationFailed,  // failure, otherwise unspecified
42     kAlreadyConnected,
43     kAlreadyExists,
44     kIncorrectPin,
45     kInProgress,
46     kInternalError,
47     kInvalidApn,
48     kInvalidArguments,
49     kInvalidNetworkName,
50     kInvalidPassphrase,
51     kInvalidProperty,
52     kNoCarrier,
53     kNotConnected,
54     kNotFound,
55     kNotImplemented,
56     kNotOnHomeNetwork,
57     kNotRegistered,
58     kNotSupported,
59     kOperationAborted,
60     kOperationInitiated,
61     kOperationTimeout,
62     kPassphraseRequired,
63     kPermissionDenied,
64     kPinBlocked,
65     kPinRequired,
66     kWrongState,
67     kNumErrors
68   };
69 
70   Error();  // Success by default.
71   explicit Error(Type type);  // Uses the default message for |type|.
72   Error(Type type, const std::string& message);
73   ~Error();
74 
75   void Populate(Type type);  // Uses the default message for |type|.
76   void Populate(Type type, const std::string& message);
77   void Populate(Type type,
78                 const std::string& message,
79                 const tracked_objects::Location& location);
80 
81   void Reset();
82 
83   void CopyFrom(const Error& error);
84 
85   // Sets the Chromeos |error| and returns true if Error represents failure.
86   // Leaves error unchanged, and returns false otherwise.
87   bool ToChromeosError(brillo::ErrorPtr* error) const;
88 
type()89   Type type() const { return type_; }
message()90   const std::string& message() const { return message_; }
91 
IsSuccess()92   bool IsSuccess() const { return type_ == kSuccess; }
IsFailure()93   bool IsFailure() const { return !IsSuccess() && !IsOngoing(); }
IsOngoing()94   bool IsOngoing() const { return type_ == kOperationInitiated; }
95 
96   static std::string GetDBusResult(Type type);
97   static std::string GetDefaultMessage(Type type);
98 
99   // Log an error message from |from_here|.  If |error| is non-NULL, also
100   // populate it.
101   static void PopulateAndLog(const tracked_objects::Location& from_here,
102                              Error* error, Type type,
103                              const std::string& message);
104 
105  private:
106   struct Info {
107     const char* dbus_result;  // Error type name.
108     const char* message;  // Default Error type message.
109   };
110 
111   static const Info kInfos[kNumErrors];
112 
113   Type type_;
114   std::string message_;
115   tracked_objects::Location location_;
116 
117   DISALLOW_COPY_AND_ASSIGN(Error);
118 };
119 
120 }  // namespace shill
121 
122 // stream operator provided to facilitate logging
123 std::ostream& operator<<(std::ostream& stream, const shill::Error& error);
124 
125 #endif  // SHILL_ERROR_H_
126