////////////////////////////////////////////////////////////////////////// // _print: print helper // we use the thread-safe funtion "SafeWriteFile()" to output the data ////////////////////////////////////////////////////////////////////////// int CConsoleLogger::_print(const char *lpszText,int iSize) { DWORD dwWritten=(DWORD)-1; return (!SafeWriteFile( m_hPipe,lpszText,iSize,&dwWritten,NULL) || (int)dwWritten!=iSize) ? -1 : (int)dwWritten; }
////////////////////////////////////////////////////////////////////////// // clear_eol() : clear till the end of current line ////////////////////////////////////////////////////////////////////////// void CConsoleLoggerEx::clear_eol(void) { DWORD dwWritten=(DWORD)-1; // we assume that in iSize < 2^24 , because we're using only 3 bytes of iSize // 32BIT: send DWORD = 4bytes: one byte is the command (COMMAND_PRINT) , and 3 bytes for size DWORD command = COMMAND_CLEAR_EOL<<24; SafeWriteFile (m_hPipe, &command,sizeof(DWORD),&dwWritten,NULL); }
void ASF_MetaHandler::UpdateFile ( bool doSafeUpdate ) { bool updated = false; if ( ! this->needsUpdate ) return; XMP_IO* fileRef ( this->parent->ioRef ); if ( fileRef == 0 ) return; ASF_Support support(0,this->parent->progressTracker); ASF_Support::ObjectState objectState; long numTags = support.OpenASF ( fileRef, objectState ); if ( numTags == 0 ) return; XMP_StringLen packetLen = (XMP_StringLen)xmpPacket.size(); this->legacyManager.ExportLegacy ( this->xmpObj ); if ( this->legacyManager.hasLegacyChanged() ) { this->legacyManager.SetDigest ( &this->xmpObj ); // serialize with updated digest if ( objectState.xmpLen == 0 ) { // XMP does not exist, use standard padding this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat ); } else { // re-use padding with static XMP size try { XMP_OptionBits compactExact = (kXMP_UseCompactFormat | kXMP_ExactPacketLength); this->xmpObj.SerializeToBuffer ( &this->xmpPacket, compactExact, XMP_StringLen(objectState.xmpLen) ); } catch ( ... ) { // re-use padding with exact packet length failed (legacy-digest needed too much space): try again using standard padding this->xmpObj.SerializeToBuffer ( &this->xmpPacket, kXMP_UseCompactFormat ); } } } XMP_StringPtr packetStr = xmpPacket.c_str(); packetLen = (XMP_StringLen)xmpPacket.size(); if ( packetLen == 0 ) return; // value, when guessing for sufficient legacy padding (line-ending conversion etc.) const int paddingTolerance = 50; bool xmpGrows = ( objectState.xmpLen && (packetLen > objectState.xmpLen) && ( ! objectState.xmpIsLastObject) ); bool legacyGrows = ( this->legacyManager.hasLegacyChanged() && (this->legacyManager.getLegacyDiff() > (this->legacyManager.GetPadding() - paddingTolerance)) ); if ( doSafeUpdate || legacyGrows || xmpGrows ) { // do a safe update in any case updated = SafeWriteFile(); } else { // possibly we can do an in-place update if ( objectState.xmpLen < packetLen ) { updated = SafeWriteFile(); } else { XMP_ProgressTracker* progressTracker = this->parent->progressTracker; if ( progressTracker != 0 ) progressTracker->BeginWork ( (float)packetLen ); // current XMP chunk size is sufficient -> write (in place update) updated = ASF_Support::WriteBuffer(fileRef, objectState.xmpPos, packetLen, packetStr ); // legacy update if ( updated && this->legacyManager.hasLegacyChanged() ) { ASF_Support::ObjectIterator curPos = objectState.objects.begin(); ASF_Support::ObjectIterator endPos = objectState.objects.end(); for ( ; curPos != endPos; ++curPos ) { ASF_Support::ObjectData object = *curPos; // find header-object if ( IsEqualGUID ( ASF_Header_Object, object.guid ) ) { // update header object updated = support.UpdateHeaderObject ( fileRef, object, legacyManager ); } } } if ( progressTracker != 0 ) progressTracker->WorkComplete(); } } if ( ! updated ) return; // If there's an error writing the chunk, bail. this->needsUpdate = false; } // ASF_MetaHandler::UpdateFile