ManagedShader(ResourceManager& rm, std::string vert="", std::string frag="")
	:	ShaderProgram(),
		rm(rm),
		relink(0)
	{
		vertex(vert);
		fragment(frag);
	}
Exemplo n.º 2
0
    void scgi_server::decode(const std::string& payload) {
        // headers length
        const char* p = payload.data();
        char* e = nullptr;
        size_t hl = std::strtoul(p, &e, 10);
        if (*e != ':') {
            throw scgi_payload_error{"Delimiter ':' is expected."};
        }
        const char* end = ++e + hl;

        // headers
        for (p = e; p < end; ++p) {
            std::string k = fragment(p);
            (*this)[k] = fragment(++p);
        }
        if (p != end or *p != ',') {
            throw scgi_payload_error{"Broken SCGI payload."};
        }
        this->content = ++p;

        // SCGI
        auto scgi = this->find("SCGI");
        if (scgi == this->end()) {
            throw scgi_payload_error{"Invalid SCGI payload."};
        }
        else if (scgi->second != "1") {
            throw scgi_payload_error{
              "Unsupported protocol version: " + scgi->second
            };
        }
        this->erase(scgi);

        // CONTENT_LENGTH
        auto cl = this->find("CONTENT_LENGTH");
        if (cl == this->end()) {
            throw scgi_payload_error{
              "The \"CONTENT_LENGTH\" header must always be present,"
                " even if its value is \"0\"."
            };
        }
        this->content_length = std::strtoul(cl->second.data(), &e, 10);
        if (*e != 0) {
            throw scgi_payload_error{"Invalid content length."};
        }
        this->erase(cl);
    }
