/*
 * carotDlg.h : ここうさぎウィザード carot
 *      メインダイアログ ヘッダーファイル
 *          written by H.Tsujimura  15 Oct 2004
 *
 * $Log: /makeRSS/carot/carotDlg.h $
 * 
 * 46    09/03/20 23:00 Tsujimura543
 * ウェブリブログの XML-RPC API 経由ではない方の諸々を削除
 * 
 * 45    09/03/20 22:27 Tsujimura543
 * はてなダイアリー(の Atom API での投稿)に対応した
 * 
 * 44    09/03/20 18:27 Tsujimura543
 * ウェブリブログの XMLRPC API 対応作業開始
 * 
 * 43    08/09/10 23:30 Tsujimura543
 * loginExciteBlog(), getCategoryListExciteBlog(), getBlogIDsExciteBlog()
 * を xmlRPC.dll から移管
 * 
 * 42    08/09/10 22:19 Tsujimura543
 * loginEchoo(), getCategoryListEchoo(), getBlogIDsEchoo()
 * を xmlRPC.dll から移管
 * 
 * 41    08/09/10 18:23 Tsujimura543
 * loginRakuten(), getCategoryListRakuten(), getBlogIDsRakuten(),
 * getCategoryIDbyName(), getCategoryIDs()
 * を xmlRPC.dll から移管
 * 
 * 40    08/09/09 23:57 Tsujimura543
 * getCategoryListWebry(), getBlogIDsWebry() を xmlRPC.dll から移管
 * 
 * 39    07/11/30 2:51 Tsujimura543
 * Jugem、ヤプログ!、ドリコムブログ、しまにてぃ内日記向けの専用処理を廃止
 * 
 * 38    07/10/29 16:49 Tsujimura543
 * yaplog_x → yaplogX に変更
 * 
 * 37    07/10/29 16:36 Tsujimura543
 * yaplog_x を追加
 * 
 * 36    07/10/17 23:48 Tsujimura543
 * ダミーのコピーコンストラクタ、代入演算子を private として導入。
 * 知らないうちにメモリ確保(と解放し忘れ)が発生する可能性を排除。
 * 
 * 35    07/10/17 23:31 Tsujimura543
 * (1) バージョン管理用コメントを入れるようにする
 * (2) 余分なプリプロセッサ制御文を削除
 */

#if !defined(AFX_CAROTDLG_H__3E7345CC_A642_4B52_951B_28C38CE64606__INCLUDED_)
#define AFX_CAROTDLG_H__3E7345CC_A642_4B52_951B_28C38CE64606__INCLUDED_

#ifdef __cplusplus
extern "C" {
#endif
#include "xmlRPC.h"
#include "atomAPI.h"
#include "encryptRSA.h"
#include "utility.h"
#include "excite.h"
#include "echoo.h"
#include "rakuten.h"
#ifdef __cplusplus
}
#endif

#define CAROT_NUM_OF_BLOG_KINDS         48
#define CAROT_MAX_BLOG_NAME_LENGTH      MAX_BLOGNAMELENGTH

#define CAROT_NUM_OF_BLOGPET_TYPES      6
#define CAROT_MAX_BLOGPETTYPE_LENGTH    12

#define CAROT_INF_EOF_STRING            "## end of file ##"

/////////////////////////////////////////////////////////////////////////////
// CCarotDlg ダイアログ

