📄 flickr.cpp
字号:
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 + -