Exemplo n.º 3
0
ShaderManager::ShaderManager()
{
    ShaderStage staticMeshVsh(GL_VERTEX_SHADER, "shaders/static_mesh.vsh");
    ShaderStage staticMeshFsh(GL_FRAGMENT_SHADER, "shaders/static_mesh.fsh");
    //Color mult prog
    m_staticMeshShader = new UnlitTintedShaderDescription(staticMeshVsh, staticMeshFsh);
    
    //Room prog
    ShaderStage roomFragmentShader(GL_FRAGMENT_SHADER, "shaders/room.fsh");
    for (int isWater = 0; isWater < 2; isWater++)
    {
        for (int isFlicker = 0; isFlicker < 2; isFlicker++)
        {
            std::ostringstream stream;
            stream << "#define IS_WATER " << isWater << std::endl;
            stream << "#define IS_FLICKER " << isFlicker << std::endl;

            ShaderStage roomVsh(GL_VERTEX_SHADER, "shaders/room.vsh", stream.str().c_str());
            m_roomShaders[isWater][isFlicker] = new UnlitTintedShaderDescription(roomVsh, roomFragmentShader);
        }
    }
    
    // Entity prog
    ShaderStage entityVertexShader(GL_VERTEX_SHADER, "shaders/entity.vsh");
    ShaderStage entitySkinVertexShader(GL_VERTEX_SHADER, "shaders/entity_skin.vsh");
    for (int i = 0; i <= MAX_NUM_LIGHTS; i++) {
        std::ostringstream stream;
        stream << "#define NUMBER_OF_LIGHTS " << i << std::endl;
        
        ShaderStage fragment(GL_FRAGMENT_SHADER, "shaders/entity.fsh", stream.str().c_str());
        m_entityShader[i][0] = new LitShaderDescription(entityVertexShader, fragment);
        m_entityShader[i][1] = new LitShaderDescription(entitySkinVertexShader, fragment);
    }
    
    // GUI prog
    ShaderStage guiVertexShader(GL_VERTEX_SHADER, "shaders/gui.vsh");
    ShaderStage guiFsh(GL_FRAGMENT_SHADER, "shaders/gui.fsh");
    m_gui = new GuiShaderDescription(guiVertexShader, guiFsh);
    
    ShaderStage guiTexFsh(GL_FRAGMENT_SHADER, "shaders/gui_tex.fsh");
    m_guiTextured = new GuiShaderDescription(guiVertexShader, guiTexFsh);
    
    ShaderStage textVsh(GL_VERTEX_SHADER, "shaders/text.vsh");
    ShaderStage textFsh(GL_FRAGMENT_SHADER, "shaders/text.fsh");
    m_text = new TextShaderDescription(textVsh, textFsh);
    
    ShaderStage spriteVsh(GL_VERTEX_SHADER, "shaders/sprite.vsh");
    ShaderStage spriteFsh(GL_FRAGMENT_SHADER, "shaders/sprite.fsh");
    m_sprites = new SpriteShaderDescription(spriteVsh, spriteFsh);
    
    ShaderStage stencilVsh(GL_VERTEX_SHADER, "shaders/stencil.vsh");
    ShaderStage stencilFsh(GL_FRAGMENT_SHADER, "shaders/stencil.fsh");
    m_stencil = new UnlitShaderDescription(stencilVsh, stencilFsh);

    ShaderStage debugVsh(GL_VERTEX_SHADER, "shaders/debuglines.vsh");
    ShaderStage debugFsh(GL_FRAGMENT_SHADER, "shaders/debuglines.fsh");
    m_debugline = new UnlitShaderDescription(debugVsh, debugFsh);
}
Exemplo n.º 4
0
// Read a rule table from 'in' and filter it according to the test sentences.
//
// This involves testing TSG fragments for matches against at potential match
// sites in the set of test parse trees / forests.  There are a few
// optimizations that make this reasonably fast in practice:
//
// Optimization 1
// If a rule has the same TSG fragment as the previous rule then re-use the
// result of the previous filtering decision.
//
// Optimization 2
// Test if the TSG fragment contains any symbols that don't occur in the
// symbol vocabulary of the test set.  If it does then the rule can be
// discarded.
//
// Optimization 3
// Prior to filtering, a map is constructed from each distinct test set tree /
// forest vertex symbol to the set of vertices having that symbol.  During
// filtering, for each rule's TSG fragment the leaf with the smallest number of
// corresponding test nodes nodes is determined.  Matching is only attempted
// at those sites (this is done in MatchFragment, which has tree- and
// forest-specific implementations).
//
// Some statistics from real data (WMT14, English-German, tree-version):
//
//  4.4M    Parallel sentences (source-side parsed with Berkeley parser)
//  2.7K    Test sentences (newstest2014)
//
// 73.4M    Original rule table size (number of distinct, composed GHKM rules)
// 22.9M    Number of rules with same source-side as previous rule
// 50.5M    Number of rules requiring vocabulary matching test
// 24.1M    Number of rules requiring full tree matching test
//  6.7M    Number of rules retained after filtering
//
void TsgFilter::Filter(std::istream &in, std::ostream &out)
{
  const util::MultiCharacter delimiter("|||");

  std::string line;
  std::string prevLine;
  StringPiece source;
  bool keep = true;
  int lineNum = 0;
  std::vector<TreeFragmentToken> tokens;
  std::vector<IdTree *> leaves;

  while (std::getline(in, line)) {
    ++lineNum;

    // Read the source-side of the rule.
    util::TokenIter<util::MultiCharacter> it(line, delimiter);

    // Check if this rule has the same source-side as the previous rule.  If
    // it does then we already know whether or not to keep the rule.  This
    // optimisation is based on the assumption that the rule table is sorted
    // (which is the case in the standard Moses training pipeline).
    if (*it == source) {
      if (keep) {
        out << line << std::endl;
      }
      continue;
    }

    // The source-side is different from the previous rule's.
    source = *it;

    // Tokenize the source-side tree fragment.
    tokens.clear();
    for (TreeFragmentTokenizer p(source); p != TreeFragmentTokenizer(); ++p) {
      tokens.push_back(*p);
    }

    // Construct an IdTree representing the source-side tree fragment.  This
    // will fail if the fragment contains any symbols that don't occur in
    // m_testVocab and in that case the rule can be discarded.  In practice,
    // this catches a lot of discardable rules (see comment at the top of this
    // function).  If the fragment is successfully created then we attempt to
    // match the tree fragment against the test trees.  This test is exact, but
    // slow.
    int i = 0;
    leaves.clear();
    boost::scoped_ptr<IdTree> fragment(BuildTree(tokens, i, leaves));
    keep = fragment.get() && MatchFragment(*fragment, leaves);
    if (keep) {
      out << line << std::endl;
    }

    // Retain line for the next iteration (in order that the source StringPiece
    // remains valid).
    prevLine.swap(line);
  }
}
Exemplo n.º 5
0
static inline void
drawtri_horse(Image *img, Rect *r, short *a, short *b, short *c, uchar *color)
{
	v4int abp_y, bcp_y, cap_y, abp, bcp, cap;
	v4int abp_dx, bcp_dx, cap_dx;
	v4int abp_dy, bcp_dy, cap_dy;
	v4int mask;

	short u0, v0;

	enum { ustep = 2, vstep = 2 };

	abp_dx = vec4ir(ori2i_dx(a, b));
	bcp_dx = vec4ir(ori2i_dx(b, c));
	cap_dx = vec4ir(ori2i_dx(c, a));

	abp_dy = vec4ir(ori2i_dy(a, b));
	bcp_dy = vec4ir(ori2i_dy(b, c));
	cap_dy = vec4ir(ori2i_dy(c, a));

	short p[2] = { r->u0, r->v0 };
	abp_y = vec4ir(ori2i(a, b, p)) + vec4i(0, abp_dx[0], abp_dy[0], abp_dx[0]+abp_dy[0]);
	bcp_y = vec4ir(ori2i(b, c, p)) + vec4i(0, bcp_dx[0], bcp_dy[0], bcp_dx[0]+bcp_dy[0]);
	cap_y = vec4ir(ori2i(c, a, p)) + vec4i(0, cap_dx[0], cap_dy[0], cap_dx[0]+cap_dy[0]);

	abp_y += topleft(a, b);
	bcp_y += topleft(b, c);
	cap_y += topleft(c, a);

	abp_dx = abp_dx * ustep;
	bcp_dx = bcp_dx * ustep;
	cap_dx = cap_dx * ustep;

	abp_dy = abp_dy * vstep;
	bcp_dy = bcp_dy * vstep;
	cap_dy = cap_dy * vstep;

	for(v0 = r->v0; v0 < r->vend; v0 += vstep){
		abp = abp_y;
		bcp = bcp_y;
		cap = cap_y;
		for(u0 = r->u0; u0 < r->uend; u0 += ustep){
			mask = (abp | bcp | cap) >> 31;
			if((mask[0]&mask[1]&mask[2]&mask[3]) == 0){
				mask |= vec4i(0, -(u0 == r->uend-1), 0, -(u0 == r->uend-1));
				mask |= vec4i(0, 0, -(v0 == r->vend-1), -(v0 == r->vend-1));
				fragment(img, u0, v0, *(u32int*)color, mask);
			}
			abp += abp_dx;
			bcp += bcp_dx;
			cap += cap_dx;
		}
		abp_y += abp_dy;
		bcp_y += bcp_dy;
		cap_y += cap_dy;
	}
}
Exemplo n.º 6
0
void FlatTextarea::processDocumentContentsChange(int position, int charsAdded) {
    int32 emojiPosition = 0, emojiLen = 0;
    const EmojiData *emoji = 0;

    QTextDocument *doc(document());

    while (true) {
        int32 start = position, end = position + charsAdded;
        QTextBlock from = doc->findBlock(start), till = doc->findBlock(end);
        if (till.isValid()) till = till.next();

        for (QTextBlock b = from; b != till; b = b.next()) {
            for (QTextBlock::Iterator iter = b.begin(); !iter.atEnd(); ++iter) {
                QTextFragment fragment(iter.fragment());
                if (!fragment.isValid()) continue;

                int32 fp = fragment.position(), fe = fp + fragment.length();
                if (fp >= end || fe <= start) {
                    continue;
                }

                QString t(fragment.text());
                const QChar *ch = t.constData(), *e = ch + t.size();
                for (; ch != e; ++ch) {
                    emoji = emojiFromText(ch, e, emojiLen);
                    if (emoji) {
                        emojiPosition = fp + (ch - t.constData());
                        break;
                    }
                    if (ch + 1 < e && ch->isHighSurrogate() && (ch + 1)->isLowSurrogate()) ++ch;
                }
                if (emoji) break;
            }
            if (emoji) break;
        }
        if (emoji) {
            if (!document()->pageSize().isNull()) {
                document()->setPageSize(QSizeF(0, 0));
            }

            QTextCursor c(doc->docHandle(), emojiPosition);
            c.setPosition(emojiPosition + emojiLen, QTextCursor::KeepAnchor);
            int32 removedUpto = c.position();

            insertEmoji(emoji, c);

            charsAdded -= removedUpto - position;
            position = emojiPosition + 1;

            emoji = 0;
            emojiPosition = 0;
        } else {
            break;
        }
    }
}
Exemplo n.º 7
0
Node* Node::insertBefore(Node *newChild, Node* refChild)
{
	ASSERT(0);
	return nullptr;
#if 0

	if (newChild == NULL) return E_INVALIDARG;

	ILDOMNode *refChild;
	if (V_VT(&vrefChild) == VT_NULL || V_VT(&vrefChild) == VT_EMPTY)
	{
		refChild = NULL;
	}
	else if (V_VT(&vrefChild) == VT_UNKNOWN || V_VT(&vrefChild) == VT_DISPATCH)
	{
		if (V_UNKNOWN(&vrefChild))
		{
			refChild = CComQIPtr<ILDOMNode, &IID_ILDOMNode>(V_UNKNOWN(&vrefChild));
			if (refChild == NULL) return E_INVALIDARG;
		}
		else
			refChild = NULL;
	}
	else
		return E_INVALIDARG;

	CComQIPtr<ILDOMDocumentFragment, &IID_ILDOMDocumentFragment> fragment((IUnknown*)newChild);
	if (fragment)
	{
		CComPtr<ILDOMNode> child;
		fragment->get_firstChild(&child);
		while (child)
		{
			CComPtr<ILDOMNode> nextSibling;
			child->get_nextSibling(&nextSibling);

			insertNode(thisNode, child, refChild, NULL);

			child = nextSibling;
		}

		if (pVal)
		{
			*pVal = NULL;	// ??
		}

		return S_OK;
	}
	else
	{
		return insertNode(thisNode, newChild, refChild, pVal);
	}
#endif
}
Exemplo n.º 8
0
        const PacketBuilder::FragmentPtr OutboundMessageState::getNextFragment()
        {
            if(!m_fragments.size())
                fragment();

            for(const auto& fs : m_fragments) {
                if(!fs.second.sent)
                    return fs.first;
            }
            return PacketBuilder::FragmentPtr();
        }
