diff options
| -rw-r--r-- | src/core/hle/service/nifm/nifm.cpp | 41 | 
1 files changed, 34 insertions, 7 deletions
| diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index e3ef06481..4fa9f51a6 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -129,6 +129,9 @@ static_assert(sizeof(NifmNetworkProfileData) == 0x18E,                "NifmNetworkProfileData has incorrect size.");  #pragma pack(pop) +constexpr Result ResultPendingConnection{ErrorModule::NIFM, 111}; +constexpr Result ResultNetworkCommunicationDisabled{ErrorModule::NIFM, 1111}; +  class IScanRequest final : public ServiceFramework<IScanRequest> {  public:      explicit IScanRequest(Core::System& system_) : ServiceFramework{system_, "IScanRequest"} { @@ -192,6 +195,10 @@ private:      void Submit(Kernel::HLERequestContext& ctx) {          LOG_WARNING(Service_NIFM, "(STUBBED) called"); +        if (state == RequestState::NotSubmitted) { +            UpdateState(RequestState::Pending); +        } +          IPC::ResponseBuilder rb{ctx, 2};          rb.Push(ResultSuccess);      } @@ -201,19 +208,32 @@ private:          IPC::ResponseBuilder rb{ctx, 3};          rb.Push(ResultSuccess); - -        if (Network::GetHostIPv4Address().has_value()) { -            rb.PushEnum(RequestState::Connected); -        } else { -            rb.PushEnum(RequestState::NotSubmitted); -        } +        rb.PushEnum(state);      }      void GetResult(Kernel::HLERequestContext& ctx) {          LOG_WARNING(Service_NIFM, "(STUBBED) called"); +        const auto result = [this] { +            const auto has_connection = Network::GetHostIPv4Address().has_value(); +            switch (state) { +            case RequestState::NotSubmitted: +                return has_connection ? ResultSuccess : ResultNetworkCommunicationDisabled; +            case RequestState::Pending: +                if (has_connection) { +                    UpdateState(RequestState::Connected); +                } else { +                    UpdateState(RequestState::Error); +                } +                return ResultPendingConnection; +            case RequestState::Connected: +            default: +                return ResultSuccess; +            } +        }(); +          IPC::ResponseBuilder rb{ctx, 2}; -        rb.Push(ResultSuccess); +        rb.Push(result);      }      void GetSystemEventReadableHandles(Kernel::HLERequestContext& ctx) { @@ -252,8 +272,15 @@ private:          rb.Push<u32>(0);      } +    void UpdateState(RequestState new_state) { +        state = new_state; +        event1->Signal(); +    } +      KernelHelpers::ServiceContext service_context; +    RequestState state; +      Kernel::KEvent* event1;      Kernel::KEvent* event2;  }; | 
