/*******************************************************************************
*
*  (C) COPYRIGHT MICROSOFT CORP., 1997
*
*  TITLE:       PARSE.H
*
*  VERSION:     2.0
*
*  AUTHOR:      ReedB
*
*  DATE:        1 Jan, 1997
*
*  DESCRIPTION:
*
*   Declarations and definitions for the parse helper.
*
*******************************************************************************/

#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <memory.h>
#include <windows.h>
#include <regstr.h>
#include <ntpoapi.h>

#include "powrprofp.h"

#define MAX_LINES           256
#define MAX_STR             128
#define DELIMITERS          ","
#define LINE_DELIMITERS     "\n\r"

// The following defines determine which zero based line of the spread sheet
// a given data will appear on. These are one based line indicies which match
// the spreadsheet line numbers as long as no blank lines are included.
 
#define SKU_LINE                                1
#define NAME_LINE                               2
#define DESCRIPTION_LINE                        3

#define PLATFORM_LINE                           4
#define INSTALL_ON_LINE                         5

#define SYSTEM_IDLE_LINE                        SKU_LINE + 7
#define SYSTEM_IDLE_TIMEOUT_LINE                SYSTEM_IDLE_LINE + 1
#define SYSTEM_IDLE_SLEEP_ACTION_FLAGS_LINE     SYSTEM_IDLE_LINE + 2
#define SYSTEM_IDLE_SENSITIVITY_LINE            SYSTEM_IDLE_LINE + 8

#define MIN_SLEEP_LINE                          SKU_LINE + 17
#define MAX_SLEEP_LINE                          MIN_SLEEP_LINE + 1
#define REDUCED_LATENCY_SLEEP_LINE              MIN_SLEEP_LINE + 2
#define DOZE_TIMEOUT_LINE                       MIN_SLEEP_LINE + 3
#define DOZE_S4_TIMEOUT_LINE                    MIN_SLEEP_LINE + 4

#define VIDEO_TIMEOUT_LINE                      SKU_LINE + 23
#define SPINDOWN_TIMEOUT_LINE                   VIDEO_TIMEOUT_LINE + 1

#define OPTIMIZE_FOR_POWER_LINE                 SKU_LINE + 26
#define FAN_THROTTLE_TOL_LINE                   OPTIMIZE_FOR_POWER_LINE + 1
#define FORCED_THROTTLE_LINE                    OPTIMIZE_FOR_POWER_LINE + 2
#define MIN_THROTTLE_LINE                       OPTIMIZE_FOR_POWER_LINE + 3
#define OVERTHROTTLED_LINE                      OPTIMIZE_FOR_POWER_LINE + 4
#define OVERTHROTTLED_SLEEP_ACTION_FLAGS_LINE   OPTIMIZE_FOR_POWER_LINE + 5

#define DYNAMIC_THROTTLE_LINE                   OPTIMIZE_FOR_POWER_LINE + 11
#define C1_THRESHOLDS_LINE                      DYNAMIC_THROTTLE_LINE + 1
#define C2_THRESHOLDS_LINE                      C1_THRESHOLDS_LINE + 8
#define C3_THRESHOLDS_LINE                      C2_THRESHOLDS_LINE + 8

// Global
#define ADVANCED_LINE                           64
#define LOCK_ON_SLEEP_LINE                      ADVANCED_LINE + 1
#define WAKE_ON_RING_LINE                       ADVANCED_LINE + 2
#define VIDEO_DIM_DISPLAY_LINE                  ADVANCED_LINE + 3
#define POWER_BUTTON_LINE                       ADVANCED_LINE + 5
#define POWER_BUTTON_SLEEP_ACTION_FLAGS_LINE    ADVANCED_LINE + 6
#define POWER_BUTTON_SLEEP_EVENT_CODE_LINE      ADVANCED_LINE + 12
#define SLEEP_BUTTON_LINE                       ADVANCED_LINE + 14
#define SLEEP_BUTTON_SLEEP_ACTION_FLAGS_LINE    ADVANCED_LINE + 15
#define SLEEP_BUTTON_SLEEP_EVENT_CODE_LINE      ADVANCED_LINE + 21
#define LID_CLOSE_LINE                          ADVANCED_LINE + 23
#define LID_CLOSE_SLEEP_ACTION_FLAGS_LINE       ADVANCED_LINE + 24
#define LID_OPEN_WAKE_LINE                      ADVANCED_LINE + 30

#define BROADCAST_CAP_RES_LINE                  96
#define BATMETER_ENABLE_SYSTRAY_FLAG_LINE       BROADCAST_CAP_RES_LINE + 2
#define BATMETER_ENABLE_MULTI_FLAG_LINE         BROADCAST_CAP_RES_LINE + 3
#define DISCHARGE_POLICY_1_LINE                 BROADCAST_CAP_RES_LINE + 4
#define DISCHARGE_POLICY_2_LINE                 BROADCAST_CAP_RES_LINE + 18

