Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygeninfhostgen.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: .inf file parser 00003 * LICENSE: GPL - See COPYING in the top level directory 00004 * PROGRAMMER: Royce Mitchell III 00005 * Eric Kohl 00006 * Ge van Geldorp <gvg@reactos.org> 00007 */ 00008 00009 /* INCLUDES *****************************************************************/ 00010 00011 #include "inflib.h" 00012 #include "infhost.h" 00013 00014 #define NDEBUG 00015 #include <debug.h> 00016 00017 /* PUBLIC FUNCTIONS *********************************************************/ 00018 00019 int 00020 InfHostOpenBufferedFile(PHINF InfHandle, 00021 void *Buffer, 00022 ULONG BufferSize, 00023 LANGID LanguageId, 00024 ULONG *ErrorLine) 00025 { 00026 INFSTATUS Status; 00027 PINFCACHE Cache; 00028 WCHAR *FileBuffer; 00029 ULONG FileBufferSize; 00030 00031 *InfHandle = NULL; 00032 *ErrorLine = (ULONG)-1; 00033 00034 /* Allocate file buffer */ 00035 FileBufferSize = BufferSize + 2; 00036 FileBuffer = MALLOC(FileBufferSize); 00037 if (FileBuffer == NULL) 00038 { 00039 DPRINT1("MALLOC() failed\n"); 00040 return(INF_STATUS_INSUFFICIENT_RESOURCES); 00041 } 00042 00043 MEMCPY(FileBuffer, Buffer, BufferSize); 00044 00045 /* Append string terminator */ 00046 FileBuffer[BufferSize] = 0; 00047 FileBuffer[BufferSize + 1] = 0; 00048 00049 /* Allocate infcache header */ 00050 Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); 00051 if (Cache == NULL) 00052 { 00053 DPRINT1("MALLOC() failed\n"); 00054 FREE(FileBuffer); 00055 return(INF_STATUS_INSUFFICIENT_RESOURCES); 00056 } 00057 00058 /* Initialize inicache header */ 00059 ZEROMEMORY(Cache, 00060 sizeof(INFCACHE)); 00061 00062 Cache->LanguageId = LanguageId; 00063 00064 /* Parse the inf buffer */ 00065 if (!RtlIsTextUnicode(FileBuffer, (INT)FileBufferSize, NULL)) 00066 { 00067 // static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; 00068 WCHAR *new_buff; 00069 // UINT codepage = CP_ACP; 00070 UINT offset = 0; 00071 00072 // if (BufferSize > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) 00073 // { 00074 // codepage = CP_UTF8; 00075 // offset = sizeof(utf8_bom); 00076 // } 00077 00078 new_buff = MALLOC(FileBufferSize * sizeof(WCHAR)); 00079 if (new_buff != NULL) 00080 { 00081 ULONG len; 00082 Status = RtlMultiByteToUnicodeN(new_buff, 00083 FileBufferSize * sizeof(WCHAR), 00084 &len, 00085 (char *)FileBuffer + offset, 00086 FileBufferSize - offset); 00087 00088 Status = InfpParseBuffer(Cache, 00089 new_buff, 00090 new_buff + len / sizeof(WCHAR), 00091 ErrorLine); 00092 FREE(new_buff); 00093 } 00094 else 00095 Status = INF_STATUS_INSUFFICIENT_RESOURCES; 00096 } 00097 else 00098 { 00099 WCHAR *new_buff = (WCHAR *)FileBuffer; 00100 /* UCS-16 files should start with the Unicode BOM; we should skip it */ 00101 if (*new_buff == 0xfeff) 00102 { 00103 new_buff++; 00104 FileBufferSize -= sizeof(WCHAR); 00105 } 00106 Status = InfpParseBuffer(Cache, 00107 new_buff, 00108 (WCHAR*)((char*)new_buff + FileBufferSize), 00109 ErrorLine); 00110 } 00111 00112 if (!INF_SUCCESS(Status)) 00113 { 00114 FREE(Cache); 00115 Cache = NULL; 00116 } 00117 00118 /* Free file buffer */ 00119 FREE(FileBuffer); 00120 00121 *InfHandle = (HINF)Cache; 00122 00123 return INF_SUCCESS(Status) ? 0 : -1; 00124 } 00125 00126 00127 int 00128 InfHostOpenFile(PHINF InfHandle, 00129 const CHAR *FileName, 00130 LANGID LanguageId, 00131 ULONG *ErrorLine) 00132 { 00133 FILE *File; 00134 CHAR *FileBuffer; 00135 ULONG FileLength; 00136 ULONG FileBufferLength; 00137 PINFCACHE Cache; 00138 INFSTATUS Status = INF_STATUS_SUCCESS; 00139 00140 *InfHandle = NULL; 00141 *ErrorLine = (ULONG)-1; 00142 00143 /* Open the inf file */ 00144 File = fopen(FileName, "rb"); 00145 if (NULL == File) 00146 { 00147 DPRINT1("fopen() failed (errno %d)\n", errno); 00148 return -1; 00149 } 00150 00151 DPRINT("fopen() successful\n"); 00152 00153 /* Query file size */ 00154 if (fseek(File, (size_t)0, SEEK_END)) 00155 { 00156 DPRINT1("fseek() to EOF failed (errno %d)\n", errno); 00157 fclose(File); 00158 return -1; 00159 } 00160 00161 FileLength = (ULONG)ftell(File); 00162 if ((ULONG) -1 == FileLength) 00163 { 00164 DPRINT1("ftell() failed (errno %d)\n", errno); 00165 fclose(File); 00166 return -1; 00167 } 00168 DPRINT("File size: %u\n", (UINT)FileLength); 00169 00170 /* Rewind */ 00171 if (fseek(File, (size_t)0, SEEK_SET)) 00172 { 00173 DPRINT1("fseek() to BOF failed (errno %d)\n", errno); 00174 fclose(File); 00175 return -1; 00176 } 00177 00178 /* Allocate file buffer */ 00179 FileBufferLength = FileLength + 2; 00180 FileBuffer = MALLOC(FileBufferLength); 00181 if (FileBuffer == NULL) 00182 { 00183 DPRINT1("MALLOC() failed\n"); 00184 fclose(File); 00185 return -1; 00186 } 00187 00188 /* Read file */ 00189 if (FileLength != fread(FileBuffer, (size_t)1, (size_t)FileLength, File)) 00190 { 00191 DPRINT1("fread() failed (errno %d)\n", errno); 00192 FREE(FileBuffer); 00193 fclose(File); 00194 return -1; 00195 } 00196 00197 fclose(File); 00198 00199 /* Append string terminator */ 00200 FileBuffer[FileLength] = 0; 00201 FileBuffer[FileLength + 1] = 0; 00202 00203 /* Allocate infcache header */ 00204 Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); 00205 if (Cache == NULL) 00206 { 00207 DPRINT1("MALLOC() failed\n"); 00208 FREE(FileBuffer); 00209 return -1; 00210 } 00211 00212 /* Initialize inicache header */ 00213 ZEROMEMORY(Cache, 00214 sizeof(INFCACHE)); 00215 00216 Cache->LanguageId = LanguageId; 00217 00218 /* Parse the inf buffer */ 00219 if (!RtlIsTextUnicode(FileBuffer, (INT)FileBufferLength, NULL)) 00220 { 00221 // static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; 00222 WCHAR *new_buff; 00223 // UINT codepage = CP_ACP; 00224 UINT offset = 0; 00225 00226 // if (FileLength > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) 00227 // { 00228 // codepage = CP_UTF8; 00229 // offset = sizeof(utf8_bom); 00230 // } 00231 00232 new_buff = MALLOC(FileBufferLength * sizeof(WCHAR)); 00233 if (new_buff != NULL) 00234 { 00235 ULONG len; 00236 Status = RtlMultiByteToUnicodeN(new_buff, 00237 FileBufferLength * sizeof(WCHAR), 00238 &len, 00239 (char *)FileBuffer + offset, 00240 FileBufferLength - offset); 00241 00242 Status = InfpParseBuffer(Cache, 00243 new_buff, 00244 new_buff + len / sizeof(WCHAR), 00245 ErrorLine); 00246 00247 FREE(new_buff); 00248 } 00249 else 00250 Status = INF_STATUS_INSUFFICIENT_RESOURCES; 00251 } 00252 else 00253 { 00254 WCHAR *new_buff = (WCHAR *)FileBuffer; 00255 /* UCS-16 files should start with the Unicode BOM; we should skip it */ 00256 if (*new_buff == 0xfeff) 00257 { 00258 new_buff++; 00259 FileBufferLength -= sizeof(WCHAR); 00260 } 00261 Status = InfpParseBuffer(Cache, 00262 new_buff, 00263 (WCHAR*)((char*)new_buff + FileBufferLength), 00264 ErrorLine); 00265 } 00266 00267 if (!INF_SUCCESS(Status)) 00268 { 00269 FREE(Cache); 00270 Cache = NULL; 00271 } 00272 00273 /* Free file buffer */ 00274 FREE(FileBuffer); 00275 00276 *InfHandle = (HINF)Cache; 00277 00278 return INF_SUCCESS(Status) ? 0 : -1; 00279 } 00280 00281 00282 void 00283 InfHostCloseFile(HINF InfHandle) 00284 { 00285 PINFCACHE Cache; 00286 00287 Cache = (PINFCACHE)InfHandle; 00288 00289 if (Cache == NULL) 00290 { 00291 return; 00292 } 00293 00294 while (Cache->FirstSection != NULL) 00295 { 00296 Cache->FirstSection = InfpFreeSection(Cache->FirstSection); 00297 } 00298 Cache->LastSection = NULL; 00299 00300 FREE(Cache); 00301 } 00302 00303 /* EOF */ Generated on Sat May 26 2012 04:35:14 for ReactOS by
1.7.6.1
|