class CCarotDlg : public CDialog
{
// 構築
public:
#if !defined( BLOGKIND_NEWPOSTONLY )
#define BLOGKIND_NEWPOSTONLY    0xFE    /* metaWeblog.newPost のみサポート */
                                        /* している blog                   */
#endif
#if !defined( BLOGKIND_NOSUPPORT )
#define BLOGKIND_NOSUPPORT      0xFF    /* 「ここうさぎ」未サポート blog   */
#endif
    enum blogKind {
        unset        = -1,                  // 未設定
        typepad      = BLOGKIND_TYPEPAD,    // Typepad, Typepad France,
                                            //   TypePad Germany
        typepadJapan = BLOGKIND_TYPEPADJAPAN,//Typepad Japan
        cocolog      = BLOGKIND_COCOLOG,    // ココログ
        cocologFree  = BLOGKIND_COCOLOGFREE,// ココログフリー
        blogzine     = BLOGKIND_BLOGZINE,   // ブログ人
        newsHandler  = BLOGKIND_NEWSHANDLER,// News-Handler
        seesaa       = BLOGKIND_SEESAABLOG, // Seesaa BLOG
        netLaputa    = BLOGKIND_NETLAPUTA,  // NetLaputa BLOG
        blogG        = BLOGKIND_269G,       // 269g
        livedoor     = BLOGKIND_LIVEDOOR,   // livedoor Blog
        lovelog      = BLOGKIND_LOVELOG,    // LOVELOG
        sonet        = BLOGKIND_SONET,      // So-net blog
        blogger      = BLOGKIND_BLOGGER,    // Blogger
        vox          = BLOGKIND_VOX,        // Vox
        hatena       = BLOGKIND_HATENADIARY,// はてなダイアリー (Atom API)
        movableType  = BLOGKIND_MOVABLETYPE,// Movable Type または BOXERBLOG
        bloggerAPI   = BLOGKIND_BLOGGERAPI, // blogger API サポート blog
        metaWeblog   = BLOGKIND_METAWEBLOG, // metaWeblog API サポート blog
        mtAPI        = BLOGKIND_MTAPI,      // MovableType API
                                            //   (+ 拡張 metaWeblog API)
                                            //   サポート blog
        atomAPI      = BLOGKIND_ATOMAPI,    // Atom API サポート blog
        newPostOnly  = BLOGKIND_NEWPOSTONLY,// metaWeblog.newPost のみサポート
                                            //   している blog
        jugemX       = BLOGKIND_JUGEM_X,    // JUGEM (XML-RPC API)
        exciteBlog   = BLOGKIND_EXCITEBLOG, // exciteブログ
        yaplogX      = BLOGKIND_YAPLOG_X,   // ヤプログ! (XML-RPC API)
        drecomX      = BLOGKIND_DRECOMBLOG_X,//ドリコムブログ (XML-RPC API)
        webryX       = BLOGKIND_WEBRY_X,    // ウェブリブログ (XML-RPC API)
        myprofile    = BLOGKIND_MYPROFILE,  // マイプロフィール
        mixi         = BLOGKIND_MIXI,       // mixi内日記
        ameblo       = BLOGKIND_AMEBLO,     // アメーバブログ
        kinugasa     = BLOGKIND_KINUGASA,   // キヌガサ内日記
        echoo        = BLOGKIND_ECHOO,      // エコログ
        fc2blog      = BLOGKIND_FC2BLOG,    // FC2BLOG
        fc2network   = BLOGKIND_FC2NETWORK, // FC2NETWORK内日記
        rakuten      = BLOGKIND_RAKUTEN,    // 楽天広場 (楽天ブログ)
        gooBlog      = BLOGKIND_GOOBLOG,    // goo Blog
        colors       = BLOGKIND_COLORS,     // COLORS内日記
        msnSpaces    = BLOGKIND_MSNSPACES,  // MSN Spaces (Windows Live Spaces)
        openPne      = BLOGKIND_OPENPNE,    // OpenPNE内日記
        unsupported  = BLOGKIND_NOSUPPORT   // 「ここうさぎ」未サポート blog
    }       m_blogKind;

    int     m_numOfBlogKinds;

    struct blogKindInfo {
        enum blogKind   blogKind;
        char            *blogKindString;
        char            *blogKindID;
        char            *endpointURL;
    }       m_blogKindInfo[CAROT_NUM_OF_BLOG_KINDS];

private:
    void    switchKeyword( bool value );
    void    switchHaiku( bool value );
    void    switchPostForcely( bool value );
    void    switchSimilarity( bool value );
    void    switchAssociateID( bool value );
    void    switchUseWriting( bool value );
    void    switchEndpointURL( int blogKindIndex = -1 );
    void    switchBlogID( const char *blogID = NULL );
    void    switchBlogPetInfo();
    void    switchBlogInfo();
    void    switchBrowseBlog();
    void    switchBrowseBlogPet();
    void    initBlogKindList();

    void    loadSetting( FILE *fp );
    void    loadSetting( void );
    void    saveSetting( FILE *fp, bool savedForcely );
    void    saveSetting( bool savedForcely = FALSE );
    bool    checkSetting( const char *filename );

    bool    createBlogPet();
    bool    allocateBlogPetInfo();
    void    createBlogPetInfo();
    void    loadBlogPetInfo( FILE *fp = NULL );
    void    saveBlogPetInfo( FILE *fp = NULL );
    bool    checkBlogPetInfo( const char *filename );
    void    registerBlogPetInfoFromFile( FILE *fp );

    bool    createBlogList();
    bool    allocateBlogInfo();
    void    createBlogInfo();
    void    loadBlogInfo( FILE *fp = NULL );
    void    saveBlogInfo( FILE *fp = NULL );
    bool    checkBlogInfo( const char *filename );
    void    registerBlogInfoFromFile( FILE *fp );

    bool    getStringValue(
                const char *inputString,
                const char  *targetName,
                char        *stringValue );
    bool    getStringValue(
                const char *inputString,
                const char *paramName,
                CString    &param,
                int        idc,
                int        paramAreaSize = MAX_NAMELEN );
    bool    getStringValue(
                const char      *inputString,
                const char      *targetName,
                int             &blogIndex );

