1 //
2 // Copyright (C) 2013 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_PENDING_ACTIVATION_STORE_H_
18 #define SHILL_PENDING_ACTIVATION_STORE_H_
19 
20 #include <memory>
21 #include <string>
22 
23 #include <base/files/file_path.h>
24 #include <gtest/gtest_prod.h>  // for FRIEND_TEST
25 
26 namespace shill {
27 
28 class StoreInterface;
29 
30 // PendingActivationStore stores the network activation status for a
31 // particular SIM. Once an online payment for the activation of a 3GPP
32 // network is successful, the associated SIM is regarded as pending
33 // activation and stored in the persistent profile. Once shill knows that
34 // the activation associated with a particular SIM is successful, it is removed
35 // from the profile and the cellular service is marked as activated.
36 class PendingActivationStore {
37  public:
38   enum State {
39     // This state indicates that information for a particular SIM was never
40     // stored in this database.
41     kStateUnknown,
42     // This state indicates that an online payment has been made but the modem
43     // has not yet been able to register with the network.
44     kStatePending,
45     // This state indicates that the modem has registered with the network but
46     // the network has not yet confirmed that the service has been activated.
47     // Currently, shill knows that activation has gone through, when a non-zero
48     // MDN has been received OTA.
49     kStateActivated,
50     // This state is used in CDMA activation to indicate that OTA activation
51     // failed and was scheduled for a retry.
52     kStateFailureRetry,
53     kStateMax,
54   };
55 
56   enum IdentifierType {
57     kIdentifierICCID,
58     kIdentifierMEID,
59   };
60 
61   // Constructor performs no initialization.
62   PendingActivationStore();
63   virtual ~PendingActivationStore();
64 
65   // Tries to open the underlying store interface from the given file path.
66   // Returns false if it fails to open the file.
67   //
68   // If called more than once on the same instance, the file that was already
69   // open will allways be flushed and closed, however it is not guaranteed that
70   // the file will always be successfully reopened (technically it should, but
71   // it is not guaranteed).
72   virtual bool InitStorage(const base::FilePath& storage_path);
73 
74   // Returns the activation state for a SIM with the given identifier. A return
75   // value of kStateUnknown indicates that the given identifier was not found.
76   virtual State GetActivationState(IdentifierType type,
77                                    const std::string& identifier) const;
78 
79   // Sets the activation state for the given identifier. If an entry for this
80   // identifier was not found, a new entry will be created. Returns true on
81   // success.
82   virtual bool SetActivationState(IdentifierType type,
83                                   const std::string& identifier,
84                                   State state);
85 
86   // Removes the entry for the given identifier from the database. Returns true
87   // if the operation was successful. If the identifier did not exist in the
88   // database, still returns true.
89   virtual bool RemoveEntry(IdentifierType type, const std::string& identifier);
90 
91  private:
92   friend class PendingActivationStoreTest;
93   friend class CellularCapabilityUniversalTest;
94   FRIEND_TEST(PendingActivationStoreTest, FileInteractions);
95   FRIEND_TEST(PendingActivationStoreTest, GetActivationState);
96   FRIEND_TEST(PendingActivationStoreTest, RemoveEntry);
97   FRIEND_TEST(PendingActivationStoreTest, SetActivationState);
98 
99   static const char kIccidGroupId[];
100   static const char kMeidGroupId[];
101   static const char kStorageFileName[];
102 
103   static std::string IdentifierTypeToGroupId(IdentifierType type);
104 
105   std::unique_ptr<StoreInterface> storage_;
106 
107   DISALLOW_COPY_AND_ASSIGN(PendingActivationStore);
108 };
109 
110 }  // namespace shill
111 
112 #endif  // SHILL_PENDING_ACTIVATION_STORE_H_
113