| 122 | |
| 123 | |
| 124 | bool QuickOpen::Read(void *Data,size_t Size,size_t &Result) |
| 125 | { |
| 126 | if (!Loaded) |
| 127 | return false; |
| 128 | // Find next suitable cached block. |
| 129 | while (LastReadHeaderPos+LastReadHeader.Size()<=SeekPos) |
| 130 | if (!ReadNext()) |
| 131 | break; |
| 132 | if (!Loaded) |
| 133 | { |
| 134 | // If something wrong happened, let's set the correct file pointer |
| 135 | // and stop further quick open processing. |
| 136 | if (UnsyncSeekPos) |
| 137 | Arc->File::Seek(SeekPos,SEEK_SET); |
| 138 | return false; |
| 139 | } |
| 140 | |
| 141 | if (SeekPos>=LastReadHeaderPos && SeekPos+Size<=LastReadHeaderPos+LastReadHeader.Size()) |
| 142 | { |
| 143 | memcpy(Data,LastReadHeader+size_t(SeekPos-LastReadHeaderPos),Size); |
| 144 | Result=Size; |
| 145 | SeekPos+=Size; |
| 146 | UnsyncSeekPos=true; |
| 147 | } |
| 148 | else |
| 149 | { |
| 150 | if (UnsyncSeekPos) |
| 151 | { |
| 152 | Arc->File::Seek(SeekPos,SEEK_SET); |
| 153 | UnsyncSeekPos=false; |
| 154 | } |
| 155 | int ReadSize=Arc->File::Read(Data,Size); |
| 156 | if (ReadSize<0) |
| 157 | { |
| 158 | Loaded=false; |
| 159 | return false; |
| 160 | } |
| 161 | Result=ReadSize; |
| 162 | SeekPos+=ReadSize; |
| 163 | } |
| 164 | |
| 165 | return true; |
| 166 | } |
| 167 | |
| 168 | |
| 169 | bool QuickOpen::Seek(int64 Offset,int Method) |