/*
 * Copyright (C) 2015 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.
 */

#include <trusty_ipc.h>
#include <uapi/trusty_uuid.h>

#include "aidl_service.h"
#include "block_device_tipc.h"
#include "crypt.h"
#include "ipc.h"
#include "tipc_service.h"

#include "crypt.h"
#include "ipc.h"
#include "tipc_service.h"

struct storage_service {
    bool initialized;
    struct key key;
    struct block_device_tipc block_device;
    struct storage_service_aidl_context aidl;
};

#define STORAGE_SERVICE_INITIAL_VALUE(self)                        \
    (struct storage_service) {                                     \
        .initialized = false,                                      \
        .aidl = STORAGE_SERVICE_AIDL_CONTEXT_INITIAL_VALUE(.aidl), \
    }

/* SSSC (Secure Storage Session Context) */
#define STORAGE_SESSION_MAGIC 0x53535343

/**
 * storage_session - Session that exists for the duration of a proxy connection
 * @magic:        a sentinel value used for checking for data corruption.
 *                Initialized to STORAGE_SESSION_MAGIC.
 * @service:      storage app state that persists across connections
 * @tipc:         tipc service accepting client connections and requests
 * @proxy_ctx:    the context object on the proxy channel
 */
struct storage_session {
    uint32_t magic;
    struct storage_service* service;
    struct storage_tipc_service tipc;

    struct ipc_channel_context proxy_ctx;
};

/**
 * proxy_connect_context - Context for opening a connection to storageproxy
 *
 * @service: storage app state
 * @tipc_ctx: context object for the proxy port
 */
struct proxy_connect_context {
    struct storage_service service;
    struct ipc_port_context tipc_ctx;
};

/*
 * @parent_ctx must be a pointer to the &tipc_ctx member of a
 * &struct proxy_connect_context
 */
struct ipc_channel_context* proxy_connect(struct ipc_port_context* parent_ctx,
                                          const uuid_t* peer_uuid,
                                          handle_t chan_handle);

/** proxy_destroy() - Clean up a &struct proxy_connect_context
 *
 * Does not free @self.
 *
 * @self: The proxy context to delete. Must have been previously connected to
 * the proxy (see &proxy_connect()), but no longer have an active connection
 * (see &proxy_disconnect()).
 */
void proxy_destroy(struct proxy_connect_context* self);