0

libtorrent-goを使用して、Golangで個人プロジェクトを開発しています

タイプ のアラートを受け取ったら"save_resume_data_alert"、それを拾い、libtorrent のドキュメントに書かれているようにキャストする必要があります。

...
        save_resume_data_alert const* rd = alert_cast<save_resume_data_alert>(a);
...

しかし、golangでキャストする方法が本当にわかりません! 現在のコード:

package main

import (
    lt "github.com/steeve/libtorrent-go"

    "log"
    "time"
)

func main() {

    randomTorrent := lt.NewAdd_torrent_params()
    randomTorrent.SetUrl("PUT A MAGNET LINK HERE")
    randomTorrent.SetSave_path(".")

    ec := lt.NewError_code()
    torrentSession := lt.NewSession()
    torrentSession.Set_alert_mask(status_notification + storage_notification)
    torrentSession.Listen_on(lt.NewStd_pair_int_int(6900, 6999), ec)
    if ec.Value() != 0 {
        log.Println(ec.Message())
    }

    torrentHandle := torrentSession.Add_torrent(randomTorrent, ec)
    if ec.Value() != 0 {
        log.Println(ec.Message())
    }

    go func() {
        for {
            if torrentSession.Wait_for_alert(lt.Seconds(10)).Swigcptr() == 0 {
                log.Println("Alert timeout occurred!")
            }

            alert := torrentSession.Pop_alert()
            switch alert.What() {
            default:
                log.Printf("Alert: %#v", alert.What())
            case "metadata_received_alert":
                log.Println("Received Metadata!! finally!")
                torrentHandle.Save_resume_data()
            case "save_resume_data_alert":
                log.Println("Wrote Metadata!")
                // need to actually write the resume_data :( can't find how
            case "save_resume_data_failed_alert":
                log.Println("Failed Metadata!")
            }
        }
    }()

    select {}
}
4

1 に答える 1

1

上記のように、libtorrent-go開発者が私に答えたので、後世の理由で答えを転送しています。

SWIG ライブラリを使用した Golang での C++ 構造のキャストについては、SWIG-Golang ドキュメントに記載されています。
特にこの声明では:

インターフェイス型の値を指定すると、Go コードは Swigcptr メソッドを呼び出して C++ 型へのポインターを取得できます。これは、タイプ SwigcptrClassName の値を返します。これは、uintptr の単なる名前です。Go 型変換を使用して、この値を別の C++ 型に変換できますが、この変換は型チェックされず、本質的に reinterpret_cast と同等であることに注意してください。これは、C++ が dynamic_cast を使用する場合など、非常に特殊な場合にのみ使用する必要があります。

上記に投稿した特定のコードでは、それを機能させるために次のことが必要でした。

case "save_resume_data_alert":
  log.Println("Wrote Metadata!")
  // need to actually write the resume_data :( can't find how
  SaveRDAlert := lt.SwigcptrSave_resume_data_alert(alert.Swigcptr())
  log.Printf("Resume Data: %#v", SaveRDAlert.GetResume_data())
于 2014-12-17T17:17:59.150 に答える