void wxMemoryInputStream::InitFromStream(wxInputStream& stream, wxFileOffset lenFile) { if ( lenFile == wxInvalidOffset ) lenFile = stream.GetLength(); if ( lenFile == wxInvalidOffset ) { m_i_streambuf = NULL; m_lasterror = wxSTREAM_EOF; return; } const size_t len = wx_truncate_cast(size_t, lenFile); wxASSERT_MSG( (wxFileOffset)len == lenFile, wxT("huge files not supported") ); m_i_streambuf = new wxStreamBuffer(wxStreamBuffer::read); m_i_streambuf->SetBufferIO(len); // create buffer stream.Read(m_i_streambuf->GetBufferStart(), len); m_i_streambuf->SetIntPosition(0); // seek to start pos m_i_streambuf->Fixed(true); m_length = stream.LastRead(); }
bool wxAnimation::Load(wxInputStream &stream, wxAnimationType type) { UnRef(); char anim_type[12]; switch (type) { case wxANIMATION_TYPE_GIF: strcpy(anim_type, "gif"); break; case wxANIMATION_TYPE_ANI: strcpy(anim_type, "ani"); break; default: anim_type[0] = '\0'; break; } // create a GdkPixbufLoader GError *error = NULL; GdkPixbufLoader *loader; if (type != wxANIMATION_TYPE_INVALID && type != wxANIMATION_TYPE_ANY) loader = gdk_pixbuf_loader_new_with_type(anim_type, &error); else loader = gdk_pixbuf_loader_new(); if (!loader) { wxLogDebug(wxT("Could not create the loader for '%s' animation type"), anim_type); return false; } // connect to loader signals g_signal_connect(loader, "area-updated", G_CALLBACK(gdk_pixbuf_area_updated), this); guchar buf[2048]; while (stream.IsOk()) { // read a chunk of data stream.Read(buf, sizeof(buf)); // fetch all data into the loader if (!gdk_pixbuf_loader_write(loader, buf, stream.LastRead(), &error)) { gdk_pixbuf_loader_close(loader, &error); wxLogDebug(wxT("Could not write to the loader")); return false; } } // load complete if (!gdk_pixbuf_loader_close(loader, &error)) { wxLogDebug(wxT("Could not close the loader")); return false; } // wait until we get the last area_updated signal return true; }
bool wxSHA384::Hash(wxInputStream &input, wxSHA384Hash &hash) { // Get and verify the length of the stream m_length = input.GetLength(); if((m_length == wxInvalidOffset) || (m_length == 0)) return false; // Initialize H[0,..,7] hash.H[0] = SHA384_INIT_0; hash.H[1] = SHA384_INIT_1; hash.H[2] = SHA384_INIT_2; hash.H[3] = SHA384_INIT_3; hash.H[4] = SHA384_INIT_4; hash.H[5] = SHA384_INIT_5; H6 = SHA384_INIT_6; H7 = SHA384_INIT_7; // Initialize data variables m_readed = 0; m_N = (m_length / SHA384_DATA_PAD_SPACE_1) + 1; for(i = 0; i < m_N; i++) { // Initialize temporary HASH value a = hash.H[0]; b = hash.H[1]; c = hash.H[2]; d = hash.H[3]; e = hash.H[4]; f = hash.H[5]; g = H6; h = H7; // First step SHA384 [0,..,15] size_t t; for(t = 0; t < 16; t++) { // Read data to W[t] if((input.Read(&W[t], GetWSize()).LastRead() != GetWSize()) && ((m_length - m_readed) != input.LastRead())) return false; W[t] = wxUINT64_SWAP_ON_LE(W[t].GetValue()); // Wt = Mt(i) M(t, input.LastRead()); m_readed += input.LastRead(); ComputeTempHash(t); } // Second step SHA384 [16,..,79] for(; t < 80; t++) { W16_79(t); ComputeTempHash(t); } // Update HASH hash.H[0] += a; hash.H[1] += b; hash.H[2] += c; hash.H[3] += d; hash.H[4] += e; hash.H[5] += f; H6 += g; H7 += h; } return true; }
bool wxAnimation::Load(wxInputStream &stream, wxAnimationType type) { UnRef(); char anim_type[12]; switch (type) { case wxANIMATION_TYPE_GIF: strcpy(anim_type, "gif"); break; case wxANIMATION_TYPE_ANI: strcpy(anim_type, "ani"); break; default: anim_type[0] = '\0'; break; } // create a GdkPixbufLoader GError *error = NULL; GdkPixbufLoader *loader; if (type != wxANIMATION_TYPE_INVALID && type != wxANIMATION_TYPE_ANY) loader = gdk_pixbuf_loader_new_with_type(anim_type, &error); else loader = gdk_pixbuf_loader_new(); if (!loader || error != NULL) // even if the loader was allocated, an error could have happened { wxLogDebug(wxT("Could not create the loader for '%s' animation type: %s"), anim_type, error->message); return false; } // connect to loader signals g_signal_connect(loader, "area-updated", G_CALLBACK(gdk_pixbuf_area_updated), this); guchar buf[2048]; bool data_written = false; while (stream.IsOk()) { // read a chunk of data if (!stream.Read(buf, sizeof(buf)) && stream.GetLastError() != wxSTREAM_EOF) // EOF is OK for now { // gdk_pixbuf_loader_close wants the GError == NULL gdk_pixbuf_loader_close(loader, NULL); return false; } // fetch all data into the loader if (!gdk_pixbuf_loader_write(loader, buf, stream.LastRead(), &error)) { wxLogDebug(wxT("Could not write to the loader: %s"), error->message); // gdk_pixbuf_loader_close wants the GError == NULL gdk_pixbuf_loader_close(loader, NULL); return false; } data_written = true; } if (!data_written) { wxLogDebug("Could not read data from the stream..."); return false; } // load complete: gdk_pixbuf_loader_close will now check if the data we // wrote inside the pixbuf loader does make sense and will give an error // if it doesn't (because of a truncated file, corrupted data or whatelse) if (!gdk_pixbuf_loader_close(loader, &error)) { wxLogDebug(wxT("Could not close the loader: %s"), error->message); return false; } // wait until we get the last area_updated signal return data_written; }
/** * Calculates the checksums from the given stream. * * @param in Input stream from which the data will be extracted to * compute the checksum. The data are extracted until the end * of the stream is reached. * @param checksums Array of checksums to calculate. * @param sumValues The calculated values of the checksums from the input * stream. The array is erased first before adding results. * On success <CODE>ArrayChecksum.GetCount() == sumValues.GetCount()</CODE>, * on failure, <CODE>sumValues</CODE> should be empty. * @return <UL> * <LI><CODE>Ok</CODE> if the checksum has been successfully calculated.</Li> * <LI><CODE>ReadError</CODE> if a read error has occured.</LI> * <LI><CODE>Canceled</CODE> if the user has canceled the calculation.</LI> * </UL> */ ChecksumCalculator::State ChecksumCalculator::calculate(wxInputStream& in, const ArrayChecksum& checksums, wxArrayString& sumValues) { // Check if the input stream is valid. if (!in.IsOk()) return ReadError; // Check if at least a checksum instance is OK. bool aInstanceOK = false; size_t i = 0; size_t s = checksums.GetCount(); while (!aInstanceOK && i < s) if (checksums[i] != NULL) aInstanceOK = true; else i++; if (!aInstanceOK) return ReadError; // Initializes the buffer. const size_t bufSize = getBufferSize(); wxByte* buff = new wxByte[bufSize]; // Calculating the checksum. ChecksumProgress* p = getChecksumProgress(); bool canceled = false; size_t read; wxStreamError lastError = wxSTREAM_NO_ERROR; s = checksums.GetCount(); for (i = 0; i < s; i++) if (checksums[i] != NULL) checksums[i]->reset(); while (!canceled && !in.Eof() && lastError == wxSTREAM_NO_ERROR) { in.Read(buff, bufSize); read = in.LastRead(); if (read > 0 && read <= bufSize) { for (i = 0; i < s; i++) if (checksums[i] != NULL) checksums[i]->update(buff, read); if (p != NULL) p->update(read, canceled); } lastError = in.GetLastError(); } // Cleans-up the memory delete[] buff; if (canceled) return CanceledByUser; if (lastError != wxSTREAM_NO_ERROR && lastError != wxSTREAM_EOF) return ReadError; sumValues.Empty(); for (i = 0; i < s; i++) if (checksums[i] != NULL) sumValues.Add(checksums[i]->getValue()); else sumValues.Add(wxEmptyString); return Ok; }