/*
 * Copyright 2015, Intel Corporation
 * 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.
 *
 * Written by William Roberts <william.c.roberts@intel.com>
 *
 * This is a parser library for parsing the packages.list file generated
 * by PackageManager service.
 *
 * This simple parser is sensitive to format changes in
 * frameworks/base/services/core/java/com/android/server/pm/Settings.java
 * A dependency note has been added to that file to correct
 * this parser.
 */

#ifndef PACKAGELISTPARSER_H_
#define PACKAGELISTPARSER_H_

#include <stdbool.h>
#include <sys/cdefs.h>
#include <sys/types.h>

__BEGIN_DECLS

/** The file containing the list of installed packages on the system */
#define PACKAGES_LIST_FILE  "/data/system/packages.list"

typedef struct pkg_info pkg_info;
typedef struct gid_list gid_list;

struct gid_list {
    size_t cnt;
    gid_t *gids;
};

struct pkg_info {
    char *name;
    uid_t uid;
    bool debuggable;
    char *data_dir;
    char *seinfo;
    gid_list gids;
    void *private_data;
    bool profileable_from_shell;
    long version_code;
};

/**
 * Callback function to be used by packagelist_parse() routine.
 * @param info
 *  The parsed package information
 * @param userdata
 *  The supplied userdata pointer to packagelist_parse()
 * @return
 *  true to keep processing, false to stop.
 */
typedef bool (*pfn_on_package)(pkg_info *info, void *userdata);

/**
 * Parses the file specified by PACKAGES_LIST_FILE and invokes the callback on
 * each entry found. Once the callback is invoked, ownership of the pkg_info pointer
 * is passed to the callback routine, thus they are required to perform any cleanup
 * desired.
 * @param callback
 *  The callback function called on each parsed line of the packages list.
 * @param userdata
 *  An optional userdata supplied pointer to pass to the callback function.
 * @return
 *  true on success false on failure.
 */
extern bool packagelist_parse(pfn_on_package callback, void *userdata);

/**
 * Frees a pkg_info structure.
 * @param info
 *  The struct to free
 */
extern void packagelist_free(pkg_info *info);

__END_DECLS

#endif /* PACKAGELISTPARSER_H_ */