    bool    getParameter( bool savedForcely = FALSE );

    void    decodeParameter(
                CString             &param,          // 設定先
                const unsigned char *encryptedString,// 設定すべき内容(要・復号)
                const unsigned char *rsaString );    // RSA鍵対応文字列
    void    encodeParameter(
                FILE          *fp,
                FILE          *gp,
                const char    *param,
                const char    *paramName,
                char          *key,
                unsigned char **rsaString,
                bool          &encrypted );
    bool    checkEncodedPassword( const char *filename );
    void    SetProxyInfo( bool saveForcely = false );

    bool    m_haiku;    // 「俳句」を詠むか否か
    bool    m_keyword;  // 「はてなダイアリーキーワード」を使うか否か
    bool    m_similarity;   // 「おすすめ」を使うか否か

    char    m_settingDir[MAX_PATH];  // 設定ファイル格納ディレクトリ
    char    m_settingFile[MAX_PATH]; // 設定ファイル名 (「ここうさぎ」と連携)
    char    m_petInfoFile[MAX_PATH]; // 飼っている BlogPet の一覧
    char    m_blogInfoFile[MAX_PATH];// 投稿対象の blog の一覧
    char    m_editorPath[MAX_PATH];  // 代筆記事編集用エディタのパス名
    long    m_currentPetID;          // カレント BlogPet ID (index)
    long    m_currentBlogID;         // カレント blog ID (index)

public:
	CCarotDlg(CWnd* pParent = NULL);	// 標準のコンストラクタ
    ~CCarotDlg();

// ダイアログ データ
	//{{AFX_DATA(CCarotDlg)
	enum { IDD = IDD_CAROT_DIALOG };
	CComboBox	m_blogKindList;
	CComboBox	m_blogPetTypeList;
	CListBox	m_categoryList;
	CString	m_blogPassword;
	CString	m_blogUserName;
	CString	m_cousagiName;
	CString	m_cousagiPassword;
	CString	m_cousagiUserName;
	CString	m_userName;
	CString	m_endpointURL;
	CString	m_blogID;
	BOOL	m_postForcely;
	CString	m_associateID;
	CString	m_blogPetID;
	CString	m_categoryName;
	CString	m_blogPetType;
	BOOL	m_useWritingForPet;
	CString	m_blogName;
	CString	m_blogURL;
	//}}AFX_DATA

	//{{AFX_VIRTUAL(CCarotDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV のサポート
	//}}AFX_VIRTUAL

// インプリメンテーション
protected:
	HICON m_hIcon;

	// メッセージマップ関数
	//{{AFX_MSG(CCarotDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnExecuteCocousagi();
	afx_msg void OnRadioKeywordOn();
	afx_msg void OnRadioKeywordOff();
	afx_msg void OnRadioHaikuOn();
	afx_msg void OnRadioHaikuOff();
	afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
	afx_msg void OnSelchangeListBlogkind();
	afx_msg void OnExit();
	afx_msg void OnCheckPostForcely();
	afx_msg void OnRadioSimlarityOn();
	afx_msg void OnRadioSimilarityOff();
	afx_msg void OnKillfocusEditAssociateId();
	afx_msg void OnSelchangeListBlogPetType();
	afx_msg void OnButtonGetCategories();
	afx_msg void OnSelchangeListCategory();
	afx_msg void OnButtonSwitchPet();
	afx_msg void OnSelchangeComboBlogPetType();
	afx_msg void OnSelchangeComboBlogKind();
	afx_msg void OnKillfocusEditBlogPetID();
	afx_msg void OnKillfocusEditCousagiName();
	afx_msg void OnKillfocusEditCousagiUserName();
	afx_msg void OnKillfocusEditCousagiPassword();
	afx_msg void OnKillfocusEditEndpointURL();
	afx_msg void OnButtonSwitchBlog();
	afx_msg void OnCheckWriting();
	afx_msg void OnKillfocusEditBlogUsername();
	afx_msg void OnKillfocusEditBlogPassword();
	afx_msg void OnKillfocusEditBlogID();
	afx_msg void OnButtonBrowseBlog();
	afx_msg void OnButtonBrowseBlogPet();
	afx_msg void OnButtonSetProxyInfo();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()

private:
    CCarotDlg( CCarotDlg &dlg );
    CCarotDlg   operator = ( CCarotDlg &dlg );
};

//{{AFX_INSERT_LOCATION}}

#endif // !defined(AFX_CAROTDLG_H__3E7345CC_A642_4B52_951B_28C38CE64606__INCLUDED_)
