Talk:LlSetPrimMediaParams/Tricks

From Second Life Wiki
Jump to navigation Jump to search

Here is my quick hack of your code to allow forms to be submitted using the javascript trick.

string url; // Our base http-in url
integer r;  // Used for uniqueness in PrimMedia urls
integer page;  // The page number.
 
show(string html)
{
    html += "<span " + (string)((++r) % 10) + "/>";
 
    llSetPrimMediaParams(0,                  // Side to display the media on.
            [PRIM_MEDIA_AUTO_PLAY,TRUE,      // Show this page immediately
             PRIM_MEDIA_CURRENT_URL,html,    // The url if they hit 'home'
             PRIM_MEDIA_HOME_URL,html,       // The url currently showing
             PRIM_MEDIA_HEIGHT_PIXELS,512,   // Height/width of media texture will be
             PRIM_MEDIA_WIDTH_PIXELS,512]);  //   rounded up to nearest power of 2.
}
 
// This creates a data: url that will render the output of the http-in url 
// given.
string build_url(string url)
{
    return "data:text/html," 
        + llEscapeURL("<html><head><script src='" + url 
        + "' type='text/javascript'></script></head><body onload='init()'></body></html>");
}
 
// This wraps the html you want to display so that it will be shown from links 
// made with build_url
string build_response(string body)
{
    return "function init() {document.getElementsByTagName('body')[0].innerHTML='" + body + "';}";
}
 
 
string replace_all(string src, string target, string replace)
{
    return llDumpList2String(llParseString2List(src,[target],[]),replace);
}

string get_query(key id, string name)
{
    string query = llGetHTTPHeader(id,"x-query-string");
    query = replace_all(query,"+"," ");
    query = llUnescapeURL(query);
    list q = llParseString2List(query,["=","&",";"],[]);
    integer i = llListFindList(q,[name]);
    if (i != -1)
    {
        return llList2String(q,i+1);
    }
 
    return "";
}


default
{
    state_entry()
    {
        llRequestURL();
        llOwnerSay("Ready");
    }
 
    http_request(key id, string method, string body)
    {
        if (method == URL_REQUEST_GRANTED)
        {
            url = body + "/";
 
            show(build_url(url + "page" + (string)(page)));
        }
        else if (method == "GET")
        {
            //Check for submited form value here
            string float_text=get_query(id,"text");
            if (float_text!="")
            {                
                llSetText(float_text,<1,1,0>,1);
                show(build_url(url + "page" + (string)(page)));
                llHTTPResponse(id,200,"Loading...");
                return;
            }       
            
            string path = llGetHTTPHeader(id,"x-path-info");
            string content = "<h1>path: " + path + "</h1>";
            page = (integer)llGetSubString(path,5,5);
            if (page > 0) content += "<a href=\"" + build_url(url + "page" + (string)(page - 1)) + "\">Previous</a> ";
            if (page < 9) content += "<a href=\"" + build_url(url + "page" + (string)(page + 1)) + "\">Next</a><br>";
            integer k;
            for(;k<10;++k)
            {
                if (k == page)
                    content += "<br>Page " + (string)k;
                else
                    content += "<br><a href=\"" + build_url(url + "page" + (string)(k)) + "\">Page " + (string)k + "</a>";
            }
            content += "<h1><form action=\""+url+"\" method=\"GET\">Floating Text:<input type=\"text\" name=\"text\"><br><input type=\"submit\" value=\"Set\"></form></h1>";
            content += "<br><br>This page is " + (string)(llStringLength(build_response(content)) + 37) + " bytes long.";
            
            
            
                 
            
            llHTTPResponse(id,200,build_response(content));
            
            
        }
    }
}

In regards to needing to use llEscapeURL.

There are specific characters that must be encoded when included in a URL. llEscapeURL encodes MORE than what is needed.

Specifically llEscapeURL only leaves [0-9a-zA-Z] as not encoded.

Other characters can be left not encoded as well - $-_.+!*'(),

See the following link for more information.

URL Encoding


Thraxis Epsilon 03:22, 31 August 2010 (UTC)