static bool MakeDiffTmpFile_core(CTextOutputStream& out, HWND hwnd, CEditView& view, bool bBom) { CLogicInt y = CLogicInt(0); const wchar_t* pLineData; if( !hwnd ){ const CDocLineMgr& docMgr = view.m_pcEditDoc->m_cDocLineMgr; for(;;){ CLogicInt nLineLen; pLineData = docMgr.GetLine(y)->GetDocLineStrWithEOL(&nLineLen); // 正常終了 if( 0 == nLineLen || NULL == pLineData ) break; if( bBom ){ CNativeW cLine2(L"\ufeff"); cLine2.AppendString(pLineData, nLineLen); out.WriteString(cLine2.GetStringPtr(), cLine2.GetStringLength()); bBom = false; }else{ out.WriteString(pLineData,nLineLen); } y++; } }else if( IsSakuraMainWindow(hwnd) ) { const int max_size = (int)GetDllShareData().m_sWorkBuffer.GetWorkBufferCount<const EDIT_CHAR>(); pLineData = GetDllShareData().m_sWorkBuffer.GetWorkBuffer<const EDIT_CHAR>(); for(;;){ int nLineOffset = 0; int nLineLen = 0; //初回用仮値 do{ // m_sWorkBuffer#m_Workの排他制御。外部コマンド出力/TraceOut/Diffが対象 LockGuard<CMutex> guard( CShareData::GetMutexShareWork() ); { nLineLen = ::SendMessageAny( hwnd, MYWM_GETLINEDATA, y, nLineOffset ); if( nLineLen == 0 ){ return true; } // EOF => 正常終了 if( nLineLen < 0 ){ return false; } // 何かエラー if( bBom ){ CNativeW cLine2(L"\ufeff"); cLine2.AppendString(pLineData, t_min(nLineLen, max_size)); out.WriteString(cLine2.GetStringPtr(), cLine2.GetStringLength()); bBom = false; }else{ out.WriteString(pLineData, t_min(nLineLen, max_size)); } } nLineOffset += max_size; }while(max_size < nLineLen); y++; } }else{ return false; } if( bBom ){ out.WriteString(L"\ufeff", 1); } return true; }
/*! 外部ファイルを指定でのファイルを表示 */ BOOL CEditView::MakeDiffTmpFile2( TCHAR* tmpName, const TCHAR* orgName, ECodeType code, ECodeType saveCode ) { //一時 TCHAR* pszTmpName = _ttempnam( NULL, SAKURA_DIFF_TEMP_PREFIX ); if( NULL == pszTmpName ){ WarningMessage( NULL, LS(STR_DIFF_FAILED) ); return FALSE; } _tcscpy( tmpName, pszTmpName ); free( pszTmpName ); bool bBom = false; const STypeConfigMini* typeMini; CDocTypeManager().GetTypeConfigMini( CDocTypeManager().GetDocumentTypeOfPath( orgName ), &typeMini ); CFileLoad cfl( typeMini->m_encoding ); CTextOutputStream out(tmpName, saveCode, true, false); if(!out){ WarningMessage( NULL, LS(STR_DIFF_FAILED_TEMP) ); return FALSE; } try{ bool bBigFile; #ifdef _WIN64 bBigFile = true; #else bBigFile = false; #endif cfl.FileOpen( orgName, bBigFile, code, GetDllShareData().m_Common.m_sFile.GetAutoMIMEdecode(), &bBom ); CNativeW cLine; CEol cEol; while( RESULT_FAILURE != cfl.ReadLine( &cLine, &cEol ) ) { const wchar_t* pLineData; CLogicInt nLineLen; pLineData= cLine.GetStringPtr(&nLineLen); if( 0 == nLineLen || NULL == pLineData ) break; if( bBom ){ CNativeW cLine2(L"\ufeff"); cLine2.AppendString(pLineData, nLineLen); out.WriteString(cLine2.GetStringPtr(), cLine2.GetStringLength()); bBom = false; }else{ out.WriteString(pLineData,nLineLen); } } if( bBom ){ out.WriteString(L"\ufeff", 1); } } catch(...){ out.Close(); _tunlink( tmpName ); //関数の実行に失敗したとき、一時ファイルの削除は関数内で行う。 WarningMessage( NULL, LS(STR_DIFF_FAILED_TEMP) ); return FALSE; } return TRUE; }
// create the constrained lines foreach(QVariant item, lines) { QObject* line = item.value<QObject*>(); int start = line->property("startPoint").value<QObject*>()->property("identifier").toInt(); int end = line->property("endPoint").value<QObject*>()->property("identifier").toInt(); #ifdef CARPENTER_DEBUG qDebug() << "SketchSolver: line [" << start << "," << end << "]"; #endif bool vertical = line->property("verticallyConstrained").toBool(); bool horizontal = line->property("horizontallyConstrained").toBool(); bool distanceFixed = line->property("distanceFixed").toBool(); int identifier = line->property("identifier").toInt(); QSharedPointer<ConstrainedLine> cLine1(new ConstrainedLine(this->points[start], this->points[end], identifier)); QSharedPointer<ConstrainedLine> cLine2(new ConstrainedLine(this->points[end], this->points[start], identifier)); if(distanceFixed) { double desiredDistance = line->property("desiredDistance").toDouble(); cLine1->setDesiredDistance(desiredDistance); cLine2->setDesiredDistance(desiredDistance); this->constraints << cLine1; } if(horizontal) { cLine1->horizontallyConstrained(); cLine2->horizontallyConstrained(); horizontalAndVerticalConstraints++; } if(vertical) { cLine1->verticallyConstrained(); cLine2->verticallyConstrained(); horizontalAndVerticalConstraints++; } this->lines << cLine1 << cLine2; }