亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲mv在线观看| 亚洲第一狼人社区| 欧美另类z0zxhd电影| 久久精品国产免费看久久精品| 26uuu精品一区二区三区四区在线| 色综合久久久久综合体| 国模无码大尺度一区二区三区| 亚洲人123区| 久久久久久久久岛国免费| 亚洲精品国产精华液| av在线播放不卡| 免费观看30秒视频久久| 中文字幕一区二区三区四区不卡 | 黑人巨大精品欧美黑白配亚洲| 亚洲视频一区在线观看| 欧美tickling挠脚心丨vk| 欧美三级中文字幕在线观看| 91在线观看视频| 国产精品996| 麻豆国产欧美日韩综合精品二区 | 免费观看在线综合色| 亚洲视频中文字幕| 国产欧美一区二区三区网站| 日韩一区和二区| 欧美日韩在线一区二区| 成人国产精品免费网站| 国产一区二区三区免费看| 美女视频一区二区三区| 亚洲成人激情社区| 亚洲一区二区中文在线| 亚洲乱码中文字幕| 亚洲人成网站影音先锋播放| 中文字幕免费不卡| 欧美激情一区二区三区四区| 精品999在线播放| 日韩一级视频免费观看在线| 欧美日韩免费在线视频| 欧美网站一区二区| 欧美日韩一级大片网址| 精品视频在线免费看| 91精彩视频在线观看| 在线欧美小视频| 欧洲日韩一区二区三区| 欧洲av一区二区嗯嗯嗯啊| 91高清视频在线| 欧美日韩在线三级| 91精品国产综合久久精品| 欧美男人的天堂一二区| 91精品中文字幕一区二区三区| 欧美精品视频www在线观看| 欧美精品高清视频| 日韩欧美国产综合一区| 亚洲精品一区二区精华| 国产欧美日本一区二区三区| 国产清纯白嫩初高生在线观看91| 国产欧美日韩综合| 亚洲欧美日韩电影| 一区二区三区在线不卡| 亚洲成a人在线观看| 免费成人在线影院| 国产中文字幕精品| 成人综合婷婷国产精品久久蜜臀| proumb性欧美在线观看| 91免费视频网| 91麻豆精品国产自产在线| 久久精品欧美日韩精品| 中文字幕中文字幕在线一区| 美女被吸乳得到大胸91| 7777女厕盗摄久久久| 精品成人私密视频| 亚洲欧美欧美一区二区三区| 亚洲成av人**亚洲成av**| 久久精品国产澳门| 国产.欧美.日韩| 欧美日韩一区精品| 精品少妇一区二区三区日产乱码| 国产蜜臀97一区二区三区| 一区二区在线免费| 精品一区二区三区日韩| 91在线精品一区二区| 欧美精品久久一区二区三区| 久久久久久亚洲综合影院红桃| 国产精品国产成人国产三级| 日韩国产精品大片| 国产91丝袜在线观看| 欧美日韩在线一区二区| 国产欧美视频在线观看| 亚洲va国产va欧美va观看| 国产精品一级黄| 欧美日本一区二区三区| 欧美韩日一区二区三区| 日本色综合中文字幕| 色域天天综合网| 欧美精品一区在线观看| 亚洲18影院在线观看| 成人免费va视频| 日韩欧美一区在线| 一区二区三区不卡在线观看 | 99精品欧美一区| 欧美变态tickling挠脚心| 亚洲欧美另类综合偷拍| 黄一区二区三区| 欧美丰满美乳xxx高潮www| 亚洲视频一区二区在线观看| 国产精品小仙女| 欧美一二三在线| 亚洲精品国产视频| 丰满亚洲少妇av| 久久免费电影网| 精品一区在线看| 欧美疯狂做受xxxx富婆| 亚洲精品久久久久久国产精华液| 国产成人免费视频网站| 欧美大片在线观看一区| 亚洲妇女屁股眼交7| av一区二区三区| 欧美国产一区在线| 国产精品一区二区91| 欧美一级夜夜爽| 亚洲一卡二卡三卡四卡无卡久久 | 99国内精品久久| 精品久久久久久久人人人人传媒| 日本欧美加勒比视频| 欧美天堂一区二区三区| 国产精品素人一区二区| 国产精品911| 久久久久久9999| 麻豆国产欧美一区二区三区| 7777精品伊人久久久大香线蕉经典版下载 | 成人一区二区三区视频在线观看| 欧美丰满少妇xxxbbb| 视频一区二区三区在线| 色欧美乱欧美15图片| 最新不卡av在线| 国产精品一区在线观看乱码 | 欧美四级电影网| 亚洲一区二区在线播放相泽| 不卡在线视频中文字幕| 国产精品久久看| 国产乱一区二区| 日本一区二区综合亚洲| 激情综合色综合久久综合| 精品国产乱码久久久久久图片 | 成人动漫在线一区| 国产欧美久久久精品影院| 国产精品影视网| 中文字幕一区二区5566日韩| 亚洲午夜免费福利视频| 欧美亚洲国产一区二区三区va | 欧美激情一区二区三区在线| 国产乱码字幕精品高清av | 91精品综合久久久久久| 免播放器亚洲一区| 精品蜜桃在线看| 本田岬高潮一区二区三区| 久久日一线二线三线suv| 精品制服美女丁香| 亚洲国产激情av| 成人av影院在线| 亚洲午夜免费电影| 日韩一区二区免费电影| 精品无人码麻豆乱码1区2区 | 国产99久久久精品| 亚洲精品日韩综合观看成人91| 91亚洲精品久久久蜜桃| 亚洲一区二区三区中文字幕 | 一本色道久久综合精品竹菊| 亚洲猫色日本管| 91免费看`日韩一区二区| 制服.丝袜.亚洲.另类.中文| 久久91精品国产91久久小草| 欧美成va人片在线观看| 成人av在线电影| 国产精品免费久久久久| 91精彩视频在线观看| 久久精品二区亚洲w码| 国产日产欧美精品一区二区三区| 色8久久人人97超碰香蕉987| 天天综合日日夜夜精品| 久久亚洲精品小早川怜子| 午夜精品一区在线观看| 2欧美一区二区三区在线观看视频| 99久久伊人精品| 视频一区中文字幕| 国产精品国产三级国产三级人妇| 91久久精品一区二区| 精品一区二区国语对白| 亚洲精品一二三| 日韩女优毛片在线| 91福利在线免费观看| 卡一卡二国产精品 | 亚洲欧美电影院| 日韩免费高清av| 日韩av电影天堂| 专区另类欧美日韩| 精品99一区二区三区| 日本韩国一区二区三区| 成人午夜激情在线| 一区二区三区四区视频精品免费| 日韩欧美高清在线|