παπι Δημοσ. 6 Ιουνίου 2013 Δημοσ. 6 Ιουνίου 2013 Ποια ειναι η πιο μινιμαλ υλοποιηση του εν λογο prototype/api/οπως λεγεται τεσπα.
nucleus Δημοσ. 6 Ιουνίου 2013 Δημοσ. 6 Ιουνίου 2013 https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest Είναι built-in object τι εννοείς με implementation?
παπι Δημοσ. 6 Ιουνίου 2013 Μέλος Δημοσ. 6 Ιουνίου 2013 Στε embedded v8 ειναι undefined αρα πρεπει να το bindαρω, και επειδη βαριεμαι να το κανω καρμπον, θελω καποιος να μου πει πιο ειναι το μινιμαλ interface
nucleus Δημοσ. 6 Ιουνίου 2013 Δημοσ. 6 Ιουνίου 2013 http://www.w3.org/TR/XMLHttpRequest/ http://trac.webkit.org/browser/releases/WebKitGTK#webkit-2.1.1/Source/WebCore/xml
παπι Δημοσ. 6 Ιουνίου 2013 Μέλος Δημοσ. 6 Ιουνίου 2013 http://trac.webkit.org/browser/releases/WebKitGTK#webkit-2.1.1/Source/WebCore/xml ααα, μαλιστα. Θα bindαρω μια συναρτηση Download και τελειωσε το θεμα
nucleus Δημοσ. 7 Ιουνίου 2013 Δημοσ. 7 Ιουνίου 2013 Οπότε ψάχνεις την υλοποίηση και όχι πηγαίο κώδικα (κατάλαβα λάθος) σίγουρα δεν περιλαμβάνεται ήδη στο framework σου? V8 Binding? https://docs.google.com/a/chromium.org/presentation/d/1OFG81taxgjOGU43sv9WHvPZkt5--KnM6gSijWN8NMcU/edit?disco=AAAAAECHbXY&pli=1#slide=id.g16a516bb_1_173
παπι Δημοσ. 8 Ιουνίου 2013 Μέλος Δημοσ. 8 Ιουνίου 2013 function Net() { this.codepage = -1; this.post = ""; this.method = "GET"; this.ready = function(data){}; this.async = false; this.send = function(url){ return _download(url,this.post,this.method=="POST",this.codepage,this.codepage == -1,this.ready,this.async); } } Η μακαροναδα ειναι στα σποιλερ για οσους θελουν να κατεβασουν κατι με embedded v8 binding v::Handle<v::Value> _BindDownload(const v::Arguments& args) { HandleScopeThreadSafety _scope(gIsolate); v::Context::Scope _contextscope(gContext); if(args.Length() == 7 && args[0]->IsString() && args[1]->IsString() && args[2]->IsBoolean() && args[3]->IsInt32() && args[4]->IsBoolean() && args[5]->IsFunction() && args[6]->IsBoolean() ) { std::wstring url,post; bool isPost,ignoreCodepage,isAsync; int codepage = args[3]->ToInt32()->Value(); v::Persistent<v::Function> funcCopy; url = Utf8ToWide(*v::String::Utf8Value(args[0]->ToString())); post = Utf8ToWide(*v::String::Utf8Value(args[1]->ToString())); isPost = args[2]->ToBoolean()->Value(); ignoreCodepage = args[4]->ToBoolean()->Value(); isAsync = args[6]->ToBoolean()->Value(); funcCopy = v::Persistent<v::Function>::New( v::Handle<v::Function>::Cast( args[5] ) ); std::function<v::Handle<v::Value>(void)> *download = new std::function<v::Handle<v::Value>(void)>( [=](void) -> v::Handle<v::Value> { HandleScopeThreadSafety scope(gIsolate); std::vector<char> data; v::Handle<v::String> result; //download if(isPost) data = Download(url,false,post); else data = Download(url); //encoding if(!ignoreCodepage) { size_t len = MultiByteToWideChar(codepage,0,data.data(),data.size(),0,0); wchar_t *buf = new wchar_t[len]; MultiByteToWideChar(codepage,0,data.data(),data.size(),buf,len); data.clear(); result = v::String::New((const uint16_t*)buf,len-1); delete[] buf; } else result = v::String::New(data.data(),data.size()); //return or call if(isAsync) { v::Handle<v::Value> val = result; funcCopy->Call(gContext->Global(),1,&val); return v::Undefined(); } else return scope.Close(result); } ); //async if(isAsync) ExecuteOutside(download); else { v::Handle<v::Value> res = (*download)(); delete download; return _scope.Close(res); } } return v::Undefined(); } references download std::vector<char> Download( std::wstring url, bool isGet, const std::wstring& post ) { std::vector<char> data; //TODO std::wstring defUserAgent = L"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36"; std::wstring server; std::wstring getObject; INTERNET_PORT port; HINTERNET hSession = 0, hConnect = 0, hRequest = 0; URL_COMPONENTS urlcom = { 0 }; urlcom.dwStructSize = sizeof(urlcom); urlcom.dwUrlPathLength = -1; urlcom.dwHostNameLength = -1; if(url.compare(0,4,L"http") !=0) { std::wstring http(L"http://"); url.insert(url.begin(),http.begin(),http.end()); } if(!WinHttpCrackUrl(url.c_str(),url.size(),0,&urlcom)) return data; server.assign(urlcom.lpszHostName,urlcom.lpszHostName + urlcom.dwHostNameLength); getObject.assign(urlcom.lpszUrlPath,urlcom.lpszUrlPath + urlcom.dwUrlPathLength); port = urlcom.nPort; hSession = WinHttpOpen(defUserAgent.c_str(),0,0,0,0); if(hSession) hConnect = WinHttpConnect(hSession,server.c_str(),port,0); if(hConnect) { DWORD dwHttps = urlcom.nPort == 80 ? 0 : WINHTTP_FLAG_SECURE; if(isGet) hRequest = WinHttpOpenRequest(hConnect,L"GET",getObject.c_str(),0,0,0,dwHttps); else hRequest = WinHttpOpenRequest(hConnect,L"POST",post.c_str(),0,0,0,dwHttps); } if(hRequest && WinHttpSendRequest(hRequest,0,0,0,0,0,0) && WinHttpReceiveResponse(hRequest,0) ) { DWORD dwSize = 0; DWORD dwReaded = 0; do { char buffer[1024]; if(!WinHttpQueryDataAvailable(hRequest,&dwSize)) break; if(dwSize > sizeof(buffer)) dwSize = sizeof(buffer); if(!WinHttpReadData(hRequest,buffer,dwSize,&dwReaded)) break; data.insert(data.end(),buffer,buffer + dwReaded); }while(dwSize > 0); } if (hRequest) WinHttpCloseHandle(hRequest); if (hConnect) WinHttpCloseHandle(hConnect); if (hSession) WinHttpCloseHandle(hSession); return data; } handlescopethreadsafety class HandleScopeThreadSafety { public: v::Locker locker; v::HandleScope handleScope; v::Isolate::Scope enterExit; HandleScopeThreadSafety(v::Isolate* pIsolate) : locker(pIsolate), // lock handleScope(pIsolate), // create handle tracker enterExit(pIsolate) // enter { } template <class T> v::Local<T> Close(v::Handle<T> value) { return handleScope.Close(value); } }; executeoutside template<class TResult> static DWORD CALLBACK _winCallback(void* pArg) { std::function<TResult(void)> *pFunc = (std::function<TResult(void)>*)pArg; (*pFunc)(); delete pFunc; CloseHandle(GetCurrentThread()); return 0; } template<class TResult> __inline void ExecuteOutside(std::function<TResult(void)> *pFunc) { CreateThread(0,0,_winCallback<TResult>,pFunc,0,0); }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα