ソースコード

前回と同じくソースコードを公開します.
ツッコミなどをコメントに書いていただけたら感激ですd(・・

/*!
*  \file   main.cpp
*/
#include <iostream>
using namespace std;

#include "./twitterStreaming.hpp"

#define CR 13
#define LF 10

void
*myrealloc(void *ptr, size_t size)
{
    /* There might be a realloc() out there that doesn't like reallocing
    NULL pointers, so we take care of it here */
    if(ptr)
        return realloc(ptr, size);
    else
        return malloc(size);
}

size_t
curlCallback(void *ptr, size_t size, size_t nmemb, TwttrStrm::twitter &twitter)
{
    size_t realsize = size * nmemb;

    twitter.mp_responseBuffer = (char *)myrealloc(twitter.mp_responseBuffer, twitter.m_responseSize+realsize+1);
    if (twitter.mp_responseBuffer)
    {
        memcpy(&(twitter.mp_responseBuffer[twitter.m_responseSize]), ptr, realsize);
        twitter.m_responseSize += realsize;
        twitter.mp_responseBuffer[twitter.m_responseSize] = '\0';
    }

    if (CR == twitter.mp_responseBuffer[twitter.m_responseSize-2] && LF == twitter.mp_responseBuffer[twitter.m_responseSize-1]) // Tweet を一つ受け取りきったら入る
    {
        if (!twitter.loadJson())
        {
            exit(0);
        }
    }

    return realsize;
}

int
main(int argc, char **argv)
{
    using namespace TwttrStrm;
    twitter twttr;

    // cURL
    CURL *curl_handle;
    CURLcode res;

    curl_handle = curl_easy_init();

    //  Twitter ログイン
    curl_easy_setopt(curl_handle, CURLOPT_PROXY, "192.168.0.1:8080");
    curl_easy_setopt(curl_handle, CURLOPT_PROXYUSERPWD, "PROXY_USER_NAME:PROXY_PASSWORD");
    curl_easy_setopt(curl_handle, CURLOPT_PROXYAUTH, (long)CURLAUTH_ANY);
    curl_easy_setopt(curl_handle, CURLOPT_USERPWD, "TWITTER_ID:TWITTER_PASSWORD");

    // babel
    babel::init_babel();    

    if(curl_handle)
    {
        //curl_easy_setopt(curl_handle, CURLOPT_URL, "http://stream.twitter.com/1/statuses/filter.json?follow=5835402");    //  ID が「5835402」の人を追いかける
        //curl_easy_setopt(curl_handle, CURLOPT_URL, "http://stream.twitter.com/1/statuses/filter.json?track=%23ppfun");    //  「#ppfun」というキーワードを追いかける
        curl_easy_setopt(curl_handle, CURLOPT_URL, "http://stream.twitter.com/1/statuses/sample.json");                   //  サンプル

        /* send all data to this function  */
        curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, curlCallback);

        /* we pass our 'chunk' struct to the callback function */
        curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &twttr);

        res = curl_easy_perform(curl_handle);

        /* always cleanup */ 
        curl_easy_cleanup(curl_handle);
    }

    return 0;
}
/*!
 *  \file   twitter.hpp
 */
#ifndef _TWITTER_STREAMING_HPP_
#define _TWITTER_STREAMING_HPP_

#include <map>
#include <string>
using namespace std;

#include "./curl/curl.h"
#include "./babel/babel.h"
#include "./picojson.h"

namespace TwttrStrm
{
class twitter
{
public:
    twitter();                      //!< コンストラクタ
    ~twitter();                     //!< デストラクタ

    bool loadJson();                //!< json から Tweet の情報を受け取る

public:
    //  cURL
    char   *mp_responseBuffer;      //!< Twiter の StreamingAPI から流れ込んでくる Tweet
    size_t  m_responseSize;         //!< mp_reponseBuffer のサイズ

private:
    //  Twitter
    string  m_twitterUsrName;       //!< Twitter のユーザ名
    string  m_twitterUsrPasswd;     //!< Twitter のパスワード
    map<string, string> m_statuses; //!< Tweet の情報 <reply, mention>
};

}   //  namespace TwttrStrm
#endif  // _TWITTER_STREAMING_HPP_
/*!
 *  \file   twitter.cpp
 */
#include "twitterStreaming.hpp"
#include "json.hpp"
#include "./babel/babel.h"

namespace TwttrStrm
{

twitter::twitter():
mp_responseBuffer(NULL),
m_responseSize(0),
m_twitterUsrName(""),
m_twitterUsrPasswd("")
{
}

twitter::~twitter()
{
}

bool
twitter::loadJson()
{
    using namespace picojson;
    string err; //  エラーメッセージを受け取る
    value v;
    parse(v, mp_responseBuffer, mp_responseBuffer + m_responseSize, &err);

    if (err.empty())    //  正常に受け取れた
    {
        object2map(v.get<object>(), m_statuses);    //  要素を全て抜き出す

        for (map<string, string>::iterator it = m_statuses.begin(); it != m_statuses.end(); it++)
        {
            cout << it->first << ": " << it->second << endl;
        }
        cout << endl;
        m_statuses.clear();

        mp_responseBuffer = NULL;
        m_responseSize    = 0;
    }
    

    return true;
}
}   //  namespace TwttrStrm
/*!
 *  \file   json.hpp
 */
#ifndef _JSON_HPP_
#define _JSON_HPP_

#include <map>
#include <string>
using namespace std;

#include "./babel/babel.h"
#include "./picojson.h"

void
object2map(picojson::object &obj, map<string, string> &mp);

#endif  //  _JSON_HPP_
/*!
 *  \file   json.cpp
 */
#include "json.hpp"

void
object2map(picojson::object &obj, map<string, string> &mp)
{
    for (picojson::object::iterator it = obj.begin(); it != obj.end(); it++)
    {
        string s = babel::utf8_to_sjis(it->second.to_str());
        if (s == "object")
        {
            object2map(it->second.get<picojson::object>(), mp);
        }
        else
        {
            mp.insert(map<string, string>::value_type(it->first, s));
        }
    }
}

いい加減ソースコードも長くなったし見にくいですね.
行番号とスクロールバーが欲しいです.
WordPress あたりに移ろうかな(・・;