⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flickr.cpp

📁 著名的相册网站flickr开发了他的API
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		header << "--cppFlickrBoundry\r\n";
		header << "Content-Disposition: form-data; name=\"description\"\r\n\r\n" << makeUTF(description) << "\r\n";
	}
	if(tags.length())
	{
		header << "--cppFlickrBoundry\r\n";
		header << "Content-Disposition: form-data; name=\"tags\"\r\n\r\n" << makeUTF(tags) << "\r\n";
	}

	header << "--cppFlickrBoundry\r\n";
	header << "Content-Disposition: form-data; name=\"is_public\"\r\n\r\n" << (isPublic ? 1 : 0) << "\r\n";
	header << "--cppFlickrBoundry\r\n";
	header << "Content-Disposition: form-data; name=\"is_friend\"\r\n\r\n" << (isFriend ? 1 : 0) << "\r\n";
	header << "--cppFlickrBoundry\r\n";
	header << "Content-Disposition: form-data; name=\"is_family\"\r\n\r\n" << (isFamily ? 1 : 0) << "\r\n";
	
	header << "--cppFlickrBoundry\r\n";
	header << "Content-Disposition: form-data; name=\"photo\"; filename=\"" << makeUTF(path) << "\"\r\nContent-Type: " << makeUTF(imgMime) << "\r\n\r\n";

	FILE* pFile = _wfopen(path.c_str(),L"rb");

	char* sendData = 0;
	size_t totalSize = 0;
	if(pFile)
	{
		// obtain file size.
		fseek (pFile , 0 , SEEK_END);
		size_t fileSize = ftell (pFile);
		rewind (pFile);

		char* imgBuffer = new char[fileSize];
		size_t read = fread(imgBuffer,1,fileSize,pFile);

		std::string footer = "\r\n--cppFlickrBoundry--\r\n";	
		
		//	glue the lot together
		totalSize = fileSize + header.str().length() + footer.length();
		sendData = new char[totalSize];

		char* imgStart = sendData + header.str().length();
		char* footStart = imgStart + fileSize;

		memcpy(sendData,header.str().c_str(),header.str().length());
		memcpy(imgStart,imgBuffer,fileSize);
		memcpy(footStart,footer.c_str(),footer.length());

		fclose(pFile);
		delete[] imgBuffer;
	}

	int ret = -1;

	if(sendData)
	{

		// send it
		void* ctx = xmlNanoHTTPMethod(targetURL,"POST",sendData,&contentType,0,(int)totalSize);
		delete[] sendData;
		sendData = 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
			xmlDocPtr 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
			{
				xmlNodePtr root = xmlDocGetRootElement(doc);

				xmlNodePtr upNode = root->xmlChildrenNode;
				xmlNodePtr statusNode = upNode->next;	
				
				xmlNodePtr statusText = statusNode->xmlChildrenNode;

				if(strcmp((char*)statusText->content,"fail") == 0)
				{
					xmlNodePtr errNode = statusNode->next->next;
					xmlNodePtr errText = errNode->xmlChildrenNode;
					ret = atoi((char*)errText->content);
					xmlNodePtr msgNode = errNode->next->next;

					m_errorMsg = makeWide((char*)msgNode->xmlChildrenNode->content);
				}
				else
				{
					xmlNodePtr idNode = statusNode->next->next;
					retID = atoi((char*)idNode->xmlChildrenNode->content);
					ret = 0;// It worked!
				}

				xmlFreeDoc(doc);
			}

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

	return ret;

}

//------------------------------------------------------------------------------------------
//Get your own contact list
int Flickr::getContactList(ContactList& retList)
{
	int ret = -1;

	std::stringstream url;
	url << m_baseURL << "?";
	//	 Build the request string
	url << "method=flickr.contacts.getList&api_key=" << m_apiKey;

	//	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 contacts = root->xmlChildrenNode->next;

			xmlNodePtr cNode = contacts->xmlChildrenNode->next;
			while(cNode)
			{
				Contact c;
				
				xmlChar* val =  xmlGetProp(cNode,(const xmlChar *)"nsid");
				c.nsid = makeWide((char*)val);
				xmlFree(val);

				val =  xmlGetProp(cNode,(const xmlChar *)"username");
				c.username = makeWide((char*)val);
				xmlFree(val);
				
				val =  xmlGetProp(cNode,(const xmlChar *)"realname");
				c.realName = makeWide((char*)val);
				xmlFree(val);
				
				//	TODO: isfamily etc
			

				//	 return it
				retList.push_back(c);

				cNode = cNode->next;
				if(cNode) cNode = cNode->next;
			}


		}
		
		xmlFreeDoc(doc);

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

}
//------------------------------------------------------------------------------------------
//Get someone's public contact list
int Flickr::getPublicContactList(const std::wstring& nsid, ContactList& retList)
{
	int ret = -1;

	std::stringstream url;
	url << m_baseURL << "?";
	//	 Build the request string
	url << "method=flickr.contacts.getPublicList&api_key=" << m_apiKey;

	url << "&user_id=" << makeUTF(nsid);

	//	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 contacts = root->xmlChildrenNode->next;

			xmlNodePtr cNode = contacts->xmlChildrenNode->next;
			while(cNode)
			{
				Contact c;
				
				xmlChar* val =  xmlGetProp(cNode,(const xmlChar *)"nsid");
				c.nsid = makeWide((char*)val);
				xmlFree(val);

				val =  xmlGetProp(cNode,(const xmlChar *)"username");
				c.username = makeWide((char*)val);
				xmlFree(val);
				

				//	TODO: ignored
			

				//	 return it
				retList.push_back(c);

				cNode = cNode->next;
				if(cNode) cNode = cNode->next;
			}


		}
		
		xmlFreeDoc(doc);

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

}


int Flickr::getContactsPhotos(int count,bool justFriends,bool singlePhoto,bool includeSelf)
{

	int ret = -1;

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

	//	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 contacts = root->xmlChildrenNode->next;

			xmlNodePtr cNode = contacts->xmlChildrenNode->next;
			while(cNode)
			{
				Contact c;
				
				xmlChar* val =  xmlGetProp(cNode,(const xmlChar *)"nsid");
				c.nsid = makeWide((char*)val);
				xmlFree(val);

				val =  xmlGetProp(cNode,(const xmlChar *)"username");
				c.username = makeWide((char*)val);
				xmlFree(val);
				
				val =  xmlGetProp(cNode,(const xmlChar *)"realname");
				c.realName = makeWide((char*)val);
				xmlFree(val);
				
				//	TODO: isfamily etc
			

				//	 return it
				//retList.push_back(c);

				cNode = cNode->next;
				if(cNode) cNode = cNode->next;
			}


		}
		
		xmlFreeDoc(doc);

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


}


}// namespace

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -