亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? flickr.cpp

?? 著名的相冊網站flickr開發了他的API
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/*
	cppFlickr

	Copyright (c) 2005, Gareth Simpson (http://www.xurble.org/)
	All rights reserved.

	See License.txt for terms and conditions.
*/

#include "stdafx.h"
#include "Flickr.h"

#include <libxml/parser.h>
#include <libxml/xmlmemory.h>
#include <libxml/nanohttp.h>

#include "iconv.h"

#include <sstream>
#include <vector>
#include <algorithm>

namespace cppFlickr
{
static const char DEFAULT_URL[] = "http://www.flickr.com/services/rest/";

//------------------------------------------------------------------------------------------
//Ctor
Flickr::Flickr()
{
	m_baseURL = DEFAULT_URL;
}
//------------------------------------------------------------------------------------------
//Ctor
Flickr::Flickr(const std::wstring& apikey,const std::wstring& email,const std::wstring& password)
{
	m_baseURL = DEFAULT_URL;
	m_email = urlEncode(makeUTF(email));
	m_password = urlEncode(makeUTF(password));
	m_emailRaw = makeUTF(email);
	m_passwordRaw =makeUTF(password);
	m_apiKey = makeUTF(apikey);

	//	uncomment if using fiddler
	//xmlNanoHTTPScanProxy("http://127.0.0.1:8888/");

}


//------------------------------------------------------------------------------------------
//	Ascii to wide
std::wstring Flickr::makeWide(const std::string& in)
{
	//	TODO: Use iconv here for cross platformness
	std::wstring retStr = L"UTF Conversion Failure"; // TODO: Something better here!
	int len = (int)in.length() + 1;
	if(len > 0)
	{
		wchar_t* wideBuffer = new wchar_t[len+1];
		memset(wideBuffer,0,(sizeof(wchar_t) * (len+1)));
		int ret = MultiByteToWideChar(CP_UTF8,0,in.c_str(),(int)in.length()+1,wideBuffer,len);

		if(ret > 0)
		{
			retStr = wideBuffer;
		}
		delete[] wideBuffer;
	}
	return retStr;
}
//------------------------------------------------------------------------------------------
// convert wide to ascii
std::string Flickr::makeUTF(const std::wstring& str)
{
    int l =static_cast<int>(str.length());
    int sz=::WideCharToMultiByte(CP_UTF8,0,str.c_str(),l,0,0,0,0);

    std::vector<char> buffer;
    buffer.resize(sz);

    ::WideCharToMultiByte(CP_UTF8,0,str.c_str(),l,&buffer[0],sz,0,0);

    return std::string(buffer.begin(),buffer.end());
}

//------------------------------------------------------------------------------------------
//Add a note at the specified co-ordinates
int Flickr::addNote(int photoID,int x,int y, int width, int height, const std::wstring& text,int& retID)
{
	int ret = -1;

	std::stringstream url;
	url << m_baseURL << "?";
	//	 Build the request string
	url << "method=flickr.photos.notes.add&api_key=" << m_apiKey << "&photo_id=" << photoID;

	//	params
	url << "&note_x=" << x << "&note_y=" << y << "&note_w=" << width << "&note_h=" << height << "&note_text=" << urlEncode(makeUTF(text)); 

	//	authentication
	url << "&email=" << m_email << "&password="  << m_password;

	xmlDocPtr doc = (xmlDocPtr)doGet(url.str());
	if(doc)
	{
		// make sure that document is not an error
		ret = checkError(doc);
		if(ret == 0)
		{
			xmlNodePtr root = xmlDocGetRootElement(doc);

			xmlNodePtr idNode = root->xmlChildrenNode->next;	

			xmlChar* id =  xmlGetProp(idNode,(const xmlChar *)"id");
			retID = atoi((const char*)id);
			xmlFree(id);

		}

		
		xmlFreeDoc(doc);

		/*
		*Free the global variables that may
		*have been allocated by the parser.
		*/
		xmlCleanupParser();
	}
	return ret;

}
//------------------------------------------------------------------------------------------
//	Add tags to the photo
int Flickr::addTags(int photoID, const std::wstring& tags)
{
	std::stringstream url;
	url << m_baseURL << "?";
	//	 Build the request string
	url << "method=flickr.photos.addTags&api_key=" << m_apiKey << "&photo_id=" << photoID << "&tags=" << urlEncode(makeUTF(tags));
	//	authentication
	url << "&email=" << m_email << "&password="  << m_password;
	return simpleUpdate(url.str());
}


//------------------------------------------------------------------------------------------
// replace the tags on the photo with a new set
int Flickr::setTags(int photoID, const std::wstring& tags)
{
	std::stringstream url;
	url << m_baseURL << "?";
	//	 Build the request string
	url << "method=flickr.photos.setTags&api_key=" << m_apiKey << "&photo_id=" << photoID << "&tags=" << urlEncode(makeUTF(tags));
	//	authentication
	url << "&email=" << m_email << "&password="  << m_password;
	return simpleUpdate(url.str());
}


//------------------------------------------------------------------------------------------
//	This function will check if the passed in document is a fail response
// if it is, we parse out the error message and response code
int Flickr::checkError(void* doc)
{
	int ret = 0;

	xmlDocPtr xmlDoc = (xmlDocPtr)doc;

	xmlNodePtr root = xmlDocGetRootElement(xmlDoc);

	xmlChar* stat =  xmlGetProp(root,(const xmlChar *)"stat");

	if(xmlStrcmp(stat,(const xmlChar *)"ok"))
	{
		xmlNodePtr codeNode = root->xmlChildrenNode->next;	
		xmlChar* msg =  xmlGetProp(codeNode,(const xmlChar *)"msg");
		xmlChar* code =  xmlGetProp(codeNode,(const xmlChar *)"code");

		m_errorMsg = makeWide((char*)msg);
		ret = atoi((const char*)code);

		if (ret == 0) ret = -2;
		
		xmlFree(msg);
		xmlFree(code);

	}
	else
	{
		//	It was OK!
		m_errorMsg = L"OK";
	}
	xmlFree(stat);

	return ret;
	
}

//------------------------------------------------------------------------------------------
//	performs the passed in get operation and returns the XML result
void* Flickr::doGet(const std::string& url)
{
	xmlDocPtr doc = 0;

	// send it
	void* ctx = xmlNanoHTTPMethod(url.c_str(),"GET",0,0,0,0);
	if(ctx)
	{
		//	some kind of response
		std::stringstream response;

		//	get the XML that is returned
		while(true)
		{
			char buf[1024];
			int read = xmlNanoHTTPRead(ctx,buf,1023);
			if(read > 0)
			{
				buf[read] = 0;
				response << buf;

			}
			if (read < 1023)
				break;
		}
		xmlNanoHTTPClose(ctx);

		//	parse it into a document
		doc = xmlReadMemory(response.str().c_str(),(int)response.str().length(),m_baseURL.c_str(),0, XML_PARSE_NONET );

		if(!doc)
		{
			m_errorMsg = L"Server response was invalid";
		}

	}
	else
	{
		m_errorMsg = L"Could not connect to the server";
	}


	return doc;
}




//------------------------------------------------------------------------------------------
//	Performs simple sets which don't retrieve results
int Flickr::simpleUpdate(const std::string& url)
{
	int ret = -1;
	

	xmlDocPtr doc = (xmlDocPtr)doGet(url);
	if(doc)
	{
		// make sure that document is not an error
		ret = checkError(doc);
		
		xmlFreeDoc(doc);

		/*
		*Free the global variables that may
		*have been allocated by the parser.
		*/
		xmlCleanupParser();
	}

	return ret;
}

//------------------------------------------------------------------------------------------
//	replace with something standard ???
std::string Flickr::urlEncode(const std::string& str)
{
	std::stringstream ret;

	for(size_t i =0; i < str.length(); ++i)
	{
		char c = str[i];
		if((c >= 48 && c <= 57)  ||
			(c >= 65 && c <= 90)  ||
			(c >= 97 && c <= 122))
		{
			ret << c;
		}
		else if(c == 32)
		{
			ret << "+";
		}
		else 
		{
			char buf[5];
			sprintf(buf,"%%%00x",c);
			ret << buf;
		}
	}
	return ret.str();
}

//------------------------------------------------------------------------------------------
//	This is the heart of it

// default jpeg version
int Flickr::uploadFile(const std::wstring& path,const std::wstring& title,const std::wstring& description, const std::wstring& tags, bool isPublic, bool isFriend,bool isFamily,int& retID)
{
	return uploadFile(path,title,description,tags,isPublic,isFriend,isFamily,L"image/jpeg",retID);
}
//	Full on version
int Flickr::uploadFile(const std::wstring& path,const std::wstring& title,const std::wstring& description, const std::wstring& tags, bool isPublic, bool isFriend,bool isFamily,const std::wstring& imgMime, int& retID)
{
	const char targetURL[] = "http://www.flickr.com/tools/uploader_go.gne";
	//const char targetURL[] = "http://www.flickr.com/tools/uploader_test.gne";

	char* contentType = "multipart/form-data; boundary=\"cppFlickrBoundry\"";

	std::stringstream header;

	header << "--cppFlickrBoundry\r\n";
	header << "Content-Disposition: form-data; name=\"email\"\r\n\r\n" << m_emailRaw << "\r\n";

	header << "--cppFlickrBoundry\r\n";
	header << "Content-Disposition: form-data; name=\"password\"\r\n\r\n" << m_passwordRaw << "\r\n";

	if(title.length())
	{
		header << "--cppFlickrBoundry\r\n";
		header << "Content-Disposition: form-data; name=\"title\"\r\n\r\n" << makeUTF(title) << "\r\n";
	}
	if(description.length())
	{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品自拍网站| 99久久er热在这里只有精品15| 免费成人美女在线观看| 欧美日韩国产a| 久久久99久久精品欧美| 亚洲欧美日韩国产综合在线| 毛片一区二区三区| 色婷婷综合激情| 久久久久久99精品| 视频一区二区不卡| 91原创在线视频| 精品国产乱码久久久久久蜜臀 | 亚洲成av人片一区二区| 成人精品国产一区二区4080| 欧美久久久久免费| 亚洲色图第一区| 日本亚洲最大的色成网站www| 成人性生交大片免费看视频在线| 欧美人牲a欧美精品| 亚洲美女在线国产| www.综合网.com| 久久久久久久久久久黄色| 日韩高清中文字幕一区| 在线精品视频免费观看| 国产精品国产三级国产普通话三级| 另类成人小视频在线| 欧美日韩国产高清一区二区 | 91网站在线播放| 欧美国产日韩一二三区| 国产乱子伦视频一区二区三区| 欧美一区二区日韩| 91激情在线视频| 国产精品欧美经典| 国产成人在线色| 亚洲精品一区二区三区福利| 日韩国产精品久久久| 欧美日韩dvd在线观看| 一区二区三区四区av| 一本色道**综合亚洲精品蜜桃冫| 国产精品乱码一区二三区小蝌蚪| 国产精品夜夜爽| 亚洲国产精品黑人久久久| 国产不卡在线一区| 国产亚洲成年网址在线观看| 国产一区日韩二区欧美三区| 欧美成人综合网站| 国内成人免费视频| 久久久精品国产99久久精品芒果| 国产麻豆成人精品| 欧美国产一区二区在线观看| 国产iv一区二区三区| 久久久五月婷婷| 国产99久久久国产精品免费看| 欧美韩日一区二区三区四区| 不卡的av中国片| 中文字幕一区三区| 欧美在线色视频| 青青草精品视频| 久久久综合九色合综国产精品| 精品一区二区久久久| 国产精品嫩草影院com| 国产精品全国免费观看高清| 99久久婷婷国产综合精品电影 | 一区二区免费看| 69堂精品视频| 九九国产精品视频| 国产精品三级在线观看| 在线中文字幕一区二区| 三级精品在线观看| 2023国产精品视频| 91麻豆免费看片| 日本亚洲视频在线| 国产精品久久久久久久久免费丝袜| 色国产综合视频| 六月婷婷色综合| 亚洲三级小视频| 日韩欧美国产一区二区三区| 成人午夜私人影院| 亚洲成av人影院| 国产精品视频一二三| 欧美猛男超大videosgay| 国产自产v一区二区三区c| 亚洲美女视频在线| 精品日韩在线观看| 色欧美88888久久久久久影院| 久久国产成人午夜av影院| 亚洲日本中文字幕区| 26uuu亚洲婷婷狠狠天堂| 欧美专区亚洲专区| 高清在线不卡av| 蜜臀久久99精品久久久久宅男| 综合色天天鬼久久鬼色| 26uuu欧美日本| 制服丝袜在线91| 色综合网色综合| 国产大片一区二区| 欧美日韩三级在线| 成人动漫av在线| 久久99国产精品久久99果冻传媒 | 欧美一区二区视频在线观看2022 | 亚洲国产精品精华液ab| 日韩一二三四区| 欧美日韩国产大片| 在线精品视频一区二区三四 | 国产午夜精品理论片a级大结局| 欧美日韩视频在线一区二区| av成人免费在线观看| 久久激情五月婷婷| 日日夜夜精品视频免费| 亚洲综合视频网| 亚洲视频一二三| 国产人妖乱国产精品人妖| 欧美大片免费久久精品三p| 欧美中文字幕一二三区视频| 不卡免费追剧大全电视剧网站| 国产精品一线二线三线| 美女网站视频久久| 美女视频黄 久久| 青草国产精品久久久久久| 亚洲一区二区三区四区在线| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 国产人妖乱国产精品人妖| 久久久一区二区三区| www一区二区| 久久婷婷一区二区三区| 久久久久国产成人精品亚洲午夜| 精品日本一线二线三线不卡| 久久影音资源网| 国产亚洲福利社区一区| 国产欧美视频一区二区| 欧美精彩视频一区二区三区| 欧美国产精品劲爆| 中文字幕一区二区三区精华液| 中文字幕永久在线不卡| 亚洲区小说区图片区qvod| 亚洲精品免费电影| 午夜久久电影网| 美日韩一区二区| 国模少妇一区二区三区| 国产成人精品1024| 99视频精品全部免费在线| 欧洲一区二区三区免费视频| 欧美日韩综合在线| 精品91自产拍在线观看一区| 欧美激情综合五月色丁香小说| 国产亚洲成aⅴ人片在线观看| 中文字幕欧美激情| 亚洲精品久久久久久国产精华液| 亚洲成a人v欧美综合天堂下载| 精品一区二区三区影院在线午夜| 国产ts人妖一区二区| 色久综合一二码| 在线不卡免费欧美| 国产日韩av一区| 亚洲男人天堂av网| 毛片不卡一区二区| 99久久精品一区二区| 欧美精品在线一区二区| 久久亚洲免费视频| 亚洲欧美另类久久久精品2019| 午夜日韩在线观看| 国产盗摄精品一区二区三区在线| 91国偷自产一区二区三区观看| 91精品国产色综合久久ai换脸 | 蜜桃av噜噜一区| 不卡影院免费观看| 欧美一区二区三区四区久久| 国产欧美日韩视频在线观看| 亚洲国产视频一区二区| 国产成人精品亚洲日本在线桃色| 欧美色涩在线第一页| 国产欧美精品一区二区色综合 | 91污在线观看| 欧美α欧美αv大片| 亚洲欧美色图小说| 精品制服美女丁香| 欧美午夜片在线看| 中文字幕av一区二区三区免费看 | 欧美图片一区二区三区| 国产亚洲制服色| 日韩精品视频网站| 欧美性做爰猛烈叫床潮| 中文字幕久久午夜不卡| 国产又黄又大久久| 在线播放中文字幕一区| 一区二区三区成人| 成人99免费视频| 久久精品视频免费| 老汉av免费一区二区三区| 欧美精品粉嫩高潮一区二区| 亚洲精品中文字幕乱码三区| 国产一区二区精品在线观看| 欧美一区二区视频免费观看| 亚洲精选在线视频| www.综合网.com| 国产精品美女久久久久av爽李琼| 国产一区二区按摩在线观看| 日韩亚洲欧美综合| 青草国产精品久久久久久| 欧美精品电影在线播放|