xref: /reactos/base/setup/lib/spapisup/infsupp.c (revision 279107d5)
1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         ReactOS Setup Library
4  * FILE:            base/setup/lib/infsupp.c
5  * PURPOSE:         Interfacing with Setup* API .INF Files support functions
6  * PROGRAMMERS:     Hervé Poussineau
7  *                  Hermes Belusca-Maito (hermes.belusca@sfr.fr)
8  */
9 
10 /* INCLUDES *****************************************************************/
11 
12 #include "precomp.h"
13 #include "infsupp.h"
14 
15 #define NDEBUG
16 #include <debug.h>
17 
18 /* GLOBALS *******************************************************************/
19 
20 /*
21  * These externs should be defined by the user of this library.
22  * They are kept there for reference and ease of usage.
23  */
24 #if 0
25 
26 pSpInfCloseInfFile  SpInfCloseInfFile  = NULL;
27 pSpInfFindFirstLine SpInfFindFirstLine = NULL;
28 pSpInfFindNextLine  SpInfFindNextLine  = NULL;
29 pSpInfGetFieldCount SpInfGetFieldCount = NULL;
30 pSpInfGetBinaryField  SpInfGetBinaryField  = NULL;
31 pSpInfGetIntField     SpInfGetIntField     = NULL;
32 pSpInfGetMultiSzField SpInfGetMultiSzField = NULL;
33 pSpInfGetStringField  SpInfGetStringField  = NULL;
34 pSpInfGetField    SpInfGetField    = NULL;
35 pSpInfOpenInfFile SpInfOpenInfFile = NULL;
36 
37 #endif
38 
39 /* HELPER FUNCTIONS **********************************************************/
40 
41 BOOLEAN
42 INF_GetDataField(
43     IN PINFCONTEXT Context,
44     IN ULONG FieldIndex,
45     OUT PCWSTR* Data)
46 {
47 #if 0
48 
49     BOOL Success;
50     PWCHAR InfData;
51     DWORD dwSize;
52 
53     *Data = NULL;
54 
55     Success = SpInfGetStringField(Context,
56                                   FieldIndex,
57                                   NULL,
58                                   0,
59                                   &dwSize);
60     if (!Success)
61         return FALSE;
62 
63     InfData = RtlAllocateHeap(ProcessHeap, 0, dwSize * sizeof(WCHAR));
64     if (!InfData)
65         return FALSE;
66 
67     Success = SpInfGetStringField(Context,
68                                   FieldIndex,
69                                   InfData,
70                                   dwSize,
71                                   NULL);
72     if (!Success)
73     {
74         RtlFreeHeap(ProcessHeap, 0, InfData);
75         return FALSE;
76     }
77 
78     *Data = InfData;
79     return TRUE;
80 
81 #else
82 
83     *Data = SpInfGetField(Context, FieldIndex);
84     return !!*Data;
85 
86 #endif
87 }
88 
89 BOOLEAN
90 INF_GetData(
91     IN PINFCONTEXT Context,
92     OUT PCWSTR* Key,
93     OUT PCWSTR* Data)
94 {
95     BOOL Success;
96     PCWSTR InfData[2] = {NULL, NULL};
97 
98     if (Key)
99         *Key = NULL;
100 
101     if (Data)
102         *Data = NULL;
103 
104     /*
105      * Verify that the INF file has only one value field, in addition to its key name.
106      * Note that SpInfGetFieldCount() does not count the key name as a field.
107      */
108     if (SpInfGetFieldCount(Context) != 1)
109     {
110         DPRINT1("SpInfGetFieldCount != 1\n");
111         return FALSE;
112     }
113 
114     if (Key)
115     {
116         Success = INF_GetDataField(Context, 0, &InfData[0]);
117         if (!Success)
118             return FALSE;
119     }
120 
121     if (Data)
122     {
123         Success = INF_GetDataField(Context, 1, &InfData[1]);
124         if (!Success)
125         {
126             INF_FreeData(InfData[0]);
127             return FALSE;
128         }
129     }
130 
131     if (Key)
132         *Key = InfData[0];
133 
134     if (Data)
135         *Data = InfData[1];
136 
137     return TRUE;
138 }
139 
140 /* EOF */
141