Exemplo n.º 9
0
	static Uri make_base(const Uri& document)
	{
		auto tmp = document;
		if (tmp.relative())
			tmp = "http://" + tmp.string();

		tmp.fragment(std::string());
		tmp.query(std::string());
		tmp.path(filesystem::path{ tmp.path() }.remove_filename().string());
		tmp.ensure_query();
		return tmp;
	}
Exemplo n.º 10
0
bool FlatTextarea::hasText() const {
	QTextDocument *doc(document());
	QTextBlock from = doc->begin(), till = doc->end();

	if (from == till) return false;

	for (QTextBlock::Iterator iter = from.begin(); !iter.atEnd(); ++iter) {
		QTextFragment fragment(iter.fragment());
		if (!fragment.isValid()) continue;
		if (!fragment.text().isEmpty()) return true;
	}
	return (from.next() != till);
}
Exemplo n.º 11
0
Shader::Shader(const char* name_, const char* vertexSource, const char* fragmentSource, gl::ObjectStore& store, Defines defines)
    : name(name_)
    , program(store.createProgram())
    , vertexShader(store.createShader(GL_VERTEX_SHADER))
    , fragmentShader(store.createShader(GL_FRAGMENT_SHADER))
{
    util::stopwatch stopwatch("shader compilation", Event::Shader);

    if (!compileShader(vertexShader, vertexSource)) {
        Log::Error(Event::Shader, "Vertex shader %s failed to compile: %s", name, vertexSource);
        throw util::ShaderException(std::string { "Vertex shader " } + name + " failed to compile");
    }

    std::string fragment(fragmentSource);
    if (defines & Defines::Overdraw) {
        assert(fragment.find("#ifdef OVERDRAW_INSPECTOR") != std::string::npos);
        fragment.replace(fragment.find_first_of('\n'), 1, "\n#define OVERDRAW_INSPECTOR\n");
    }

    if (!compileShader(fragmentShader, fragment.c_str())) {
        Log::Error(Event::Shader, "Fragment shader %s failed to compile: %s", name, fragmentSource);
        throw util::ShaderException(std::string { "Fragment shader " } + name + " failed to compile");
    }

    // Attach shaders
    MBGL_CHECK_ERROR(glAttachShader(program.get(), vertexShader.get()));
    MBGL_CHECK_ERROR(glAttachShader(program.get(), fragmentShader.get()));

    // Bind attribute variables
    MBGL_CHECK_ERROR(glBindAttribLocation(program.get(), a_pos, "a_pos"));
    MBGL_CHECK_ERROR(glBindAttribLocation(program.get(), a_extrude, "a_extrude"));
    MBGL_CHECK_ERROR(glBindAttribLocation(program.get(), a_offset, "a_offset"));
    MBGL_CHECK_ERROR(glBindAttribLocation(program.get(), a_data, "a_data"));
    MBGL_CHECK_ERROR(glBindAttribLocation(program.get(), a_texture_pos, "a_texture_pos"));

    // Link program
    GLint status;
     MBGL_CHECK_ERROR(glLinkProgram(program.get()));

    MBGL_CHECK_ERROR(glGetProgramiv(program.get(), GL_LINK_STATUS, &status));
    if (status == 0) {
        GLint logLength;
        MBGL_CHECK_ERROR(glGetProgramiv(program.get(), GL_INFO_LOG_LENGTH, &logLength));
        const auto log = std::make_unique<GLchar[]>(logLength);
        if (logLength > 0) {
            MBGL_CHECK_ERROR(glGetProgramInfoLog(program.get(), logLength, &logLength, log.get()));
            Log::Error(Event::Shader, "Program failed to link: %s", log.get());
        }
        throw util::ShaderException(std::string { "Program " } + name + " failed to link: " + log.get());
    }
}
Exemplo n.º 12
0
bool shader_t::compile()
{
	m_program_handle = 0;
	
	GLuint vertex( compile_shader( GL_VERTEX_SHADER, m_vertex_shader_src ) );

	if( vertex == 0 ) 
	{
		return false;
	}

	GLuint fragment( compile_shader( GL_FRAGMENT_SHADER, m_fragment_shader_src ) );

	if( fragment == 0 ) 
	{
		glDeleteShader( vertex );
		return false;
	}

	GLuint program( glCreateProgram() );
	if( program == 0 ) 
	{
		glDeleteShader( vertex );
		glDeleteShader( fragment );
		return false;
	}

	glBindAttribLocation( program, Common::POSITION, "VertexPosition" );
	glBindAttribLocation( program, Common::COLOR, "VertexColor" );


	glAttachShader( program, vertex );
	glAttachShader( program, fragment );

	glLinkProgram( program );

	glDeleteShader( vertex );
	glDeleteShader( fragment );

	GLint result;
	glGetShaderiv( program, GL_LINK_STATUS, &result );

	if( GL_FALSE == result ) 
	{
		log_opengl_error( program );
		return false;
	}

	m_program_handle = program;
	return true;
}
Exemplo n.º 13
0
std::string URL::pathEtc() const
{
    std::string res;    
    res.append(path());    
    if (hasQuery()) {
        res.append("?");
        res.append(query());
    }
    if (hasFragment()) {
        res.append("#");
        res.append(fragment());
    }
    return res;
}
Exemplo n.º 14
0
void CMaterialSet::dumpSources(const CUniqueID& id)
{
    atUint32 i = 0;
    for (atUint32 matId : m_materials)
    {
        std::ofstream fragment(Athena::utility::sprintf("fs_%s_%i.txt", id.toString().c_str(), i));
        CMaterial& mat = CMaterialCache::instance()->material(matId);
        fragment << mat.fragmentSource().toStdString();
        fragment.flush();
        std::ofstream vertex(Athena::utility::sprintf("vs_%s_%i.txt", id.toString().c_str(), i));
        vertex << mat.vertexSource().toStdString();
        vertex.flush();
        i++;
    }
}
Exemplo n.º 15
0
	static Uri canonical(const Uri& uri, const Uri& base)
	{
		if (uri.absolute())
			return uri;

		auto temp = base;
		temp.fragment(uri.fragment());
		temp.query(uri.query());

		auto path = filesystem::canonical(uri.path(), base.path());
		if (path.has_root_name())
			path = path.string().substr(path.root_name().string().length());
		temp.path(path.string());

		return temp;
	}
