first.c compilet en draait!
[projects/chimara/chimara.git] / src / stream.c
index 28ea3ec91933981bf7554897da0d22196fe6cf8d..b737f356f798766089dffbd097b06c4772fdc34a 100644 (file)
@@ -81,7 +81,7 @@ glk_stream_get_rock(strid_t str)
 void
 glk_stream_set_current(strid_t str)
 {
-       if(str != NULL && str->file_mode != filemode_Write)
+       if(str != NULL && str->file_mode == filemode_Read)
        {
                g_warning("glk_stream_set_current: "
                        "Cannot set current stream to non output stream");
@@ -250,7 +250,8 @@ file_stream_new(frefid_t fileref, glui32 fmode, glui32 rock, gboolean unicode)
        g_return_val_if_fail(fileref != NULL, NULL);
        
        gchar *modestr;
-       gboolean binary = fileref->usage & fileusage_BinaryMode;
+       /* Binary mode is 0x000, text mode 0x100 */
+       gboolean binary = !(fileref->usage & fileusage_TextMode);
        switch(fmode) 
        {
                case filemode_Read:
@@ -268,7 +269,11 @@ file_stream_new(frefid_t fileref, glui32 fmode, glui32 rock, gboolean unicode)
                        modestr = g_strdup(binary? "ab" : "a");
                        break;
                case filemode_ReadWrite:
-                       modestr = g_strdup(binary? "r+b" : "r+");
+                       if( g_file_test(fileref->filename, G_FILE_TEST_EXISTS) ) {
+                               modestr = g_strdup(binary? "r+b" : "r+");
+                       } else {
+                               modestr = g_strdup(binary? "w+b" : "w+");
+                       }
                        break;
                default:
                        g_warning("glk_stream_open_file: Invalid file mode");
@@ -285,11 +290,16 @@ file_stream_new(frefid_t fileref, glui32 fmode, glui32 rock, gboolean unicode)
        /* If they opened a file in write mode but didn't specifically get
        permission to do so, complain if the file already exists */
        if(fileref->orig_filemode == filemode_Read && fmode != filemode_Read) {
+               gdk_threads_enter();
+
                GtkWidget *dialog = gtk_message_dialog_new(NULL, 0,
                        GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
                        "File %s already exists. Overwrite?", fileref->filename);
                gint response = gtk_dialog_run(GTK_DIALOG(dialog));
                gtk_widget_destroy(dialog);
+
+               gdk_threads_leave();
+
                if(response != GTK_RESPONSE_YES) {
                        fclose(fp);
                        return NULL;
@@ -406,7 +416,13 @@ glk_stream_close(strid_t str, stream_result_t *result)
                                __func__);
                        return;
        }
-       
+
+       stream_close_common(str, result);
+}
+
+void
+stream_close_common(strid_t str, stream_result_t *result)
+{
        /* Remove the stream from the global stream list */
        stream_list = g_list_delete_link(stream_list, str->stream_list);
        /* If it was the current output stream, set that to NULL */
@@ -426,4 +442,3 @@ glk_stream_close(strid_t str, stream_result_t *result)
        }
        g_free(str);
 }
-