Nachdem mein Arbeitslaptop nun seit einiger Zeit mit Linux läuft bin ich vor ein paar Tagen auch Zuhause auf Linux gewechselt. Für manche Games gibt es noch einen Dualboot, aber vieles läuft mittlerweile auch so. Dennoch stellen sich einige Herrausforderungen über die man sich im Windows Universum keine Gedanken machen musste. So nutze ich seit Jahren gerne Google Drive und möchte das auch so beibehalten. Doch für Linux gibt es noch keinen offiziellen gdrive Client. Nun läuft es per grive, einem OpenSource Sync Client + einem eigenem Script bei mir bestens. Lediglich das direkte öffnen von Google Docs Files will per default nicht.

*.gdsheet Dateien

Um Google Drive Dokumente direkt im Browser öffnen zu können gibt es im gdrive Dateien mit der Endung .gdsheet oder .gdform. Diese enthalten den entsprechenden Link zum Google doc als JSON Objekt. Um diese, wie gewohnt, einfach per Doppeltklick zu öffnen habe ich ein kleines tool erstellt welches das handling übernimmt. Bei mir kam eine kleine kompilierbare Datei direkt in C raus die ich der Welt nicht vorenthalten möchte. Es gibt zwar auch andere Lösungen aber Learning by Doing und mühsam ernährt sich... ach lassen wir das.
/* See: http://solariz.de/de/google_drive_linux_gdsheet_handler_gdrive.htm 
   for Information, License or whatever :p */

#include 
#include 
#include     // strlen
#include 

char* readFile(char* filename)
{
    FILE* file = fopen(filename,"r");
    if(file == NULL)
    {
        return NULL;
    }

    fseek(file, 0, SEEK_END);
    long int size = ftell(file);
    rewind(file);

    char* content = calloc(size + 1, 1);

    fread(content,1,size,file);

    return content;
}

const char* escapeshellarg(const char* str) {
    char *esc = strdup(str);
    int i = 0;
    int len = strlen(str) + 1;
 
    while( *str ) {
        if( *str == '\'' || *str == '\\' ) {
            esc[i++] = '\\';
            len += 1;
            esc = (char*)realloc(esc, len);
        }
        esc[i++] = *str++;
    }
    esc[i] = 0;
    return esc;
}

int main ( int argc, char *argv[] )
{
    if ( argc != 2 ) /* argc should be 2 for correct execution */
    {
        /* We print argv[0] assuming it is the program name */
        printf( "usage: %s ", argv[0] );
    }
    else 
    {
        // argv[1] is a filename to open, let's try:
        FILE *file = fopen( argv[1], "r" );

        /* fopen returns 0, the NULL pointer, on failure */
        if ( file == 0 )
        {
            printf( "ERROR: Could not open file!\n" );
        }
        else 
        {
            fclose( file );
            /* read */
            char * raw = readFile(argv[1]);
            json_object * jobj = json_tokener_parse(raw);
            const char * url = json_object_get_string(json_object_object_get(jobj, "url"));
            /* prevent exploding buffer */
            if(strlen(url) > 230) {
                printf("URL String to Long! Maximum 230 Chars!\n");
                exit(0);
            }
            /* only for Google Docs! */
            if(strstr(url, "https://docs.google.com/") != NULL || strstr(url, "https://docs.google.com/") != NULL) {
                printf("Google docs target found!\n");
            } else {
                printf("URL Seems not a google Docs target, break!\n");
                exit(0);
            }
            /* Escape String */
            const char * str = escapeshellarg(url);
            /* and open Browser (only works in Gnome) */
            const char * cmd = "/usr/bin/gnome-open \"";
            char buffer[256]; // <- danger, only storage for 256 char!
            strncpy(buffer, cmd, sizeof(buffer));
            strncat(buffer, str, sizeof(buffer));
            strncat(buffer, "\"", sizeof(buffer));
            //printf("cmd: %s\n",buffer);
            printf("Opening Browser...\n");
            system(buffer);
            /* Over and out */
            exit(1);
        }
    }
}
Getestet und lauffähig in aktuellem Linux Mint so wie wohl jedem Debian Derivat mit Gnome. Vorraussetzung ist lediglich libjson0 und libjson0-dev. Kompiliert wird das ganze dann relativ einfach:
[source]
sudo apt-get install gcc libjson0 libjson0-dev
gcc -o gdsheet gdsheet.c -l json
chmod +x gdsheet
sudo mv gdsheet /usr/bin
[/source] Danach muss man nur noch im verwendem Filemanager, bei mir Caja, die entsprechende Endung .gdsheet / .gdform mit dem gdsheet binary verknüpfen. Das war es auch schon, beim Doppeltklick auf meine Google Drive Documents öffnet sich nun selbigs wie gewohnt im Chrome. Ich stelle das ganze noch mal mit dem Source und einer bereits kompilierten x64 Version zum Download. GL HF.

DOWNLOAD

Linux gdsheet opener
[download]
(1480 Downloads)

Lizenz?

Für jene die fragen: Public Domain. Do whatever you want.

✉ MG// CEST

Follow Icon
Don’t miss out and subscribe by email:
Don't worry! NO Spam and FREE; Receive a summarizing email for new posts, easy to unsubscribe at any time.
← Other Blog Posts