Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Στε embedded v8 ειναι undefined αρα πρεπει να το bindαρω, και επειδη βαριεμαι να το κανω καρμπον, θελω καποιος να μου πει πιο ειναι το μινιμαλ interface

Δημοσ.

Close_Enough1_zps7bee2934.png

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);
} 

 

 

 

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...