ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

infhostgen.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.