Exemplo n.º 1
0
/**
This is not called in bulk_extractor
*/
void File::Write(const void *Data,size_t Size)
{ //This is not called in bulk_extractor 
  if (Size==0)
    return;
#ifndef _WIN_CE
  if (HandleType!=FILE_HANDLENORMAL)
    switch(HandleType)
    {
      case FILE_HANDLESTD:
#ifdef _WIN_ALL
        hFile=GetStdHandle(STD_OUTPUT_HANDLE);
#else
        hFile=stdout;
#endif
        break;
      case FILE_HANDLEERR:
#ifdef _WIN_ALL
        hFile=GetStdHandle(STD_ERROR_HANDLE);
#else
        hFile=stderr;
#endif
        break;
    }
#endif
  while (1)
  {
    bool Success=false;
#ifdef _WIN_ALL
    DWORD Written=0;
    if (HandleType!=FILE_HANDLENORMAL)
    {
      // writing to stdout can fail in old Windows if data block is too large
      const size_t MaxSize=0x4000;
      for (size_t I=0;I<Size;I+=MaxSize)
      {
        Success=WriteFile(hFile,(byte *)Data+I,(DWORD)Min(Size-I,MaxSize),&Written,NULL)==TRUE; //Writing happens here
        if (!Success)
          break;
      }
    }
    else
      Success=WriteFile(hFile,Data,(DWORD)Size,&Written,NULL)==TRUE;
#else
    int Written=fwrite(Data,1,Size,hFile);
    Success=Written==Size && !ferror(hFile);
#endif
    if (!Success && AllowExceptions && HandleType==FILE_HANDLENORMAL)
    {
#if defined(_WIN_ALL) && !defined(SFX_MODULE) && !defined(RARDLL)
      int ErrCode=GetLastError();
      int64 FilePos=Tell();
      uint64 FreeSize=GetFreeDisk(FileName);
      SetLastError(ErrCode);
      if (FreeSize>Size && FilePos-Size<=0xffffffff && FilePos+Size>0xffffffff)
        ErrHandler.WriteErrorFAT(FileName,FileNameW);
#endif
      if (ErrHandler.AskRepeatWrite(FileName,FileNameW,false))
      {
#ifndef _WIN_ALL
        clearerr(hFile);
#endif
        if (Written<Size && Written>0)
          Seek(Tell()-Written,SEEK_SET);
        continue;
      }
      ErrHandler.WriteError(NULL,NULL,FileName,FileNameW);
    }
    break;
  }
  LastWrite=true;
}
Exemplo n.º 2
0
void File::Write(const void *Data,int Size)
{
    /*if (Size==0)
      return;
    //#ifndef _WIN_CE
    #if !defined(_WIN_CE) && !defined(_XBOX)
    if (HandleType!=FILE_HANDLENORMAL)
      switch(HandleType)
      {
        case FILE_HANDLESTD:
    #ifdef _WIN_32
          hFile=GetStdHandle(STD_OUTPUT_HANDLE);
    #else
          hFile=stdout;
    #endif
          break;
        case FILE_HANDLEERR:
    #ifdef _WIN_32
          hFile=GetStdHandle(STD_ERROR_HANDLE);
    #else
          hFile=stderr;
    #endif
          break;
      }
    #endif*/
    while (1)
    {
        bool success = true;
#if defined(_WIN_32) || defined(_LINUX)
        DWORD Written=0;
        if (HandleType!=FILE_HANDLENORMAL)
        {
            const int MaxSize=0x4000;
            for (int I=0; I<Size; I+=MaxSize)
                //if (!(success=WriteFile(hFile,(byte *)Data+I,Min(Size-I,MaxSize),&Written,NULL) != FALSE))
                m_File.Write((byte*)Data+I,Min(Size-I,MaxSize));
            //  break;
        }
        else
        {
            //success=WriteFile(hFile,Data,Size,&Written,NULL) != FALSE;
            m_File.Write(Data,Size);
        }
#else
        success=fwrite(Data,1,Size,hFile)==Size && !ferror(hFile);
#endif
        if (!success && AllowExceptions && HandleType==FILE_HANDLENORMAL)
        {
#if defined(_WIN_32) && !defined(SFX_MODULE) && !defined(RARDLL)
            int ErrCode=GetLastError();
            Int64 FilePos=Tell();
            Int64 FreeSize=GetFreeDisk(FileName);
            SetLastError(ErrCode);
            if (FreeSize>Size && FilePos-Size<=0xffffffff && FilePos+Size>0xffffffff)
                ErrHandler.WriteErrorFAT(FileName);
#endif
            if (ErrHandler.AskRepeatWrite(FileName))
            {
#if !defined(_WIN_32) && !defined(_LINUX)
                clearerr(hFile);
#endif
                if (Written<(unsigned int)Size && Written>0)
                    Seek(Tell()-Written,SEEK_SET);
                continue;
            }
            ErrHandler.WriteError(NULL,FileName);
        }
        break;
    }
    LastWrite=true;
}
Exemplo n.º 3
0
void File::Write(const void *Data,int Size)
{
  if (Size==0)
    return;
#ifndef _WIN_CE
  if (HandleType!=FILE_HANDLENORMAL)
    switch(HandleType)
    {
      case FILE_HANDLESTD:
#ifdef _WIN_32
        hFile=GetStdHandle(STD_OUTPUT_HANDLE);
#else
        hFile=stdout;
#endif
        break;
      case FILE_HANDLEERR:
#ifdef _WIN_32
        hFile=GetStdHandle(STD_ERROR_HANDLE);
#else
        hFile=stderr;
#endif
        break;
    }
#endif
  while (1)
  {
    bool Success;
#ifdef _WIN_32
    DWORD Written;
    if (HandleType!=FILE_HANDLENORMAL)
    {
      const int MaxSize=0x4000;
      for (int I=0;I<Size;I+=MaxSize)
        if (!(Success=WriteFile(hFile,(byte *)Data+I,Min(Size-I,MaxSize),&Written,NULL)))
          break;
    }
    else
      Success=WriteFile(hFile,Data,Size,&Written,NULL);
#else
    Success=fwrite(Data,1,Size,hFile)==Size && !ferror(hFile);
#endif
    if (!Success && AllowExceptions && HandleType==FILE_HANDLENORMAL)
    {
#if defined(_WIN_32) && !defined(SFX_MODULE) && !defined(RARDLL)
      int ErrCode=GetLastError();
      Int64 FilePos=Tell();
      Int64 FreeSize=GetFreeDisk(FileName);
      SetLastError(ErrCode);
      if (FreeSize>Size && FilePos-Size<=0xffffffff && FilePos+Size>0xffffffff)
        ErrHandler.WriteErrorFAT(FileName);
#endif
      if (ErrHandler.AskRepeatWrite(FileName))
      {
#ifndef _WIN_32
        clearerr(hFile);
#endif
        continue;
      }
      ErrHandler.WriteError(NULL,FileName);
    }
    break;
  }
  LastWrite=true;
}