Exemplo n.º 16
0
/**
 * Allocate a new area for the fragment from the parent sublist.
 * 
 * @return 0 on success, non-zero on failure 
 */
uintptr_t
allocateMemoryForSublistFragment(void *vmThreadRawPtr, J9VMGC_SublistFragment *fragmentPrimitive)
{
	OMR_VMThread *omrVMThread = (OMR_VMThread*) vmThreadRawPtr;
	MM_SublistFragment fragment(fragmentPrimitive);
	
	MM_SublistFragment::flush(fragmentPrimitive);
	MM_EnvironmentBase *env = MM_EnvironmentBase::getEnvironment(omrVMThread);
	
	bool result = ((MM_SublistPool *)fragmentPrimitive->parentList)->allocate(env, &fragment);
	if (result) {
		return 0;
	} else {
#if defined(OMR_GC_MODRON_SCAVENGER)
		env->getExtensions()->setRememberedSetOverflowState();
#endif /* OMR_GC_MODRON_SCAVENGER */
		return 1;
	}
}
    std::unique_ptr<unsigned> CircleValueRecognitionEngine::recognize(const IBitmapRawData & data, ImageRect const * rect)
    {
        if (!rect) throw invalid_argument("rect");

        BitmapRawData fragment(data);
        ImageRect cropRect = *rect;
        ++cropRect.width;
        ++cropRect.height;
        fragment.crop(cropRect);

#ifdef _DEBUG
        Debug::WriteBmp("fragment.bmp", fragment.getWidth(), fragment.getHeight(), [&](size_t x, size_t y) { return fragment.getPixel(x, y); });
#endif

        std::set<unsigned> digitNumbers({ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 });
        const auto num = tesseract_->recognize(fragment, digitNumbers);
        if (num)
            return std::make_unique<unsigned>(num->first);

        return nullptr;
    }
Exemplo n.º 18
0
//Produção Statement
StatementNode* statement(){
printf("Statement\n");
      if (lookahead == ID){
            int lexema = retornaIndiceLexemaAtual();
            REGISTRO *regi = retornaRegistroAtual();
            IdNode* idStm = new IdNode(lexema, regi);
            match(ID, followStatement, &lexema);       
            return statementDuasLinhas(idStm);         
      }else if (lookahead == IF){
            match(IF,followStatement, NULL);
            ExpressionNode* exp = expression();
            StatementNode* stmt = statement();
            StatementNode* stmtLinha = statementLinha();
            return new IfNode(exp, stmt, stmtLinha);
      }else if (lookahead == WHILE){
            match(WHILE,followStatement, NULL);
            ExpressionNode* exp = expression();
            StatementNode* stmt = statement();
            return new WhileNode(exp, stmt);
      }else if (lookahead == WRITE){
            match(WRITE,followStatement, NULL);
            match(OPENPAR,followStatement, NULL);
            ExpressionListNode* expList = expressionList();            
            match(CLOSEPAR,followStatement, NULL);
            return new WriteNode(expList);
      }else if (lookahead == READ){
            match(READ,followStatement, NULL);
            match(OPENPAR,followStatement, NULL);
            ExpressionListNode* expList = expressionList();            
            match(CLOSEPAR,followStatement, NULL);
            return new ReadNode(expList);
      }else if (lookaheadPertenceFirst(NameDecl) == 1){
            return  namedecl();
      }else if (lookaheadPertenceFirst(Fragment) == 1){
            return fragment();
      }else {
            emiteErroSintatico(ERRO_TOKEN_INVALIDO,lookahead,retornaLinha()); return NULL;}
}
Exemplo n.º 19
0
void ShaderLibrary::loadAllShaders()
{
   s_shaders.insert(NoShader, 0);
   QVariantMap defaultParameters;
   defaultParameters.insert("Shininess", QVariant(0.5));
   defaultParameters.insert("Highlights", QVariant(0.5));
   setUniformVariables(NoShader, defaultParameters);

   QDir dir(Preferences::ShaderDirectory());
   if (!dir.exists() || !dir.isReadable()) {
      QLOG_WARN() << "Could not access shader directory: " + dir.path();
      return;
   }

   QDir::Filters filters(QDir::Files | QDir::Readable);
   QStringList contents(dir.entryList(filters));

   unsigned program;
   QStringList::iterator iter;
   for (iter = contents.begin(); iter != contents.end(); ++iter) {
       QFileInfo vertex(dir, *iter);
       if (vertex.suffix().contains("vert", Qt::CaseInsensitive)) {
          QFileInfo fragment(dir, vertex.completeBaseName() + ".frag"); 
          if (fragment.exists()) {
             QString name(fragment.completeBaseName());
             name = name.replace("_", " ");
             program = createProgram(vertex.filePath(), fragment.filePath());          
             if (program > 0) {
                QLOG_DEBUG() << "Shader compilation successful:" << name;
                s_shaders.insert(name, program);
                QVariantMap uniforms(parseUniformVariables(vertex.filePath()));
                uniforms.unite(parseUniformVariables(fragment.filePath()));
                setUniformVariables(name, uniforms);
             }
          }
       }
   }
}
Exemplo n.º 20
0
/**
 * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
 *
 * foo://[email protected]:8042/over/there?name=ferret#nose
 * \_/   \_______________________/\_________/ \_________/ \__/
 * |                |                |            |       |
 * scheme        authority           path        query   fragment
 */