// Handy line offsets, for sleep action flags.
#define QUERY_APPS                      1
#define ALLOW_UI                        2
#define IGNORE_NON_RESP                 3
#define IGNORE_WAKE                     4
#define IGNORE_CRITICAL                 5

// offsets for sleep action event codes
#define NOTIFY_USER_CODE                1


// Handy line offsets for DISCHARGE_POLICIES
#define DP_ENABLE                       1
#define DP_BAT_LEVEL                    2
#define DP_POWER_POLICY                 3
#define DP_MIN_SLEEP_STATE              4
#define DP_TEXT_NOTIFY                  6
#define DP_SOUND_NOTIFY                 7
#define DP_SLEEP_ACT_FLAGS              8

// Handy line offsets for C-state thresholds
#define C_TIME_CHECK                    1
#define C_PROMOTE_LIMIT                 2
#define C_DEMOTE_LIMIT                  3
#define C_PROMOTE_PERCENT               4
#define C_DEMOTE_PERCENT                5
#define C_ALLOW_PROMOTION               6
#define C_ALLOW_DEMOTION                7

// Memphis INF types:

#define TYPICAL         0x01
#define COMPACT         0x02
#define CUSTOM          0x04
#define PORTABLE        0x08
#define SERVER          0x10
#define NUM_INF_TYPES   5

// OS types:
#define WIN_95          1
#define WIN_NT          2

// file locations
#define MACHINE_INF_NAME    "..\\winnt\\POWERSYS.INF"
#define USER_INF_NAME       "..\\winnt\\POWERSFT.INF"
#define INI_NAME            "POWERCFG.INI"

#define MAX_SKUS            6
#define MAX_PROFILES        16
#define MAX_LINE_SIZE       1024
#define DATA_REV            1

extern char *g_pszSrc[MAX_SKUS];
extern char *g_pszLines[MAX_SKUS][MAX_LINES];
extern char *g_pszSkuNames[MAX_SKUS];
extern char g_pszSkuDecoration[MAX_SKUS];

extern UINT g_uiPoliciesCount[MAX_SKUS];

extern PMACHINE_POWER_POLICY       g_pmpp[MAX_SKUS][MAX_PROFILES];
extern PUSER_POWER_POLICY          g_pupp[MAX_SKUS][MAX_PROFILES];
extern PMACHINE_PROCESSOR_POWER_POLICY g_ppmpp[MAX_SKUS][MAX_PROFILES];

extern GLOBAL_USER_POWER_POLICY    g_gupp[MAX_SKUS];
extern GLOBAL_MACHINE_POWER_POLICY g_gmpp[MAX_SKUS];


// Function prototypes implemented in MAKEINI.C or MAKEINF.C:
VOID CDECL DefFatalExit(BOOLEAN, char*, ... );

// Function prototypes implemented in PARSE.C:

void StrToUpper(char*, char*);
UINT GetTokens(char*, UINT, char**, UINT, char*);
VOID GetCheckLabelToken(UINT uiLine, char *pszCheck, UINT uiSku);
UINT GetFlagToken(UINT);
UINT GetPowerStateToken(VOID);
UINT GetIntToken(char*);
VOID GetNAToken(VOID);
POWER_ACTION GetPowerActionToken(VOID);
UINT GetOSTypeToken(VOID);
UINT GetINFTypeToken(VOID);
void StrTrimTrailingBlanks(char *);
UINT GetThrottleToken(VOID);
VOID CDECL DefFatalExit(BOOLEAN bGetLastError, char *pszFormat, ... );
BOOLEAN ReadSource(void);
UINT BuildLineArray(void);
VOID GetSleepActionFlags(
    UINT    uiStartLine,
    UINT    uiFlagsAC[],
    UINT    uiFlagsDC[],
    PUINT   puiCount,
    UINT    sku
    );
VOID GetSleepActionFlagsGlobal(
    UINT                    uiStartLine,
    PPOWER_ACTION_POLICY    ppapAC,
    PPOWER_ACTION_POLICY    ppapDC,
    UINT    sku
    );
VOID GetSleepActionFlagsUserPolicy(
    UINT    uiStartLine,
    ULONG   ulAcPowerPolicyOffset,
    ULONG   ulDcPowerPolicyOffset,
    PUINT   puiCount,
    UINT    sku
    );
VOID GetSleepActionFlagsMachinePolicy(
    UINT    uiStartLine,
    ULONG   ulAcPowerPolicyOffset,
    ULONG   ulDcPowerPolicyOffset,
    PUINT   puiCount,
    UINT    sku
    );
VOID GetCStateThresholds(
    UINT    uiStartLine,
    UINT    uiCState,
    PUINT   puiCount,
    UINT    sku
    );
VOID GetDischargePolicies(
    UINT uiLine,
    UINT uiNum,
    UINT uiIndex,
    UINT    sku
    );
BOOLEAN GetGlobalPolicies(void);
BOOLEAN GetPolicies(void);
VOID GetPolicyInf(void);