// // Copyright (C) 2013 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef SHILL_PENDING_ACTIVATION_STORE_H_ #define SHILL_PENDING_ACTIVATION_STORE_H_ #include <memory> #include <string> #include <base/files/file_path.h> #include <gtest/gtest_prod.h> // for FRIEND_TEST namespace shill { class StoreInterface; // PendingActivationStore stores the network activation status for a // particular SIM. Once an online payment for the activation of a 3GPP // network is successful, the associated SIM is regarded as pending // activation and stored in the persistent profile. Once shill knows that // the activation associated with a particular SIM is successful, it is removed // from the profile and the cellular service is marked as activated. class PendingActivationStore { public: enum State { // This state indicates that information for a particular SIM was never // stored in this database. kStateUnknown, // This state indicates that an online payment has been made but the modem // has not yet been able to register with the network. kStatePending, // This state indicates that the modem has registered with the network but // the network has not yet confirmed that the service has been activated. // Currently, shill knows that activation has gone through, when a non-zero // MDN has been received OTA. kStateActivated, // This state is used in CDMA activation to indicate that OTA activation // failed and was scheduled for a retry. kStateFailureRetry, kStateMax, }; enum IdentifierType { kIdentifierICCID, kIdentifierMEID, }; // Constructor performs no initialization. PendingActivationStore(); virtual ~PendingActivationStore(); // Tries to open the underlying store interface from the given file path. // Returns false if it fails to open the file. // // If called more than once on the same instance, the file that was already // open will allways be flushed and closed, however it is not guaranteed that // the file will always be successfully reopened (technically it should, but // it is not guaranteed). virtual bool InitStorage(const base::FilePath& storage_path); // Returns the activation state for a SIM with the given identifier. A return // value of kStateUnknown indicates that the given identifier was not found. virtual State GetActivationState(IdentifierType type, const std::string& identifier) const; // Sets the activation state for the given identifier. If an entry for this // identifier was not found, a new entry will be created. Returns true on // success. virtual bool SetActivationState(IdentifierType type, const std::string& identifier, State state); // Removes the entry for the given identifier from the database. Returns true // if the operation was successful. If the identifier did not exist in the // database, still returns true. virtual bool RemoveEntry(IdentifierType type, const std::string& identifier); private: friend class PendingActivationStoreTest; friend class CellularCapabilityUniversalTest; FRIEND_TEST(PendingActivationStoreTest, FileInteractions); FRIEND_TEST(PendingActivationStoreTest, GetActivationState); FRIEND_TEST(PendingActivationStoreTest, RemoveEntry); FRIEND_TEST(PendingActivationStoreTest, SetActivationState); static const char kIccidGroupId[]; static const char kMeidGroupId[]; static const char kStorageFileName[]; static std::string IdentifierTypeToGroupId(IdentifierType type); std::unique_ptr<StoreInterface> storage_; DISALLOW_COPY_AND_ASSIGN(PendingActivationStore); }; } // namespace shill #endif // SHILL_PENDING_ACTIVATION_STORE_H_