inline std::tstring_t
Uri::uri() const
{
    std::tstring_t sRv;
    std::tstring_t temp;

    temp = scheme();
    if (!temp.empty()) {
        sRv += xT("");
        sRv += temp;
    }

    temp = authority();
    if (!temp.empty()) {
        sRv += xT(":");
        sRv += temp;
    }

    temp = path();
    if (!temp.empty()) {
        sRv += xT("");
        sRv += temp;
    }

    temp = query();
    if (!temp.empty()) {
        sRv += xT("?");
        sRv += temp;
    }

    temp = fragment();
    if (!temp.empty()) {
        sRv += xT("#");
        sRv += temp;
    }

    return sRv;
}
Exemplo n.º 21
0
void url::
user_info(const stream9::opt<boost::string_ref> &user_info)
{
    rebuild(scheme(), host(), port(), path(), query(),
                                      fragment(), user_info);
}
Exemplo n.º 22
0
void RTMFPWriter::raiseMessage() {
	bool header = true;
	bool stop = true;
	bool sent = false;
	UInt64 stage = _stageAck+1;

	for(RTMFPMessage* pMessage : _messagesSent) {
		RTMFPMessage& message(*pMessage);
		
		if(message.fragments.empty())
			break;

		// not repeat unbuffered messages
		if(!message.repeatable) {
			stage += message.fragments.size();
			header = true;
			continue;
		}
		
		/// HERE -> message repeatable AND already flushed one time!

		if(stop) {
			_band.flush(); // To repeat message, before we must send precedent waiting mesages
			stop = false;
		}

		map<UInt32,UInt64>::const_iterator itFrag=message.fragments.begin();
		UInt32 available = message.size()-itFrag->first;
	
		while(itFrag!=message.fragments.end()) {
			UInt32 contentSize = available;
			UInt32 fragment(itFrag->first);
			++itFrag;

			// Compute flags
			UInt8 flags = 0;
			if(fragment>0)
				flags |= MESSAGE_WITH_BEFOREPART; // fragmented
			if(itFrag!=message.fragments.end()) {
				flags |= MESSAGE_WITH_AFTERPART;
				contentSize = itFrag->first - fragment;
			}

			UInt32 size = contentSize+4;

			if(header)
				size+=headerSize(stage);

			// Actual sending packet is enough large? Here we send just one packet!
			if(size>_band.availableToWrite()) {
				if(!sent)
					ERROR("Raise messages on writer ",id," without sending!");
				DEBUG("Raise message on writer ",id," finishs on stage ",stage);
				return;
			}
			sent=true;

			// Write packet
			size-=3;  // type + timestamp removed, before the "writeMessage"
			flush(_band.writeMessage(header ? 0x10 : 0x11,(UInt16)size)
				,stage++,flags,header,message,fragment,contentSize);
			available -= contentSize;
			header=false;
		}
	}

	if(stop)
		_trigger.stop();
}
// -----------------------------------------------------------------------------
// CBrCtlSampleAppLinkResolver::GetFileNameL
// Translate the file name from a URL to a valid file name in the system.
// -----------------------------------------------------------------------------
//
TBool 
CBrCtlSampleAppLinkResolver::GetFileNameL(const TDesC& aFileName)
    {
    // This function accepts URLs in the following format:
    // file://filename.xxx
    // file:///filename.xxx
    // file://c:/filename.xxx
    // file:///c:/filename.xxx
    //
    _LIT(KFileScheme, "file://");
    _LIT(KDefaultDrivePath, "C:\\");
    _LIT(KPathChar, "\\");
    
    TInt count;
    TInt index = 0;
    TBool drvLetter = EFalse;
    TUint16 c;
    
    // Verify the file scheme
    TPtrC urlPtr(aFileName);
    if (urlPtr.FindF(KFileScheme) != 0)
        {
        return EFalse;
        }
    urlPtr.Set(urlPtr.Mid(KFileScheme().Length()));
    
    // make sure there are enough characters in the filename before
    // trying to check them
    count = urlPtr.Length();
    if(count == 0)
        {
        return EFalse;            // no filename, so can't look at urlPtr[0]
        }
    
    // Skip the first '/' if there is one
    if (urlPtr[0] == '/')
        {
        urlPtr.Set(urlPtr.Mid(1));
        }
    count = urlPtr.Length();
    
    // Is there a drive letter?
    if(count > 1)
        {
        // can check for drive letter
        if (urlPtr[1 + index] == ':')
            {
            drvLetter = ETrue;
            }
        }
    if(drvLetter == EFalse)
        {
        // 3 additional characters for the string "c:\"
        count = urlPtr.Length() + 3;
        }
    iFileName = HBufC::NewL(count);
    if (!drvLetter)
        {
        iFileName->Des().Append(KDefaultDrivePath);
        }
    
    TBool fragment(EFalse);
    // Convert relative path containing /./ and /../ to absolute path
    for (; index < urlPtr.Length() && !fragment; index ++)
        {
        switch(urlPtr[index])
            {
            case '#':    //Check if there is a fragment '#'
                {
                fragment = ETrue;
                continue; // Just stop there
                }
                
            case '/':
                {
                iFileName->Des().Append(KPathChar);
                break;
                }
            case '.':
                {
                if (index > 1 && urlPtr[index - 1] == '/')
                    {
                    if (index < count - 1 && urlPtr[index + 1] == '/')
                        {
                        index ++; // skip  ./
                        break;
                        }
                    if (index > 2 && index < count - 3 &&
                        urlPtr[index + 1] == '.' && urlPtr[index + 2] == '/')
                        {
                        TInt i = index - 2;
                        
                        for (; i > 0 && urlPtr[i] != '/'; i--) {} // skip  /../
                        
                        iFileName->Des().SetLength(iFileName->Des().Length() - (index - i));
                        index += 2;
                        break;
                        }
                    }
                }
                // no break
                //lint -fallthrough
                
            default:
                {
                c = urlPtr[index];
                iFileName->Des().Append(&c, 1);
                break;
                }
            }	// end of switch
        }
    return ETrue;
}
Exemplo n.º 24
0
void GGLAssembler::build_blending(
                        component_t& temp,      // incomming fragment / output
                        const pixel_t& pixel,   // framebuffer
                        int component,
                        Scratch& regs)
{
   if (!mInfo[component].blend)
        return;
        
    int fs = component==GGLFormat::ALPHA ? mBlendSrcA : mBlendSrc;
    int fd = component==GGLFormat::ALPHA ? mBlendDstA : mBlendDst;
    if (fs==GGL_SRC_ALPHA_SATURATE && component==GGLFormat::ALPHA)
        fs = GGL_ONE;
    const int blending = blending_codes(fs, fd);
    if (!temp.size()) {
        // here, blending will produce something which doesn't depend on
        // that component (eg: GL_ZERO:GL_*), so the register has not been
        // allocated yet. Will never be used as a source.
        temp = component_t(regs.obtain(), CORRUPTIBLE);
    }

    // we are doing real blending...
    // fb:          extracted dst
    // fragment:    extracted src
    // temp:        component_t(fragment) and result

    // scoped register allocator
    Scratch scratches(registerFile());
    comment("blending");

    // we can optimize these cases a bit...
    // (1) saturation is not needed
    // (2) we can use only one multiply instead of 2
    // (3) we can reduce the register pressure
    //      R = S*f + D*(1-f) = (S-D)*f + D
    //      R = S*(1-f) + D*f = (D-S)*f + S

    const bool same_factor_opt1 =
        (fs==GGL_DST_COLOR && fd==GGL_ONE_MINUS_DST_COLOR) ||
        (fs==GGL_SRC_COLOR && fd==GGL_ONE_MINUS_SRC_COLOR) ||
        (fs==GGL_DST_ALPHA && fd==GGL_ONE_MINUS_DST_ALPHA) ||
        (fs==GGL_SRC_ALPHA && fd==GGL_ONE_MINUS_SRC_ALPHA);

    const bool same_factor_opt2 =
        (fs==GGL_ONE_MINUS_DST_COLOR && fd==GGL_DST_COLOR) ||
        (fs==GGL_ONE_MINUS_SRC_COLOR && fd==GGL_SRC_COLOR) || 
        (fs==GGL_ONE_MINUS_DST_ALPHA && fd==GGL_DST_ALPHA) ||
        (fs==GGL_ONE_MINUS_SRC_ALPHA && fd==GGL_SRC_ALPHA);


    // XXX: we could also optimize these cases:
    // R = S*f + D*f = (S+D)*f
    // R = S*(1-f) + D*(1-f) = (S+D)*(1-f)
    // R = S*D + D*S = 2*S*D


    // see if we need to extract 'component' from the destination (fb)
    integer_t fb;
    if (blending & (BLEND_DST|FACTOR_DST)) { 
        fb.setTo(scratches.obtain(), 32); 
        extract(fb, pixel, component);
        if (mDithering) {
            // XXX: maybe what we should do instead, is simply
            // expand fb -or- fragment to the larger of the two
            if (fb.size() < temp.size()) {
                // for now we expand 'fb' to min(fragment, 8)
                int new_size = temp.size() < 8 ? temp.size() : 8;
                expand(fb, fb, new_size);
            }
        }
    }


    // convert input fragment to integer_t
    if (temp.l && (temp.flags & CORRUPTIBLE)) {
        MOV(AL, 0, temp.reg, reg_imm(temp.reg, LSR, temp.l));
        temp.h -= temp.l;
        temp.l = 0;
    }
    integer_t fragment(temp.reg, temp.size(), temp.flags);

    // if not done yet, convert input fragment to integer_t
    if (temp.l) {
        // here we know temp is not CORRUPTIBLE
        fragment.reg = scratches.obtain();
        MOV(AL, 0, fragment.reg, reg_imm(temp.reg, LSR, temp.l));
        fragment.flags |= CORRUPTIBLE;
    }

    if (!(temp.flags & CORRUPTIBLE)) {
        // temp is not corruptible, but since it's the destination it
        // will be modified, so we need to allocate a new register.
        temp.reg = regs.obtain();
        temp.flags &= ~CORRUPTIBLE;
        fragment.flags &= ~CORRUPTIBLE;
    }

    if ((blending & BLEND_SRC) && !same_factor_opt1) {
        // source (fragment) is needed for the blending stage
        // so it's not CORRUPTIBLE (unless we're doing same_factor_opt1)
        fragment.flags &= ~CORRUPTIBLE;
    }


    if (same_factor_opt1) {
        //  R = S*f + D*(1-f) = (S-D)*f + D
        integer_t factor;
        build_blend_factor(factor, fs, 
                component, pixel, fragment, fb, scratches);
        // fb is always corruptible from this point
        fb.flags |= CORRUPTIBLE;
        build_blendFOneMinusF(temp, factor, fragment, fb);
    } else if (same_factor_opt2) {
        //  R = S*(1-f) + D*f = (D-S)*f + S
        integer_t factor;
        // fb is always corrruptible here
        fb.flags |= CORRUPTIBLE;
        build_blend_factor(factor, fd,
                component, pixel, fragment, fb, scratches);
        build_blendOneMinusFF(temp, factor, fragment, fb);
    } else {
        integer_t src_factor;
        integer_t dst_factor;

        // if destination (fb) is not needed for the blending stage, 
        // then it can be marked as CORRUPTIBLE
        if (!(blending & BLEND_DST)) {
            fb.flags |= CORRUPTIBLE;
        }

        // XXX: try to mark some registers as CORRUPTIBLE
        // in most case we could make those corruptible
        // when we're processing the last component
        // but not always, for instance
        //    when fragment is constant and not reloaded
        //    when fb is needed for logic-ops or masking
        //    when a register is aliased (for instance with mAlphaSource)

        // blend away...
        if (fs==GGL_ZERO) {
            if (fd==GGL_ZERO) {         // R = 0
                // already taken care of
            } else if (fd==GGL_ONE) {   // R = D
                // already taken care of
            } else {                    // R = D*fd
                // compute fd
                build_blend_factor(dst_factor, fd,
                        component, pixel, fragment, fb, scratches);
                mul_factor(temp, fb, dst_factor);
            }
        } else if (fs==GGL_ONE) {
            if (fd==GGL_ZERO) {         // R = S
                // NOP, taken care of
            } else if (fd==GGL_ONE) {   // R = S + D
                component_add(temp, fb, fragment); // args order matters
                component_sat(temp);
            } else {                    // R = S + D*fd
                // compute fd
                build_blend_factor(dst_factor, fd,
                        component, pixel, fragment, fb, scratches);
                mul_factor_add(temp, fb, dst_factor, component_t(fragment));
                component_sat(temp);
            }
        } else {
            // compute fs
            build_blend_factor(src_factor, fs, 
                    component, pixel, fragment, fb, scratches);
            if (fd==GGL_ZERO) {         // R = S*fs
                mul_factor(temp, fragment, src_factor);
            } else if (fd==GGL_ONE) {   // R = S*fs + D
                mul_factor_add(temp, fragment, src_factor, component_t(fb));
                component_sat(temp);
            } else {                    // R = S*fs + D*fd
                mul_factor(temp, fragment, src_factor);
                if (scratches.isUsed(src_factor.reg))
                    scratches.recycle(src_factor.reg);
                // compute fd
                build_blend_factor(dst_factor, fd,
                        component, pixel, fragment, fb, scratches);
                mul_factor_add(temp, fb, dst_factor, temp);
                if (!same_factor_opt1 && !same_factor_opt2) {
                    component_sat(temp);
                }
            }
        }
    }

    // now we can be corrupted (it's the dest)
    temp.flags |= CORRUPTIBLE;
}
Exemplo n.º 25
0
void FlowWriter::raiseMessage() {
	list<Message*>::const_iterator it;
	bool header = true;
	bool stop = true;
	bool sent = false;
	UInt64 stage = _stageAck+1;

	for(it=_messagesSent.begin();it!=_messagesSent.end();++it) {
		Message& message(**it);
		
		if(message.fragments.empty())
			break;

		// not repeat unbuffered messages
		if(!message.repeatable) {
			stage += message.fragments.size();
			header = true;
			continue;
		}
		
		/// HERE -> message repeatable AND already flushed one time!

		if(stop) {
			_band.flush(false); // To repeat message, before we must send precedent waiting mesages
			stop = false;
		}

		std::map<UInt32,UInt64>::const_iterator 
itFrag=message.fragments.begin();
		UInt32 available;
		BinaryReader& content = message.reader(available);
		
		while(itFrag!=message.fragments.end()) {
			UInt32 contentSize = available;
			UInt32 fragment(itFrag->first);
			++itFrag;

			// Compute flags
			UInt8 flags = 0;
			if(fragment>0)
				flags |= MESSAGE_WITH_BEFOREPART; // fragmented
			if(itFrag!=message.fragments.end()) {
				flags |= MESSAGE_WITH_AFTERPART;
				contentSize = itFrag->first - fragment;
			}

			UInt32 size = contentSize+4;

			if(header)
				size+=headerSize(stage);

			// Actual sending packet is enough large? Here we send just one packet!
			if(size>_band.writer().available()) {
				if(!sent)
					ERROR("Raise messages on flowWriter %s without sending!",NumberFormatter::format(id).c_str());
				DEBUG("Raise message on flowWriter %s finishs on stage %s",NumberFormatter::format(id).c_str(),NumberFormatter::format(stage).c_str());
				return;
			}
			sent=true;

			// Write packet
			size-=3;  // type + timestamp removed, before the "writeMessage"
			flush(_band.writeMessage(header ? 0x10 : 0x11,(UInt16)size)
				,stage++,flags,header,content,contentSize);
			available -= contentSize;
			header=false;
		}
	}

	if(stop)
		_trigger.stop();
}
Exemplo n.º 26
0
void url::
scheme(const boost::string_ref &scheme)
{
    rebuild(scheme, host(), port(), path(), query(), fragment(), user_info());
}
Exemplo n.º 27
0
void url::
port(const stream9::opt<uint16_t> port)
{
    rebuild(scheme(), host(), port,
            path(), query(), fragment(), user_info());
}
Exemplo n.º 28
0
QString FlatTextarea::getText(int32 start, int32 end) const {
	if (end >= 0 && end <= start) return QString();

	if (start < 0) start = 0;
	bool full = (start == 0) && (end < 0);

	QTextDocument *doc(document());
	QTextBlock from = full ? doc->begin() : doc->findBlock(start), till = (end < 0) ? doc->end() : doc->findBlock(end);
	if (till.isValid()) till = till.next();

	int32 possibleLen = 0;
	for (QTextBlock b = from; b != till; b = b.next()) {
		possibleLen += b.length();
	}
	QString result;
	result.reserve(possibleLen + 1);
	if (!full && end < 0) {
		end = possibleLen;
	}

	for (QTextBlock b = from; b != till; b = b.next()) {
		for (QTextBlock::Iterator iter = b.begin(); !iter.atEnd(); ++iter) {
			QTextFragment fragment(iter.fragment());
			if (!fragment.isValid()) continue;

			int32 p = full ? 0 : fragment.position(), e = full ? 0 : (p + fragment.length());
			if (!full) {
				if (p >= end || e <= start) {
					continue;
				}
			}

			QTextCharFormat f = fragment.charFormat();
			QString emojiText;
			QString t(fragment.text());
			if (!full) {
				if (p < start) {
					t = t.mid(start - p, end - start);
				} else if (e > end) {
					t = t.mid(0, end - p);
				}
			}
			QChar *ub = t.data(), *uc = ub, *ue = uc + t.size();
			for (; uc != ue; ++uc) {
				switch (uc->unicode()) {
				case 0xfdd0: // QTextBeginningOfFrame
				case 0xfdd1: // QTextEndOfFrame
				case QChar::ParagraphSeparator:
				case QChar::LineSeparator:
					*uc = QLatin1Char('\n');
					break;
				case QChar::Nbsp:
					*uc = QLatin1Char(' ');
					break;
				case QChar::ObjectReplacementCharacter:
					if (emojiText.isEmpty() && f.isImageFormat()) {
						QString imageName = static_cast<QTextImageFormat*>(&f)->name();
						if (imageName.startsWith(QLatin1String("emoji://e."))) {
							if (EmojiPtr emoji = emojiFromUrl(imageName)) {
								emojiText = textEmojiString(emoji);
							}
						}
					}
					if (uc > ub) result.append(ub, uc - ub);
					if (!emojiText.isEmpty()) result.append(emojiText);
					ub = uc + 1;
				break;
				}
			}
			if (uc > ub) result.append(ub, uc - ub);
		}
		result.append('\n');
	}
	result.chop(1);
	return result;
}
Exemplo n.º 29
0
void RTMFPWriter::acknowledgment(PacketReader& packet) {

	UInt64 bufferSize = packet.read7BitLongValue(); // TODO use this value in reliability mechanism?
	
	if(bufferSize==0) {
		// In fact here, we should send a 0x18 message (with id flow),
		// but it can create a loop... We prefer the following behavior
		fail("Negative acknowledgment");
		return;
	}

	UInt64 stageAckPrec = _stageAck;
	UInt64 stageReaden = packet.read7BitLongValue();
	UInt64 stage = _stageAck+1;

	if(stageReaden>_stage) {
		ERROR("Acknowledgment received ",stageReaden," superior than the current sending stage ",_stage," on writer ",id);
		_stageAck = _stage;
	} else if(stageReaden<=_stageAck) {
		// already acked
		if(packet.available()==0)
			DEBUG("Acknowledgment ",stageReaden," obsolete on writer ",id);
	} else
		_stageAck = stageReaden;

	UInt64 maxStageRecv = stageReaden;
	UInt32 pos=packet.position();

	while(packet.available()>0)
		maxStageRecv += packet.read7BitLongValue()+packet.read7BitLongValue()+2;
	if(pos != packet.position()) {
		// TRACE(stageReaden,"..x"Util::FormatHex(reader.current(),reader.available()));
		packet.reset(pos);
	}

	UInt64 lostCount = 0;
	UInt64 lostStage = 0;
	bool repeated = false;
	bool header = true;
	bool stop=false;

	auto it=_messagesSent.begin();
	while(!stop && it!=_messagesSent.end()) {
		RTMFPMessage& message(**it);

		if(message.fragments.empty()) {
			CRITIC("RTMFPMessage ",(stage+1)," is bad formatted on fowWriter ",id);
			++it;
			continue;
		}

		map<UInt32,UInt64>::iterator itFrag=message.fragments.begin();
		while(message.fragments.end()!=itFrag) {
			
			// ACK
			if(_stageAck>=stage) {
				message.fragments.erase(message.fragments.begin());
				itFrag=message.fragments.begin();
				++_ackCount;
				++stage;
				continue;
			}

			// Read lost informations
			while(!stop) {
				if(lostCount==0) {
					if(packet.available()>0) {
						lostCount = packet.read7BitLongValue()+1;
						lostStage = stageReaden+1;
						stageReaden = lostStage+lostCount+packet.read7BitLongValue();
					} else {
						stop=true;
						break;
					}
				}
				// check the range
				if(lostStage>_stage) {
					// Not yet sent
					ERROR("Lost information received ",lostStage," have not been yet sent on writer ",id);
					stop=true;
				} else if(lostStage<=_stageAck) {
					// already acked
					--lostCount;
					++lostStage;
					continue;
				}
				break;
			}
			if(stop)
				break;
			
			// lostStage > 0 and lostCount > 0

			if(lostStage!=stage) {
				if(repeated) {
					++stage;
					++itFrag;
					header=true;
				} else // No repeated, it means that past lost packet was not repeatable, we can ack this intermediate received sequence
					_stageAck = stage;
				continue;
			}

			/// Repeat message asked!
			if(!message.repeatable) {
				if(repeated) {
					++itFrag;
					++stage;
					header=true;
				} else {
					INFO("RTMFPWriter ",id," : message ",stage," lost");
					--_ackCount;
					++_lostCount;
					_stageAck = stage;
				}
				--lostCount;
				++lostStage;
				continue;
			}

			repeated = true;
			// Don't repeate before that the receiver receives the itFrag->second sending stage
			if(itFrag->second >= maxStageRecv) {
				++stage;
				header=true;
				--lostCount;
				++lostStage;
				++itFrag;
				continue;
			}

			// Repeat message

			DEBUG("RTMFPWriter ",id," : stage ",stage," repeated");
			UInt32 fragment(itFrag->first);
			itFrag->second = _stage; // Save actual stage sending to wait that the receiver gets it before to retry
			UInt32 contentSize = message.size() - fragment; // available
			++itFrag;

			// Compute flags
			UInt8 flags = 0;
			if(fragment>0)
				flags |= MESSAGE_WITH_BEFOREPART; // fragmented
			if(itFrag!=message.fragments.end()) {
				flags |= MESSAGE_WITH_AFTERPART;
				contentSize = itFrag->first - fragment;
			}

			UInt32 size = contentSize+4;
			UInt32 availableToWrite(_band.availableToWrite());
			if(!header && size>availableToWrite) {
				_band.flush();
				header=true;
			}

			if(header)
				size+=headerSize(stage);

			if(size>availableToWrite)
				_band.flush();

			// Write packet
			size-=3;  // type + timestamp removed, before the "writeMessage"
			flush(_band.writeMessage(header ? 0x10 : 0x11,(UInt16)size)
				,stage,flags,header,message,fragment,contentSize);
			header=false;
			--lostCount;
			++lostStage;
			++stage;
		}

		if(message.fragments.empty()) {
			if(message.repeatable)
				--_repeatable;
			if(_ackCount || _lostCount) {
				_qos.add(_lostCount / (_lostCount + _ackCount));
				_ackCount=_lostCount=0;
			}
			
			delete *it;
			it=_messagesSent.erase(it);
		} else
			++it;
	
	}

	if(lostCount>0 && packet.available()>0)
		ERROR("Some lost information received have not been yet sent on writer ",id);


	// rest messages repeatable?
	if(_repeatable==0)
		_trigger.stop();
	else if(_stageAck>stageAckPrec || repeated)
		_trigger.reset();
}
// -----------------------------------------------------------------------------
// CWidgetUiObserver::TranslateURLToFilenameL
// Translate the file name from a URL to a valid file name in the system.
// -----------------------------------------------------------------------------
//
TBool CWidgetUiObserver::TranslateURLToFilenameL( const TDesC& aFileName, const TDesC& aLanguageDir )
    {
    // This function accepts URLs in the following format:
    // file://filename.xxx
    // file:///filename.xxx
    // file://c:/filename.xxx
    // file:///c:/filename.xxx
    // c:/dir/file.txt (the browser engine can send these too!)
    TInt count( 0 );
    TInt index( 0 );
    TBool drvLetter = EFalse;
    TUint16 c;
    
    HBufC* decodedUrl = EscapeUtils::EscapeDecodeL(aFileName);
    CleanupStack::PushL( decodedUrl );
    
    // Throw away the intial file:// part, if present
    TPtrC urlPtr( aFileName );
    if (urlPtr.FindF( KFileScheme) == 0 )
        {
        urlPtr.Set( decodedUrl->Mid( KFileScheme().Length() ) );    
        }
    
    // Make sure there are enough characters in the filename before
    // trying to check them
    count = urlPtr.Length() + aLanguageDir.Length() + KLprojExt().Length() + KPathChar().Length();
    if ( urlPtr.Length() > 0 ) //do nothing for trivial input
        {  
    // Skip the first '/' if there is one
    if ( urlPtr[0] == '/' )
        {
        urlPtr.Set( urlPtr.Mid( 1 ) );
        }
    // Is there a drive letter?
    if ( urlPtr.Length() > 1 )
        {
        // Can check for drive letter
        if ( urlPtr[1 + index] == ':' )
            {
            drvLetter = ETrue;
            }
        }
    if ( drvLetter == EFalse )
        {
        // Plan for a c:\ type drive prefix to what we already tallied above
        count += KDefaultDrivePath().Length();
        }
    delete iFileName;
    iFileName = NULL;
    iFileName = HBufC::NewL( count );
    if ( !drvLetter )
        {
        iFileName->Des().Append( KDefaultDrivePath );
        }

    TBool fragment( EFalse );
    // Convert relative path containing /./ and /../ to absolute path
    for ( ; index < urlPtr.Length() && !fragment; index ++ )
        {
        switch ( urlPtr[index] )
            {
            case '#':    // Check if there is a fragment '#'
                {
                fragment = ETrue;
                continue; // Just stop there
                }

            case '/':
                {
                iFileName->Des().Append( KPathChar );
                break;
                }
            case '.':
                {
                if ( index > 1 && urlPtr[index - 1] == '/' )
                    {
                    if ( index < count - 1 && urlPtr[ index + 1 ] == '/' )
                        {
                        index ++; // Skip  ./
                        break;
                        }
                    if ( index > 2 && index < count - 3 &&
                         urlPtr[ index + 1 ] == '.' && urlPtr[ index + 2 ] == '/' )
                        {
                        TInt i = index - 2;

                        for ( ; i > 0 && urlPtr[i] != '/'; i-- ) {} // Skip  /../

                        iFileName->Des().SetLength( iFileName->Des().Length() - (index - i) );
                        index += 2;
                        break;
                        }
                    }
                }
                // No break
                //lint -fallthrough

            default:
                {
                c = urlPtr[ index ];
                iFileName->Des().Append( &c, 1 );
                break;
                }
            }   // end of switch
        }

    if ( aLanguageDir.Length() )
        {
        TChar backSlash = '\\';
        TInt pos = iFileName->Des().LocateReverse( backSlash );
        if ( pos != KErrNotFound )
            {
            TPtr p = iFileName->Des();
            p.Insert(pos, KLprojExt );
            p.Insert(pos, aLanguageDir );
            p.Insert(pos, KPathChar );
            }
        }
        } //Do nothing for any trivial input
    CleanupStack::PopAndDestroy(1, decodedUrl); // decodedUrl
    return ETrue;
}